我在网络设置方面遇到问题,而我较差的网络知识或我当地的 Linux 社区无法帮助我。
我有服务器 A(就在我的 PC 附近),它隐藏在 NAT 路由器后面,还有服务器 B,它是具有静态 IP 的 VPS。
我想使用我的服务器 A 作为网络服务器,可以从互联网上的任何地方访问(并且此后,作为自己的小型网络托管)。我已经意识到如何通过互联网上的 SSH 通过服务器 B 访问服务器 A -反向 SSH 隧道。但这东西有两个缺陷:
- 它只通过一个端口(例如,我希望所有端口同时维护 web、ssh 和更多服务器)
- 我无法直接从网络访问服务器 A - 我必须连接到服务器 B,然后再执行
ssh -p 22222 username@localhost
有什么解决方案可以将所有端口传递到现有隧道吗?我在互联网上找到的所有内容都是关于或者制作反向隧道或者将端口传递到直接隧道,但不传递到现有反向隧道。
答案1
也许您已经知道“关于反向 ssh 隧道的两个附加说明”,但如果您错过了:
- 反向 SSH 隧道单身的命令可以包含多个(不仅仅是一个)端口转发
- 反向 ssh 隧道也可以侦听本地或公共 IP(不仅在 B 的本地主机上)
要实现(1)
你只需要添加多个-R参数,因为(2)
你必须放在服务器BGatewayPorts clientspecified
内部/etc/ssh/sshd_config
并重新启动sshd服务。通常我们还希望侦听服务器 B 的 1024 以下端口,该端口只允许 root,因此PermitRootLogin yes
也应该位于 sshd_config 文件内。
在服务器 A 上运行的完整 ssh 命令可能如下所示:
ssh -R serverBpublicIP:2222:serverAlocalIP:22 \
-R serverBpublicIP:80:serverAlocalIP:80 \
-R serverBpublicIP:5901:serverAlocalIP:5901 \
-R serverBpublicIP:8080:serverAlocalIP:8080 root@serverBpublicIP
#--------------------------|----------------------------------------
# new listening B side | already listening local A side
它将转发 4 个端口到服务器 B 的公共 IP。当检查并确认此命令运行良好时,您可以添加守护程序-fNT
参数并使用 systemd 自动启动它。
如果转发失败,请确保新端口空闲:
serverB$ netstat -anpt | grep '2222\|80\|5901\|8080'
因此,如果您需要有限数量的 TCP 端口(并且不使用某些具有 udp 端口范围需求的特定 sip 电话或 rtp 应用程序),则反向隧道对于大多数情况来说应该足够了。
答案2
查看穿梭项目。
根据文档,它解决了以下常见情况:
- 您的客户端计算机(或路由器)是 Linux、FreeBSD 或 MacOS。
- 您可以通过 ssh 访问远程网络。
- 您不一定具有远程网络的管理员访问权限。
- 远程网络没有 VPN,或者只有愚蠢/复杂的 VPN 协议(IPsec、PPTP 等)。或者,也许您是管理员,您只是对 VPN 工具的糟糕状态感到沮丧。
- 您不想为远程网络上的每个主机/端口创建 ssh 端口转发。
- 你讨厌 openssh 的端口转发,因为它随机缓慢和/或愚蠢。
- 你不能使用 openssh 的 PermitTunnel 功能,因为它在 openssh 服务器上默认是禁用的;另外,它还支持 TCP-over-TCP,但性能很差(见下文)。