我如何通过NAT路由器后面的SSH帮助某人(比如奶奶)?

为了快速帮助他人,SSH非常有用,特别是与GNU Screen结合使用。 用户常常在NAT路由器后面。 即使用户可以配置路由器,也需要一些时间来记住密码,找到正确的选项等。

那么,如果他们在NAT路由器后面,通过SSH帮助其他人的最简单方法是什么?

我目前告诉人们打开终端运行以下命令并从http://ip.appspot.com/这样的网站传递他们的IP:

sudo apt-get install openssh-server ssh-import-id && ssh-import-id lekensteyn 

显然,如果它们位于NAT路由器后面或配置了个人防火墙,则无法工作。 那么,是否有类似的东西:

 sshd --accept-help-from lekensteyn 

我不是在寻找像Teamviewer这样的替代品,只是像SSH这样的shell。 它也应该是开源的。

如果您自己的计算机可以接受SSH连接,则有一种方法可以使用Pavlos G.链接到的技术,而无需额外的计算机。

您首先需要一个朋友将连接的弱势*用户:

 sudo adduser reverse --shell /bin/false 

告诉你的朋友启动隧道:

 ssh -N -R 62222:localhost:22 reverse@lekensteyns-server 

然后,在您自己的计算机( lekensteyns-server )上,启动反向连接:

 ssh -p 62222 localhost 

*我对安全性知之甚少,无法为创建适当的弱势用户提供建议。 这可能应该在一个单独的问题中讨论。

根据您的具体需求,我可能会:

  1. 让他们告诉我路由器的密码
  2. 仅为端口22登录和设置端口转发
  3. 如果您需要打开额外的端口,请通过SSH(或SSH隧道连接)进行连接并完成工作。

我也忘了你可以尝试反向ssh隧道 ,虽然这个解决方案在技术上需要一台 – 中间计算机才能工作。

更多信息可以在这里找到

我通常只设置一个IPv6隧道(来自sixxs.net或he.net),如果他们还没有IPv6,那么计算机有一个静态地址,我不必乱用NAT。 我还想设置基于密钥的身份validation(然后他们不必告诉你他们的密码)。

Sixxs有自己的客户端。 它几乎可以在任何NAT后面运行,并在IPv4地址更改时自动更新。 他们有关于如何设置它的说明,它是为Ubuntu打包的。

Hurricane Electric使用隧道将IPv6包作为IPv4数据包的有效负载发送。 与Sixxs不同,不使用TCP / UDP。 这意味着您所支持的NAT必须支持转发PROTOCOL 41(而不是端口),并且NAT后面只有一台计算机可以使用它。 使用像这样的隧道的软件内置于Ubuntu中。

对于HE,我在/etc/network/interfaces使用类似的东西:

 auto he-ipv6 iface he-ipv6 inet6 v4tunnel endpoint 216.218.226.238 address 2001:470:a29f::2 netmask 64 ttl 64 up ip -6 route add default dev he-ipv6 down ip -6 route del default dev he-ipv6 

您需要做的另一件事是更新隧道端点。 由于您不知道外部IP何时发生更改,因此您必须每隔几分钟尝试更新一次端点。 你可以使用这样的东西并从cron运行它:

 #!/bin/sh echo -n "Hurricane Electric Proto-41 tunnel endpoint update: " #(C) 2010 Erik B. Andersen This script is licensed under the latest version of the # AGPL published by the Free Software Foundation at http://www.gnu.org/licenses/ . ####Set these for each different site######### pass="passwordhere" user_id="a765b8e2f474667dcb56e08c5f1aa05b" tunnel_id="97817" ####Past here doesn't need to be changed###### wget -4 "https://ipv4.tunnelbroker.net/ipv4_end.php?ipv4b=AUTO&pass=$(echo -n "${pass}" | md5sum | grep -o -E "[0-9a-fA-F]{32}")&user_id=${user_id}&tunnel_id=${tunnel_id}" -O /dev/null -o /dev/null --no-check-certificate echo " Done" 

多年来,我开发了一个GUI来完成OP所要求的……除了它需要使用公共IP的第三个服务器的ssh访问,如Pavlos所建议的那样。 你可以在这里找到debian包和说明:

http://pietrobattiston.it/reachme

注意它(仍然)无法处理初始配置 – 即,您必须自己设置rsa密钥以进行无密码连接。 设置完成后,“到达”可以让您查看是否已连接“reachme”,并打开ssh shell /浏览文件系统/查看屏幕(实验)。

显然,如果您的计算机本身具有公共IP,则不需要第三台计算机,如ændrük的答案。 显然,GUI的好处是远程用户不必在终端中输入任何命令……但如果远程用户必须安装覆盖范围,则部分此优点将丢失。 所以我总是安装并设置到我安装Ubuntu的每个人的设备。