有一段時間木有回來寫博客了,最近比較忙又或者是本人不是太習慣寫作,這次趁着空閒特上來寫一次博客,這次回來主要是這段時間要弄一些基本的防禦,能抵禦輕量級的***,所以特寫個iptables的腳本,如有不好的地方,見諒,不廢話了,直接上代碼:
#!/bin/bash # # 適用於Web等服務的Linux iptables防火牆腳本。 # 根據網上的一些腳本整理而來 # # # 注意1:該腳本需要根據實際情況修改後才能使用。 # 注意2:如果需要開發ftp服務,僅僅開放TCP20,21端口是不夠的,必須加載ip_conntrack_ftp以及ip_nat_ftp。 # 方法是修改/etc/sysconfig/iptables-config, 增加/修改爲以下一行內容: # IPTABLES_MODULES="ip_conntrack_ftp ip_nat_ftp" # ############## # 可信任的主機或者網段 ############## TRUSTHOSTS=( "10.0.0.0/8" "xxx.xxx.xxx.xxx" ) ############## # 只開放給可信任主機的管理用端口 ############## ADMIN_TCP_PORTS="22,3306" ############## # 對公網開放的服務端口 ############## SERVICE_TCP_PORTS="22,20,21,25,80,443" SERVICE_UDP_PORTS="53" ############## # 清空原來的iptables設置 ############## iptables -F iptables -X ############## # 設置默認規則 # 通常INPUT及FORWARD設爲DROP,OUTPUT設置爲ACCEPT就足夠了 # 極端情況下,可以將OUTPUT也設置成默認DROP。然後針對OUTPUT逐條增加過濾規則 ############## iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT ############## # 允許lo, PING, 以及所有內部發起的訪問 ############## iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -p icmp -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT ############## # 允許可信任主機訪問管理端口 ############## for TRUSTHOST in ${TRUSTHOSTS[@]} do iptables -A INPUT -p tcp -j ACCEPT -m multiport --dport $ADMIN_TCP_PORTS -s $TRUSTHOST done ############## # 放開TCP及UDP服務端口 ############## iptables -A INPUT -p tcp -j ACCEPT -m multiport --dport $SERVICE_TCP_PORTS iptables -A INPUT -p udp -j ACCEPT -m multiport --dport $SERVICE_UDP_PORTS ####################### # 防止DDOS***:Ping of Death ####################### iptables -N PING_OF_DEATH iptables -A PING_OF_DEATH -p icmp --icmp-type echo-request \ -m hashlimit \ --hashlimit 1/s \ --hashlimit-burst 10 \ --hashlimit-htable-expire 300000 \ --hashlimit-mode srcip \ --hashlimit-name t_PING_OF_DEATH \ -j RETURN iptables -A PING_OF_DEATH -j LOG --log-prefix "ping_of_death_attack: " iptables -A PING_OF_DEATH -j DROP iptables -A INPUT -p icmp --icmp-type echo-request -j PING_OF_DEATH #爲了防止DOS太多連接進來,那麼可以允許最多15個初始連接,超過的丟棄 iptables -A INPUT -s 192.186.0.0/24 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP #爲了防止DOS太多連接進來,那麼可以允許最多15個初始連接,超過的丟棄 iptables -A INPUT -p icmp -m limit --limit 3/s -j LOG --log-level INFO --log-prefix "ICMP packet IN: " iptables -A INPUT -p icmp -j DROP ####################################################################### sysctl -w net.ipv4.ip_forward=1 &>/dev/null #打開轉發 ####################################################################### sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null #打開 syncookie (輕量級預防 DOS ***) sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &>/dev/null #設置默認 TCP 連接癡呆時長爲 3800 秒(此選項可以大大降低連接數) sysctl -w net.ipv4.ip_conntrack_max=300000 &>/dev/null #設置支持最大連接樹爲 30W(這個根據你的內存和 iptables 版本來,每個 connection 需要 300 多個字節) ####################### # 防止DDOS***:SYN FLOOD ####################### iptables -N SYN_FLOOD iptables -A SYN_FLOOD -p tcp --syn \ -m hashlimit \ --hashlimit 200/s \ --hashlimit-burst 3 \ --hashlimit-htable-expire 300000 \ --hashlimit-mode srcip \ --hashlimit-name t_SYN_FLOOD \ -j RETURN iptables -A SYN_FLOOD -j LOG --log-prefix "syn_flood_attack: " iptables -A SYN_FLOOD -j DROP iptables -A INPUT -p tcp --syn -j SYN_FLOOD ####################### # 防止DDOS***:stealth scan ####################### iptables -N STEALTH_SCAN iptables -A STEALTH_SCAN -j LOG --log-prefix "stealth_scan_attack: " iptables -A STEALTH_SCAN -j DROP iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags ALL NONE -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j STEALTH_SCAN iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j STEALTH_SCAN service iptables save