iptables - synproxy 目标不将数据包标记为无效

iptables - synproxy 目标不将数据包标记为无效

我正在编写 iptables 规则,在防止 SYN 泛洪方面遇到了问题。我发现 synproxy 应该是正确的解决方案。但在测试时,我发现它不会将数据包标记为无效,因此 iptables 规则不会丢弃它。

$iptables -t raw    -A PREROUTING -p tcp -m tcp -m multiport --dports 25,80,443,587 --syn -j  CT --notrack  
$iptables -t filter -A INPUT      -p tcp -m tcp -m multiport --dports 25,80,443,587 -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
$iptables -t filter -A INPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "IPTABLES=INVALID "                                                                
$iptables -t filter -A INPUT -m conntrack --ctstate INVALID -j DROP
$iptables -A INPUT -j LOG --log-prefix "IPTABLES=PASS "

正如我正确理解的那样,synproxy 目标应该为所有未创建三向握手的数据包设置无效状态,但是当我使用hping3 -c 10000 -d 120 -S -w 64 -p 80 --flood --rand-source 192.168.0.50数据包时,它们被记录为 PASS 而不是 INVALID。

我还向 sysctl 添加了更严格的连接跟踪,这对于将 ACK 数据包(来自 3WHS)标记为 INVALID 状态是必要的。

/etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_loose = 0
net.ipv4.tcp_timestamps = 1

我用的是这个博客文章了解发生了什么。但我无能为力。

有人能指出我做错什么了吗?

iptables -nvL
Chain PREROUTING (policy ACCEPT 69965 packets, 9252K bytes)
 pkts bytes target     prot opt in     out     source               destination
38184 6109K CT         tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0 tcp dpt:80 flags:0x17/0x02 NOTRACK

Chain INPUT (policy DROP 98 packets, 4346 bytes)
 pkts bytes target     prot opt in     out     source               destination
34063 5450K SYNPROXY   tcp  --  !lo    *       0.0.0.0/0            0.0.0.0/0            tcp multiport dports 25,80,150,443,587 ctstate INVALID,UNTRACKED SYNPROXY sack-perm t imestamp wscale 7 mss 1460
    0     0 LOG        all  --  !lo    *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID LOG flags 0 level 4 prefix "IPTABLES=INVALID1 "
    0     0 DROP       all  --  !lo    *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID

答案1

SYNPROXY 似乎运行正常,它不会将数据包标记为无效,而是立即在 SYNPROXY 目标处丢弃它们。这就是我看不到无效数据包的原因。

很奇怪,因为之前 hping 禁用了我的操作系统,我不得不重新启动它,但现在一切都正常了。也许是因为我没有打开永久的 sysctl 设置,谁知道呢。

相关内容