Linux實用iptables腳本

有一段時間木有回來寫博客了,最近比較忙又或者是本人不是太習慣寫作,這次趁着空閒特上來寫一次博客,這次回來主要是這段時間要弄一些基本的防禦,能抵禦輕量級的***,所以特寫個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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章