物理机通过ESXi虚拟机上网:原理与详细配置指南
场景与需求
您是否遇到过这样的困境:一台物理服务器(称为“物理机A”)因安全策略、网络限制或特殊配置无法直接访问互联网,但其运行的ESXi主机上的某台虚拟机(称为“虚拟机B”)却拥有畅通的网络连接?让物理机A借助虚拟机B的网络通道上网,就成为了一种实用的解决方案,本文将深入解析其工作原理,并提供一份详细的配置步骤。
核心原理:虚拟交换机与NAT
实现物理机通过ESXi虚拟机上网,本质是利用ESXi强大的网络虚拟化能力,核心在于两个关键组件:
- 虚拟交换机 (vSwitch): ESXi内置的网络交换设备,连接物理网卡、虚拟机虚拟网卡(vNIC)以及VMkernel端口,它是数据流转发的核心枢纽。
- 网络地址转换 (NAT): 在虚拟机B内部配置NAT服务(如Linux的
iptables
/nftables
或Windows的“Internet连接共享”ICS),NAT负责将物理机A发出的网络请求,伪装成源自虚拟机B的IP地址,并将外部返回的响应数据正确转发回物理机A。
工作流程
- 物理机A将上网请求数据包发送到其配置的网关(即虚拟机B的内部IP)。
- 数据包通过ESXi的虚拟交换机,从物理机A的物理网卡传递到虚拟机B的虚拟网卡。
- 虚拟机B内部的NAT服务收到数据包:
- 修改源IP地址:将源IP(物理机A的内部IP)改为虚拟机B自身的公网/可上网IP。
- 记录连接映射:在NAT表中保存这条连接的原始信息(物理机A的IP和端口)。
- 修改后的数据包从虚拟机B发出,经由ESXi虚拟交换机和物理主机B的物理网卡,最终到达互联网。
- 互联网服务器返回响应数据包给虚拟机B的公网IP。
- 虚拟机B的NAT服务根据之前记录的映射表:
- 修改目标IP地址:将目标IP(虚拟机B的公网IP)改回物理机A的内部IP。
- 将数据包转发回虚拟交换机。
- 数据包通过虚拟交换机送达物理机A的物理网卡,完成通信。
详细配置步骤 (以Linux虚拟机B为例)
第一部分:ESXi主机配置
- 创建端口组 (Port Group):
- 登录vSphere Client (Web Client)。
- 导航到您的ESXi主机 -> “配置” -> “网络” -> “虚拟交换机”。
- 选择一个现有的标准交换机(vSwitch),或新建一个。
- 在选定的vSwitch上,点击“添加端口组”。
- 为端口组命名(
Transit-Network
)。 - 关键安全设置:
- 混杂模式 (Promiscuous Mode): 必须设置为
接受
,允许端口组上的虚拟机(即虚拟机B)接收目的地非其自身MAC地址的流量(即物理机A的流量)。 - MAC地址更改 (MAC Address Changes): 设置为
接受
(通常默认即可)。 - 伪传输 (Forged Transmits): 设置为
接受
(通常默认即可)。
- 混杂模式 (Promiscuous Mode): 必须设置为
- 完成创建。
- 配置虚拟机B的网络:
- 编辑虚拟机B的设置。
- 为虚拟机B 添加第二块虚拟网卡 (vNIC)。
- 将此新vNIC连接到刚创建的
Transit-Network
端口组,这块网卡将用于与物理机A通信。 - 确保虚拟机B原有的、连接着可上网网络的vNIC(通常连接
VM Network
)仍然存在,这块网卡用于访问互联网。 - 保存设置,启动虚拟机B。
第二部分:虚拟机B内部配置 (Linux – 使用iptables)
- 识别网络接口:
- 登录虚拟机B。
- 运行
ip a
或ifconfig
(较旧系统),找到两块网卡:eth0
(假设):连接原有可上网网络 (VM Network
),拥有公网/可路由IP。eth1
(假设):新添加的网卡,连接Transit-Network
,它应该有一个私有IP(168.10.1
),记下此接口名和IP。
- 配置
eth1
的IP (静态):- 编辑网络配置文件(如
/etc/network/interfaces
或/etc/sysconfig/network-scripts/ifcfg-eth1
),为eth1
设置静态IP(如168.10.1/24
)并禁用DHCP。 - 重启网络服务或重启
eth1
(sudo ifdown eth1 && sudo ifup eth1
或sudo systemctl restart networking
/NetworkManager
)。
- 编辑网络配置文件(如
- 启用IP转发:
- 编辑
/etc/sysctl.conf
文件,添加或修改行:net.ipv4.ip_forward = 1
- 使配置立即生效:
sudo sysctl -p
。
- 编辑
- 配置iptables NAT规则:
- 设置SNAT (源地址转换 – 用于上网):
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
-o eth0
: 指定出口网卡(连接互联网的网卡)。MASQUERADE
: 自动使用eth0
的IP作为源IP进行SNAT,适用于动态获取IP的情况。eth0
是固定IP,也可以用-j SNAT --to-source [eth0的IP]
。
- 设置FORWARD规则 (允许流量转发):
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT # 允许从内网(eth1)到外网(eth0)的转发 sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许已建立连接的相关/返回流量
- 设置SNAT (源地址转换 – 用于上网):
- (可选) 持久化iptables规则:
- 安装持久化工具(如
iptables-persistent
):sudo apt-get install iptables-persistent
(Debian/Ubuntu) 或sudo yum install iptables-services
(RHEL/CentOS)。 - 保存规则:
sudo netfilter-persistent save
或sudo service iptables save
(取决于系统)。
- 安装持久化工具(如
第三部分:物理机A配置
- 物理连接:
- 使用网线将物理机A的物理网卡连接到ESXi主机上承载
Transit-Network
端口组的那个物理网卡(或连接到同一物理交换机上该ESXi物理网卡所连的端口)。
- 使用网线将物理机A的物理网卡连接到ESXi主机上承载
- 网络配置:
- 在物理机A的操作系统中,为其物理网卡配置一个与虚拟机B的
eth1
同网段的静态IP地址(168.10.2
)。 - 配置默认网关为虚拟机B的
eth1
的IP地址(即168.10.1
)。 - 配置DNS服务器,可以设置为公共DNS(如
8.8.8
,8.4.4
),或者如果虚拟机B能解析内网DNS,也可以设置为虚拟机B的IP (168.10.1
),但这需要在虚拟机B上配置DNS转发。
- 在物理机A的操作系统中,为其物理网卡配置一个与虚拟机B的
验证与测试
- 在物理机A上:
ping 192.168.10.1
(虚拟机B的eth1) 应该成功。ping 8.8.8.8
或ping www.baidu.com
应该成功。traceroute 8.8.8.8
或tracert 8.8.8.8
(Windows) 应显示第一跳是168.10.1
(虚拟机B)。
- 在虚拟机B上:
- 运行
sudo iptables -t nat -vL POSTROUTING -n
和sudo iptables -vL FORWARD -n
,可以看到数据包计数在增加,表明NAT和转发正在工作。 - 使用
tcpdump
监听eth1
(sudo tcpdump -i eth1
) 可以看到物理机A发出的流量;监听eth0
(sudo tcpdump -i eth0
) 可以看到源IP已被替换为虚拟机B的IP的流量。
- 运行
重要安全警告与注意事项
- 安全风险: 此配置将虚拟机B变成了物理机A的网关。虚拟机B的安全性至关重要:
- 确保虚拟机B本身及时更新补丁,安装并配置好防火墙(仅允许必要的转发规则)。
- 虚拟机B上的NAT服务(如iptables)配置不当可能导致安全漏洞。
- 物理机A理论上可以访问虚拟机B所在的
Transit-Network
上的任何其他设备(如果存在),反之亦然,请将此网络视为隔离区 (DMZ) 对待。
- 性能影响: 所有物理机A的上网流量都需经虚拟机B处理转发,这会消耗虚拟机B的CPU、内存和网络带宽资源,并引入额外延迟,确保虚拟机B有足够资源。
- 混杂模式: ESXi端口组上开启混杂模式是必要条件,但这也降低了该端口组的网络隔离性,仅应在确实需要此功能的端口组上启用。
- 防火墙: 检查虚拟机B内部防火墙(如
firewalld
,ufw
)以及ESXi主机防火墙,确保它们没有阻止转发流量或NAT所需的连接。 - 替代方案: 如果物理机A是另一台ESXi主机,或者网络环境允许,更优的方案可能是:
- 配置物理机A直接连接到可上网的网络。
- 在物理机A所在的网络和可上网网络之间配置路由器或防火墙规则。
- 使用专用的虚拟防火墙/路由器设备(如pfSense, OPNsense, VyOS)部署在ESXi上,代替在普通虚拟机中配置NAT,通常更安全、功能更强大、性能更好。
- IPv6: 本文主要针对IPv4,如需支持IPv6,需要在虚拟机B上额外配置IPv6转发和NDP代理或NPTv6/NAT66。
通过合理配置ESXi虚拟交换机的端口组(开启混杂模式)并在目标虚拟机内设置NAT服务,可以实现物理机通过ESXi虚拟机访问互联网,这种方案适用于特定网络受限场景,但务必充分理解其安全风险和性能影响,配置过程涉及ESXi网络设置、虚拟机操作系统网络配置及防火墙/NAT规则设定,在实施前,请评估是否有更优、更安全的网络架构方案可供选择。
引用说明
本文配置方法参考了VMware官方文档关于虚拟交换机安全策略(Security Policies for Standard Switches)及Linux内核网络参数(IP Forwarding)的相关说明,并结合了常见的Linux iptables NAT配置实践,具体命令语法可能因操作系统发行版及版本略有差异。
重要提示: 生产环境中实施此类方案前,请务必进行严格的测试,并制定相应的安全加固措施和应急预案。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/18125.html