我可以使用内部 IP 地址(例如 192.168.10.2)从家庭网络内通过 SSH 连接到 Linux 机器。或者从外部,我可以通过路由器上的端口转发通过外部 IP 地址(例如 74.23.43.98)进行连接,我已将路由器设置为将端口 22 上的传入连接转发到内部地址 192.168.10.2。但是,如果我在家,则无法通过外部 IP 地址进行连接。这仅适用于我的网络外部。这是普遍适用的还是我的特定摩托罗拉路由器的特殊之处?
谢谢
答案1
这是与 NAT 和本地网络有关的常见问题。基本上,当路由器将 74.23.43.98 重写为 192.168.10.2 时,源地址不会被重写,因此目标计算机会将数据包直接发送回源,而不是通过路由器。由于源计算机不希望从 192.168.10.2 返回数据包(相反,它希望看到数据包来自 74.23.43.98),因此它会丢弃这些数据包,并且不会执行任何有用的操作。
如果您的路由器性能良好,那么它应该可以配置为执行正确的操作(重写内部到内部 NAT 流量的源地址),但如果它默认不执行此操作,那么它可能不算“性能良好”。或者,如果它功能齐全,您应该能够为您的服务器设置第二个内部网络,这将确保所有流量都通过路由器。
答案2
这应该是可能的(我已经在我的 linksys 路由器上做过了),尽管我不太清楚你为什么要这么做。
首先,有必要澄清“无法连接”的含义。您可以 ping 您的外部地址并得到回复吗?sshd 是否记录了连接尝试?您可以通过转发端口进行 telnet 吗(以证明该端口至少是开放的)?
答案3
我管理的几台机器位于防火墙后面,防火墙限制了哪些主机可以通过 SSH 进入网络。在大多数情况下,这不是问题,因为我在家或办公室时通常有一个静态 IP,但当我在其他地方的远程网络上时,这会给我带来无穷无尽的麻烦。我的解决方案是使用ProxyCommand
SSH 客户端配置中的 简化通过我的一台主机的转发,该主机具有允许通过防火墙的静态 IP。这对我来说使用 OpenSSH 有效,并且应该可以与支持 的其他 SSH 客户端一起使用,因此ProxyCommand
如果有疑问,请查看您的客户端文档。它还需要安装netcat
TCP/IP 瑞士军刀。
在我的里面〜/.ssh /配置文件我有以下配置:
Host InternalHost
ProxyCommand ssh StaticHost nc %h 22
HostName InternatHost-FQDN
我使用短主机名来引用配置,这样我就可以使用完全限定域名来访问它,而无需使用转发。此配置的作用是连接到静态主机并运行 netcat 转发到内部主机 FQDN在端口 22 上。除非您已设置 SSH 身份密钥,以便在不提示输入密码的情况下登录 StaticHost 和 InternalHost,否则您将收到两次输入密码的提示。就我而言,我在两者上都安装了 SSH 身份密钥,并将 SSH 密钥加载到 SSH 代理中,结果发现自己登录时没有任何密码请求提示。
此配置还可以允许您使用命令与 InternalHost 来回传输文件,scp
就像登录到 shell 一样简单。