更改 autossh 命令中的 ip 地址?

更改 autossh 命令中的 ip 地址?

我使用来自无头远程客户端的 systemd 服务运行的 Autossh。远程客户端设置一个 ssh 隧道回到我的家庭防火墙。我的 ISP 经常更改我的家庭 IP。因此我使用动态 DNS 服务 (dDNS),以便远程客户端可以找到我的防火墙。

我发现 dDNS 并非在世界各地都有效。如果远程客户端位于 dDNS 服务被阻止或不可用的国家/地区,则远程客户端无法找到我的防火墙的 IP 地址。

作为备份,我正在修改客户端,以便我的家庭防火墙 IP 地址可以由具有远程客户端物理访问权限的用户手动输入。这将要求我通过另一个渠道(电子邮件、电话、短信等)传达 IP 地址。用户将通过客户端提供的网页界面手动输入 IP 地址。用户永远无法访问远程客户端 CLI。

当用户保存手动输入的 IP 地址时,它将存储在用户主目录中的 home_ip.conf 文件中(无需 root 访问权限)。我编写了一个 systemd 路径服务,用于检测 home_ip.conf 文件的更改。home_ip.conf 文件的更改意味着用户已输入并保存了 IP 地址。

另一种用例是,IP 地址被用户删除/禁用,客户端恢复使用 dDNS 服务。

此时,我需要运行一个脚本来关闭 autossh(如果正在运行)和任何相关的 ssh 隧道(不是所有隧道)。然后在 exec 命令行中使用不同的 ip/dDNS 变量重新启动 autossh。

我搜索了互联网,没有找到任何与我的用例完全匹配的内容。我找到的最接近的是这个答案如何停止/终止 autossh 隧道?来自@KeithMcFly。就我的使用情况而言,我认为将此脚本放入 .bashrc 不是最佳选择。

我在现有服务中使用的命令如下:

Environment='AUTOSSH_GATETIME=0'
ExecStart=/usr/bin/autossh -M0 foo.ddns.org -F /home/fooUser/.ssh/fooUser_ssh_config -NR 9011:localhost:22 -NR 9012:localhost:8999

我已经在使用一个环境变量加上一个 ssh_config 文件(与上面的 home_ip.conf 不同),所以一个选项是用foo.ddns.org环境变量替换,或者我可以更改 fooUser-ssh_config 文件中的值。

看来我有多种方法可以解决这个问题。哪一个可以被视为“最佳实践”?

答案1

虽然这不是对标题的完全回答,但我认为这个问题是一个 XY 问题,所以我将用一个可能的解决方案来回答,这也是一个最佳实践。

设置 VPN 基础设施,然后通过 VPN 连接到 SSH。这被认为是最佳实践,因为它具有众多安全性和易用性优势。其中一个优点是它隐藏了您的 SSH 服务器,另一个优点是 IP 地址变成了不会改变的内部 IP 地址。

(此外,一种可能有用的技巧是让您的家庭客户端连接到 Web 服务器并让 Web 服务器记录 IP 地址。然后,即使动态 DNS 被阻止,您也可以查看 Web 服务器以查找路由器的外部 IP。我必须说,我发现动态 DNS 被阻止的想法有点奇怪。我确实想知道您是否可以运行由数据库支持的自己的权威 DNS 服务器并构建自己的动态 DNS 类型系统而不触发这些防火墙。这并不难 - PowerDNS 可以轻松做到这一点,毫无疑问,在许多名称服务器中都是如此)

相关内容