本文详解虚拟机Linux端口映射至本机的配置方法:首先确保虚拟机为NAT模式,进入虚拟机软件(如VMware/VirtualBox)的“网络设置”,配置端口转发规则(本机端口→虚拟机IP:端口);随后登录Linux系统,通过firewalld(firewall-cmd --add-port=端口/tcp --permanent)或iptables开放目标端口,并重启防火墙,常见问题包括:端口冲突(更换本机端口)、防火墙阻拦(检查规则)、映射失效(确认虚拟机IP是否为DHCP分配或静态设置),正确配置后,可通过本机浏览器访问虚拟机服务,实现跨机通信。在开发与测试环境中,我们常需要通过本地主机访问虚拟机中运行的服务(如Web服务器、数据库、SSH等),虚拟机Linux系统的端口映射功能,正是实现这一需求的核心技术——它将虚拟机内部服务的端口“转发”到本地主机的指定端口,使本地主机能像访问本地服务一样访问虚拟机资源,本文将以主流虚拟化软件(VMware、VirtualBox)和Linux系统为例,详细讲解端口映射的配置方法、关键步骤及常见问题排查。
为什么需要端口映射?
虚拟机默认运行在独立的虚拟网络中,与本地主机(物理机)网络隔离,若需从本地主机访问虚拟机内的服务(如虚拟机中部署的Nginx监听80端口),直接通过本地IP访问是无法成功的,因为虚拟机的IP对本地主机不可见,端口映射通过在虚拟化软件中配置“转发规则”,将本地主机的某个端口与虚拟机的指定端口绑定,实现流量转发:
- 本地主机:访问
本地IP:映射端口 - 虚拟化软件:将流量转发至
虚拟机IP:目标端口 - 虚拟机:接收流量并返回响应
前置条件:虚拟机网络模式选择
端口映射的前提是虚拟机采用NAT模式(网络地址转换),NAT模式下,虚拟机通过虚拟化软件的NAT服务共享本地主机的网络,虚拟机IP通常为私有IP(如192.168.x.x),且虚拟化软件会充当“中间人”,实现端口转发。

若虚拟机为“桥接模式”,则虚拟机直接连接本地物理网络,相当于一台独立设备,此时无需端口映射即可通过局域网IP访问(需确保虚拟机与本地主机在同一网络),本文以更常用的NAT模式为例展开。
VMware虚拟机Linux端口映射配置
确认虚拟机NAT网络设置
打开VMware Workstation,选择虚拟机 → 右键“设置” → “网络适配器”,确保网络模式为“NAT模式”。
点击“NAT设置”,记录以下信息:
- 网关IP:如192.168.123.2(虚拟机网络的默认网关)
- 子网掩码:如255.255.255.0
- DHCP范围:如192.168.123.128-192.168.123.254(虚拟机动态分配的IP范围)
配置虚拟机静态IP(避免重启后IP变化)
DHCP分配的IP可能变化,导致端口映射失效,建议为虚拟机Linux系统配置静态IP,确保IP固定。
以Ubuntu/Debian为例:
编辑网络配置文件 /etc/netplan/01-netcfg.yaml(文件名可能因系统版本不同):
network:
version: 2
ethernets:
eth0: # 网卡名称,可通过 `ip a` 查看
dhcp4: no
addresses: [192.168.123.150/24] # 选择DHCP范围内的IP,如192.168.123.150
gateway4: 192.168.123.2 # 步骤1中记录的网关IP
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
执行 netplan apply 使配置生效,通过 ip a 确认虚拟机IP已固定(如192.168.123.150)。
添加NAT端口转发规则
回到VMware虚拟机设置界面,选择“NAT设置” → “端口转发” → “添加”。
填写规则信息(以映射SSH服务22端口为例):
- 名称:自定义(如
ssh-forward) - 协议:TCP(根据服务类型选择,HTTP/TCP,UDP/UDP等)
- 主机IP:留空(默认为本地主机所有IP,或指定本地主机IP如192.168.1.100)
- 主机端口:本地主机映射端口(如2222,避免与本地已有端口冲突)
- 虚拟机IP地址:步骤2中配置的虚拟机静态IP(192.168.123.150)
- 虚拟机端口:虚拟机内服务监听的端口(如SSH的22)
点击“确定”保存规则,VMware会自动应用转发规则。
虚拟机内服务与防火墙配置
确保虚拟机内目标服务已启动并监听正确IP(如Nginx监听0.0.0:80,而非0.0.1:80),同时检查Linux防火墙,放行目标端口:
- Ubuntu/Debian (ufw):
sudo ufw allow 22/tcp # 放行SSH端口(示例) sudo ufw reload
- CentOS/RHEL (firewalld):
sudo firewall-cmd --permanent --add-port=22/tcp sudo firewall-cmd --reload
验证映射是否成功
在本地主机(物理机)终端执行:
telnet 本地IP 映射端口 # 如 telnet 127.0.0.1 2222 # 或 curl http://本地IP:映射端口 # 如 curl http://127.0.0.1:8080(假设映射了Web服务的8080端口)
若连接成功(telnet显示“Connected to...”

