特定端口的两个接口之间的 TCP 桥接(从虚拟机内部访问主机的本地主机)

特定端口的两个接口之间的 TCP 桥接(从虚拟机内部访问主机的本地主机)

我的机器上的 localhost:5037 上运行着一个 ADB 守护进程。我的机器上运行着一个虚拟机。我们把我的机器称为主机,把虚拟机称为客户机。

客户虚拟机使用主机的接口:

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255

连接到互联网。我需要从客户机内部访问主机上的 ADB 服务器。如果我只是192.168.122.1从客户机内部调用它,它不起作用,因为主机上的 adb 绑定到 localhost:5037,而不是 192.168.122.1:5037,因此我需要一种方法来映射

192.168.122.1:5037 <-> localhost:5037

在主机上以双向方式。

如果我只是在所有东西之间添加一座桥梁,那么它就会扰乱我的虚拟机的工作方式,因为它依赖这个接口来连接到互联网。

如何在这两个 IP 之间创建 TCP 桥接?我发现http://tcpreplay.synfin.net/wiki/tcpbridge但不清楚它是如何工作的。也许 iptables 可以解决这个问题?

更新:

按照答案中的建议,我使用了 socat,现在它可以工作了:

#on host machine:
socat tcp-listen:5037,bind=192.168.122.1,reuseaddr,fork tcp:localhost:5037

#on virtual machine:
socat tcp-listen:5037,bind=localhost,reuseaddr,fork tcp:192.168.122.1:5037

答案1

如果 ADB 守护进程真的仅绑定到环回接口,那么无论您使用什么技巧,它都只会对来自主机本地应用程序的数据包做出反应,因为只有这些数据包通过环回路由。

因此,首先要做的是查看 ADB 守护程序的配置,看看是否不能让它放弃绑定(然后它会对 192.168.122.1 做出反应)。

要检查的第二件事是您的虚拟机配置如何。许多虚拟机(您没有告诉我们您使用的是哪种类型的虚拟机)允许客户端使用主机接口无法访问主机如果是这种情况,请重新配置您的 VM,并ping 192.168.122.1在客户端测试等是否正常工作。

如果这些都不起作用,我接下来要尝试的是socat在主机上使用它来转发数据包,因为这样它在 ADB 守护程序中看起来就像一个本地应用程序。

相关内容