我在本地网络上运行了一个 SSH 服务器,该服务器通过路由器的端口转发暴露给公共互联网。我还在我的机器上本地(通过)和远程(通过动态 DNS)为主机设置了一个名称etc/hosts
,比如说:
ip name
locally 192.168.0.5 myhost
remotely 11.22.33.44 myhost.example.com
ssh 192.168.0.5
从我的本地网络内,我可以通过/访问服务器ssh myhost
,从我的网络外部,我可以通过ssh 11.22.33.44
/访问服务器ssh myhost.example.com
。
到目前为止,一切都运行正常。但是,对同一台服务器使用两个不同的主机名有点麻烦。我想以统一方式即只使用一个可以在本地和远程工作的 IP / 主机名。
这个问题有简单的解决办法吗?如果这很重要的话,我在用 macOS。
顺便说一句:我无法使用其公共 IP 从本地网络访问我的路由器。
答案1
由于您已经设置了动态 DNS,因此不需要更改 /etc/hosts 文件。
对于外部访问,您可以使用 DNS 进行主机到 IP 的解析,并且对于本地网络也使用相同的方式。
大多数路由器都支持 DNS 注入。您需要检查路由器配置并分配 192.168.0.5 IP 地址以对应与外部网络相同的动态 DNS 主机名。然后,当您在内部网络中并使用路由器作为 DNS 服务器时,路由器会将 myhost.example.com 解析为本地地址。当您外出并尝试外部访问时,动态 DNS 将轮流解析为外部 IP。
如果您在设置路由器时遇到困难,请发布品牌和型号,以便我们查看它是否支持所需的设置。
答案2
如果您无法设置 DNS,您可以使用盒子上的 SSH 配置玩一些游戏,做类似的事情。首先,您需要一种方法来检测您是否在“家中”。根据您去的地方和连接方式,这可能最容易通过轮询您的 wifi SSID 来完成,但 BSSID 或网络配置可能对您来说更强大/更可行。以下是示例:
MY_SSID="local ssid name"
ssid=`/System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport -I | grep " SSID" | cut -d " " -f 2-`
if [ "$ssid" == "$MY_SSID" ]
then
exit 0
else
exit 1
fi
将其命名为“at_home”并将其放入您的路径中。然后假设myserver
通常解析为外部地址,在您的 sshconfig
文件中添加一个类似于此的节来覆盖内部地址:
Match host myserver exec at_home
Hostname myserver.localname # or "local IP"