☰
VirtualBox双网卡配置:CentOS 7 NAT与Host-Only联网实战
2026/10/20 18:15:31 网站建设 项目流程

1. 为什么我要折腾双网卡联网方案

在本地虚拟机里跑 CentOS 7 做开发环境,最让人头疼的往往不是系统本身,而是网络配置。我最初用 VirtualBox 默认的 NAT 模式,虚拟机确实能上网,但宿主机想 SSH 连进去、想访问虚拟机里跑的服务,就变得特别别扭——得靠端口转发,每加一个服务就要改一次配置,时间长了转发规则能列一长串,自己都记不清哪个端口对应哪个服务。

后来我换成了 NAT 加 Host-Only 双网卡方案,思路其实很朴素:NAT 网卡专门负责虚拟机访问外网,Host-Only 网卡专门负责宿主机和虚拟机之间的内网通信。两块网卡各司其职,互不干扰。听起来简单,但实际操作中我在 CentOS 7 上踩了一连串的坑,从网卡识别、配置文件命名、路由优先级到 DNS 解析,几乎每个环节都卡过。

这篇文章就是把这套方案的完整落地过程拆开讲清楚。适合正在用 VirtualBox 跑 CentOS 7、需要同时满足"虚拟机上网"和"宿主机直连虚拟机"两个需求的开发者。不管你之前有没有接触过 Linux 网络配置,只要跟着思路走,应该都能把环境搭起来。我会把每一步背后的逻辑讲透,而不是只丢几条命令让你照抄——因为环境稍有不同,照抄往往就是踩坑的开始。

2. 双网卡方案的核心逻辑与常见误解

2.1 NAT 和 Host-Only 各自到底管什么

很多人对这两种网络模式的理解停留在"NAT 能上网、Host-Only 不能上网"这个层面,但真正配置时出问题,往往是因为没搞清楚它们在数据包层面的行为差异。

NAT 模式的本质是 VirtualBox 在宿主机上跑了一个虚拟的 NAT 设备。虚拟机发出的数据包,源地址会被转换成宿主机的地址再发出去,所以虚拟机可以访问外网,但外网和宿主机默认无法主动访问虚拟机。它就像你家里的路由器,内部设备能出去,外面进不来,除非你手动做端口映射。

Host-Only 模式则是 VirtualBox 创建了一块虚拟网卡挂在宿主机上,虚拟机和宿主机处在这个虚拟网卡的同一个网段里。它不能访问外网,但宿主机和虚拟机之间可以自由通信。你可以把它理解成一根网线直接把两台机器连起来,形成一个封闭的小局域网。

关键点在于:当虚拟机同时挂载这两块网卡时,系统里会出现两个网络接口,各自有独立的 IP 和路由。CentOS 7 需要正确识别它们、正确配置它们,还要保证默认路由走 NAT 那块网卡,否则就会出现"能 ping 通宿主机但上不了网"或者"能上网但宿主机连不进来"的经典问题。

2.2 一个容易想当然的误区

我一开始以为,只要在 VirtualBox 里给虚拟机挂两块网卡,CentOS 7 就会自动都启用、自动配好。事实完全不是这样。CentOS 7 默认使用 NetworkManager 管理网络,而 VirtualBox 虚拟出来的网卡在系统里可能被识别成不同的接口名,配置文件也可能不存在或者名字对不上。

更坑的是,CentOS 7 的网卡命名规则不是传统的 eth0、eth1,而是类似 enp0s3、enp0s8 这种基于硬件位置的命名。如果你按老教程去改/etc/sysconfig/network-scripts/ifcfg-eth0,会发现根本没这个文件,改了也不生效。这是第一个必须跨过的认知门槛。

还有一个误区是认为 Host-Only 网卡的 IP 可以随便设。实际上它必须和 VirtualBox 里 Host-Only 网络适配器设定的网段一致,否则宿主机和虚拟机根本不在一个网段,自然连不通。这个网段在 VirtualBox 的全局设置里能看到,配置前一定要先确认。

3. VirtualBox 侧的网卡挂载与网络规划

3.1 先规划好网段再动手

动手改配置之前,我建议先把网段规划清楚,不然后面改来改去很容易乱。我的规划是这样的:

