![在来自任何源 IP 的端口碰撞后允许 SSH 访问](https://linux22.com/image/97591/%E5%9C%A8%E6%9D%A5%E8%87%AA%E4%BB%BB%E4%BD%95%E6%BA%90%20IP%20%E7%9A%84%E7%AB%AF%E5%8F%A3%E7%A2%B0%E6%92%9E%E5%90%8E%E5%85%81%E8%AE%B8%20SSH%20%E8%AE%BF%E9%97%AE.png)
我在 Linux 上仅使用 iptables 规则和遵循本教程的“最近”模块,为 SSH 建立了一个有效的端口敲门设置:https://wiki.archlinux.org/index.php/Port_knocking#Port_knoking_with_iptables_only。
现在我的问题是,像我的工作网络这样的几个网络会阻止流向非标准端口(如 22、80、443)的流量,因此我无法发送敲门数据包。另一方面,我的移动互联网允许他们。
作为一种解决方法,我想在发送正确的敲击序列时打开 SSH 端口任何主机,而不仅仅是同一台主机。
有没有办法用 iptables 来实现这一点?例如,我可以想象一个“状态开关”或全局变量,可以由一个规则打开并由另一规则检查。超时后它会回到“关闭”状态。
答案1
我建议走敲门路线。这样就比较简单了。仅代替使用此默认配置
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 10
tcpflags = syn
command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 10
tcpflags = syn
command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
您将使用这个(注意 -s %IP% 已删除)
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 10
tcpflags = syn
command = /usr/sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 10
tcpflags = syn
command = /usr/sbin/iptables -D INPUT -p tcp --dport 22 -j ACCEPT