![我怎样才能通过 SSH 帮助位于 NAT 路由器后面的某人(例如奶奶)?](https://linux22.com/image/1075532/%E6%88%91%E6%80%8E%E6%A0%B7%E6%89%8D%E8%83%BD%E9%80%9A%E8%BF%87%20SSH%20%E5%B8%AE%E5%8A%A9%E4%BD%8D%E4%BA%8E%20NAT%20%E8%B7%AF%E7%94%B1%E5%99%A8%E5%90%8E%E9%9D%A2%E7%9A%84%E6%9F%90%E4%BA%BA%EF%BC%88%E4%BE%8B%E5%A6%82%E5%A5%B6%E5%A5%B6%EF%BC%89%EF%BC%9F.png)
为了快速帮助他人,SSH 非常有用,尤其是与 GNU Screen 结合使用时。用户通常位于 NAT 路由器后面。即使用户可以配置路由器,也需要一些时间记住密码、找到正确的选项等。
那么,如果其他人位于 NAT 路由器后面,那么通过 SSH 帮助他们的最简单方法是什么?
我现在告诉人们打开终端运行以下命令,并从类似这样的网站将他们的 IP 传递给我http://ip.appspot.com/:
sudo apt-get install openssh-server ssh-import-id && ssh-import-id lekensteyn
显然,如果他们位于 NAT 路由器后面或配置了个人防火墙,这将不起作用。那么,有没有类似的东西:
sshd --accept-help-from lekensteyn
我并不是在寻找像 Teamviewer 这样的替代品,只是寻找像 SSH 这样的 shell。它也应该是开源的。
答案1
如果你自己的计算机可以接受 SSH 连接,则可以使用Pavlos G. 链接的技术无需额外的计算机。
首先,您需要一个权限较低的*用户,您的朋友将以此身份进行连接:
sudo adduser reverse --shell /bin/false
告诉你的朋友启动隧道:
ssh -N -R 62222:localhost:22 reverse@lekensteyns-server
然后,在您自己的计算机 ( lekensteyns-server
) 上启动反向连接:
ssh -p 62222 localhost
* 我对安全性了解不够,无法就创建适当的低权限用户提供建议。这可能应该在单独的问题中讨论。
答案2
根据您的具体需求,我可能会:
- 让他们告诉我路由器的密码
- 登录并设置仅 22 端口的端口转发
- 通过 SSH 连接(或者,如果需要打开额外的端口,则通过 SSH 隧道连接)并完成工作。
我还忘了你可以尝试反向 SSH 隧道,尽管从技术上来说,这个解决方案需要多一台中间计算机才能工作。
更多信息请见这里
答案3
如果他们还没有 IPv6,我通常会设置一个 IPv6 隧道(来自 sixxs.net 或 he.net),这样计算机就有了一个静态地址,我就不必处理 NAT。我还喜欢设置基于密钥的身份验证(这样他们就不必告诉你他们的密码了)。
Sixxs 有自己的客户端供您使用。它几乎可以在任何 NAT 后面工作,并在 IPv4 地址更改时自动更新。他们有关于如何设置的说明,并且它是为 Ubuntu 打包的。
Hurricane Electric 使用隧道,其中 IPv6 包作为 IPv4 数据包的有效负载发送。与 Sixxs 不同,它不使用 TCP/UDP。这意味着您身后的 NAT 必须支持转发协议 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"
答案4
多年来,我开发了一个 GUI 来完全按照 OP 的要求执行操作……只是它需要通过 ssh 访问具有公共 IP 的第三台服务器,正如 Pavlos 所建议的那样。您可以在此处找到 debian 软件包和说明:
http://pietrobattiston.it/reachme
请注意,它(仍然)无法处理初始配置 - 即,您必须自己设置无密码连接的 rsa 密钥。设置完成后,“reachthem”允许您查看“reachme”是否已连接,并打开 ssh shell/浏览文件系统/查看屏幕(实验性)。
显然,如果您的计算机本身具有公共 IP,则不需要第三台计算机,如 ændrük 的回答中所述。显然,GUI 的好处是远程用户不必在终端中输入任何命令……但如果远程用户必须安装 reachme,则部分好处就会丧失。所以我总是为我安装 Ubuntu 的每个人安装和设置 reachme。