三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

VMware虚拟机Linux静态IP配置与端口转发实战指南

VMware虚拟机Linux静态IP配置与端口转发实战指南

1. 项目概述:为什么要在Linux下折腾静态NAT上网?

如果你在Linux系统,特别是虚拟机里的Linux,遇到过网络不通、服务无法被外部访问,或者想搭建一个隔离的测试环境,那你很可能已经和NAT打过交道了。静态NAT,作为网络地址转换(NAT)技术中的一种“硬核”模式,它解决的问题非常具体:将内网中一个固定的私有IP地址,永久地映射到公网(或外部网络)的一个固定IP地址上。这听起来可能有点抽象,我举个生活化的例子:你公司有一部总机电话(公网IP),你作为某个部门的固定分机(内网私有IP)。静态NAT就像给这个分机设置了一条专线,任何打给总机并转接你这个分机号的电话,都会毫无偏差地接通到你这里,并且你这个分机对外显示的就是总机的号码。在VMware、VirtualBox这类虚拟化环境里,VMnet8(NAT模式虚拟网卡)扮演的就是这个“总机交换机”的角色。

那么,为什么我们不在Linux里直接用默认的DHCP获取地址,而非要手动配置静态NAT呢?原因有几个:首先是服务稳定性,对于部署在虚拟机里的Web服务器、数据库或者开发测试环境,一个固定的IP是必须的,否则每次重启都可能变地址,配置起来会非常头疼。其次是端口转发精准控制,静态NAT(结合端口转发)能让你清晰地定义“外部哪个端口访问网关IP,就转发到内部Linux的哪个端口”,这对于部署应用、远程调试至关重要。最后是网络隔离与模拟,在学习和实验网络架构,比如模拟防火墙策略、理解路由原理时,静态NAT提供了一个清晰、可控的网络边界模型。

本文将以最常见的VMware Workstation的NAT模式(VMnet8)为背景,手把手带你完成从理解原理、配置虚拟网络编辑器、到在Linux内部(以Rocky Linux/CentOS为例)设置静态IP并确保上网的全过程。过程中会穿插大量我踩过的坑和排查技巧,目标就是让你配置一次,以后就能稳定使用。

2. 核心原理与网络架构拆解

在动手之前,我们必须把背后的网络关系理顺。否则,一旦出现上不了网、ping不通网关的问题,就会像无头苍蝇一样乱撞。

2.1 NAT模式与VMnet8虚拟网络

当你为虚拟机选择“NAT模式”时,VMware会在你的物理主机(宿主机)上创建一个虚拟的以太网适配器,通常就是VMnet8。这个适配器充当了一个虚拟网络的网关和NAT设备。整个架构可以这样理解:

  1. 虚拟局域网(VLAN):所有设置为NAT模式的虚拟机,都连接到一个由VMware虚拟出来的局域网里,这个局域网的网段由VMware的“虚拟网络编辑器”定义,例如192.168.10.0/24
  2. 虚拟网关:VMnet8虚拟网卡本身有一个在这个虚拟局域网内的IP地址,通常是网段的第一个地址,如192.168.10.1这个地址就是所有NAT模式下虚拟机的默认网关
  3. NAT设备:VMware在后台运行一个NAT服务。当虚拟机(IP为192.168.10.128)要访问互联网(如8.8.8.8)时,数据包先发送到网关192.168.10.1。NAT服务会将数据包的源IP192.168.10.128替换为宿主机物理网卡的IP,然后才发往互联网。回程数据包则反向转换,再送回到虚拟机。这样,互联网看到的只是你宿主机的IP,虚拟机被隐藏在了内部。

2.2 静态NAT(SNAT/DNAT)与静态IP配置的区分

这里有一个至关重要的概念澄清,也是很多新手混淆的地方:

  • 我们常说的“静态NAT”:在专业网络设备(如路由器、防火墙)上,往往指一对一的IP映射(One-to-One NAT),即内网一个私有IP固定映射到公网一个公有IP。这属于目的NAT(DNAT)和源NAT(SNAT)的结合
  • 我们在VMware虚拟机里要做的“静态NAT上网”:更准确的描述是“在NAT网络模式下,为虚拟机配置静态的私有IP地址”。我们并没有改变VMware NAT设备一对多的本质(多个虚拟机共享宿主机IP上网),我们只是让虚拟机在内部的虚拟局域网里有一个固定地址,而不是每次从DHCP动态获取。

