为什么我的 iptables 端口敲击配置不起作用?

为什么我的 iptables 端口敲击配置不起作用?

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。

我建议重写你的端口敲击,并考虑到在同一端口上发送的多个相同的数据包。

相关内容