网卡模式网段虚拟机 IP用途
网卡1NAT由 VirtualBox 分配DHCP 自动获取访问外网
网卡2Host-Only192.168.56.0/24192.168.56.101宿主机直连

Host-Only 的网段我选了 192.168.56.0/24,这是 VirtualBox 默认的 Host-Only 网段,比较省事。如果你之前改过,可以在 VirtualBox 菜单的"管理"→"主机网络管理器"里查看和修改。虚拟机 IP 我固定成 192.168.56.101,方便记忆和后续 SSH 配置。

提示:Host-Only 网段不要和你宿主机所在的真实局域网网段冲突,否则路由会出问题。比如你家里路由器是 192.168.1.x,那 Host-Only 就别用这个段。

3.2 在 VirtualBox 里挂载两块网卡

关闭虚拟机后,打开虚拟机的设置界面,进入"网络"选项卡。这里默认有四个网卡槽位,我用了前两个:

网卡1 的"连接方式"选NAT,高级选项里适配器类型保持默认的 Intel PRO/1000 就行。这块网卡不需要额外配置,VirtualBox 会自动处理地址转换。

网卡2 的"连接方式"选Host-Only,界面名称选择 VirtualBox 创建的那块 Host-Only 虚拟网卡。如果下拉列表是空的,说明你还没创建 Host-Only 网络,需要先去"主机网络管理器"里新建一个。

这里有个细节值得说:网卡的"混杂模式"我一般设为"全部允许",虽然理论上不设也能用,但在某些宿主机环境下,不开启混杂模式会导致 Host-Only 通信不稳定。这个设置不影响安全,因为 Host-Only 本身就是封闭网络。

3.3 启动后确认网卡是否被识别

虚拟机启动后,第一件事是确认系统识别到了几块网卡。执行:

ip addr

或者用老命令:

ifconfig -a

正常情况下你会看到两个 enp 开头的接口,比如 enp0s3 和 enp0s8。enp0s3 对应网卡1(NAT),enp0s8 对应网卡2(Host-Only)。如果只看到一个,说明 VirtualBox 侧的网卡没挂好,或者系统没识别到,需要回头检查虚拟机设置。

我遇到过一种情况:两块网卡都识别到了,但其中一块显示state DOWN,也就是没启用。这时候不要急着改配置文件,先用命令临时启用看看:

sudo ip link set enp0s8 up

如果启用后能正常工作,说明是配置文件的问题;如果启用后还是不行,那可能是 VirtualBox 侧的问题。这个排查顺序能帮你快速定位问题在哪一层。

4. CentOS 7 网卡配置文件的手动修正

4.1 找到真实的配置文件

CentOS 7 的网络配置文件都在/etc/sysconfig/network-scripts/目录下,文件名格式是ifcfg-接口名。先列出来看看:

ls /etc/sysconfig/network-scripts/ifcfg-*

你可能会发现只有ifcfg-enp0s3或者ifcfg-enp0s8其中一个,甚至两个都没有。这是因为 CentOS 7 默认用 NetworkManager 动态管理,不一定为每块网卡都生成静态配置文件。如果缺文件,需要手动创建。

我建议两块网卡都用静态配置文件管理,这样行为可预测,不会因为 NetworkManager 的自动决策导致路由乱跳。

4.2 NAT 网卡的配置要点

NAT 网卡(enp0s3)的配置文件内容大致如下:

TYPE=Ethernet BOOTPROTO=dhcp NAME=enp0s3 DEVICE=enp0s3 ONBOOT=yes

这里BOOTPROTO=dhcp是关键,因为 NAT 模式下 VirtualBox 内置的 DHCP 服务会给虚拟机分配地址。ONBOOT=yes保证开机自动启用。不需要配 IPADDR、GATEWAY 这些,DHCP 会全部搞定。

有一点要注意:如果你之前手动改过这个文件,把 BOOTPROTO 改成了 static 并配了固定 IP,那 NAT 可能就不通了。NAT 网卡最好保持 DHCP,让它自己拿地址。

4.3 Host-Only 网卡的静态配置

Host-Only 网卡(enp0s8)我配成静态 IP,配置文件如下:

TYPE=Ethernet BOOTPROTO=static NAME=enp0s8 DEVICE=enp0s8 ONBOOT=yes IPADDR=192.168.56.101 NETMASK=255.255.255.0

