Udp端口绑定在VMware Linux中

在我的应用程序中,有两台物理计算机,都在Windows环境中。 计算机2(IP为“192.168.2.2”)安装了VMware Linux虚拟机(IP为“192.168.80.129”)。 我想要做的是将UDP套接字从虚拟机发送到计算机1(IP“192.168.2.1”)。

根据我的申请要求,当udp通过虚拟机发送到计算机2时,应指定端口。

现在我的情况是,当我在Linux中创build和configurationudp套接字时,我指定了两个端口LOCAL_PORT(9000)和REMOTE_PORT(9001)。

当我打开WireShark来监视时,在Linux VM中,源端口是LOCAL_PORT(9001),但是目的端口是“iua(9900)”。 源IP是“192.168.80.129”,目的IP是“192.168.2.1”,是正确的。

当我在计算机1或计算机2上的Windows中打开Wireshark时,显示的源IP是“192.168.2.2”,而目标IP是“192.168.2.1”。 这似乎是可以理解的,因为发送者是虚拟机,所以Udp实际上是由主机(计算机2)发送的。 目标端口是正确的,但是,源端口似乎是任意的。

有谁知道我可以做什么在虚拟机,以便源端口可以是数字(9900)作为分配,而不是一个任意数字? 谢谢!

int sock1; struct sockaddr_in slAddr, myAddr; memset(&slAddr, 0, sizeof(slAddr)); memset(&myAddr, 0, sizeof(myAddr)); slAddr.sin_family = AF_INET; slAddr.sin_port = htons(RM_PORT);//RM_PORT=9900 slAddr.sin_addr.s_addr = inet_addr(SL_IP);//SL_IP="192.168.2.1" myAddr.sin_family = AF_INET; myAddr.sin_port = htons(LC_PORT);//LC_PORT=9901 myAddr.sin_addr.s_addr = inet_addr(MY_IP);//MY_IP="192.168.80.129" sock1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); bind(sock1, (struct sockaddr *)&myAddr, sizeof(myAddr)); sendto(sock1, packeddata, 8, 0, (struct sockaddr*)&slAddr, sizeof(slAddr));

你的代码似乎没问题(除了有时写端口9901,有时9001)。

你的问题是,你的VMWare主机NAT的所有出站数据包。

您需要NAT来重写虚拟机的源IP以对应于192.168.2。*networking。 要为许多源IP(这里有两个,您的VM和物理机器)执行此操作,NAT也需要能够重写源端口。 它使用源端口来记住数据包来自哪里。 你不需要,因为你只有一个应用程序,但NAT不知道。

(实际上,根据经典的思科术语,您正在做PAT,并且非过载的NAT将通过要求您的虚拟机专用的192.168.2。* IP来解决您的问题,但是我认为任何人都不会再使用它。 )

我不认为VMWare可以在保留源端口的情况下执行NAT。 因此,您需要closuresNAT(在物理LAN和虚拟机的networking适配器之间build立第2层网桥 )。 这意味着你必须给你的虚拟计算机提供与物理服务器相同的192.168.2。* IP地址(否则你将不得不进行路由,这将变得复杂得多)。

你所做的(根据你的评论)是写一个代理,绑定到主机上的端口9901。 这是你的代理翻译IP从192.168.80.129到192.168.2.2,并保持源端口,因为你这样写。

如果这个解决scheme对你有好处,对你而言,那很好!

通常在互联网上编写的程序和协议都不在乎源端口; 源端口只是一个> 1023的数字,将被用作回复数据包的目标端口。 其他协议(DNS和NTP想到的)已经发展到允许非固定的源端口。