通过 ssh(动态 IP)使用受防火墙保护的服务器

通过 ssh(动态 IP)使用受防火墙保护的服务器

我需要通过 SSH 在 Debian 6 服务器上工作。服务器受防火墙保护,并且根据用户 IP 过滤 SSH 连接。

不幸的是,我有一个具有动态 IP 的 ISP 提供商 - 它每天都在变化。

我设法编写了一个简单的脚本来读取文件中存储的 IP 并将其添加到防火墙的例外列表中。但现在每次连接到服务器时我都需要:

  • 将我的IP发送到服务器
  • 登录网络控制台
  • 重新启动防火墙

当我有动态 IP 时,有没有更简单/更自动化的方法来管理防火墙保护的 SSH 连接?

答案1

目前我能想到三种办法:

第一个是使用knockd- 我最喜欢的 - (http://www.zeroflux.org/projects/knock/)并配置仅您记得的端口序列,并knockd为您引用的 IP 地址打开 SSH。knockd在 debian 软件包中可用,示例配置 ( /etc/knockd.conf) 可以是:

[options]
logfile = /var/log/knockd.log

[opencloseSSH]
sequence      = 2221,2222,2223
seq_timeout   = 5
tcpflags      = syn
start_command = /usr/sbin/iptables -I INPUT -i enp0s8 -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout   = 15
stop_command  = /usr/sbin/iptables -D INPUT -i enp0s8 -s %IP% -p tcp --dport 22 -j ACCEPT

这种方式knockd将侦听指定端口上的序列(它们甚至可能相同),并且如果在 5 秒内命中该序列,则将打开端口。 15 秒后,该规则将再次删除,因此需要在这 15 秒内开始成功登录。

第二种是基于动态 DNS 并结合定期刷新 iptables 链:

iptables -N SSH
iptables -A INPUT -p tcp -m tcp --dport 22 -j SSH

安排一个 cronjob 运行以下脚本,例如每分钟运行一次:

#!/bin/bash

iptables -F SSH 
iptables -A SSH -s ddns-entry.com -j ACCEPT

这样,SSH 链就会在您选择的每个时间间隔内刷新并重新填充。

或者,您可以在 Debian 6 主机上创建一个(受密码保护的)网页,该网页将允许您输入保存到其中的 IP 地址/tmp/currip。安排一个 cron 作业每分钟运行一次 - 或者更好的是,使用 inotify/incron - 并检查文件/tmp/currip并更改iptables规则以使用文件中列出的地址。由于这很大程度上取决于您所使用的网络堆栈的类型,因此我在此不列出示例。

答案2

最简单的答案:使用动态域名解析

有一些免费(供私人使用)的选项,例如诺伊普网, 或者dyndns.org

编辑: 您必须创建一个不断更新规则的脚本(例如)iptables,我之前忘记提到这一点。 (感谢@兰伯特)

编辑2: 我没有使用这样漂亮的解决方案,但你可以尝试一下简洁的Python脚本。

相关内容