如何在野外通过 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 个组件需要注意:
- 您的 SSH 客户端,即您正在使用的笔记本电脑。
- 您的 SSH Client/laptop 连接到的网络及其防火墙。
- 您家中用于处理来自家庭网络的所有传入和传出流量的路由器
- 你家路由器后面的 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 连接在你的盒子上。破解您的密码的人将有能力彻底摧毁您的服务器。
我有一台 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.
机器连接的路由器很可能正在使用 NAT。这意味着您需要将 SSH 端口(默认为 22)转发到机器。您可以在路由器的配置界面中执行此操作。
使用 NAT 时没有办法解决这个问题(没有技巧、变通办法、黑客或其他任何东西)。需要端口转发。
如果有问题的路由器是运行 UPnP,那么机器可以自动请求端口转发。您可以使用 MiniUPnP 工具来做到这一点:
http://miniupnp.tuxfamily.org/
但是,出于安全考虑,许多路由器都禁用了 UPnP。此外,一些路由器可能不允许转发端口 22,因为它们自己使用它。因此,在您的情况下,最好将 sshd 配置为使用另一个端口。
正如我在上面所写的,但想进一步澄清:
当从外部 IP 连接到您家庭网络上的 SSH 服务器时(假设您在星巴克或其他地方),有 4 个组件需要注意:
- 您的 SSH 客户端,即您正在使用的笔记本电脑。
- 您的 SSH Client/laptop 连接到的网络及其防火墙。
- 您家中用于处理来自家庭网络的所有传入和传出流量的路由器
- 你家路由器后面的 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 连接在你的盒子上。破解您的密码的人将有能力彻底摧毁您的服务器。