我有以下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
我做了一些testing,看到如果第一个数据包在我的防火墙(一个TCP SYN数据包)中传递,连接是不是真的closures。
检查第三个数据包的长度后,有没有办法拒绝第一个数据包?
谢谢!
使用这个规则你只阻塞符合条件的数据包(input,长度为270), – 数据包已build立连接,所有下一个长度小于270的数据包将被允许。
因此, “检查第三个数据包的长度后拒绝第一个数据包”是不可能的,连接已经存在。
但是, “放弃或拒绝整个连接”似乎是可能的:)
1)。 loggingIP地址:
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