Iptables-芝麻开门
端口碰撞
端口容易破解,因为一般探测器都是扫描端口,而ping很少用,所以用ping会保险一点,所以其实是包大小碰撞。
包大小碰撞
包大小算法
# 潜在问题:以太网mtu(最大传输单元)=1500,某些网络可能不支持ping大于1500的包
# 切片,滑动窗口实现数据传输
# https://zh.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E4%BC%A0%E8%BE%93%E5%8D%95%E5%85%83
# From 172.31.32.1 icmp_seq=1 Frag needed and DF set (mtu = 1500)
# 指定数据包78字节,包含IP头部20字节,ICMP头部8字节。所以:实际数据大小为50个字节
# length = 包大小 + 28字节
# ping -c 1 -w 1 -s 50 host # Linux下解锁
# ping -n 1 -l 50 host # Windows下解锁
防火墙规则
#!/bin/bash
# 参考:
# https://huangjunwen.github.io/post/2016/port-knocking-using-iptables/
# https://datahunter.org/iptables_recent_connlimit_limit
# 测试 三组随机大小:21660 32838 6191
# length对应的值为:21688 32866 6219
# Windows下解锁,必须按照顺序执行下面的命令
# ping -n 1 -l 21660 10.0.26.26
# ping -n 1 -l 32838 10.0.26.26
# ping -n 1 -l 6191 10.0.26.26
LENGTH1=21688
LENGTH2=32866
LENGTH3=6219
# reset firewall
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# create new chains used by port knocking
iptables -N KNOCKING
iptables -N GATE1
iptables -N GATE2
iptables -N GATE3
iptables -N PASSED
# accept current connections (keep current SSH connections)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# accept local machine's connection
iptables -A INPUT -i lo -j ACCEPT
# accept http/https or other exported services
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# company ip
iptables -A INPUT -s 10.0.26.28 -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# now pass all other to the KNOCKING chain
iptables -A INPUT -j KNOCKING
# KNOCKING dispatch
# 一小时内可以登录PASSED链路内的规则
# --rcheck替换成--update参数则可以每次建立连接的时候更新时间戳,也就是说有效期是:最后一次连接时间+1小时
# 时间戳具体位置:/proc/net/xt_recent/AUTH3下的last_seen
iptables -A KNOCKING -m recent --rcheck --seconds 3600 --name AUTH3 -j PASSED
# 碰撞数据有效期10s,防止暴力破解
iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH2 -j GATE3
iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH1 -j GATE2
iptables -A KNOCKING -j GATE1
# cat /proc/net/xt_recent/AUTH1 查看当前第一阶段匹配的ip列表
iptables -A GATE1 -p icmp --icmp-type 8 -m length --length ${LENGTH1} -m recent --set --name AUTH1 -j DROP
iptables -A GATE1 -j DROP
# allow $LENGTH1 duplication 不允许包大小重复
iptables -A GATE2 -p icmp --icmp-type 8 -m length --length ${LENGTH1} -j DROP
# 删除进入此流程的上一个状态,以免出现不按照顺序发包,任然可以芝麻开门的效果(容易被暴力破解)
iptables -A GATE2 -m recent --name AUTH1 --remove
# cat /proc/net/xt_recent/AUTH2 查看当前第一阶段匹配的ip列表
iptables -A GATE2 -p icmp --icmp-type 8 -m length --length ${LENGTH2} -m recent --set --name AUTH2 -j DROP
iptables -A GATE2 -j GATE1
# allow $LENGTH2 duplication 不允许包大小重复
iptables -A GATE3 -p icmp --icmp-type 8 -m length --length ${LENGTH2} -j DROP
iptables -A GATE3 -m recent --name AUTH2 --remove
# cat /proc/net/xt_recent/AUTH3 查看最终可以通行的ip列表
iptables -A GATE3 -p icmp --icmp-type 8 -m length --length ${LENGTH3} -m recent --set --name AUTH3 -j DROP
iptables -A GATE3 -j GATE1
# allow $LENGTH3 duplication 不允许包大小重复
iptables -A PASSED -p icmp --icmp-type 8 -m length --length ${LENGTH3} -j DROP
# 芝麻开门后,这里可以定义多个可以访问的端口
iptables -A PASSED -p tcp --dport 22 -j ACCEPT
iptables -A PASSED -p tcp --dport 3306 -j ACCEPT
iptables -A PASSED -j DROP
# NAT FORWARD 规则
# -A FORWARD -j KNOCKING
配置文件
:GATE1 - [0:0]
:GATE2 - [0:0]
:GATE3 - [0:0]
:KNOCKING - [0:0]
:PASSED - [0:0]
# 这个链路里面,没有匹配到的规则都会被DROP,所以需要将链路放置到合适的位置,通常放在最后会比较保险(必须放在公司访问的规则之后)
-A INPUT -j KNOCKING
-A GATE1 -p icmp -m icmp --icmp-type 8 -m length --length 21688 -m recent --set --name AUTH1 --rsource -j DROP
# 没有匹配的数据被DROP掉
-A GATE1 -j DROP
-A GATE2 -p icmp -m icmp --icmp-type 8 -m length --length 21688 -j DROP
-A GATE2 -m recent --remove --name AUTH1 --rsource
-A GATE2 -p icmp -m icmp --icmp-type 8 -m length --length 32866 -m recent --set --name AUTH2 --rsource -j DROP
-A GATE2 -j GATE1
-A GATE3 -p icmp -m icmp --icmp-type 8 -m length --length 32866 -j DROP
-A GATE3 -m recent --remove --name AUTH2 --rsource
-A GATE3 -p icmp -m icmp --icmp-type 8 -m length --length 6219 -m recent --set --name AUTH3 --rsource -j DROP
-A GATE3 -j GATE1
-A KNOCKING -m recent --rcheck --seconds 3600 --name AUTH3 --rsource -j PASSED
-A KNOCKING -m recent --rcheck --seconds 10 --name AUTH2 --rsource -j GATE3
-A KNOCKING -m recent --rcheck --seconds 10 --name AUTH1 --rsource -j GATE2
-A KNOCKING -j GATE1
-A PASSED -p icmp -m icmp --icmp-type 8 -m length --length 6219 -j DROP
-A PASSED -p tcp -m tcp --dport 22 -j ACCEPT
-A PASSED -p tcp -m tcp --dport 3306 -j ACCEPT
# 没有匹配的数据被DROP掉
-A PASSED -j DROP
# NAT FORWARD 规则
# -A FORWARD -j KNOCKING
功能测试
# Windows下解锁
# 必须按照顺序执行下面的命令
ping -n 1 -l 21660 10.0.26.26
ping -n 1 -l 32838 10.0.26.26
ping -n 1 -l 6191 10.0.26.26
# 防火墙服务器上面查看最终可以通行的ip列表
cat /proc/net/xt_recent/AUTH3
src=10.0.26.28 ttl: 62 last_seen: 6806352133 oldest_pkt: 1 6806352133
参数优化
# 1、修改配置文件
vim /etc/modprobe.d/xt_recent.conf
options xt_recent ip_list_tot=20480 ip_pkt_list_tot=10
# 重新加载(防火墙需要重启)
/etc/init.d/iptables stop
# 重新加载
modprobe -r xt_recent
/etc/init.d/iptables start
# 查看是否生效
cat /sys/module/xt_recent/parameters/ip_list_tot
cat /sys/module/xt_recent/parameters/ip_pkt_list_tot
连接卡死
# 连接数据库有时候卡死
发现数据库客户端到nat服务器是建立连接的,但是nat到mysql server 没有连接
相关产品
- knockd
- 原文作者:zaza
- 原文链接:https://zazayaya.github.io/2020/10/19/iptables-lock-lock.html
- 说明:转载本站文章请标明出处,部分资源来源于网络,如有侵权请及时与我联系!