问题描述
我家里有多台机器,我想使用 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。有什么方法可以将其设置为能够访问两台机器吗?
最佳答案
如果您有 IPv6,您甚至不需要端口转发!只需获取您的永久 IPv6 地址(基于您的 MAC 地址,因此保证保持不变,除非您的 ISP 不知道 IPv6 的工作原理)并使用它进行隧道接入。由于您的 IPv6 地址是 public-facing 并且允许全世界访问您无需通过本地 NAT,也无需在任何地方启用 port-forwarding。它将“正常工作”。
但请注意,IPv6 在全球范围内仍未得到真正支持,并且您的家庭互联网连接和远程互联网连接都需要具有 fully-working IPv6 才能执行此操作。
但是,如果您像大多数人一样并且只有 IPv4,那么还有办法!某些路由器允许您将特定源端口转发到特定目标端口,如下所示:
在此示例中,端口 22
直接传递到我的计算机 sheepdog
,而端口 292
则转发到 coyote
上的端口 22
。
最后,如果您的路由器没有此功能,您只需更改端口即可,因为 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
使用 sudo service ssh restart
重新启动 SSH 服务器,并在路由器上转发端口。
然而,对于这个用例,我会考虑 SSH 隧道是否是正确的选择。也许您应该在家庭网络上设置专用 VPN 服务器?只要您拥有 VPN 所需的适当安全凭证,您就可以从任何地方访问整个家庭网络。此外,VPN 的开销稍微少一些;您通常只需要为一台机器转发一个端口。
次佳答案
解决此问题的一个简单方法是将路由器的不同端口映射到计算机的端口 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>
现在您应该能够连接到所有计算机。
第三种答案
如果您知道其中一台计算机始终处于运行状态,您还可以将其用作 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 %r@myhome.dyndns.com
然后连接:
ssh-add ~/.ssh/id_rsa # to do only once per session
ssh myuser@ubuntu (login without password)
从现在开始,如果您输入 ssh ubuntu,计算机将首先连接到树莓派,然后启动到 ubuntu 计算机的 ssh 会话。
我建议您,无论您选择转发哪个端口,都在 /etc/sshd.conf 中禁用密码,以仅允许通过 ssh 密钥登录。这样,如果您在树莓派和 ubuntu 上使用参数 ‘ForwardAgent’ 设置密钥,则只需解锁密钥,然后无需密码即可连接。这样,即使机器人尝试登录您的 ssh,他们也永远无法登录,因为您不允许密码登录。
奖励,这也适用于 scp,scp foo ubuntu:/tmp/foo 将使用相同的设置,无需进一步的参数。\n奖励 2,此设置不需要在家进行任何更改,如果明天您和另一台计算机,只需复制/粘贴ssh 配置中的代码,更改主机和 ip,就这样,无需在路由器上打开新端口
第四种答案
我这样做——我让 rpi 保持开启状态并一直直接插入路由器(因为它运行起来最便宜),然后通过 ssh 进入它,然后从它跳到其他路由器——它从来不需要太多关注。
还可以通过 ssh 管道使用 VNC/RDP GUI,这有点有趣,或者转发端口,让您浏览到桌面计算机上的服务器,同时保持其私密性。
我添加这个答案的原因是给你一些建议。
1) 使用与 22 不同的端口。您可以在 PI 上将其保留为 22,但将路由器上的传入端口更改为超过 10,000…否则您每天会受到数十到数百次攻击 – 一旦您一旦发现漏洞,您就知道正在运行 SSH 主机。
2) 使用证书代替用户名/密码——完全禁用用户名/密码登录。
3)如果你的IP地址可以改变,使用dyndns类型的服务为自己获取一个DNS主机(我使用noip,它是免费的,他们支持Linux客户端来更新你的IP地址 – 我认为你可以在pi上apt-get它现在)。还有一些其他公司免费提供此服务。
4) 保持你的 pi (或者你通过 ssh 连接的任何东西)是最新的(sudo apt-get update)。我相信 ssh 现在已经得到了很好的审查,但我也相信 https ……
第五种答案
怀疑这是否更适合作为评论而不是答案,但无论如何我都会将其发布在这里。
在执行此操作之前您应该考虑一些事情:
-
您将向互联网开放您的系统,因此您最好确保它们是 well-patched 并且您的安全配置已得到强化(例如,不允许 root 登录并使用公钥而不是密码)。
-
您的公共 IP(请参阅whatismyip.com)可能会更改,具体取决于您的 ISP,它可能每天都会更改或几乎从不更改。这意味着您必须找到一种方法来确定您的公共 IP。您可以每天从家庭网络访问whatismyip.com,创建一些应用程序,或使用动态 DNS (DynDNS) 将不断变化的公共 IP 映射到静态域名。
-
如果您想使用 IPv6 绕过与 IPv4 和 NATing 相关的所有麻烦,您还需要您的设备、路由器、ISP…能够与 IPv6 通信。当您的 ISP 不支持 IPv6 时,有些服务可以为您提供帮助,但您的设备和路由器无论如何都必须与之通信。
-
向互联网开放的端口和设备越多,攻击区域就越大。我建议在您的网络中使用 jump-box,并且仅允许从互联网通过 SSH 访问该设备。 jump-box 基本上是一个非常坚固的系统,您可以通过路由器将 port-forward 连接到互联网。连接到该盒子后,您将能够通过它通过 SSH 连接到您的内部网络。 jump-box 基本上可以是另一个 Raspberry Pi。我建议使用专用设备,以便能够尽可能地强化它(其中包括运行尽可能少的服务)。
-
(4a) 您还可以设置一个 VPN-server,而不是通过 SSH 连接到 jump-box,它允许您从学校的设备浏览家庭网络(如果允许出站 VPN 连接)。