![针对 CNAT 后面的计算机的 IPV4 上的 SSH 隧道代理](https://linux22.com/image/122079/%E9%92%88%E5%AF%B9%20CNAT%20%E5%90%8E%E9%9D%A2%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9A%84%20IPV4%20%E4%B8%8A%E7%9A%84%20SSH%20%E9%9A%A7%E9%81%93%E4%BB%A3%E7%90%86.png)
我不确定我是否应该在 Unix & Linux 或网络工程中问这个问题
这是物理场景
[主机 1]----[运营商级 NAT]---->AWS<----[运营商级 NAT]----[主机 2]
主持人 1和主机2通过反向 ssh(autossh)连接到 AWS Box,因此它们确实具有 shell 连接(如果需要),并且可以在需要时公开任何其他端口。
主机2将备份转储推送到主持人 1定期使用 SCP。其实有主机2×10推动数据转储的盒子。最近的 AWS 位置距离盒子的位置很远,因此延迟很大。
是否可以使用 AWS 盒子作为集合点来在盒子之间建立 ssh 隧道?我知道 IPv6 隧道代理,但该地区的 ISP 尚未采用它(晚了 20 年......废话!)我正在探索一种基于以下基础的解决方案:
- TCP/UDP打洞(附实际实现)
- AWS 上的 UPnP / NAT-PMP 服务
- 使用 Chrome 远程桌面等工具,破解它以暴露 SSH 端口而不是 VNC
- 任何其他路由器服务。
- 任何其他实用方法。
盒子大多运行 CentOS 6/7。
答案1
然而,这并不完全是您所需要的:您可以使用 iptables 将 host1 或 host2 反向本地端口公开为外部端口。假设您将 host2 连接为 ssh 反向隧道:
user2@host2 $ ssh -R 9999:localhost:22 [email protected]
现在您可以将传入端口 aws.com:9999 转发到 aws [localport:9999]: 在 AWS 服务器上:
[email protected] # iptables -t nat -I PREROUTING -p tcp --dport 9999 -j DNAT --to 127.0.0.1:9999
现在您可以通过以下方式从 host2 连接到 host1:
user1@host1 $ ssh [email protected] -p 9999
答对了。您是这样连接的:
[主机 1] --> [aws:端口 9999] --> [aws: 127.0.0.1:9999 上的反向隧道] --> [主机 2]
当不再使用此连接时,您应该删除 iptable 记录:
[email protected] # iptables -t nat -A PREROUTING -p tcp --dport 9999 -j DNAT --to 127.0.0.1:9999
该解决方案的缺点是,host2 通过外部端口 9999 暴露给所有人。您仍然需要输入密码才能登录,但它已暴露。
UPD:您可能还需要启用本地转发:
awsuser@aws # ls echo 1 > /proc/sys/net/ipv4/conf/all/route_localnet
或者不为所有接口启用它,而是仅在收入接口上启用:
awsuser@aws # ls echo 1 > /proc/sys/net/ipv4/conf/eth0/accept_local