iptables
我在课程测试服务器上实施了以下规则。防火墙关闭,我无法访问端口 22。但是,按顺序敲入端口 1111、2222 和 3333 后,端口 22 应该打开。尽管如此,我的ssh
端口仍然被阻止。
我正在通过 Python 脚本敲击每个端口:
# knock_list = [1111, 2222, 3333]
for port in knock_list:
time.sleep(1.5)
sock = None
try:
print 'Knocking:', ip_address, port
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.set_timeout(1)
sock.connect((ip_address, port))
except:
pass
finally:
if sock:
sock.close()
为什么我的 iptables 端口敲击配置不起作用?
我的 iptables 配置
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F
sudo iptables -N KNOCKING
sudo iptables -N GATE1
sudo iptables -N GATE2
sudo iptables -N GATE3
sudo iptables -N PASSED
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -j KNOCKING
sudo iptables -A GATE1 -p tcp --dport 1111 -m recent --name AUTH1 --set -j DROP
sudo iptables -A GATE1 -j DROP
sudo iptables -A GATE2 -m recent --name AUTH1 --remove
sudo iptables -A GATE2 -p tcp --dport 2222 -m recent --name AUTH2 --set -j DROP
sudo iptables -A GATE2 -j GATE1
sudo iptables -A GATE2 -j GATE1
sudo iptables -A GATE3 -m recent --name AUTH2 --remove
sudo iptables -A GATE3 -p tcp --dport 3333 -m recent --name AUTH3 --set -j DROP
sudo iptables -A GATE3 -j GATE1
sudo iptables -A PASSED -m recent --name AUTH3 --remove
sudo iptables -A PASSED -p tcp --dport 22 -j ACCEPT
sudo iptables -A PASSED -j GATE1
sudo iptables -A KNOCKING -m recent --rcheck --seconds 30 --name AUTH3 -j PASSED
sudo iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH2 -j GATE3
sudo iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH1 -j GATE2
sudo iptables -A KNOCKING -j GATE1
答案1
有两件事要提一下。
首先,您要为 INPUT、OUTPUT 和 FORWARD 制定一个策略 (-P) ACCEPT。最好关闭 (DROP) 所有内容,尤其是 INPUT,然后只打开需要的内容。
其次,我不太了解 Python,但通常这种连接不会只发送一个数据包,而是发送更多数据包。即使超时 1 秒,也会有(我猜)2 个相同的数据包发送,因为第一个数据包没有答案。因此,第一个数据包将源带入下一个列表 AUTH+1,第二个数据包将其删除并将源带回列表 AUTH1。
我建议重写你的端口敲击,并考虑到在同一端口上发送的多个相同的数据包。