ESXi 主机只要在网络里露了头443 端口的 Web 管理页面就会成为被扫描的重点。很多朋友问我ESXi 能不能像普通网站那样只允许指定 IP 访问 Web 页面答案是可以但别把它想成在浏览器里点两下就能完成的事。ESXi 的访问控制分两层一层是主机自带的防火墙规则集它能针对服务做来源 IP 白名单另一层是外部交换机或边界防火墙的 ACL它直接看 IP 包头的五元组。把这两层配合起来才能既限制 IP又给自己留好退路。这篇内容适合已经装好 ESXi、正在做管理面收紧的运维同学也适合刚接触虚拟化、想知道 Host Client 到底怎么开白的读者。下面我按我实际改过 ESXi 6.7、7.0、8.0 的经验把命令、顺序和踩过的坑都摊开讲。1. 方案总览ESXi 管理页面的 IP 限制到底该做在哪一层1.1 ESXi 的 Web 页面不是普通网站ESXi 的 Web 管理页面也就是常说的 Host Client本质上是 hostd 提供的一项管理服务默认监听 443 端口浏览器访问https://ESXi_IP/ui就能打开登录界面。它没有 Apache 的.htaccess也没有 Nginx 的allow、deny指令你不能像改网站配置那样直接写一条“只允许某个 IP”的规则。ESXi 自带的是esxcli network firewall这套防火墙机制它把不同服务划分成规则集规则集里可以设置端口、协议、是否启用、是否允许所有地址以及一个允许 IP 列表。对 Web 页面来说最关键的就是找到承载 443 访问的规则集常见名称是vSphereClient部分版本里还可能看到vSphere Web Access之类的名字。不同版本叫法有差异所以不能死记一个名字必须先用命令列出来再动手。1.2 内置防火墙做白名单与外部 ACL 的分工我习惯把限制分成内层和外层。内层就是 ESXi 自己的防火墙规则集优点是跟着主机走不需要网络设备权限做单机级白名单很直接缺点是规则集名称和依赖关系需要确认弄错了可能把 vCenter、备份软件、监控系统一起挡在门外。外层是交换机 ACL 或边界防火墙策略优点是更硬直接基于 IP 包头五元组过滤不依赖 ESXi 版本缺点是需要网络设备管理权限而且一旦写错 ACL可能连 vMotion、iSCSI、NFS 这些流量一起误伤。我的做法通常是先在 ESXi 内置防火墙把vSphereClient规则集限制到指定 IP再在管理 VLAN 的交换机接口上做一层粗粒度 ACL 兜底。两层都做任何一层漏了另一层还能挡一下。1.3 不推荐直接修改配置文件或关闭管理服务网上有些老教程会让你去改/etc/vmware/firewall/service.xml或者干脆把 web 服务停掉。我不建议这么干。第一ESXi 的配置文件在重启或升级后可能被覆盖或还原你辛苦写的规则不一定能保留第二直接停掉 hostd 或 web 服务不只影响浏览器登录还会影响 vCenter 纳管、API 调用、备份软件连接排查起来非常麻烦第三ESXi 官方提供的esxcli network firewall已经能完成来源 IP 白名单没必要绕过受支持的接口。配置文件可以看可以备份但真正生效的变更应该走命令行或 vSphere Client 里的防火墙配置。把受支持的命令用熟比改系统文件可靠得多。2. 动手前必须盘点的信息和退路2.1 版本、管理 IP、备用通道核对清单变更前先拿张纸或者开个记事本把这几项写清楚ESXi 版本是 6.7、7.0 还是 8.0管理 IP 是多少掩码和网关是否正常当前你用来访问 Web 页面的终端 IP 是多少有没有 vCentervCenter 的 IP 是多少备份软件、监控系统、日志服务器分别从哪个 IP 访问 ESXiSSH 服务是否已经打开root 密码能不能登录。最重要的是备用通道你这台物理服务器有没有 iLO、iDRAC、IPMI 这类带外管理如果没有能不能接显示器键盘到现场如果有带外管理先确认能打开远程控制台并且能进入 DCUI。因为一旦白名单写错SSH 和 Web 都可能进不去到时候只能靠本地控制台救回来。别嫌这一步麻烦我见过太多人直接上手改结果把自己关在门外最后抱着显示器去机房。2.2 备份防火墙规则和主机配置动手之前先把当前防火墙状态导出来。用 SSH 登录后执行下面两条命令把输出保存到本地esxcli network firewall ruleset list /tmp/firewall-before.txt esxcli network firewall ruleset allowedip list /tmp/allowedip-before.txt如果你有 vCenter可以在 vSphere Client 里使用主机配置备份功能把 ESXi 的配置 bundle 导出到安全位置。独立 ESXi 也可以用vim-cmd hostsvc/firmware/backup_config生成配置备份不同版本的输出路径和下载方式略有差异执行前先看帮助。除了导出建议把当前vSphereClient规则集的enabled、allowed-all和允许 IP 列表截图保存。很多人只记得备份虚拟机忘了主机管理面的配置同样需要回退路径。真正出问题时你手里有一份变更前状态恢复起来会快很多。2.3 变更窗口和双人复核管理面限制属于高风险变更尽量放在维护窗口做不要在周五下午或者业务高峰期动手。条件允许的话拉一个同事一起复核你负责执行命令他负责核对 IP 和规则集名称。尤其是allowed-allfalse这条命令按下去之前一定要让第二个人确认白名单里至少有当前管理终端 IP、vCenter IP、备份 IP 和监控 IP。如果你们有变更单制度把命令原文和回退命令都写进去。回退命令很简单就是esxcli network firewall ruleset set --ruleset-idvSphereClient --allowed-alltrue但前提是你还能登录进去执行。所以变更时旁边开着带外控制台比什么都重要。3. 用 ESXi 内置防火墙限制来源 IP 的完整操作3.1 通过 SSH 或本地控制台进入命令行ESXi 的 Web 页面限制最终要通过命令行完成最方便的是 SSH。如果你还没开 SSH可以在 DCUI 里按 F2进入故障排除选项选择启用 SSH然后用管理 IP 登录。登录后先确认身份和版本esxcli system version get esxcli network ip interface ipv4 get如果 SSH 也被你限制过或者网络已经出问题就在物理机本地按 AltF1 进入控制台登录输入 root 和密码效果和 SSH 一样。注意本地控制台默认可能没有显示登录提示按几下回车就能看到。带外管理里的远程控制台也可以走这条路。我的习惯是每次改防火墙前先在本地控制台登录一次保持会话不要退出然后再用 SSH 做变更。这样即使 SSH 断了本地控制台还能执行回退命令。3.2 找到 vSphereClient 或 vSphere Web Access 规则集先列出所有规则集过滤出可能和 Web 管理相关的名字esxcli network firewall ruleset list | grep -i -E vsphere|web|client你会看到类似vSphereClient true true这样的输出三个字段分别是规则集名称、是否启用、是否允许所有地址。不同版本里承载 443 的规则集可能是vSphereClient也可能出现vSphere Web Access。如果你不确定哪个管 Web可以逐个查看端口定义或者直接看vSphereClient的允许 IP 列表esxcli network firewall ruleset allowedip list --ruleset-idvSphereClient如果提示找不到规则集就把上一条命令里的名字换成vSphere Web Access再试。确认名字后先不要急着关allowed-all而是进入下一步添加白名单。这里最容易犯的错就是还没加自己的 IP 就把allowed-all设为 false结果浏览器立刻打不开SSH 虽然还在但如果你一会儿又去限制 SSH就会彻底失联。3.3 先加白名单再关闭 allowed-all正确的顺序是先添加允许 IP再关闭“允许所有”。假设你的管理终端 IP 是192.168.10.50vCenter IP 是192.168.10.20备份服务器 IP 是192.168.10.30监控服务器 IP 是192.168.10.40当前 ESXi 管理 IP 是192.168.10.10。执行esxcli network firewall ruleset allowedip add --ruleset-idvSphereClient --ip-address192.168.10.50 esxcli network firewall ruleset allowedip add --ruleset-idvSphereClient --ip-address192.168.10.20 esxcli network firewall ruleset allowedip add --ruleset-idvSphereClient --ip-address192.168.10.30 esxcli network firewall ruleset allowedip add --ruleset-idvSphereClient --ip-address192.168.10.40加完后先列出确认esxcli network firewall ruleset allowedip list --ruleset-idvSphereClient确认列表里有所有该有的 IP并且没有打错网段。然后设置规则集为只允许列表中的地址esxcli network firewall ruleset set --ruleset-idvSphereClient --allowed-allfalse esxcli network firewall ruleset set --ruleset-idvSphereClient --enabledtrue这里再强调一次enabledtrue表示防火墙对该规则集生效allowed-allfalse表示不再放行所有地址只放行允许 IP 列表。如果规则集本身是enabledfalse那么防火墙对这项服务可能不拦截你的白名单就不会起作用。不同版本的行为细节有差异所以设置完一定要验证。3.4 验证白名单是否生效验证要分两个方向做。先从白名单里的机器访问打开浏览器访问https://192.168.10.10/ui应该能正常看到登录页面。再用命令行确认curl -k -I https://192.168.10.10/ui如果返回 200 或 302说明允许 IP 生效。然后找一台不在白名单里的机器执行curl -k --connect-timeout 5 -I https://192.168.10.10/ui如果连接超时或者被拒绝说明限制已经起作用。也可以从非白名单机器 ping 一下 ESXi 管理 IP如果 ping 通但 443 打不开说明是防火墙层面的限制不是网络不通。验证时注意浏览器缓存和 HTTPS 证书告警证书告警本身不影响访问控制但如果浏览器之前保存过连接最好换一个无痕窗口或者换台机器测试。测试通过后把当前规则状态再导出一份作为变更后的基线。3.5 增删改查命令速查日常维护最常用的就是查看、添加、删除和恢复全部放行。建议把这些命令记在运维手册里# 查看所有规则集状态 esxcli network firewall ruleset list # 查看指定规则集的允许 IP esxcli network firewall ruleset allowedip list --ruleset-idvSphereClient # 添加允许 IP esxcli network firewall ruleset allowedip add --ruleset-idvSphereClient --ip-address192.168.10.60 # 删除允许 IP esxcli network firewall ruleset allowedip remove --ruleset-idvSphereClient --ip-address192.168.10.60 # 临时恢复所有地址可访问 esxcli network firewall ruleset set --ruleset-idvSphereClient --allowed-alltrue关于网段写法有些版本支持192.168.10.0/24这样的 CIDR有些版本只接受单个 IP我没有在所有版本上都验证过所以生产环境里我倾向于逐台添加。如果你们环境大量使用动态地址最好先把运维终端改成固定 IP再逐台加入白名单。IPv6 也要注意如果 ESXi 启用了 IPv6而你的管理终端同时有 IPv6 地址那么即使 IPv4 被限制IPv6 仍可能访问 443。保险的做法是 IPv4 和 IPv6 白名单都配置或者干脆在管理网禁用不必要的 IPv6。4. 外部网络层兜底交换机 ACL 和边界防火墙4.1 管理网 VLAN 独立是前提如果 ESXi 管理口和业务虚拟机混在同一个 VLAN只靠主机防火墙会有点吃力因为业务网段里任何一台被入侵的机器都可能尝试访问 443。更稳妥的做法是把 ESXi 管理口放到独立的管理 VLAN只允许运维网段路由进来。VLAN 隔离是基础ACL 是补充。比如管理 VLAN 是 VLAN 100网段192.168.10.0/24办公运维网段是192.168.20.0/24那么就在三层交换机上只允许192.168.20.0/24访问192.168.10.10的 443 和 80其他一律拒绝。这样一来即使 ESXi 防火墙规则被误改攻击面也小很多。4.2 交换机 ACL 示例与注意点下面是一段 Cisco 风格的 ACL 示意不同品牌交换机的语法不一样别直接复制理解思路就行ip access-list extended ESXI-MGMT-IN permit tcp 192.168.20.0 0.0.0.255 host 192.168.10.10 eq 443 permit tcp 192.168.20.0 0.0.0.255 host 192.168.10.10 eq 80 deny tcp any host 192.168.10.10 eq 443 deny tcp any host 192.168.10.10 eq 80 permit ip any any这段 ACL 的意思是只允许运维网段访问 ESXi 的 443 和 80其他来源访问这两个端口被拒绝其他流量继续放行。注意 ACL 通常有隐式拒绝末尾的permit ip any any是为了不影响其他端口流量如果你的交换机默认允许所有可以不加。应用方向也要确认是在 VLAN 接口 inbound 还是物理端口 inbound写错方向可能完全不生效。还要留意别把 vMotion、iSCSI、NFS、vCenter 心跳这些端口一起挡住。如果 ESXi 管理口和存储口复用同一张网卡ACL 更要精确到端口和源地址。4.3 边界防火墙策略与 NAT 场景有些环境会把 ESXi 管理页面通过 NAT 发布到另一个网段这时候要特别注意ESXi 看到的来源 IP 不是你的办公终端 IP而是 NAT 设备的出口 IP。你在 ESXi 白名单里填办公终端 IP 是没用的必须把 NAT 出口 IP 加进去。更好的做法是管理页面根本不要发布到不可信网络只在内网或专用管理网访问。如果必须经过防火墙策略要限定源地址、目的地址、目的端口 443 和 80并且开启日志。日志能帮你确认哪些 IP 在尝试访问也方便排查为什么某个终端被拒绝。防火墙策略写完后用telnet ESXi_IP 443或curl从不同源地址测试确保只有策略允许的源能连通。4.4 跳板机或堡垒机访问模式的取舍大型环境里更推荐统一走跳板机或堡垒机。把所有运维终端的访问收口到跳板机ESXi 白名单只放跳板机 IP。用户先登录跳板机再从跳板机访问 ESXi Web 页面。这样做的好处是白名单数量少人员变动时只需要改跳板机权限不用挨个改 ESXi 防火墙同时跳板机可以做录屏、命令审计、双因素认证。缺点是跳板机本身成了关键入口必须重点加固定期打补丁限制登录来源开启多因素认证。小环境如果没有堡垒机也可以找一台固定 IP 的运维虚拟机充当跳板所有管理流量从它出去ESXi 只允许这一台机器访问 443。这样比把整个办公网段加白安全得多。5. 常见问题与排查技巧实录5.1 改完 allowed-all 后管理页面打不开怎么办最常见的原因就是当前终端 IP 没加进白名单或者加错了网段比如把192.168.10.50写成了192.168.1.50。还有一种情况是规则集名字找错了你限制了vSphereClient但实际生效的 Web 规则集是另一个名字。恢复方法要看你还能不能连上。如果 SSH 还通立刻执行esxcli network firewall ruleset set --ruleset-idvSphereClient --allowed-alltrue先临时放行所有再慢慢排查。如果 SSH 也不通就通过 iLO、iDRAC 或物理显示器进入本地控制台按 AltF1 登录 root执行同样的命令。如果连本地控制台都进不去只能检查带外管理是否可用。我自己的习惯是改防火墙时本地控制台会话一直开着SSH 只作为辅助。这样即使 Web 和 SSH 都断了本地控制台还能救。5.2 白名单 IP 正确但仍然被拒绝如果确认 IP 加对了但访问还是不行按下面顺序排查。第一检查规则集是否启用esxcli network firewall ruleset list | grep -i vSphereClient看第二个字段是不是true。第二检查allowed-all是不是仍然为true如果为true说明限制没生效但你的现象是打不开那就要看是不是外部 ACL 或路由问题。第三确认终端是不是真的从白名单 IP 出去有些终端有多个网卡或者走了无线网段源 IP 和你以为的不一样。第四检查 IPv6如果终端优先走 IPv6而白名单只加了 IPv4就可能被拒绝。第五看是不是 NAT 把源 IP 转换了。第六用curl -v看连接卡在哪一步是 TCP 连接超时还是 TLS 握手失败还是 HTTP 返回 403。TCP 超时通常是防火墙丢包TLS 或 HTTP 错误则可能是服务本身或证书问题。5.3 vCenter、备份软件、监控失联限制vSphereClient规则集后vCenter 可能无法连接 ESXi表现为主机在 vSphere Client 里显示断开或报警。原因是 vCenter 访问 ESXi 的 443 和 902 端口时源 IP 是 vCenter 的地址如果没加白就会被挡。解决办法是把 vCenter 所有节点的 IP 都加入白名单包括 Platform Services Controller 或 vCenter Server Appliance 的地址。备份软件通常也通过 902 或 443 访问 ESXi监控系统可能通过 443 读取 API这些 IP 也要提前加入。如果 vCenter 已经失联可以在 ESXi 本地用esxcli network firewall ruleset allowedip add把 vCenter IP 补进去然后等 vCenter 自动重连或者在 vCenter 里重新连接主机。千万不要在 vCenter 失联时直接重启 ESXi先确认管理网络和防火墙规则。5.4 ESXi 升级后规则是否保留ESXi 小版本升级通常保留配置但大版本升级或某些补丁可能会重置防火墙规则集尤其是自定义规则。我的经验是升级前先导出allowedip列表和规则集状态升级后第一时间检查vSphereClient的allowed-all是否又变回true。如果你们用 vCenter 的生命周期管理升级前确认主机配置文件里有没有包含防火墙设置否则升级后可能回到默认。升级完成后从白名单和非白名单各测一次确认限制仍然有效。把允许 IP 列表记在配置管理数据库里升级后照着重建也很快。5.5 80 端口重定向和证书告警的影响浏览器直接输入http://ESXi_IP时ESXi 通常会返回 302 重定向到 HTTPS所以真正需要保护的是 443。但 80 端口如果开着仍然是一个暴露面攻击者可以探测到主机存在。我的做法是同时限制 80 和 443如果vSphereClient规则集同时管理这两个端口那就一步到位如果 80 由其他规则集管理就找到对应规则集一起限制。证书告警方面ESXi 默认自签名证书浏览器会提示不安全这和白名单无关点了继续访问就行。如果你有内部 CA可以给 ESXi 换正式证书减少告警但换证书不会改变访问控制逻辑。测试时最好用无痕窗口避免浏览器缓存导致误判。5.6 多个管理网卡和地址怎么处理有些 ESXi 主机有多张网卡管理地址不止一个或者同时有 IPv4 和 IPv6 地址。你限制了一个地址的 443另一个地址可能仍然开放。动手前先用esxcli network ip interface ipv4 get和esxcli network ip interface ipv6 get列出所有地址确认哪些是管理地址哪些是 vMotion、存储地址。如果所有地址都由同一个 hostd 服务监听那么防火墙规则集通常会覆盖所有地址但保险起见还是从每个地址测试一遍。如果存在多个管理网卡建议只保留一个管理地址对外其他地址要么禁用要么用外部 ACL 限制。管理地址越多白名单越容易漏。6. 长期维护与安全加固清单6.1 定期导出和比对白名单限制 IP 不是一次性工作人员、跳板机、vCenter、备份服务器的 IP 都可能变化。我建议每月导出一次允许 IP 列表esxcli network firewall ruleset allowedip list --ruleset-idvSphereClient然后和 CMDB 或运维台账比对看看有没有已经下线的 IP 还留在白名单里也看看新加的运维终端有没有及时加入。离职人员用的固定 IP 要清理跳板机扩容后新 IP 要补进白名单。别小看这一步很多环境最后白名单越加越多和“只开放指定 IP”的初衷完全相反。如果你们有配置管理工具可以把白名单做成模板变更时统一推送减少手工敲命令的出错概率。6.2 日志、监控和访问审计ESXi 本身的防火墙日志能力有限被拒绝的连接不一定会在本地留下详细记录。所以更依赖外部交换机或防火墙的日志在 ACL 或安全策略上开启日志记录哪些源 IP 尝试访问 443、80 被拒绝。ESXi 端可以配置 syslog 转发把 hostd、vmkernel 日志发到日志服务器。平时监控 443 端口的连接数如果突然出现大量来自陌生 IP 的连接尝试说明管理面可能被扫描需要检查白名单和外部 ACL 是否生效。审计方面记录每次白名单变更的时间、操作人、变更原因和回退命令方便出问题时追溯。6.3 其他管理入口同步限制Web 页面只是入口之一SSH 22、SNMP、CIM、vSphere API 都可能成为管理面暴露点。既然已经限制了vSphereClient建议顺手把 SSH 规则集也做来源 IP 白名单esxcli network firewall ruleset allowedip add --ruleset-idsshServer --ip-address192.168.10.50 esxcli network firewall ruleset set --ruleset-idsshServer --allowed-allfalse esxcli network firewall ruleset set --ruleset-idsshServer --enabledtrue注意 SSH 规则集名称可能是sshServer或SSH先用ruleset list确认真实名称。限制 SSH 后一定要确保跳板机或管理终端在白名单里否则下次需要紧急登录时会很被动。SNMP、CIM 这些如果没在用可以直接禁用对应规则集如果业务依赖就按同样的方法做白名单。原则是管理入口越少越好每个入口都要有来源限制。6.4 应急恢复演练和文档化最后别只把命令写在博客里要把你们环境的恢复步骤写成文档并且每季度演练一次。演练内容可以包括从带外管理进入 DCUI按 AltF1 登录本地控制台执行allowed-alltrue恢复访问再重新加白。确认 root 密码可用确认带外管理网络独立于 ESXi 管理网确认跳板机故障时有备用终端。文档里写清楚规则集名称、当前允许 IP、回退命令、联系人。真正被锁在门外时慌是没用的只有提前准备好的恢复路径能救你。我个人在实际操作中的体会是ESXi 限制来源 IP 这件事命令本身不复杂难的是变更顺序和退路管理。先加白、再关allowed-all本地控制台一直开着vCenter 和备份 IP 提前确认这三条做到基本不会出大问题。踩过几次坑之后我现在还会把允许 IP 列表写成一个一次性执行的脚本变更时整段贴进去避免手敲漏掉某台关键服务器。