#!/bin/bash #🌐 Website: https://www.jls.idv.tw & https://www.acfs.tw/ #🚢 Copyright (C) 2025 by 👶 JHENG, Liang-Sing 🕊️ (jls@jls.idv.tw & jls550225@gmail.com) # # A simple script for Firewall, used in Linux iptables Modules(kernel 2.4.x .&. 2.6.X .&. 3.x .&. 4.x ). # Update Date: 2021/05/14 支援各種 Linux # # Copyright (C) 2003 by CHENG, Liang-Hsing (jls@mail.jls.idv.tw & jls@acfs.tw). # Website: http://www.jls.idv.tw/ # Website: http://www.acfs.tw/ # # 以下Script如有任何錯誤或您有更好的設定 # 敬請您 E-Mail 來指正 謝謝 ! # PATH=/sbin:/usr/sbin:/bin:/usr/bin ########################################################################### ################## 此段請依個人需要自行設定 ############################### ########################################################################### ########## 設定內外網卡,請自行設定,要是用撥接請在外部網卡設ppp0 ##### 外部網卡 EXT_IF="eth0" ##### 要是只有一張網卡就設 INT_IF="eth0" 吧 ##### 內部網卡 INT_IF="eth0" ##### 想要對外開放的PORT (依個人需要,增加或減少) OPEN_PORT="20 21 22 25 53 80 110 113 123 143 443 554 3128 8001 8002 8003 8004 8080 8765 9090 9980 10000 49152:65534" # OPEN_PORT="20 21 22 25 50 53 80 110 113 123 143 443 465 500 554 587 873 990 993 995 3128 3478 4500 5222 5269 5349 8001 8002 8003 8004 8080 8443 8765 8891 8989 9090 9980 10000" ##### NAT 內部IP (依個人需要,如無需要請設為 NAT_IP="" ) NAT_IP="" if [ "$NAT_IP" != "" ]; then ##### 想要對 NAT 開放的 PORT (依個人需要,增加或減少) NAT_PORT="20 21 22 25 53 80 110 113 143 443 3128 10000 12000" fi if [ "$INT_IF" != "$EXT_IF" ]; then ##### 不想要對內部開放的 PORT (依個人需要,增加或減少,如無需要請設為 DROP_PORT="" ) DROP_PORT="" fi ##### 丟棄蠕蟲對80埠的請求(依個人需要,增加) #CHK_STRING="cmd.exe default.ida robots.txt scripts msadc MSADC _vti_bin _mem_bin root.exe" ##### 對於攻擊您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" HD_DEV="hda hdb hdc hdd" ###### 外部網段 netinfo "$EXT_IF" EXT_IP="$IP" EXT_NET="$NET"/"$MASK" ####### 內部網段 netinfo "$INT_IF" INT_IP="$IP" INT_NET="$NET"/"$MASK" ####### HD Ata 66 #if [ -f "/proc/scsi/scsi" ] && [ "`cat /proc/scsi/scsi`" != "Attached devices: none" ]; then # echo "為 SCSI 介面" #else # CHK_HDPARM=$(which hdparm 2>/dev/null) # if [ -n "$CHK_HDPARM" ]; then # ######起動 HD ATA 66 # echo "啟動 HD ATA 66" # #################### # for HD in $HD_DEV; do # hdparm -d1 -c3 -k1 /dev/$HD 2>/dev/null # done # fi #fi ###### 載入相關模阻 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 ###### 關閉 ipchains CHK_IPCHAINS=$(which ipchains 2>/dev/null) CHK_IPCHAINS_M=$(lsmod | grep ipchains) if [ -n "$CHK_IPCHAINS" ] && [ -n "$CHK_IPCHAINS_M" ]; then echo "Disabling ipchains..." /etc/rc.d/init.d/ipchains stop &>/dev/null || ipchains -F &>/dev/null rmmod ipchains fi ####### 檢查 iptables 是否啟動 CHK_IPTABLES=$(which iptables 2>/dev/null) if [ -z "$CHK_IPTABLES" ]; then echo echo "$(basename $0): iptables program is not found." echo " Please install the program first." echo exit 1 fi ###### 重新設定 iptables -F iptables -X iptables -F -t filter iptables -X -t filter iptables -Z -t filter iptables -F -t nat iptables -X -t nat iptables -Z -t nat iptables -F -t mangle iptables -X -t mangle ###### 預設全部關閉 iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP ###### 將lo 的部份打開 iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT ###### 將內部的通訊打開 if [ "$INT_IF" != "$EXT_IF" ] ; then iptables -A INPUT -i $INT_IF -j ACCEPT iptables -A OUTPUT -o $INT_IF -j ACCEPT iptables -A FORWARD -i $INT_IF -j ACCEPT iptables -A FORWARD -o $INT_IF -j ACCEPT else iptables -A INPUT -s $INT_NET -j ACCEPT iptables -A OUTPUT -s $INT_NET -j ACCEPT iptables -A FORWARD -s $INT_NET -j ACCEPT fi ####### 啟動所有介面的來源 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 ####### 記錄所有PING的LOG iptables -A INPUT -p icmp -j LOG ####### 記錄所有Firewall的LOG # iptables -A INPUT -j LOG --log-prefix "Firewall Log " ######## 防止 Ping of Death iptables -N icmpfilter iptables -A icmpfilter -i $EXT_IF -p icmp --icmp-type echo-request -j DROP iptables -A icmpfilter -i $EXT_IF -p icmp --icmp-type echo-reply -j ACCEPT iptables -A icmpfilter -i $EXT_IF -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A icmpfilter -i $EXT_IF -p icmp --icmp-type parameter-problem -j ACCEPT iptables -A icmpfilter -i $EXT_IF -p icmp --icmp-type source-quench -j ACCEPT iptables -A icmpfilter -i $EXT_IF -p icmp --icmp-type time-exceeded -j ACCEPT iptables -A icmpfilter -i $EXT_IF -p icmp --icmp-type fragmentation-needed -j ACCEPT iptables -A INPUT -i $EXT_IF -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT iptables -A OUTPUT -m state -p icmp --state INVALID -j DROP iptables -A OUTPUT -p icmp -s $EXT_IP --icmp-type 8 -d any/0 -j ACCEPT iptables -A INPUT -p icmp -s any/0 --icmp-type 0 -d $EXT_IP -j ACCEPT ######## 過瀘 # iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j Drop # iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j Drop # iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j Drop # iptables -A INPUT -p tcp --tcp-flags SYN,SYN --dport 80 -j Drop iptables -N block iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A block -m state --state NEW ! -i $EXT_IF -j ACCEPT iptables -A INPUT -j icmpfilter iptables -A INPUT -j block iptables -A FORWARD -j icmpfilter iptables -A FORWARD -j block ######## 防止 sync flood 攻擊的設定 iptables -N synfoold iptables -A synfoold -p tcp --syn -m limit --limit 55/s -j RETURN iptables -A synfoold -p tcp -j REJECT --reject-with tcp-reset iptables -A INPUT -p tcp -m state --state NEW -j synfoold iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP ######## 防止 SSL 攻擊 iptables -t nat -A OUTPUT -p tcp --sport 1000:3000 --dport 443 -j REDIRECT --to-port 10000 ######## 防止惡意掃描 iptables -A INPUT -i $EXT_IF -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP iptables -A INPUT -i $EXT_IF -p tcp --tcp-flags ALL ALL -j DROP iptables -A INPUT -i $EXT_IF -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP iptables -A INPUT -i $EXT_IF -p tcp --tcp-flags ALL NONE -j DROP iptables -A INPUT -i $EXT_IF -p tcp --tcp-flags SYN,RST SYN,RST -j DROP iptables -A INPUT -i $EXT_IF -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP iptables -A INPUT -i $EXT_IF -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 6/m -j ACCEPT ######## disable been scaned iptables -N tcp_packets iptables -A tcp_packets -p TCP --tcp-flags ALL FIN,URG,PSH -j LOG --log-prefix "been scanned:" iptables -A tcp_packets -p TCP --tcp-flags ALL ALL -j LOG --log-prefix "been scanned:" iptables -A tcp_packets -p TCP --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG --log-prefix "been scanned:" iptables -A tcp_packets -p TCP --tcp-flags ALL NONE -j LOG --log-prefix "been scanned:" iptables -A tcp_packets -p TCP --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix "been scanned:" iptables -A tcp_packets -p TCP --tcp-flags SYN,FIN SYN,FIN -j LOG --log-prefix "been scanned:" iptables -A tcp_packets -p TCP --tcp-flags ALL FIN,URG,PSH -j DROP iptables -A tcp_packets -p TCP --tcp-flags ALL ALL -j DROP iptables -A tcp_packets -p TCP --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP iptables -A tcp_packets -p TCP --tcp-flags ALL NONE -j DROP iptables -A tcp_packets -p TCP --tcp-flags SYN,RST SYN,RST -j DROP iptables -A tcp_packets -p TCP --tcp-flags SYN,FIN SYN,FIN -j DROP iptables -A FORWARD -p tcp -j tcp_packets #####L2TP/IPsec VPN iptables -A INPUT -p esp -j ACCEPT iptables -A OUTPUT -p esp -j ACCEPT iptables -A INPUT -p ah -j ACCEPT iptables -A OUTPUT -p ah -j ACCEPT iptables -A INPUT -p udp --dport 500 -j ACCEPT iptables -A INPUT -p udp --dport 4500 -j ACCEPT iptables -A OUTPUT -p udp --dport 500 -j ACCEPT iptables -A OUTPUT -p udp --dport 4500 -j ACCEPT iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT #####PPTPD VPN iptables -A INPUT -p tcp --dport 1723 -j ACCEPT iptables -A OUTPUT -p tcp --sport 1723 -j ACCEPT iptables -A INPUT -p gre -j ACCEPT iptables -A OUTPUT -p gre -j ACCEPT ######## 丟棄蠕蟲對 80 PORT 請求 #if [ -f "/lib/iptables/libipt_string.so" ]; then # for STRING in $CHK_STRING; do # iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --string $STRING ######每小時只記錄一條這樣的資訊: # iptables -I INPUT -j LOG -p tcp -s 0.0.0.0/0 -m string --string $STRING -m limit --limit 1/hour # done #fi ##### 對於攻擊您Server的IP給予拒絕 if [ -f $INPUT_IP ] ; then DROP_IP=$(cat $INPUT_IP) for DROPIP in $DROP_IP; do iptables -I INPUT -s $DROPIP -j DROP done fi ###### 自訂 allowed 這個 chain 來處理 允許進入的 tcp 連線 ###### 凡 tcp_packets 中的 chain rule 目的是某些欲開放的 port 者, ###### 則跳至此一 allowed chain 來處理. iptables -N allowed iptables -A allowed -p TCP --syn -j ACCEPT iptables -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A allowed -p TCP -j DROP iptables -A tcp_packets -p TCP -s 0/0 --dport 1024:65535 -j allowed for PORT in $OPEN_PORT; do iptables -A tcp_packets -p TCP -s 0/0 --dport $PORT -j allowed done ###### 對於主動連線或者是不合法連線,一律通通拒絕掉 iptables -A INPUT -i $EXT_IF -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i $EXT_IF -m state --state NEW,INVALID -j DROP ###### 重導 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 fi fi ####### 啟動內部對外轉址 if [ "$INT_IF" != "$EXT_IF" ] ; then iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -A POSTROUTING -o $INT_IF -j SNAT --to-source $INT_IP # iptables -t nat -A POSTROUTING -s $INT_NET -j SNAT --to-source $EXT_IP iptables -t nat -A POSTROUTING -o $EXT_IF -s $INT_NET -j MASQUERADE fi ####### 語音 (依個人需要) #iptables -A PREROUTING -t nat -p tcp -i $EXT_IF --dport 389 -j DNAT --to 192.168.1.100 #iptables -A PREROUTING -t nat -p tcp -i $EXT_IF --dport 522 -j DNAT --to 192.168.1.100 #iptables -A PREROUTING -t nat -p tcp -i $EXT_IF --dport 1503 -j DNAT --to 192.168.1.100 #iptables -A PREROUTING -t nat -p tcp -i $EXT_IF --dport 1720 -j DNAT --to 192.168.1.100 #iptables -A PREROUTING -t nat -p tcp -i $EXT_IF --dport 1731 -j DNAT --to 192.168.1.100 ####### 將封包偽裝出去 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT ######################################################### ################### 各種允許的範例 ###################### ######################################################### if [ -f $OUT_IP_MAC ] ; then CLIENTOUT_IP_MAC=$(cat $OUT_IP_MAC) iptables -I FORWARD -p all -s $INT_NET -j DROP for OUT_IP_MAC1 in $CLIENTOUT_IP_MAC; do IP_OUT=$(echo $OUT_IP_MAC1 |awk -F'=' '{print $1}') MAC_OUT=$(echo $OUT_IP_MAC1 |awk -F'=' '{print $2}') iptables -I FORWARD -s $IP_OUT -m mac --mac-source $MAC_OUT -j ACCEPT done else if [ -f $OUT_IP ] ; then CLIENTOUT_IP=$(cat $OUT_IP) iptables -I FORWARD -p all -s $INT_NET -j DROP for OUT_IP in $CLIENTOUT_IP; do iptables -I FORWARD -p all -s $OUT_IP -j ACCEPT done fi if [ -f $OUT_MAC ] ; then CLIENTOUT_MAC=$(cat $OUT_MAC) iptables -I FORWARD -p all -s $INT_NET -j DROP for OUT_MAC in $CLIENTOUT_MAC; do iptables -I FORWARD -m mac --mac-source $OUT_MAC -p all -j ACCEPT done fi fi ######################################################### ################### 各種限制的範例 ###################### ######################################################### ### -- 配合彰化縣OpenID作業,開放縣網存取部分資料 iptables -I INPUT -p tcp -s 163.23.200.2 --dport 3306 -j ACCEPT ###下面的規則是直接把所有的 p2p 封包擋下 #iptables -A FORWARD -m ipp2p --ipp2p -j DROP ######停止 USER 使用 MSN 聊天 #iptables -I FORWARD -p tcp -o $EXT_IF -d 207.46.104.20 -j DROP ######禁止連上facebook.com #iptables -I FORWARD -p all -o $EXT_IF -m string --string "www.facebook.com" -j DROP --algo bm ####### 單一USER的限制,只可連web 以IP為主(依個人需要) #iptables -I FORWARD -p all -s 他的IP -j DROP #iptables -I FORWARD -p tcp -s 他的IP --dport 80 -j ACCEPT ####### 單一USER的限制,只可連web 以網卡號碼為主(依個人需要) #iptables -I FORWARD -m mac --mac-source XX:XX:XX:XX:XX:XX -p all -j DROP #iptables -I FORWARD -m mac --mac-source XX:XX:XX:XX:XX:XX -p tcp --dport 80 -j ACCEPT ####### 限制對某IP之連線 #iptables -I FORWARD -d 202.1.237.21 -i $INT_IF -j DROP ####### 限制對內 224-254 範圍內 IP 對外連線 #iptables -I FORWARD -p all -s 192.168.2.192/26 -j DROP #iptables -I FORWARD -p all -s 192.168.2.224/27 -j DROP #iptables -I FORWARD -p all -s 192.168.2.240/28 -j DROP ####### 限制對內 IP 對外連線 #iptables -I FORWARD -p all -s 192.168.2.192 -j DROP ####### 限制對內 IP 對外連線(依照您所設時間為準,例:早上8點至下午5點都不能對外連線) #iptables -I FORWARD -p all -s 192.168.2.100 -d 0/0 -m time --timestart 08:00 --timestop 17:00 -j DROP ####### 阻擋指定的網卡號碼 (依個人需要) ####### 這是 Kernel 2.4 系列新功能,主要防止 Client 非法搶 IP #iptables -A INPUT -m mac --mac-source XX:XX:XX:XX:XX:XX -j DROP ####### 阻擋內部網卡號碼出去 (依個人需要) #iptables -I FORWARD -m mac --mac-source XX:XX:XX:XX:XX:XX -j DROP ####### 不允許非root帳號的封包連線到外部網路 #iptables -A OUTPUT -m owner ! --uid-owner 0 -j DROP ####### 允許相關連結服務 for PORT in $OPEN_PORT; do iptables -A INPUT -i $EXT_IF -p tcp --dport $PORT -j ACCEPT iptables -A INPUT -i $EXT_IF -p udp --dport $PORT -j ACCEPT iptables -A INPUT -p tcp --sport $HI -d $EXT_IP --dport $PORT -j ACCEPT iptables -A INPUT -p udp --sport $HI -d $EXT_IP --dport $PORT -j ACCEPT iptables -A OUTPUT -o $EXT_IF -p tcp --dport $PORT -j ACCEPT iptables -A OUTPUT -o $EXT_IF -p udp --dport $PORT -j ACCEPT iptables -A OUTPUT -p tcp --sport $HI -d $EXT_IP --dport $PORT -j ACCEPT iptables -A OUTPUT -p udp --sport $HI -d $EXT_IP --dport $PORT -j ACCEPT iptables -A FORWARD -i $EXT_IF -p tcp --dport $PORT -j ACCEPT iptables -A FORWARD -i $EXT_IF -p udp --dport $PORT -j ACCEPT iptables -A FORWARD -p tcp --sport $HI -d $EXT_IP --dport $PORT -j ACCEPT iptables -A FORWARD -p udp --sport $HI -d $EXT_IP --dport $PORT -j ACCEPT done ##### 不想要對內部開放 if [ "$INT_IF" != "$EXT_IF" ]; then if [ "$DROP_PORT" != "" ]; then for DROPPORT in $DROP_PORT; do iptables -I FORWARD -p tcp -i $INT_IF -m multiport --dport $DROPPORT -j DROP done fi fi iptables -A PREROUTING -t mangle -p tcp --dport 20 -j TOS --set-tos 8 iptables -A PREROUTING -t mangle -p tcp --dport 21 -j TOS --set-tos 16 iptables -A PREROUTING -t mangle -p tcp --dport 23 -j TOS --set-tos 16 iptables -A PREROUTING -t mangle -p tcp --dport 25 -j TOS --set-tos 8 iptables -A PREROUTING -t mangle -p tcp --dport 80 -j TOS --set-tos 16 iptables -A PREROUTING -t mangle -p tcp --dport 53 -j TOS --set-tos 8 iptables -A PREROUTING -t mangle -p udp --dport 53 -j TOS --set-tos 16 iptables -A PREROUTING -t mangle -p tcp --dport 110 -j TOS --set-tos 2 ###### 防止 DNS 攻擊 iptables -t raw -A PREROUTING -p udp --dport 53 -m string --algo bm --hex-string "|0000ff0001|" -j DROP ###### 防止 SSH POP3 IMAP 攻擊 iptables -I INPUT 1 -p tcp --dport 22 -m state --state NEW -m recent --name ssh --update --seconds 60 --hitcount 3 -j REJECT iptables -I INPUT 2 -p tcp --dport 22 -m state --state NEW -m recent --name ssh --set iptables -I INPUT 1 -p tcp --dport 110 -m state --state NEW -m recent --name pop3 --update --seconds 60 --hitcount 3 -j REJECT iptables -I INPUT 2 -p tcp --dport 110 -m state --state NEW -m recent --name pop3 --set iptables -I INPUT 1 -p tcp --dport 143 -m state --state NEW -m recent --name imap --update --seconds 60 --hitcount 3 -j REJECT iptables -I INPUT 2 -p tcp --dport 143 -m state --state NEW -m recent --name imap --set ###限制同一IP每秒ping的次數 #iptables -A INPUT -p icmp --icmp-type any -m recent --rcheck --seconds 1 --hitcount 1 --name PING_LOG --rsource -j DROP #iptables -A INPUT -p icmp --icmp-type any -m recent --set --name PING_LOG --rsource #iptables -A INPUT -p icmp --icmp-type any -j ACCEPT ###限制DNS同一IP的每秒查詢次數 #iptables -A INPUT -p udp --dport 53 -m recent --rcheck --seconds 1 --hitcount 10 --name NAMED_LOG --rsource -j DROP #iptables -A INPUT -p udp --dport 53 -m recent --set --name NAMED_LOG --rsource #iptables -A INPUT -p udp --dport 53 -j ACCEPT ###限制網頁服務同一IP的每秒Session連線數,可讓DoS攻擊的影響降到最低 #iptables -A INPUT -p tcp --dport 80 -m recent --rcheck --seconds 1 --hitcount 5 --name HTTP_LOG --rsource -j DROP #iptables -A INPUT -p tcp --dport 80 -m recent --set --name HTTP_LOG --rsource #iptables -A INPUT -p tcp --dport 80 -j ACCEPT ###POP3也常常會受到字典攻擊 #iptables -A INPUT -p tcp --dport 110 -m recent --rcheck --seconds 600 --hitcount 5 --name POP3_LOG --rsource -j DROP #iptables -A INPUT -p tcp --dport 110 -m recent --set --name POP3_LOG --rsource #iptables -A INPUT -p tcp --dport 110 -j ACCEPT ###### 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 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 ####### 啟動 IPv6 內部對外轉址 # ip6tables -t nat -I POSTROUTING -s fc01:192:168::/48 -j MASQUERADE exit 0