我想使用自定义域名从世界任何地方访问家庭网络上的多个不同设备。
我正在运行 ISP 提供的标准(商业)路由器,并且没有更改选项(他们不会提供第三方路由器所需的 ADSL 连接的登录信息)。
我知道如何通过 Nginx/Apache/反向代理访问运行 Web 服务的 Raspberry Pi 之类的东西,但我希望 SSH 之类的东西也能有类似的功能(通过唯一域名访问单个设备)。反向代理通常只处理 HTTP(S) 流量,因此不适用于这种情况。
下面的一条评论提到了 IPv6,但这实际上是如何通过标准商用路由器实现的呢?
答案1
我在用包裹服务以及 SRV 记录,索卡特和 ProxyCommand ssh_config 选项使我的内部主机在互联网上可见不同的名称。
首先,您需要在路由器上设置适当的 DNAT 规则。我们将其命名为 router.example.com,IP 地址为 192.0.2.1,内部主机将是 host1.example.com,IP 地址为 198.51.100.1,位于 NAT 之后。
规则如下:
iptables -t nat -A PREROUTING -d 192.0.2.1 -p tcp --dport 2222 -j DNAT --to-destination 198.51.100.1:22
现在您需要将此服务的 SRV 记录放入外部 DNS 中:
_ssh._tcp.host1.example.com. SRV 10 0 2222 router.example.com.
让我们配置 ssh 以使用上面提到的记录:
Host *.example.com
ProxyCommand wrapsrv _ssh._tcp.%h socat STDIO TCP:%%h:%%p
SOCAT 还可用于通过某种代理建立连接(我也在一些防火墙后面但有 SOCKS 代理的设置中练习了此选项)。此外,您将无法对此域使用 -p ssh 选项。
现在您可能还想为您的路由器添加 SRV 记录,因此您不需要 ssh_config 中的特定部分即可获取它:
_ssh._tcp.router.example.com. SRV 10 0 22 router.example.com.
作为额外的好处,它可以很容易地将路由器上的 sshd 端口移动到其他值,以防止任何人轻易地强制您(是的,我知道,它在那里做广告,但到目前为止,我还没有看到任何人尝试我以这种方式宣传的端口)。