在一台同时连接两个或多个虚拟网段的设备上开启IP转发并配置路由规则,让这台设备充当虚拟路由器,配置步骤分为四步:规划网段、创建虚拟网络、绑定网卡、写入路由表,这是所有虚拟化平台通用的底层逻辑,不管是VMware、VirtualBox还是KVM都不例外,虚拟机之间默认处于不同广播域,只有通过路由转发才能实现跨网段互访,本节将从原理到实操逐步拆解。
跨网段通信的基本前提:虚拟机为什么“各说各话”
两台虚拟机即使跑在同一台物理服务器上,只要它们被划分到不同的虚拟网络,就等同于住在两个不同的城市,同网段通信靠交换机,也就是虚拟交换机负责MAC地址转发;跨网段通信必须依赖路由器,由路由器查看数据包的目的IP,再根据路由表决定从哪个接口送出去。
行业共识认为,理解三层转发是排查虚拟网络故障的基本功,虚拟机的流量路径是:源虚拟机先把数据包发给自己的网关,然后由网关(即路由器)查询路由表,决定下一跳是谁,最终把数据包送到目标网段。
要完成一次成功的跨网段通信,整个链路必须同时满足以下四个条件,缺一不可:
- 源虚拟机和目标虚拟机都配置了正确的IP地址和子网掩码
- 源虚拟机配置了指向虚拟路由器的网关地址
- 虚拟路由器本身开启了IP转发功能
- 所有经过的防火墙规则(包括宿主机iptables、虚拟化平台的安全策略)都放行了转发流量
大多数跨网段不通的问题,根源不是路由写错了,而是链路上某个环节的防火墙把包静默丢弃了。
虚拟机间路由怎么设置?先分清三种常见方案
在动手配置之前,需要先选一个方案,不同虚拟化环境适合的“路由器”形态完全不同,方案选错,后面所有配置都是白费功夫。
| 方案 | 路由器载体 | 适合场景 | 配置复杂度 | 性能表现 |
|---|---|---|---|---|
| 宿主机路由 | 宿主机充当路由器 | 测试环境、几台虚拟机互通 | 低 | 中,依赖宿主机转发能力 |
| 虚拟机软路由 | 一台专门的虚拟机跑路由系统 | 模拟真实网络、多网段互联 | 中高 | 高,可独立运行也可做NAT |
| SDN虚拟路由器 | 虚拟化平台自带的分布式路由 | 大规模云环境、KVM集群 | 中 | 高,流量走数据面转发 |
方案一是最省事的思路,宿主机上有多个虚拟网卡分别连接不同虚拟网络,只需要开启Linux内核的IP转发参数,再配上路由规则,这台宿主机就变成了一台路由器,VMware Workstation和VirtualBox都能这样玩。
方案二更接近物理世界的网络结构,在一台虚拟机里安装VyOS、OpenWrt或者Windows Server的路由和远程访问角色,然后给它绑定多块虚拟网卡,每块网卡连接一个不同的虚拟网络,在虚拟机里配置好各网卡IP,再开启转发功能,这台虚拟机就是一台纯软的虚拟路由器。
方案三主要出现在使用Open vSwitch和KVM的环境中,分布式虚拟路由器直接跑在物理宿主机内核里,它的优势是流量不需要跳到用户态再回来,转发性能够高,据业内专家指出,在云平台底层,这种方案能有效规避软件路由器带来的带宽瓶颈,因此在生产环境中的应用比例相当高。
VMware虚拟机不同网段互通实操配置步骤
以VMware Workstation为例,这是大部分技术人员练手的环境,整个操作可以拆成五步,每一步都有明确的界面入口和验证手段。
第一步:规划IP地址和虚拟网络拓扑
先画一个简单的拓扑图,比如有两台虚拟机:
- 虚拟机A:网段192.168.10.0/24,IP为192.168.10.10
- 虚拟机B:网段192.168.20.0/24,IP为192.168.20.10
两者之间需要跨网段通信,这时需要一个路由器,让它同时拥有两个网段的IP,如果选择方案一,需要给宿主机上的VMnet1和VMnet2分别配置上192.168.10.1和192.168.20.1。
第二步:在虚拟网络编辑器中创建两个VMnet并分配网段
打开VMware Workstation的“编辑”菜单,进入“虚拟网络编辑器”,这里有两种路径:
- 点击右下角的“更改设置”,获取管理员权限
- 在列表里找到VMnet2和VMnet3(默认是桥接或NAT模式),分别选中,改为“仅主机模式”
- 为VMnet2设置子网IP为192.168.10.0,子网掩码255.255.255.0
- 为VMnet3设置子网IP为192.168.20.0,子网掩码255.255.255.0
- 确认“DHCP设置”里不要勾选启用,避免自动分配的IP和手动规划冲突
这样VMnet2和VMnet3就是两个隔离的仅主机网络,它们之间没有路由器。
第三步:给虚拟机分配网卡,分别接入不同VMnet
打开虚拟机A的“虚拟机设置”,选择网络适配器:
- 适配器1:选择VMnet2(对应192.168.10.0网段)
- 添加一个网络适配器2:选择VMnet3(对应192.168.20.0网段)
虚拟机B只需要一块网卡接入VMnet3即可。
此时VMware Workstation的虚拟网络编辑器界面里,VMnet2和VMnet3之间还没有任何连接关系,要让这两块网卡之间能通信,关键在于虚拟机A或宿主机开启转发。
第四步:启用宿主机IP转发并添加静态路由
在宿主机(Windows)上,用管理员权限打开CMD或PowerShell,执行以下操作:
- 查看当前路由表:
route print - 开启IP转发需要修改注册表,路径为
HKLMSYSTEMCurrentControlSetServicesTcpipParameters,将IPEnableRouter的值改为1,然后重启系统
这一步比较折腾,Windows下更推荐用虚拟机A当路由器:给虚拟机A装一个Ubuntu Server,然后编辑配置文件,执行sudo sysctl -w net.ipv4.ip_forward=1,这就是开启内核转发,再把虚拟机A上的两个网卡IP分别配成192.168.10.1和192.168.20.1。
第五步:在虚拟机B上配置网关和验证连通性
虚拟机B的IP保持192.168.20.10不变,再把默认网关改成192.168.20.1,然后从虚拟机B去ping虚拟机A的192.168.10.10:
ping 192.168.10.10
如果通了,说明整个链路没问题,不通时,按顺序排查:
- 在虚拟机B上
ipconfig /all确认网关配置生效 - 在路由器虚拟机(虚拟机A)上
ping 192.168.20.10和ping 192.168.10.10分别测试两侧连通性 - 检查路由器虚拟机的iptables规则,执行
sudo iptables -L -n看FORWARD链是否DROP
KVM虚拟机跨网段通信:用Linux Bridge加静态路由实现
KVM环境下,虚拟化网络配置更灵活,但也要求你有更强的命令行功底,以宿主机为Ubuntu/CentOS系统为例,用Linux Bridge和veth pair手工搭一个虚拟路由器。
创建虚拟网络并让两台虚拟机挂到不同网桥
在宿主机上创建两个Linux Bridge:
sudo ip link add br0 type bridgesudo ip link add br1 type bridge
分别给两个网桥分配IP:
sudo ip addr add 192.168.10.1/24 dev br0sudo ip addr add 192.168.20.1/24 dev br1
然后启动网桥:sudo ip link set br0 up,sudo ip link set br1 up。
用virt-manager或virsh给虚拟机分配网卡时,分别把虚拟机A的网卡连接到br0,虚拟机B的网卡连接到br1,这两台虚拟机之间依然没有路由,但宿主机现在已经是两个网段共同的邻居。
开启内核转发并添加静态路由
编辑/etc/sysctl.conf,设置net.ipv4.ip_forward = 1,然后执行sudo sysctl -p让参数立即生效。
此时宿主机自身就能转发两个网桥之间的流量了,如果你的虚拟网络规划里还有更多网段,比如192.168.30.0/24,可以在宿主机上继续添加网桥,再写静态路由:
sudo ip route add 192.168.30.0/24 via 192.168.10.2 dev br0
这里的192.168.10.2就是专门负责30网段路由的下一跳,宿主机内核收到发往30网段的包后,会按路由表扔给br0上的另一台路由虚拟机,这种分层式结构跟物理网络中的核心路由加汇聚路由很像。
放行iptables FORWARD链
这一步是KVM环境里最常见的坑,安装Docker或者firewalld之后,系统默认的iptables FORWARD链策略往往是DROP,执行以下命令放行:
sudo iptables -P FORWARD ACCEPT
如果你的环境对安全要求更高,可以只放行特定网段之间的转发:
sudo iptables -I FORWARD -s 192.168.10.0/24 -d 192.168.20.0/24 -j ACCEPTsudo iptables -I FORWARD -s 192.168.20.0/24 -d 192.168.10.0/24 -j ACCEPT
虚拟路由器配置步骤里最容易踩的三个坑
无论哪种方案,最终踩的坑高度相似。
坑一:Windows宿主机默认不开IP转发。 Windows Server可以勾选“路由和远程访问”角色来开启,但Windows 10/11工作站版没有图形开关,改注册表后必须重启,很多人配置完没重启,流量自然不通。
坑二:虚拟机内防火墙拦截了转发流量。 当你在虚拟机里部署VyOS或OpenWrt时,它的默认防火墙策略可能会丢弃从内网口进来的、目的地址是另一个内网网段的包,需要明确添加一条LAN到LAN的ACCEPT规则。
坑三:网卡模式在创建虚拟网络之后又改动过,导致虚拟交换机端口处于隔离状态。 比如VMware的“仅主机模式”如果勾选了“DHCP服务”,某些情况下虚拟机的路由表会被重复下发,此时需要重启虚拟机或者重置虚拟网络,让所有vNIC重新进行DHCP协商。
还有个细节容易被忽视:更换网卡模式后,虚拟机内部的ARP缓存不会立刻刷新,流量不通时手动执行arp -d清空ARP表,再重新ping。
Q&A:虚拟机跨网段通信常见问题排查
虚拟机跨网段通信配置后ping不通,从哪里查起?
从源虚拟机出发逐跳排查,第一步在源虚拟机上ping自己的网关,网关通说明上行链路没问题;第二步登录路由器,ping目标网段的网关,通说明路由器到目标网段的路由存在;第三步ping虚拟机跨网段通信配置中的目标IP,这一步通说明整条链路正常,定位到哪一跳断了,再去看对应的网卡绑定、防火墙和路由表。
虚拟机间路由怎么设置才能让三个网段互相访问?
三个网段需要汇聚到同一台虚拟路由器上,这台路由器需要三块网卡分别连接三个虚拟网络,每个接口绑定一个网段IP,路由器内部会自动学习直连路由,三个网段的虚拟机把默认网关分别指向路由器对应接口的IP,互相就能通,如果虚拟机不是直接连着路由器,而是连着另一台二层交换机,那还要在交换机上做VLAN间路由,或者在每台需要通信的机器上手动写静态路由,代价会高得多,多数情况下不如全部直连虚拟路由器。
VMware和VirtualBox在跨网段方案上哪个更省事?
VMware的虚拟网络编辑器支持同时创建多个仅主机模式网络,还能自定义子网网段,配置直观,适合VMware虚拟机不同网段互通这类需求,VirtualBox的host-only网络默认只有一个vboxnet0,需要额外创建vboxnet1和vboxnet2,而且每个网络默认自带一个DHCP服务器,配置稍繁琐,VirtualBox的优势在于免费开源,两者的共同点是都支持在一块虚拟网卡上开启混杂模式,这为在虚拟机里跑软路由提供了基础条件,如果你要模拟复杂的多网段拓扑,VMware的图形化编辑器和快照回滚更省精力;如果只是临时测两个网段互通,VirtualBox也用不到三十行命令行。
跨网段通信的核心始终是“三层路由”,只要把转发设备选对,把路由规则写准确,再确认链路里的防火墙没拦路,虚拟机就能在任意网段之间自由穿梭,实际部署时,先在测试环境把上述流程完整走一遍,再迁移到生产环境,能省去大量排错时间。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/624709.html





