我有两台机器可以在互联网上访问,无需 NAT。两台机器都运行 SSH 服务。
我想通过 SSH/SFTP 连接到服务器 A 的端口 2000,并且此连接应路由到服务器 B 的端口 22(行为类似于 HTTP 反向代理,但使用 SSH/SFTP 而不是 HTTP)
答案1
您可以使用 ssh 端口转发来实现此目的
ssh -L localportinmypc:hostname_of_the_behind_the_firewall:remoteport hostname_of_my_firewall
然后连接到本地隧道端口:
sftp -o Port=localportinmyp localhost
或者
ssh -p localportinmyp
答案2
这对于 iptables 来说应该没有问题:
#!/bin/bash
export IP="1.2.3.4"
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables \-t nat \-A POSTROUTING \-o eth0 \-d $IP \-j MASQUERADE
iptables \-A PREROUTING \-t nat \-p tcp \--dport 2000 \-j DNAT \--to $IP:22
答案3
就像是:
ssh -o ProxyCommand="ssh -e none userA@serverA:2000 nc -w 1 serverB 22" userB@ServerB
你连接到的地方服务器A使用 ssh 登录用户A用于打开向前连接到服务器B您登录时使用的用户B。
解释:
代理命令打开 ssh 连接服务器A(带有用户名)用户A)并启动与端口 22 的双向连接服务器B。
初始ssh
命令使用此命令ProxyCommand
建立双向连接服务器B你必须登录用户B。
总之:
从笔记本电脑到服务器 A 有一条加密连接(图中步骤 1),并且
另一个从 Laptop 到 ServerB 的加密连接(步骤 1 + 步骤 2),封装在其第一部分(步骤 1)中的第一个连接中,然后nc
在第二部分(步骤 2)中进行绑定。
与 HTTP 不同,它SSH
是双向的,当连接打开时,所有请求和响应都遵循相同的连接。因此无需考虑步骤 3 和 4。