CentOS 7下Vagrant+VirtualBox虚拟机公网IP无法通信:Hetzner物理机配置差异排查求助
兄弟,太懂这种“明明配置看起来全一样,但就是死活不通”的崩溃感了!你已经排查了核心的网络配置文件和路由信息,那咱们再从一些容易被忽略的细节入手,一个个对比两台机器的差异:
VirtualBox桥接的深层配置
先确认VirtualBox的桥接接口是不是真的绑定对了物理网卡(eno1),用VBoxManage list bridgedifs查看桥接接口的状态,重点看对应的物理网卡名称和MAC地址。另外,虚拟机的网卡设置里,混杂模式是不是设成了「允许所有」?Hetzner的公网IP段是/28,虚拟机需要通过混杂模式才能让外部路由识别到它的IP,这个很容易被遗漏。防火墙/iptables规则的细微差异
CentOS 7.9的firewalld默认规则可能和7.8有小变化,哪怕你没手动改,说不定默认zone的转发规则不一样。先对比两台机器的iptables-save输出,看看有没有拦截桥接流量的规则;再用firewall-cmd --list-all检查当前zone的配置,重点看masquerade是不是开启了——如果开了masquerade,可能会把公网IP的流量转成NAT模式,直接破坏你要的直连公网的逻辑。另外,别忘了检查firewall-cmd --get-active-zones,看看br0和eno1是不是在同一个zone里。VirtualBox的全局网络限制
看看非工作机上有没有/etc/vbox/networks.conf这个文件?如果没有的话,VirtualBox默认可能会限制只能使用内网IP段,你需要创建这个文件并添加一行* 0.0.0.0/0 ::/0,允许所有IP段通过桥接。对比工作机的这个文件(如果有的话),确保规则一致。ARP缓存与数据包抓包验证
先在物理机上用ip neigh show查看ARP邻居表,看看虚拟机的公网IP有没有对应的MAC地址。如果没有,说明物理机没学到虚拟机的ARP,或者Hetzner网关那边没同步。再用tcpdump -i br0 icmp抓包,ping虚拟机的时候看看数据包是不是到达了br0:如果包到了但没回应,问题在虚拟机内部(比如虚拟机的防火墙、IP配置);如果包根本没到br0,那就是物理机的桥接或者路由转发有问题。SELinux状态
检查两台机器的SELinux状态:getenforce,CentOS 7.9默认可能是Enforcing模式,而你原来的7.8可能是Permissive?临时把非工作机的SELinux改成Permissive试试:setenforce 0,如果能通了,就是SELinux的规则限制了桥接的网络转发,需要调整SELinux策略或者保持Permissive。VirtualBox插件与服务状态
虽然你说用了原来的版本,但说不定Vagrant的VirtualBox插件损坏或者版本有细微差异?用vagrant plugin list对比两台机器的插件版本,必要的话重新安装插件:vagrant plugin uninstall vagrant-virtualbox && vagrant plugin install vagrant-virtualbox。另外,检查VirtualBox服务的状态:systemctl status vboxdrv,确保服务正常运行,没有报错。桥接模块的内核参数
对比两台机器的桥接模块参数,比如sysctl net.bridge.bridge-nf-call-iptables、sysctl net.bridge.bridge-nf-call-ip6tables的值,如果非工作机是1,而工作机是0,那iptables会处理桥接的数据包,可能导致规则拦截。可以临时改成0试试:sysctl -w net.bridge.bridge-nf-call-iptables=0。Hetzner后台的MAC绑定限制
最后别忘了检查Hetzner的管理面板,有些时候Hetzner会开启ARP防护或者IP-MAC绑定,你原来的虚拟机MAC可能被绑定在工作机上,换机器后新的虚拟机MAC没被添加到允许列表里。登录Hetzner后台,看看对应IP段的MAC绑定规则,把虚拟机的MAC加进去试试。
一步步对比这些点,应该能找到那藏起来的差异!
备注:内容来源于stack exchange,提问作者Kevin Jones

