我家里有多台机器,我想使用 SSH 和 VNC 从学校访问它们。为了做到这一点,我给它们分配了静态 IP:
- 192.168.1.50:Windows
- 192.168.1.51:Ubuntu
- 192.168.1.52:树莓派/Raspbian
我知道 SSH 使用端口 22,因此我可以在路由器上将此端口转发到 192.168.1.51:22,但这样我就无法通过 SSH 连接到我的 Raspberry Pi。有什么方法可以设置它以便能够访问这两台机器吗?
答案1
如果您有 IPv6,您甚至不需要端口转发!只需获取您的永久 IPv6 地址(基于您的 MAC 地址,因此除非您的 ISP 不知道 IPv6 的工作原理,否则保证该地址保持不变)并使用该地址进行隧道接入。由于您的 IPv6 地址是面向公众的,并且允许全世界访问您而无需通过您的本地 NAT,因此您无需费心在任何地方启用端口转发。它会“正常工作”。
但请注意,IPv6 在全球范围内仍然没有真正得到支持,并且您的家庭互联网连接和远程互联网连接都需要具有完全正常运行的 IPv6 才能实现这一点。
但是,如果你和大多数人一样,只有 IPv4,那么还是有办法的!有些路由器允许你将特定的源端口转发到特定的目标端口,如下所示:
在这个例子中,端口22
直接传递给我的机器sheepdog
,而端口292
被转发到22
上的端口coyote
。
最后,如果你的路由器没有此功能,你只需更改端口即可,因为 SSH 不仅限于在端口上运行22
。你可以将其设置为任何你想要的(未被使用)。
在/etc/ssh/sshd_config
(您需要root权限才能编辑,因此sudo nano /etc/ssh/sshd_config
),文件顶部有一行:
# What ports, IPs and protocols we listen for
Port 22
将其更改为您想要的任何内容:
# What ports, IPs and protocols we listen for
Port 2992
使用 重新启动 SSH 服务器sudo service ssh restart
,并在路由器上转发端口。
但是,对于这个用例,我会考虑 SSH 隧道是否是正确的选择。也许你应该在你的家庭网络上设置一个专用的 VPN 服务器?这将允许你访问你的全部的只要您拥有 VPN 所需的正确安全凭证,您就可以从任何地方访问家庭网络。此外,使用 VPN 的开销略小;您通常只需要为一台机器转发一个端口。
答案2
解决此问题的一个简单方法是将路由器上的不同端口映射到计算机的端口 22。例如,您可以在路由器中进行以下设置(假设您的路由器具有 IP 1.2.3.4
)
1. 1.2.3.4:22 --> ubuntu:22
2. 1.2.3.4:8888 --> raspberrypi:22
3. 1.2.3.4:9999 --> windows:22 (or some other port)
然后,当你使用 ssh 时,通过输入以下命令指定要使用的端口
$ ssh <username>@<router ip> -p <your port>
现在您应该能够连接到所有机器。
答案3
如果您知道您的一台计算机始终处于运行状态,那么您也可以将其用作 ssh 代理。
假设您为外部 IP 地址设置了一个域名(即 myhome.dyndns.com 或其他),您要做的就是在一台计算机上进行连接(假设 raspberry 始终处于运行状态,并且您将端口从路由器转发到它),那么您的 ssh 连接将是:
学校 --> (路由器,此处透明) --> 树莓派 --> ubuntu 或 windows
现在,在学校的 ~/.ssh/config 中添加以下行:
Host ubuntu 192.168.1.51
Hostname ubuntu (change to match your setup)
User myraspberryuser (change it ;-) )
IdentityFile ~/.ssh/id_rsa (The path to your private key, on the school computer, better on an usb key if public computer)
ForwardAgent yes
RequestTTY yes
ProxyCommand ssh -W %h:%p %[email protected]
然后连接:
ssh-add ~/.ssh/id_rsa # to do only once per session
ssh myuser@ubuntu (login without password)
从现在开始,如果您输入 ssh ubuntu,计算机将首先连接到 raspberry,然后启动到 ubuntu 计算机的 ssh 会话。
我建议您,无论您选择转发哪个端口,都禁用 /etc/sshd.conf 中的密码,以仅允许通过 ssh 密钥登录。这样,如果您在 raspberry 和 ubuntu 上使用参数“ForwardAgent”设置密钥,则只需解锁密钥,然后无需密码即可连接。这样,即使机器人试图登录您的 ssh,他们也永远无法登录,因为您不允许密码登录。
额外好处是,这也适用于 scp,scp foo ubuntu:/tmp/foo 将使用相同的设置,无需进一步的参数。额外好处 2,此设置不需要在家中进行任何更改,如果明天您和另一台计算机,只需将代码复制/粘贴到您的 ssh 配置中,更改主机和 ip,就这么简单,无需在路由器上打开新端口
答案4
我怀疑这是否更适合作为评论而不是答案,但无论如何我都会在这里发布它。
在执行此操作之前您应该考虑以下一些事项:
- 您将向互联网开放您的系统,因此您最好确保它们得到良好的修补并且您的安全配置得到加强(例如,不允许 root 登录并使用公钥而不是密码)。
- 您的公共 IP(请参阅 whatismyip.com)可能会发生变化,具体取决于您的 ISP,它可能每天都会变化,也可能几乎从不变化。这意味着您必须找到一种方法来找出您的公共 IP。您可以每天从家庭网络访问 whatismyip.com,创建一些应用程序,或者使用动态 DNS (DynDNS) 将您不断变化的公共 IP 映射到静态域名。
- 如果您想使用 IPv6 绕过与 IPv4 和 NATing 相关的所有麻烦,您需要您的设备、路由器、ISP 等也支持 IPv6。当您的 ISP 不支持 IPv6 时,有些服务可以为您提供帮助,但您的设备和路由器无论如何都必须支持 IPv6。
- 您向互联网开放的端口和设备越多,您的攻击范围就越大。我建议在您的网络中使用跳转盒,并且只允许从互联网对该设备进行 SSH 访问。跳转盒基本上是一个非常坚固的系统,您可以通过路由器将其端口转发到互联网。连接到该盒子后,您将能够通过它 SSH 到您的内部网络。跳转盒基本上可以是另一个 Raspberry Pi。我建议使用专用设备,以便尽可能地加固它(除其他外,通过运行尽可能少的服务)。
- (4a) 除了使用 SSH 进入的跳转盒之外,您还可以设置 VPN 服务器,以便您从学校的设备浏览家庭网络(如果允许出站 VPN 连接)。