注意这里我故意没有配 GATEWAY。这是整个方案里最关键的一个决策点。如果给 Host-Only 网卡也配了网关,系统里就会出现两个默认网关,路由表会混乱,可能导致上网流量走到 Host-Only 网卡上去,结果就是上不了网。

Host-Only 网卡只负责同网段通信,不需要网关。宿主机和虚拟机在 192.168.56.0/24 这个网段里直接二层通信,根本不经过网关。

4.4 重启网络让配置生效

改完配置文件后,重启网络服务:

sudo systemctl restart network

如果报错,可以用systemctl status network看具体错误。常见的错误是配置文件里有拼写错误,或者接口名和 DEVICE 不一致。

重启后再次ip addr确认,enp0s8 应该显示你配的 192.168.56.101。然后用ip route查看路由表,确认默认路由(default)指向的是 NAT 网卡的网关,而不是 Host-Only 网卡。这一步是验证配置是否正确的核心。

5. 路由与 DNS 的坑:能 ping 通却上不了网

5.1 默认路由被抢的典型症状

我踩过最典型的一个坑是:配置完成后,宿主机能 SSH 连上虚拟机,虚拟机也能 ping 通宿主机的 Host-Only 地址,但虚拟机就是上不了外网,ping www.baidu.com直接超时。

排查时先看路由表:

ip route

如果看到两条 default 路由,或者 default 指向的是 192.168.56.x 网段,那问题就找到了。系统把 Host-Only 网卡当成了默认出口,但 Host-Only 根本连不到外网,流量自然出不去。

解决办法就是前面说的:Host-Only 配置文件里不要写 GATEWAY。如果已经写了,删掉后重启网络。如果路由表里还有残留的默认路由,可以用命令手动删:

sudo ip route del default via 192.168.56.1

但手动删只是临时的,重启就回来了,根本解决还是要改配置文件。

5.2 DNS 解析失败的隐蔽问题

另一个坑是 DNS。NAT 模式下,VirtualBox 会把 DNS 请求转发给宿主机的 DNS,所以理论上虚拟机不需要手动配 DNS。但有时候/etc/resolv.conf里是空的,或者被 NetworkManager 覆盖了,导致域名解析不了。

先检查:

cat /etc/resolv.conf

如果里面没有 nameserver,可以手动加一个公共 DNS:

nameserver 114.114.114.114 nameserver 8.8.8.8

但要注意,CentOS 7 的 NetworkManager 可能会在重启网络后覆盖这个文件。如果想让它持久化,可以在网卡配置文件里加:

DNS1=114.114.114.114 DNS2=8.8.8.8

加在 NAT 网卡的配置里就行,因为 DNS 请求走的是 NAT 那条路。

注意:如果你在 Host-Only 网卡配置里也加了 DNS,可能会造成解析混乱。DNS 只配在负责外网访问的网卡上。

5.3 用 ping 和 traceroute 分层定位

遇到网络问题时,我习惯用分层排查法,从近到远一层层测:

  1. ping 127.0.0.1—— 确认本机协议栈正常
  2. ping 192.168.56.1—— 确认能通到宿主机 Host-Only 网卡
  3. ping 8.8.8.8—— 确认能通到外网 IP(跳过 DNS)
  4. ping www.baidu.com—— 确认 DNS 解析正常

如果第 2 步通、第 3 步不通,说明路由有问题;如果第 3 步通、第 4 步不通,说明 DNS 有问题。这样定位比盲目改配置高效得多。

traceroute也好用,能看到数据包走到哪一跳断了:

traceroute 8.8.8.8

如果第一跳就卡住,说明默认路由有问题;如果能走到几跳后卡住,可能是宿主机防火墙或者上层网络的问题。

6. 宿主机侧的 SSH 与防火墙配合

6.1 用 Host-Only 地址直连虚拟机

双网卡配好之后,宿主机 SSH 连虚拟机就非常清爽了,直接用 Host-Only 地址:

ssh user@192.168.56.101

不需要任何端口转发,虚拟机里跑什么服务,宿主机直接用 192.168.56.101 加端口访问就行。这比 NAT 端口转发方便太多,尤其是服务多的时候。

