如何在野外通过 SSH 连接到 linux 机器

How to SSH to a linux machine out in the wild

我有一台 linux 便携式机器,因此可以连接到不同的路由器。 linux 机器有一个脚本,它会在每次连接到 Internet 时自动更新其当前的 public IP。

现在,我想从我的计算机 ssh 进入这台 linux 机器。假设 linux 机器在线并连接到互联网,我 运行 ssh -vvvv root@LinuxPublicIP,但是操作超时:

OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: /etc/ssh_config line 102: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to 209.133.4.10 [209.133.4.10] port 22.
debug1: connect to address 209.133.4.10 port 22: Operation timed out

感谢帮助

编辑

我宁愿不使用 dynDNS,而是让我的 linux 机器不断更新其 Public 和数据库中的内部 IP。假设我当前的 public ip 是 209.10.12.23 而内部 ip 是 10.0.20.18

我怎样才能 ssh?! 运行 ssh root@209.10.12.23 将通过 SSH 连接到路由器,而不是我的 linux 机器。

编辑

是否可以通过 ssh 连接到改变位置并连接到不同路由器的设备,而无需在新路由器上手动设置端口转发?

很可能 "out in the wild" 包括过滤传入流量的地方。端口 22、25、465、587 和其他一些端口经常被过滤。通常未过滤端口包括20、21、80、443和1023以上的所有端口。

如果您可以将服务器设置为在端口 21(通常用于 FTP)甚至 80(通常用于 HTTP)上接受 SSH,那么您可以在过滤后的位置查看更好的可用性。

当 SSH 运行 在端口 80 上时,您可以这样访问它:

$ ssh -p 80 user@LinuxPublicIP

我注意到 OP 提到他以 root 身份登录。永远不要那样做,而是以非特权用户身份登录,然后 su root 或使用 sudo.

"Public" IP 地址必须正确路由到服务器,因此当服务器移动时,IP 路由必须更改。这就是创建 dynDNS 或动态 DNS 的原因。在 dynDNS 设置中,您将通过主机名连接到服务器。

EX:

ssh -vvvv user@myhostname.tld

hostname 通过动态 DNS 服务器提供服务,其中 IP 可以在非常低的 TTL(生存时间)内更改,因此您可以随时访问服务器。现在您可能会问 dynDNS 服务器如何知道您的 IP 地址。这通常是通过服务器上的 deamon/service 运行 来实现的。当它连接到互联网时,它会调用动态 DNS 服务器来更新已为您的主机名存储的 IP,从而允许路由到主机名。

无法部署服务时使用的另一种方法是在连接到 Internet 时从服务器实施 proxy 连接。这通常会将服务器置于代理上的 VLAN 内,并允许您使用本地主机名通过代理连接到它。这种方法是安全访问服务器的首选方法,在这种情况下,由于更高的安全要求而无法使用服务,并且服务器不会发布公开可用的资源,例如服务于 HTML.

的 Web 服务器

机器连接的路由器很可能正在使用 NAT。这意味着您需要将 SSH 端口(默认为 22)转发到机器。您可以在路由器的配置界面中执行此操作。

使用 NAT 时没有办法解决这个问题(没有技巧、变通办法、黑客或其他任何东西)。需要端口转发。

如果有问题的路由器是运行 UPnP,那么机器可以自动请求端口转发。您可以使用 MiniUPnP 工具来做到这一点:

http://miniupnp.tuxfamily.org/

但是,出于安全考虑,许多路由器都禁用了 UPnP。此外,一些路由器可能不允许转发端口 22,因为它们自己使用它。因此,在您的情况下,最好将 sshd 配置为使用另一个端口。

正如我在上面所写的,但想进一步澄清:

当从外部 IP 连接到您家庭网络上的 SSH 服务器时(假设您在星巴克或其他地方),有 4 个组件需要注意:

  1. 您的 SSH 客户端,即您正在使用的笔记本电脑。
  2. 您的 SSH Client/laptop 连接到的网络及其防火墙。
  3. 您家中用于处理来自家庭网络的所有传入和传出流量的路由器
  4. 你家路由器后面的 SSH 服务器。

您可以控制 1、3 和 4,但您无法控制 2(星巴克的网络及其防火墙)。它们可能正在并且可能正在阻塞某些端口。 SSH 默认使用 22,所以事情可能会有点棘手。

一般来说,方法是找到一个在网络防火墙上打开的端口。这就是人们推荐端口 80 或 443 或 21 的原因,因为这些端口在任何网络上通常都是开放的。

在您的路由器上,您必须为您要使用的任何端口启用端口转发。通常,您可以选择它应该在外部查找哪个端口(比如端口 443)和路由它的内部 IP 以及它应该路由到的端口。这将是您的 SSH 服务器的内部 IP 和端口 22。在您的路由器配置中,它可能类似于:

如果您找到一个开放端口并在您的路由器上正确转发它,那么您可以使用您家庭的外部 IP (209.10.12.23) 和您找到的端口(例如 443)将您的 SSH 客户端连接到您的 SSH 服务器).从 linux 命令行看起来像:

ssh yourusername@209.10.12.23 -p 443

如果您仍然超时,这意味着您的客户端无法连接到您的服务器,这可能是因为您选择了一个被阻止的错误端口,或者您在路由器上不正确地转发了该端口。

另请注意,您的外部 SSH client/laptop 不需要知道 SSH 服务器的内部 IP 地址,只需知道您的 public 家庭网络 IP。

最后,如果你打开东西以便从外部源连接,我强烈建议使用 SSH 密钥对而不是密码进行身份验证,并且也不允许 root 通过 SSH 连接在你的盒子上。破解您的密码的人将有能力彻底摧毁您的服务器。