为了实现这个固定地址并能上网,我们需要做两件事:

  1. 在VMware的虚拟网络编辑器中,排除掉我们想用的静态IP,防止DHCP服务器把它分配出去
  2. 在Linux操作系统内部,手动配置网络,设置那个固定的IP、子网掩码、网关和DNS

所以,整个过程是“NAT模式 + 静态IP配置”。下文提到的“静态NAT”均指这个复合操作。

2.3 关键角色与数据流向

为了更直观,我们用一个表格来梳理关键角色:

角色典型地址示例作用备注
宿主机物理网卡172.16.1.100(公司内网)连接真实物理网络,拥有公网或局域网IP。VMware NAT服务的出口。
VMnet8虚拟网卡192.168.10.1虚拟局域网的网关,为虚拟机提供DHCP和NAT服务。在Windows的“网络连接”或macOS的“系统偏好设置-网络”中可见。
虚拟机Linux (静态IP)192.168.10.128我们的目标,配置静态地址后,其网关指向192.168.10.1需要手动配置/etc/sysconfig/network-scripts/下的文件(RHEL系)。
VMware DHCP服务器-默认会为NAT网络分配192.168.10.128-254的地址。我们必须从地址池中“抠出”我们要用的静态IP。
DNS服务器192.168.10.1114.114.114.114为虚拟机提供域名解析。通常可以设成网关地址(VMnet8),它会转发DNS请求到宿主机所用的DNS。

数据流向:虚拟机(192.168.10.128) -> 网关(192.168.10.1) -> NAT转换(源IP变172.16.1.100) -> 互联网 -> 返回路径逆向。

3. 实操准备:VMware虚拟网络编辑器配置

这是确保静态IP不被冲突的关键一步,必须在启动Linux虚拟机之前完成。

3.1 定位与打开虚拟网络编辑器

首先,关闭你的Linux虚拟机。在VMware Workstation(以Pro版为例)的菜单栏,点击“编辑” -> “虚拟网络编辑器”。你需要拥有管理员权限,可能会弹出UAC确认窗口。

打开后,你会看到一个列表。选中“VMnet8”(类型为NAT模式)。右下角可以看到其子网IP和子网掩码,例如192.168.10.0,掩码255.255.255.0。记住这个子网信息,我们配置Linux静态IP时必须在这个网段内。

3.2 修改DHCP地址池,预留静态IP

这是核心操作。在VMnet8的设置面板中,点击“DHCP设置…”按钮。

  1. 在弹出的窗口中,你会看到起始地址和结束地址,例如192.168.10.128192.168.10.254。这意味着DHCP服务器只会分配这个范围内的地址。
  2. 假设我们想为Linux虚拟机配置的静态IP是192.168.10.100我们需要确保这个地址不在DHCP的分配范围内。
  3. 有两种方法:
    • 方法A(推荐,一劳永逸):直接修改起始地址,比如将起始地址从192.168.10.128改为192.168.10.101。这样,192.168.10.100这个地址就落在了池外(192.168.10.101-254),永远不会被DHCP自动分配出去。
    • 方法B:如果你不想动起始地址,也可以记住你要用的静态IP(如.100),只要确保它不在128-254之间即可,比如用.50。但要注意,.1是网关,.2可能被广播占用,建议用.10.120之间且不在DHCP池内的地址。

实操心得:我强烈推荐方法A。曾经因为偷懒,用了.200这个在DHCP池内但当时没被分配的地址,结果某次同时启动多个虚拟机时,DHCP把.200分给了另一台机器,导致IP冲突,两台机器网络都时断时续,排查了半天。所以,永远不要让静态IP落在动态DHCP池内

  1. 修改后,点击“确定”关闭DHCP设置窗口,再点击虚拟网络编辑器主窗口的“应用”和“确定”保存所有更改。

3.3 确认NAT设置与网关地址

回到虚拟网络编辑器主界面,选中VMnet8后,点击“NAT设置…”按钮。这里显示的就是网关IP地址(Gateway IP),默认就是子网的第一个地址,如192.168.10.1。这个地址就是我们稍后要在Linux里配置的默认网关,务必记下来。确认无误后关闭所有设置窗口。

