【筆記整理】Iptables網路連線限制及攻擊防護和相關設定
1. 限制每個IP連接HTTP最大併發50個連接數
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
2. 限制每個IP同時最多100個連接數
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT
or
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit ! --connlimit-above 100 -j ACCEPT
3. 限制每組C Class IP同時最多100個連接數
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 --connlimit-mask 24 -j REJECT
4. 限制每個IP同時5個80 port轉發,超過的丟棄
iptables -I FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j DROP
5. 限制每個IP在60秒內允許新建立30個連接數
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30
-j REJECT
6. (By CentOS 5.x)調整ipt_recent參數,記錄1000個IP,每個IP記錄60個封包
vim /etc/modprobe.conf
options ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60
完成後執行
modprobe ipt_recent
7. 每秒最多允許5個新連接封包數
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT
8. 防止各種端口掃描
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -m limit --limit 1/s -j ACCEPT
9. Ping of Death
iptables -A INPUT -p icmp --icmp-type echo_request -m limit --limit 1/s -j ACCEPT
10. NMAP FIN/URG/PSH
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j LOG --log-level warn
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
11. Xmas Tree
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j LOG --log-level warn
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
12. Another Xmas Tree
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG --log-level warn
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
13. Null Scan(possibly)
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j LOG --log-level warn
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
14. SYN/RST
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST SYN,RST -j LOG --log-level warn
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST SYN,RST -j DROP
15. SYN/FIN --Scan(possibly)
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN SYN,FIN -j LOG --log-level warn
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN SYN,FIN -j DROP
16. Prevent Sync Flood (New Chain:SYNFLOOD)
iptables -N SYNFLOOD
iptables -A SYNFLOOD -p tcp --syn -m limit --limit 1/s -j RETURN
iptables -A SYNFLOOD -p tcp -j LOG --log-level alert
iptables -A SYNFLOOD -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state NEW -j SYNFLOOD
17. Prevent Ping Flood ATTACK (New Chain:PING)
iptables -N PING
iptables -A PING -p icmp --icmp-type echo-request -m limit --limit 1/s -j RETURN
iptables -A PING -p icmp -j LOG --log-level alert
iptables -A PING -p icmp -j REJECT
iptables -A INPUT -p icmp --icmp-type echo-request -m state --state NEW -j PING
18. SYN相關設定
sysctl -a | grep syn
vim /etc/sysctl.conf
net.ipv4.tcp_fin_timeout=10:減少處於FIN_WAIT2連接狀態時間
net.ipv4.tcp_keepalive_time=1800:減少TCP KeepAlive連接偵測時間
net.ipv4.tcp_window_scaling=0
net.ipv4.tcp_sack=0
net.ipv4.tcp_tw_recycle=1:表示開啟TCP連接中TIME_WAIT sockets的快速回收。默認為0,表示關閉
net.ipv4.tcp_tw_reuse=1:表示開啟重用,允許將TIME_WAIT sockets重新用於新的TCP連接
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_max_syn_backlog=4096:SYN隊列的長度
net.ipv4.tcp_syncookies=1:打開SYN Cookie,可防止部分攻擊
net.ipv4.tcp_synack_retries=1:定義SYNACK重試次數
net.ipv4.tcp_syn_retries=5:加大SYN隊列長度可容納更多等待連接的網路連接數
fs.quota.syncs=23
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.ip_contrack_max=524288
net.ipv4.netfilter.ip_conntrack_max=524288
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv=5
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent=15
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=108000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=3
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=3
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=3
sysctl -p /etc/sysctl.conf:套用更改過的sysctl.conf
註:上列有些參數不需要設定,或是數字可調整,依伺服器狀況而定。
19. 查詢目前各狀態連接數狀況
netstat -nat | awk '{print awk $NF}' | sort | uniq -c | sort -n
20. 查詢並自動封鎖目前連線數最大的前50個IP(請小心謹慎並記得調整Iptables Chain)
netstat -na | grep :80 |awk '{print $5}'|awk -F '::ffff:' '{print $2}' | grep ':'
| awk -F: '{print $1}' | sort | uniq -c | sort -r | awk -F' ' '{if ($1 > 50) print $2}'
| sed 's/^.*$/iptables -I firewall 1 -p tcp -s & --dport 80 --syn -j REJECT/' | sh
21. 增加例外白名單IP(我沒測試過)
netstat -na | grep :80 |awk '{print $5}'|awk -F '::ffff:' '{print $2}' | grep ':'
| awk -F: '{print $1}' | sort | uniq -c | sort -r | awk -F' ' '{if ($1 > 50) print $2}'
| grep -v xxx.xxx.xxx.xxx
| sed 's/^.*$/iptables -I RH-Firewall-1-INPUT 1 -p tcp -m tcp -s & --dport 80 --syn -j REJECT/' | sh
22. 查詢port 80目前的IP連接數
netstat -nat | grep ":80" | awk '{printf "%s %s ", $5, $6}' | awk -F: '{print $1}' | sort | uniq -c | sort -n