我在 Mac 上的 VMware Fusion 上运行 Linux。在 Linux 上,我使用基于 TAP 设备的 TCP 回显服务器(称为 PicoTCP,链接如下:https://github.com/tass-belgium/picotcp)。我使用以下命令运行 echo 服务器:sudo ./build/test/picoapp.elf --tap tap1:192.168.13.37:255.255.255.0 --app tcpecho:8000
在一个终端窗口上,然后我可以使用以下命令与 echo 服务器通信:sudo ip addr add 192.168.13.38/24 dev tap1 ; sudo ip link set tap1 up;
后跟一个简单的 netcat,如下所示:nc 192.168.13.37 8000
。我现在的目标是能够通过从虚拟机外部运行 netcat (或等效命令),从我的 Mac(或同一网络上的任何其他计算机)与 tcp echo 服务器进行通信。我怎样才能做到这一点?目前,如果我尝试使用 VM 网卡的 IP 地址或运行 picotcp 服务器时指定的 IP 地址(在本例中为 192.168.13.37)运行 netcat,则它不起作用。
太感谢了!另外,如果您需要我当前设置的更多信息,请告诉我!
答案1
您需要了解您拥有的网络。有多个(至少 2 个)通信可能会停止的点,您需要先解决所有这些问题,然后才能从外部访问设备。
根据描述,您的本地计算机上有一个服务器侦听的 TAP 设备。通常,您将无法从 Linux 机器外部访问此 TAP 接口,即使是从 VMWare 网络上的另一台虚拟机也是如此。解决方案是将 TAP 桥接到 Linux 的以太网接口(应该是 eth0,除非你有愚蠢的 RedHat 方案;使用 ifconfig 来确保)
因此,首先创建一个桥:
ip link add br0 type bridge
然后将设备添加到网桥(我假设它是tap0,就像我假设它应该是eth0一样):
ip link set tap0 master br0
ip link set dev eth0 down
ip addr flush dev eth0
ip link set dev eth0 up
ip link set eth0 master br0
并确保桥已启动:
ip link set dev br0 up
您现在应该能够从同一 VMWare 虚拟网络上的虚拟机访问 tap0 上的服务器。您应该通过启动第二个虚拟机来测试这一点。
在您的虚拟 Linux 盒子中,您现在拥有以下网络:
+------+ +-------+
| tap0 | | eth0 |
+------+ +-------+
| | |
+-------------+ +--------
bridge 0 "outside world"
下一篇:这个VMWare虚拟网络是如何与外界连接的呢?您的 Mac 上是否也桥接此网络?还是已经NAT了?在这种情况下,您应该提供一些端口转发规则。不确定这在 VMWare 中如何工作,因为像许多人一样,我使用的是 VirtualBox。
在 VirtualBox 中,“外部世界”可以是很多东西,最重要的是:
桥接适配器:就像您对 Tap-interface 所做的那样,虚拟接口桥接到运行 VirtualBox 的主机的外部接口。虚拟机将在外部拥有自己的 IP 地址。
NAT:虚拟接口与外部连接,但通过NAT(网络地址转换)。这是大多数 SOHO DSL 路由器连接到互联网的方式。在外部,有一个IP地址,如果你想从外部访问机器,你必须设置端口转发(从未这样做过;不确定在VirtualBox中是否可行)
Host-only:一个单独的网络,只能在 VirtualBox 环境中使用。
因此,在 VirtualBox 中,桥接适配器最适合您。
假设您在 VirtualBox 中进行桥接,您现在将拥有以下网络:
+------+ +-----+ }
| tap0 | | eth0| }
+------+ +-----+ } in your Linux virtual machine
| br0 | | }
+------------+ | }
|
Your host (mac) |
-----------------+ |
| |
+-----------+ physical outside world
| mac's eth0|--------------
+-----------+
您应该注意的其他问题是您的 IP 规划和子网。