$ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: " $ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
丢弃或接受来自 Mac 地址的流量
1 2
$ iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP $ iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT
阻止或允许 ICMP Ping 请求
1 2
$ iptables -A INPUT -p icmp --icmp-type echo-request -j DROP $ iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
使用 multiport 指定多个端口
1
$ iptables -A INPUT -i eth0 -p tcp -m state --state NEW -m multiport --dports ssh,smtp,http,https -j ACCEPT
使用 random* 或 nth* 进行负载平衡
1
_ips=("172.31.250.10""172.31.250.11""172.31.250.12""172.31.250.13")for ip in"${_ips[@]}" ; do iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 0 \ -j DNAT --to-destination ${ip}:80done
or
1
_ips=("172.31.250.10""172.31.250.11""172.31.250.12""172.31.250.13")for ip in"${_ips[@]}" ; do iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25 \ -j DNAT --to-destination ${ip}:80done
使用 limit 和 iplimit* 限制连接数
1
$ iptables -A FORWARD -m state --state NEW -p tcp -m multiport --dport http,https -o eth0 -i eth1 -m limit --limit 20/hour --limit-burst 5 -j ACCEPT
or
1
$ iptables -A INPUT -p tcp -m state --state NEW --dport http -m iplimit --iplimit-above 5 -j DROP
维护要匹配的最近连接列表
1
$ iptables -A FORWARD -m recent --name portscan --rcheck --seconds 100 -j DROPiptables -A FORWARD -p tcp -i eth0 --dport 443 -m recent --name portscan --set -j DROP
匹配数据包数据负载中的 “string*”
1 2
$ iptables -A FORWARD -m string --string '.com' -j DROP $ iptables -A FORWARD -m string --string '.exe' -j DROP
$ iptables -N port-scanningiptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURNiptables -A port-scanning -j DROP
SSH 暴力破解保护
1
$ iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --setiptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
同步泛洪保护
1 2 3 4
$ iptables -N syn_floodiptables -A INPUT -p tcp --syn -j syn_floodiptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN $ iptables -A syn_flood -j DROPiptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j ACCEPT $ iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j LOG --log-prefix PING-DROP: $ iptables -A INPUT -p icmp -j DROPiptables -A OUTPUT -p icmp -j ACCEPT
使用 SYNPROXY 缓解 SYN 泛洪
1 2 3
$ iptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrack $ iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460 $ iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
阻止非 SYN 的新数据包
1
$ iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
或
1
$ iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
强制碎片数据包检查
1
$ iptables -A INPUT -f -j DROP
XMAS 包
1
$ iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
丢弃所有 NULL 数据包
1
$ iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
阻止不常见的 MSS 值
1
$ iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP
阻止带有虚假 TCP 标志的数据包
1 2 3 4 5 6 7 8 9 10 11 12 13
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP $ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP $ iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP $ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP $ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP $ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP $ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP $ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP $ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP $ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP $ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP $ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP $ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
阻止来自私有子网的数据包(欺骗)
1
_subnets=("224.0.0.0/3""169.254.0.0/16""172.16.0.0/12""192.0.2.0/24""192.168.0.0/16""10.0.0.0/8""0.0.0.0/8""240.0.0.0/5")for _sub in"${_subnets[@]}" ; do iptables -t mangle -A PREROUTING -s "$_sub" -j DROPdoneiptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP