我需要在服务器上的两个网络端口之间建立一座桥,以便到达端口 A 的所有内容都会转到端口 B,而到达端口 B 的所有内容都会转到端口 A。
我有两个设备(dA 和 dB),它们位于不同网络中的不同 NAT 后面,两者都可以建立任何出站连接,但是所有入站连接都被阻止。因此它们无法直接连接。无法在这些 NAT 上配置任何端口转发。
因此,我将放置一个可以监听所有网络端口的服务器 S。它接受端口 A 和 B 上的连接,并在它们之间建立桥梁,这样流量就可以从 A 流向 B,就像它们直接连接一样。
我想要存档的最终结果是:
- 设备 dA 通过端口 A 连接到服务器 S。例如,它连接到 server.com:A
- 设备 dB 通过端口 B 连接到服务器 S。例如,它连接到 server.com:B
- dA 通过 S 与 dB 对话
有没有办法使用 Linux 服务器来实现这一点?该服务器运行基于 Debian wheezy 的 Linux。
使用命令/命令行工具来执行此操作会很棒,因此,如果需要,可以更改端口而无需编辑任何文件(使用脚本)。
答案1
您似乎在谈论反向代理。有许多有用的守护进程(特别是 SOCKS 代理),但您正在寻找命令行解决方案。
这可以通过 ssh 端口转发来实现。您可以使用以下命令转发端口:
user@dA:~$ ssh -R :1111:localhost:1111 [email protected]
它将在 server.com 上打开端口 :1111。在该端口上接受连接后,ssh 会将此请求转发到 dA,并在 dA 上本地建立连接,以localhost:1111
通过现有 ssh 通道转发所有流量。
因此,当您的 ssh 会话启动并运行时,连接到 server.com:1111 的每个主机都将有效连接 dA:1111
请注意开头的分号。这意味着 server.com 应该接受外部连接(默认情况下它只会监听来自本地主机的连接)。
您还需要GatewayPorts
在 server.com 上的 ssh 配置中启用选项。否则 sshd 将不允许接受外部连接。
答案2
工具索卡特以简单的方式满足我的需要。
socat TCP4-LISTEN:5060,reuseaddr TCP4-LISTEN:5061,reuseaddr
它会阻塞终端,但这是我能找到的最佳解决方案。
答案3
您可以使用 xinetd 来实现这一点redirect
指示。我个人更喜欢使用 socat,因为 xinetd 的配置位于显眼的位置(使其更容易用 Puppet 或 Chef 进行管理)并且会在启动时自动启动。
答案4
为什么不使用 iptables?
iptables -t nat -I PREROUTING --src $SRC_IP_MASK --dst $DST_IP -p tcp --dport $portNumber -j REDIRECT --to-ports $rediectPort