#!/bin/bash # # A simple script for Firewall-cmd, used in Linux iptables Modules(kernel 4.x .&. 5.x ). # Update Date: 2020/03/05 支援各種 Linux # # Copyright (C) 2003 by CHENG, Liang-Hsing (jls@mail.jls.idv.tw & jls@acfs.tw & jls550225@gmail.com). # Website: http://www.jls.idv.tw/ # Website: http://www.acfs.tw/ # # 以下Script如有任何錯誤或您有更好的設定 # 敬請您 E-Mail 來指正 謝謝 ! # PATH=/sbin:/usr/sbin:/bin:/usr/bin ########################################################################### ################## 此段請依個人需要自行設定 ############################### ########################################################################### ########## 設定內外網卡,請自行設定,要是用撥接請在外部網卡設ppp0 ##### 外部網卡 EXT_IF="enp0s3" ##### 要是只有一張網卡就設 INT_IF="eth0" 吧 ##### 內部網卡 INT_IF="enp0s8" FW_CMD=$(/usr/bin/which firewall-cmd) $FW_CMD --reload #####設定內外網卡 if [ "$EXT_IF" != "$INT_IF" ]; then $FW_CMD --zone=external --change-interface=$EXT_IF $FW_CMD --zone=internal --change-interface=$INT_IF # $FW_CMD --zone=external --add-masquerade else $FW_CMD --zone=external --change-interface=$EXT_IF fi ##### 想要對外開放的服務(service) (依個人需要,增加或減少) OPEN_SERVICE="ftp cockpit smtp smtps dns http https pop3 pop3s ntp imap imaps squid" ##### 想要對外開放的埠(PORT /TCP) (依個人需要,增加或減少) OPEN_PORT_TCP="8080 21000-21010" ##### 想要對外開放的埠(PORT /UDP) (依個人需要,增加或減少) OPEN_PORT_UDP="500 4500 1701" ##### NAT 內部IP (依個人需要,如無需要請設為 NAT_IP="" ) NAT_IP="" if [ "$NAT_IP" != "" ]; then ##### 想要對 NAT 開放的服務(service) (依個人需要,增加或減少) NAT_SERVICE="ftp ssh smtp smtps dns http https pop3 php3s ntp imap imaps squid" fi if [ "$INT_IF" != "$EXT_IF" ]; then ##### 不想要對內部開放的 PORT (依個人需要,增加或減少,如無需要請設為 DROP_PORT="" ) DROP_PORT="" fi ##### 對於攻擊您Server的IP給予拒絕,不可設為 INPUT_IP="" ,也就是字串("")不能為空白 INPUT_IP="/etc/firewall/input_ip" ####### 只允許開放IP和MAC二個需相同才開放對外連線,不可設為 OUT_IP_MAC="" ,也就是字串("")不能為空白 ####### 當設為此種模式時以下二種方式均無效.格式為 192.168.2.170=XX:XX:XX:XX:XX:XX OUT_IP_MAC="/etc/firewall/clientout.ip.mac" ####### 只允許開放IP對外連線,不可設為 OUT_IP="" ,也就是字串("")不能為空白 OUT_IP="/etc/firewall/clientout.ip" ####### 只允許開放網卡號碼對外連線,不可設為 OUT_MAC="" ,也就是字串("")不能為空白 OUT_MAC="/etc/firewall/clientout.mac" ################################################################################# ###################### 以下如無特別需要,不需做任何修改 ########################## ################################################################################# netinfo () { IP="" MASK="" NET="" for NIC in "$@" ; do { TEST=$(ifconfig $NIC |grep "encap:Ethernet") if [ "$TEST" = "" ]; then IP=$(ifconfig $NIC |grep 'inet ' |awk '{print $2}') MASK=$(ifconfig $NIC |grep 'inet ' |awk '{print $4}') else IP=$(ifconfig $NIC |grep 'inet addr' |awk '{print $2}'|sed -e "s/addr\://") MASK=$(ifconfig $NIC |grep 'inet addr' |awk '{print $4}'|sed -e "s/Mask\://") fi IP1=$(echo $IP |awk -F'.' '{print $1}') if [ "$IP1" = "" ]; then echo "" echo "Warning: there is no IP found on $NIC." echo "Action is aborted." echo "Please make sure the interface is setup properly, then try again." echo "" exit 1 else IP2=$(echo $IP |awk -F'.' '{print $2}') IP3=$(echo $IP |awk -F'.' '{print $3}') IP4=$(echo $IP |awk -F'.' '{print $4}') MASK1=$(echo $MASK |awk -F'.' '{print $1}') MASK2=$(echo $MASK |awk -F'.' '{print $2}') MASK3=$(echo $MASK |awk -F'.' '{print $3}') MASK4=$(echo $MASK |awk -F'.' '{print $4}') let NET1="$IP1 & $MASK1" let NET2="$IP2 & $MASK2" let NET3="$IP3 & $MASK3" let NET4="$IP4 & $MASK4" NET="$NET1.$NET2.$NET3.$NET4" fi } done } ##### 變數設定 KVERSION="/lib/modules/$(uname -r)/kernel/net" HI="1024:65535" ###### 外部網段 netinfo "$EXT_IF" EXT_IP="$IP" EXT_NET="$NET"/"$MASK" ####### 內部網段 netinfo "$INT_IF" INT_IP="$IP" INT_NET="$NET"/"$MASK" ###### 載入相關模阻 for file in $KVERSION/ipv4/netfilter/ip_*.* do module=$(basename $file) modprobe ${module%%.*} &>/dev/null done for file in $KVERSION/ipv4/netfilter/nf_*.* do module=$(basename $file) modprobe ${module%%.*} &>/dev/null done for file in $KVERSION/ipv4/netfilter/ipt*.* do module=$(basename $file) modprobe ${module%%.*} &>/dev/null done for file in $KVERSION/netfilter/nf*.* do module=$(basename $file) modprobe ${module%%.*} &>/dev/null done for file in $KVERSION/netfilter/xt_*.* do module=$(basename $file) modprobe ${module%%.*} &>/dev/null done ####### 啟動所有介面的來源 IP 查核 if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ] then for f in /proc/sys/net/ipv4/conf/*/rp_filter do echo "1" > $f done fi #### 啟動 IP 轉送 echo 1 > /proc/sys/net/ipv4/ip_forward ########## 設定核心的安全相關參數 #### 忽略發送至廣播位址的 PING 封包,以防內部電腦被當成 DDoS 攻擊的工具。 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts #### 忽略無效或錯誤的 ICMP 封包。 echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses #### 關閉 PING 的回應 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all #### 阻擋來源路由封包,以防止入侵者藉由偽裝的方式入侵。 echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route #### 阻擋 ICMP Redirect 封包 (路由器通知主機更改路由表的封包),以防靜態路由表被竄改。 echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects #### 禁止送出 ICMP Redirect 封包,避免內部電腦被當成入侵的工具。 echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects #### 開啟核心逆向過濾功能 (Reverse Path Filtering),以過濾不可能出現在某個網路介面的封包。 echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter #### 使用 SYN cookes 功能,防止超量攻擊。 echo 1 > /proc/sys/net/ipv4/tcp_syncookies ########## 縮短 TCP 連線的重試次數與逾時時間,以減少 DoS 攻擊的危害 echo 3 > /proc/sys/net/ipv4/tcp_retries1 echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout echo 1400 > /proc/sys/net/ipv4/tcp_keepalive_time echo 0 > /proc/sys/net/ipv4/tcp_window_scaling echo 0 > /proc/sys/net/ipv4/tcp_sack echo 0 > /proc/sys/net/ipv4/tcp_timestamps ###### 重導 www 請求至 Squid (透過代理伺服器) ###### 這樣可以強迫使用者使用 Proxy 而不必修改 Client 端設定 if [ "$INT_IF" != "$EXT_IF" ] ; then CHK_SQUID=$(/etc/rc.d/init.d/squid status 2>/dev/null | grep pid) if [ -n "$CHK_SQUID" ]; then echo "開啟 proxy 對外連線" INT_IP=$(ifconfig | grep $INT_IF -A 1 | awk '/inet/ {print $2}' | sed -e s/addr\://) if [ -z "$INT_IP" ]; then echo echo "$(basename $0): there is no IP found on $INT_IF." echo " Please make sure $INT_IF is setup properly." echo exit 3 fi # iptables -t nat -A PREROUTING -i $INT_IF -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128 $FW_CMD --zone=external --add-forward-port=port=80:proto=tcp:toport=3128 fi fi ####### 啟動內部對外轉址 if [ "$INT_IF" != "$EXT_IF" ] ; then $FW_CMD --direct --add-rule ipv4 nat POSTROUTING 0 -o $EXT_IF -j MASQUERADE $FW_CMD --direct --add-rule ipv4 filter FORWARD 0 -i $INT_IF -o $EXT_IF -j ACCEPT $FW_CMD --direct --add-rule ipv4 filter FORWARD 0 -i $EXT_IF -o $INT_IF -m state --state RELATED,ESTABLISHED -j ACCEPT fi ######################################################### ################### 各種允許的範例 ###################### ######################################################### ###VPN PPTPD $FW_CMD --zone=external --add-port=1723/tcp $FW_CMD --zone=external --add-rich-rule='rule protocol value="47" accept' ######################################################### ################### 各種限制的範例 ###################### ######################################################### ####### 允許相關連結服務 for SERVICE in $OPEN_SERVICE; do $FW_CMD --zone=external --add-service=$SERVICE $FW_CMD --zone=internal --add-service=$SERVICE done for PORT_TCP in $OPEN_PORT_TCP; do $FW_CMD --zone=external --add-port=$PORT_TCP/tcp $FW_CMD --zone=internal --add-port=$PORT_TCP/tcp done for PORT_UDP in $OPEN_PORT_UDP; do $FW_CMD --zone=external --add-port=$PORT_UDP/udp $FW_CMD --zone=internal --add-port=$PORT_UDP/udp done ###### NAT部份對外網路轉址:eth0 IP位址:x.x.x.x if [ "$NAT_IP" != "" ]; then clear echo "您已開啟對內轉址,IP:$NAT_IP" for NAT in $NAT_PORT; do # iptables -t nat -A PREROUTING -p tcp -d $EXT_IP --dport $NAT -j DNAT --to-destination $NAT_IP:$NAT $FW_CMD --zone=external --add-forward-port=port=22:proto=tcp:toport=22:toaddr=192.168.1.10 echo "外部IP=$EXT_IP PORT:$NAT ---------------> 轉內部IP=$NAT_IP PORT:$NAT" done fi #iptables -t nat -A PREROUTING -p tcp -d $EXT_IP -j DNAT --to-destination $NAT_IP exit 0 #$FW_CMD --reload