我有两个 Ubuntu 盒子,A 和 B。
A 正在启动与 B 的 TCP 连接。
我希望 A 的 TCP SYN 数据包能够到达 B,但是当 B 的 SYN/ACK 回复数据包返回到 A 时,我希望 A 的防火墙丢弃它。
实现这一目标最简单的方法是什么?
答案1
以下 iptables 规则将删除来自主机 A 的 ACK:
iptables -A INPUT -s ip.of.host.a/32 --protocol tcp --tcp-flags ACK ACK -j DROP
--tcp-flags
在手册页中有记录iptables-扩展:
[!] --tcp-flags mask comp 当 TCP 标志符合指定条件时匹配。第一个参数 mask 是我们应该检查的标志,以逗号分隔的列表形式写出,第二个参数 comp 是必须设置的标志的逗号分隔列表。标志包括:SYN ACK FIN RST URG PSH ALL NONE。因此,命令
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN will only match packets with the SYN flag set, and the ACK, FIN and RST flags unset.