我有以下 iptables 日志:
May 13 17:29:20 Test: IN=eth0 LEN=60 TOS=0x00 PREC=0x00 TTL=56 ID=0 DF PROTO=TCP SPT=80 DPT=40660 WINDOW=14480 RES=0x00 ACK SYN URGP=0
May 13 17:29:20 Test: IN=eth0 LEN=52 TOS=0x00 PREC=0x00 TTL=56 ID=59083 DF PROTO=TCP SPT=80 DPT=40660 WINDOW=114 RES=0x00 ACK URGP=0
May 13 17:29:23 Test: IN=eth0 LEN=270 TOS=0x00 PREC=0x00 TTL=56 ID=59084 DF PROTO=TCP SPT=80 DPT=40660 WINDOW=114 RES=0x00 ACK PSH URGP=0
May 13 17:29:23 Test: IN=eth0 LEN=52 TOS=0x00 PREC=0x00 TTL=56 ID=59085 DF PROTO=TCP SPT=80 DPT=40660 WINDOW=114 RES=0x00 ACK FIN URGP=0
我使用以下 iptables 规则,当到达第三个数据包(长度为 270)时断开连接:
iptables -A INPUT -m length --length 270 -j REJECT
我做了一些测试,发现如果第一个数据包(tcp SYN数据包)通过我的防火墙,连接就不会很紧密。
有没有办法在检查第三个数据包的长度后拒绝第一个数据包?
谢谢你!
答案1
使用此规则,您仅阻止符合条件(输入,270 长度)的数据包,--syn 数据包已建立连接,因此所有长度小于 270 的后续数据包都将被允许。
所以,“检查第三个数据包的长度后拒绝第一个数据包”不可能,连接已经存在。
但,“丢弃或拒绝整个连接”似乎有可能:)
1). 记录IP地址:
iptables -A INPUT -m length --length 270 -j LOG --log-prefix "my_firewall:bad_connection" --log-ip-options
此规则必须位于带有 REJECT 目标的规则之前。
2). 通过 cron 读取日志并使用tcpkill用于终止连接:
tcpkill host 111.222.333.444