4. Linux系统内部静态IP配置详解

现在,启动你的Linux虚拟机。这里以RHEL、CentOS、Rocky Linux、Fedora等使用NetworkManager且兼容传统network-scripts的系统为例(目前仍是最常见的场景)。Ubuntu/Debian系使用netplan,配置方法不同,但原理相通。

4.1 确定网络接口名称

首先,打开终端,查看你的网络接口叫什么。

ip addr

或者用老命令:

ifconfig -a

你会看到类似输出:

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:xx:xx:xx brd ff:ff:ff:ff:ff:ff inet 192.168.10.128/24 brd 192.168.10.255 scope global dynamic noprefixroute ens33 valid_lft 86388sec preferred_lft 86388sec inet6 fe80::20c:29ff:fexx:xxxx/64 scope link noprefixroute valid_lft forever preferred_lft forever

关键信息是ens33(你的可能叫eth0ens160等),以及它当前通过DHCP获取到的地址192.168.10.128。记下接口名。

4.2 编辑网络配置文件(传统方法)

对于RHEL系,静态IP通常通过编辑/etc/sysconfig/network-scripts/目录下的ifcfg-<接口名>文件来配置。

  1. 备份原配置文件(如果是DHCP获取的):

    sudo cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak
  2. 使用vinano编辑配置文件:

    sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33
  3. 将其内容修改为如下所示(根据你的实际情况调整):

    TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static # 关键!将dhcp改为static/none DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=你的网卡UUID(原文件有,保留即可) DEVICE=ens33 ONBOOT=yes # 关键!确保开机自启 # 以下是静态IP配置核心部分 IPADDR=192.168.10.100 # 你预留的静态IP NETMASK=255.255.255.0 # 子网掩码,与VMnet8子网一致 # 或者用PREFIX=24 # PREFIX=24 GATEWAY=192.168.10.1 # 网关,即VMnet8的IP DNS1=192.168.10.1 # DNS1,设为网关地址,由VMware转发 DNS2=114.114.114.114 # DNS2,备用公共DNS

    关键参数解析

    • BOOTPROTO=static:指明使用静态配置。
    • ONBOOT=yes:确保网络接口在系统启动时自动激活。
    • IPADDRNETMASKGATEWAY:必须与VMware虚拟网络编辑器中的设置在同一网段。
    • DNS1:设置为网关地址192.168.10.1是最省事的方式,VMware的NAT服务会处理DNS转发。你也可以直接设置成8.8.8.8114.114.114.114
  4. 保存并退出编辑器。

4.3 使用NetworkManager命令行(nmcli)配置(现代方法)

如果你喜欢命令行工具,或者系统默认使用NetworkManager,nmcli是更强大和推荐的方式。

  1. 首先,查看当前的连接(connection)名称:

    nmcli con show

    找到对应ens33接口的连接名,比如有线连接 1Wired connection 1

  2. 修改该连接为手动配置,并设置IP、网关、DNS:

    sudo nmcli con mod "有线连接 1" ipv4.method manual \ ipv4.addresses 192.168.10.100/24 \ ipv4.gateway 192.168.10.1 \ ipv4.dns "192.168.10.1 114.114.114.114"
    • ipv4.method manual等同于BOOTPROTO=static
    • ipv4.addresses 192.168.10.100/24同时设置了IP和前缀(子网掩码)。
    • ipv4.dns可以设置多个,用空格隔开。
  3. 使配置生效:

    sudo nmcli con up "有线连接 1"

注意事项nmcli配置会直接生效,并覆盖传统的ifcfg-*文件。两种方式不要混用,建议统一使用一种。nmcli方式更灵活,且能更好地与NetworkManager服务集成。

4.4 重启网络服务并验证配置

无论用哪种方法配置,最后都需要让新配置生效。

对于传统network服务

sudo systemctl restart network

对于NetworkManager(如果用了nmcli,上一步con up已经生效):

sudo systemctl restart NetworkManager

然后进行验证:

  1. 检查IP地址ip addr show ens33ifconfig ens33,确认IP已变为192.168.10.100
  2. 检查网关路由ip route showroute -n,查看默认路由是否指向192.168.10.1
  3. 测试内网连通性ping 192.168.10.1,应该能通。这是测试到网关(VMnet8)的连通性。
  4. 测试DNS解析ping www.baidu.com,如果能解析出IP并开始ping(即使可能因为防火墙暂时不通),说明DNS配置正确。
  5. 测试外网连通性ping 8.8.8.8,如果通,恭喜你,静态IP配置成功,并且可以通过NAT上网了。

