我需要通过 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脚本。