步骤 1:将虚拟机设置为桥接适配器

步骤 1:将虚拟机设置为桥接适配器

在 IP 地址为 192.168.200.5 的 Windows 10 计算机上,我想设置一个带有 Ubuntu 的 VirtualBox,以便 Ubuntu 可以接收从端口 9001 上的硬件设备(IP 192.168.200.10)发送的 UDP 数据。

到目前为止我尝试了以下操作:

  • 具有端口转发 9001 -> 9001 的 NAT 适配器
  • 桥接适配器
  • 仅限主持人

我也尝试使用文件将 Ubuntu VM 的 IP 配置为 192.168.200.6 /etc/sysconfig/network-scripts/ifcfg-enp0s3,然后重新启动网络sudo systemctl restart systemd-networkd,但这也不起作用。

通过使用 wireshark 进行验证,Windows 本身确实在端口 9001 上接收 UDP 数据。

那么我还能尝试什么呢?或者这不可能做到吗?

答案1

如果数据可以到达主机上的端口,则无需更改任何 IP 设置。通过 NAT 进行常规端口转发即可。

免责声明:在 Ubuntu-Host/Ubuntu-VM 上使用 VirtualBox 6.1 成功测试。

首先,在“设置”>“网络”下为您的虚拟机配置端口转发规则。确保网络已启用并设置为Attached to: NAT。接下来,在“高级”下拉菜单下,选择“端口转发”并创建新规则。选择 UDP 作为协议并设置所需的端口。暂时将 IP 地址设置留空。

端口配置


您需要启动/重新启动虚拟机以使这些更改生效。从您的主机,确保 VirtualBox VM 设置正常运行并监听所需端口。在 Linux 主机上,您可以使用 查看开放端口netstat -ln | grep udp。对于 Windows,请使用netstat -an | find "UDP"


网络状态


转到您的 Ubuntu VM 以验证您是否可以接收传入数据。运行 netcat 实用程序以使用 监听所需端口上的传入 UDP 数据nc -ulk 9001。运行后,返回您的主机并使用这个简单的 Python 脚本来自你的主机测试是否可以将数据发送到虚拟机:

import socket

UDP_IP = "0.0.0.0"      # Broadcast over any address
UDP_PORT = 9001         # Send to this port
MESSAGE = "Hello World! Here's a Datagram!\n"

sock = socket.socket(
               socket.AF_INET,     # Internet
               socket.SOCK_DGRAM   # UDP
       )

sock.sendto(bytes(MESSAGE, "utf-8"), (UDP_IP, UDP_PORT))

如果一切正常,消息将从主机传递到虚拟机。

验证UDP收据


如果您愿意,现在可以更改端口转发规则中的 IP 设置以缩小来源范围。如果像以前一样留空,它将监听全部该端口的地址,这可能是一个潜在的安全风险。

但请注意,如果主机上的任何服务已在监听,或者稍后启动服务来监听同一端口,它将拦截数据并且不会将其传递到您的虚拟机。确保该端口专门用于向您的虚拟机传递消息。

希望这可以帮助!

答案2

步骤 1:将虚拟机设置为桥接适配器

这意味着您的虚拟机将直接看到您的 LAN 并与路由器通信

在此处输入图片描述

第 2 步:为你的 Ubuntu 客户机分配静态地址

我假设您安装了 Ubuntu Server。这很重要,因为 Ubuntu Server 和 Ubuntu Desktop 以不同的方式配置其静态 IP(服务器使用netplan,桌面不使用)。

sudo apt install tilde # to install a nice-to-use 
sudo tilde /etc/netplan/00-installer-config.yaml

并使用此配置:

# Make sure the address is VALID and the router address is correct!
network:
  ethernets:
    enp0s3:
      addresses:
      - 192.168.200.6/24
      nameservers:
        addresses:
        - 8.8.8.8
        - 8.8.4.4
        search: []
      routes:
      - to: default
        via: 192.168.200.1
  version: 2

使用Ctrl+W保存并Ctrl+Q退出。

请注意,这enp0s3是我的接口的名称,在您的机器上可能有所不同,请使用命令ip a列出客户虚拟机内的所有接口。

在此配置中我假设:

  1. 您希望客户虚拟机位于192.168.200.6。这就是您的硬件设备应该与之通信的地方。请注意,这与您的 Windows 10 的 IP 地址 不同192.168.200.5。对于 LAN 中的所有人来说,这就像存在第二台物理计算机
  2. 路由器位于192.168.200.1。如果此地址错误,您的 VM 客户机将无法访问互联网。

Windows 防火墙可能会阻止你与 Ubuntu VM 通信

现在,您的硬件设备192.168.200.10应该能够与您的 Ubuntu VM 通信。

但是你的 Windows 10 主机可能不想与你的客户 Ubuntu VM 对话。如果已经对话了,那么你就完了。

Windows 是否允许 LAN 中的其他计算机与 Windows 中的进程通信取决于:

  1. 您的连接设置为家庭/工作/公共。 在此处输入图片描述
  2. 防火墙规则允许从您的访客地址传入/传出 UDP 数据包(在主页上它应该可以工作,除非某些规则阻止它)。 在此处输入图片描述
    • 这应该很简单:点击添加新规则它会询问您是否要为所有程序或特定程序打开端口,哪个端口以及是否阻止或允许连接。

欢呼并祝你好运。

相关内容