5. 端口转发:让外部访问虚拟机内的服务

配置了静态IP,虚拟机可以主动访问外网了。但反过来,如果你想从宿主机甚至局域网其他电脑,访问虚拟机里搭建的Web服务器(比如跑在80端口),默认是不行的。因为NAT模式下的虚拟机处于一个私有网络后面。这时就需要用到端口转发(Port Forwarding)

生活类比:你的虚拟机是一个有固定房号(192.168.10.100:80)的房间,但整栋大楼(宿主机)只有一个对外的门牌号(宿主机IP)。端口转发就是在门卫室(VMware NAT服务)那里登记:“凡是来找大楼IP的8080端口的客人,都请带到100号房的80端口。”

5.1 在VMware虚拟网络编辑器中配置端口转发

  1. 再次打开“虚拟网络编辑器”,选中VMnet8,点击“NAT设置…”
  2. 在NAT设置窗口中,点击“添加…”按钮。
  3. 填写端口转发规则:
    • 主机端口:宿主机上用来监听的端口。例如,我们填8080。这意味着你将在宿主机上用8080端口来访问。
    • 类型:选择TCP(Web服务通常用TCP)。
    • 虚拟机IP地址:填写你为Linux配置的静态IP,192.168.10.100
    • 虚拟机端口:虚拟机内服务实际监听的端口,例如80
    • 描述可以写Web Server Forwarding
  4. 点击“确定”保存,一路“确定”退出编辑器。

5.2 验证端口转发

  1. 在Linux虚拟机内,启动一个简单的Web服务。比如用Python快速起一个:

    sudo dnf install python3 -y # 或 yum install python3 python3 -m http.server 80 &

    (注意:在Linux上监听80端口通常需要root权限,或者使用authbind等工具。这里仅为测试,也可用8080端口,并相应修改转发规则中的“虚拟机端口”。)

  2. 在Linux虚拟机内,检查服务是否监听:sudo ss -tlnp | grep :80

  3. 在宿主机(你的Windows或Mac物理机)上,打开浏览器,访问http://127.0.0.1:8080http://localhost:8080。如果能看到Python HTTP服务器列出的文件目录,说明端口转发成功!因为你的请求发到了宿主机的8080端口,被VMware转发到了虚拟机的80端口。

  4. 在局域网其他电脑上,访问http://<宿主机物理IP>:8080,也应该能访问到虚拟机内的服务。

实操心得:端口转发是打通内外网络的关键。常见问题有:1)虚拟机防火墙没开端口;2)服务没在监听0.0.0.0(所有接口);3)转发规则类型(TCP/UDP)填错。排查时,务必先在虚拟机内部用curl localhost:80测试服务本身是否正常。

6. 高级配置与故障排查大全

即使按照步骤操作,也可能遇到各种“坑”。这里汇总了常见问题及排查思路。

6.1 防火墙与SELinux干扰

这是导致网络不通的最常见原因之一。

  • Linux防火墙(firewalld/iptables)

    • 检查状态sudo systemctl status firewalld
    • 临时关闭(测试用)sudo systemctl stop firewalld
    • 永久关闭sudo systemctl disable --now firewalld
    • 更佳实践:放行服务端口
      sudo firewall-cmd --permanent --add-service=http # 放行HTTP sudo firewall-cmd --permanent --add-port=80/tcp # 或直接放行端口 sudo firewall-cmd --reload
  • SELinux:如果服务(如Nginx、Apache)无法绑定端口或访问文件,可能是SELinux上下文问题。

    • 查看状态getenforce(Enforcing为开启)
    • 临时设置为宽松模式(测试)sudo setenforce 0
    • 永久关闭(不推荐用于生产):编辑/etc/selinux/config,设置SELINUX=disabled,然后重启。

重要提示:在测试网络连通性时,可以临时关闭防火墙和SELinux来排除干扰。但问题解决后,对于需要长期运行的服务,建议学习并配置正确的安全策略,而不是一关了之。

6.2 网络服务冲突与配置重置