我一般还会在宿主机的 hosts 文件里加一条记录,给这个 IP 起个好记的名字:

192.168.56.101 devbox

这样以后ssh devbox就能连上,不用记 IP。

6.2 虚拟机防火墙要不要关

CentOS 7 默认开着 firewalld。如果你发现宿主机连不上虚拟机的某个端口,先检查防火墙:

sudo firewall-cmd --list-all

如果确实是被防火墙挡了,有两种做法:一是直接关掉防火墙(开发环境图省事),二是开放特定端口。我倾向于后者,更规范:

sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload

关防火墙的命令是:

sudo systemctl stop firewalld sudo systemctl disable firewalld

提示:开发环境关掉防火墙问题不大,但如果虚拟机里有敏感数据,还是建议按需开放端口。

6.3 SELinux 可能带来的意外

还有一个容易被忽略的点是 SELinux。某些服务在 SELinux 开启时会因为安全策略拒绝访问,表现为端口不通或者服务起不来。排查时可以临时把 SELinux 设为宽容模式:

sudo setenforce 0

如果设成宽容模式后问题消失,那基本可以确定是 SELinux 的问题。永久关闭需要改/etc/selinux/config,把SELINUX=enforcing改成SELINUX=disabled,然后重启。

不过我不建议一上来就关 SELinux,最好先确认问题确实和它有关。很多时候网络不通和 SELinux 没关系,盲目关闭反而掩盖了真正的问题。

7. 几个让我印象深刻的排查实录

7.1 网卡名对不上导致配置无效

有一次我照着旧笔记配,把文件写成了ifcfg-eth1,结果重启网络后毫无变化。后来才发现系统里的接口叫 enp0s8,配置文件名字必须和接口名严格对应,否则系统根本不读这个文件。这个坑很隐蔽,因为文件确实存在,命令也不报错,就是不起作用。

教训是:配置前一定先用ip addr确认接口的真实名字,再创建对应文件。

7.2 复制虚拟机后 MAC 地址冲突

我用虚拟机克隆功能复制了一个环境,结果两个虚拟机的 Host-Only 网卡 MAC 地址一样,导致网络时通时断,非常诡异。VirtualBox 克隆时如果选择"完全克隆"一般会重新生成 MAC,但如果选"链接克隆"或者手动复制磁盘,就可能保留原 MAC。

解决办法是在虚拟机设置的网卡高级选项里,点一下 MAC 地址旁边的刷新按钮,重新生成一个。或者直接改配置文件里的 HWADDR。这个坑不常见,但一旦遇到很难想到。

7.3 NetworkManager 和 network 服务打架

CentOS 7 里 NetworkManager 和传统的 network 服务都能管网络,如果两个都开着,可能互相覆盖配置。我遇到过重启 network 后配置生效,但过一会儿又被 NetworkManager 改回去的情况。

比较稳妥的做法是二选一。我习惯用传统的 network 服务,所以会把 NetworkManager 停掉:

sudo systemctl stop NetworkManager sudo systemctl disable NetworkManager sudo systemctl enable network

这样网络配置就完全由静态文件控制,行为可预测。

8. 稳定运行后的日常维护建议

环境搭好只是开始,日常使用中还有几个习惯能帮你少踩坑。第一,改任何网络配置前先备份原文件,cp ifcfg-enp0s8 ifcfg-enp0s8.bak,出问题能快速回滚。第二,每次改完配置用ip addr和ip route双重确认,不要只看一个。第三,如果虚拟机要长期使用,建议把 Host-Only 的 IP 固定下来并记录在案,避免时间长了忘记。

另外,如果你经常需要重建虚拟机,可以把这套配置脚本化。把网卡配置文件的内容写成一个 shell 脚本,新环境里跑一遍就配好了,比手动改快得多,也不容易出错。我自己就维护了这么一个脚本,每次新建 CentOS 7 虚拟机,五分钟就能把双网卡环境跑起来。

这套 NAT 加 Host-Only 的方案,我从最初踩坑到现在稳定使用,最大的体会是:网络配置没有捷径,每一步都要理解它在做什么。理解了 NAT 负责出口、Host-Only 负责内网这个分工,理解了默认路由只能有一个这个原则,后面遇到再奇怪的现象,都能顺着逻辑找到原因。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询