用nf_conntrack代替ipset搭建敲门验证程序

昨天晚上,杂耍了一个敲门服务:
https://blog.csdn.net/dog250/article/details/108479651

这里面的trick在于利用了TCP的重传特性:

  • 第一个把padding了认证数据,仅用于敲门,注定被丢弃。
  • 第二个重传包直接通过第一个敲门包敲开的大门,建立连接。

我在服务端使用的是ipset的方案,还是比较清晰的,我觉的不错。

早上起来,又思考了另一种方案,基于nf_conntrack来完成,毕竟我玩conntrack玩得那么熟,不拿出来杂耍两下子,总觉得虚度了时光。

千万别动不动就性能性能性能,在你功能都不知道怎么实现之前,说性能完全就是哗众取宠。使用conntrack是故意为之的,它是非常不错的东西。

很简单,服务器删除所有的ipset已经iptables规则,添加下面的即可:

# 使conntrack不再校验checksum,因为敲门包的checksum是故意错误的。
root@zhaoya-VirtualBox:/# sysctl -w net.netfilter.nf_conntrack_checksum=0
root@zhaoya-VirtualBox:/# iptables -t mangle -I PREROUTING -m conntrack --ctstatus CONFIRMED -j ACCEPT
root@zhaoya-VirtualBox:/# iptables -t mangle -A PREROUTING -p tcp --dport 22  -m string --string "skinshoe" --algo bm -j ACCEPT
root@zhaoya-VirtualBox:/# iptables -t mangle -A PREROUTING -p tcp --dport 22  ! -s 192.168.56.1 -j DROP

# 下面我们监控conntrack条目,同时在192.168.56.110上发起敲门:
# - 记得加载padding.ko模块并设置正确的敲门字符串。
root@zhaoya-VirtualBox:/# conntrack -E -p tcp
    [NEW] tcp      6 120 SYN_SENT src=192.168.56.110 dst=192.168.56.101 sport=50314 dport=22 [UNREPLIED] src=192.168.56.101 dst=192.168.56.110 sport=22 dport=50314
 [UPDATE] tcp      6 60 SYN_RECV src=192.168.56.110 dst=192.168.56.101 sport=50314 dport=22 src=192.168.56.101 dst=192.168.56.110 sport=22 dport=50314
 [UPDATE] tcp      6 432000 ESTABLISHED src=192.168.56.110 dst=192.168.56.101 sport=50314 dport=22 src=192.168.56.101 dst=192.168.56.110 sport=22 dport=50314 [ASSURED]

很容易理解:

  • 把NF的PREROUTING到INPUT想象成一道门。
  • 第一个被padding的SYN敲门包负责穿过conntrack,IP层被confirm,TCP层被丢弃,成功敲开门。
  • 第二个重传的原始SYN包直接在mangle表被ACCEPT,穿过IP层,在TCP层建立连接。

浙江温州皮鞋湿,下雨进水不会胖。

你可能感兴趣的:(nf_conntrack)