有时重启后配置失效,可能是多网络管理工具冲突。

  • NetworkManager vs network:在一些老版本系统中,两者可能冲突。建议禁用传统的network服务,只用NetworkManager。

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

    然后用nmcli重新配置连接。

  • 配置重置:如果nmcli修改后不生效,可以尝试删除连接重新创建:

    sudo nmcli con del "有线连接 1" sudo nmcli con add type ethernet con-name "Static-NAT" ifname ens33 ip4 192.168.10.100/24 gw4 192.168.10.1 sudo nmcli con mod "Static-NAT" ipv4.dns "192.168.10.1 8.8.8.8" sudo nmcli con up "Static-NAT"

6.3 虚拟机网络适配器设置检查

确保虚拟机的网络连接模式确实是“NAT模式”,并且连接着VMnet8

  1. 在VMware中,右键虚拟机 -> 设置。
  2. 选择“网络适配器”。
  3. 确认“网络连接”选择的是“NAT模式”
  4. 在“高级”选项中,可以查看并记下MAC地址,有时克隆虚拟机会导致MAC地址冲突,需要“生成”一个新的。

6.4 宿主机VMware服务状态

VMware的相关后台服务必须运行。

  • Windows:打开“服务”(services.msc),检查VMware DHCP ServiceVMware NAT Service是否处于“正在运行”状态。如果没有,手动启动它们。
  • macOS/Linux:检查VMware相关进程,或尝试在VMware Fusion或Workstation中重置网络设置。

6.5 系统性排查流程图

当网络不通时,可以按照以下顺序排查,能快速定位问题环节:

  1. 虚拟机内部环回测试ping 127.0.0.1。不通则系统TCP/IP栈有问题。
  2. 虚拟机内部ping自己IPping 192.168.10.100。不通则网卡或IP配置有问题。
  3. 虚拟机ping网关ping 192.168.10.1。不通则问题在虚拟机到VMnet8之间(IP/掩码/网关配置错误、VMware服务未启动、防火墙拦截ICMP)。
  4. 虚拟机ping外网IPping 8.8.8.8。通则说明NAT和路由基本正常。
  5. 虚拟机ping域名ping www.baidu.com。通IP不通域名,是DNS问题。
  6. 宿主机ping虚拟机:在宿主机命令行ping 192.168.10.100。不通则可能是VMnet8网卡禁用、虚拟机防火墙设置、或IP冲突。
  7. 测试端口转发:在宿主机用telnet 127.0.0.1 8080curl 127.0.0.1:8080。不通则检查转发规则、虚拟机内服务是否监听0.0.0.0、虚拟机内防火墙。

6.6 关于WSL2与VMware网络冲突的特别说明

从热词中看到wsl: 无法配置网络 (networkingmode nat)的错误。WSL2默认也使用Hyper-V的NAT网络,其虚拟交换机可能与VMware的虚拟网络(尤其是VMnet8)产生冲突,导致两者网络都不正常。

解决方案

  1. 避免同时运行:尽量不要同时运行WSL2和VMware虚拟机。
  2. 重置WSL2网络:在PowerShell(管理员)中执行wsl --shutdown关闭WSL,然后重启。
  3. 修改WSL2网络模式:在用户目录创建或编辑.wslconfig文件,内容如下:
    [wsl2] networkingMode=mirrored # 或 networkingMode=bridged
    这会将WSL2网络模式改为镜像或桥接,可能避免与VMware的NAT冲突。但具体效果因系统环境而异。

配置Linux静态IP上网,尤其是结合端口转发,是虚拟化学习和日常开发中的一项基础且重要的技能。整个过程的核心在于理解VMware构建的虚拟网络拓扑,并确保虚拟机、虚拟网络编辑器、宿主机三者之间的配置像齿轮一样严丝合缝地咬合。最深刻的体会就是:网络问题,十之八九源于配置不一致。IP地址、子网掩码、网关、DNS,任何一个参数对不上,都会导致失败。养成修改前备份、修改后逐层验证(本机->网关->外网IP->外网域名)的习惯,能节省大量排查时间。当一切配置妥当,看到宿主机浏览器通过localhost访问到虚拟机内网页的那一刻,这种对网络流量路径的掌控感,正是运维和开发工作的乐趣之一。

← 返回列表