![如何在 ufw 中为特定 IP 地址临时打开端口?](https://linux22.com/image/657865/%E5%A6%82%E4%BD%95%E5%9C%A8%20ufw%20%E4%B8%AD%E4%B8%BA%E7%89%B9%E5%AE%9A%20IP%20%E5%9C%B0%E5%9D%80%E4%B8%B4%E6%97%B6%E6%89%93%E5%BC%80%E7%AB%AF%E5%8F%A3%EF%BC%9F.png)
我在 Web 服务器上使用 ufw(简单防火墙)。目前,我已将其设置为允许 SSH 访问外部世界,并使用 fail2ban 来阻止大量登录尝试。Web 服务器已打开端口 80 和 443。
我想做的是关闭 SSH 访问,直到我需要它为止,然后只将其提供给我当前的公共 IP 地址,该地址会定期更改。我正在考虑通过 HTTPS 编写一个 PHP 脚本,该脚本会验证我的访问权限,然后将请求放入数据库。然后,cron 作业运行一个脚本,该脚本读取数据库并运行 ufw 以仅为我的 IP 地址打开 SSH 端口。30 分钟后,规则将被删除,SSH 将再次变得无法访问。我还想允许多个 IP 具有临时访问权限,最终我想扩展到 SSH 以外的其他端口。
我前面提到的自动脚本应该运行哪些 ufw 命令来临时添加和删除单个 IP 地址的 SSH 端口访问?
答案1
在我看来,更好的解决方案是使用端口敲击,基本上你会“敲击”一系列随机端口,然后在服务器上触发一个操作,这个操作就是允许你的 IP 地址通过 SSH 进入。你甚至可以设置一个超时,这样一段时间后端口就会关闭。
对于端口敲击,您可以使用 knockd。当然,您还需要一个 knock 客户端。knockd 配置如下所示:
[options]
logfile = /var/log/knockd.log
[SSH]
sequence = 7000,8000,9000
seq_timeout = 5
start_command = ufw allow from %IP% to any port 22
tcpflags = syn
cmd_timeout = 10
stop_command = ufw delete allow from %IP% to any port 22