1. 为什么需要远程访问ESXi管理界面对于运维人员来说能够随时随地访问ESXi管理界面是刚需。想象一下当你正在出差或者在家休息时突然需要检查虚拟机状态或者处理紧急故障如果只能跑到机房操作那简直是噩梦。我遇到过好几次半夜打车去机房处理问题的尴尬情况后来痛定思痛决定搭建一个安全的远程访问方案。ESXi作为企业级虚拟化平台默认只提供本地管理界面。直接暴露在公网会带来严重安全隐患比如密码爆破攻击、中间人攻击等。我曾经试过简单配置端口映射结果第二天就发现大量暴力破解尝试。所以我们需要一种既安全又稳定的远程访问方案。frp内网穿透结合nginx反向代理的方案完美解决了这个痛点。frp负责打通内外网通道nginx则提供SSL加密、访问控制和WebSocket支持。这个组合我已经在生产环境稳定运行两年多实测下来非常可靠。2. 环境准备与工具选型2.1 硬件与网络环境先说说我的实验环境这样大家更容易对照着操作内网环境ESXi主机192.168.1.5你的可能是其他地址代理服务器192.168.1.4我用的是Ubuntu 20.04公网环境云服务器阿里云ECS1核2G够用域名建议用备案过的我用的是esxi.example.com这里有个坑要注意ESXi默认使用自签名证书直接访问会报安全警告。我刚开始就是被这个坑了好久后来发现通过nginx中转可以完美规避。2.2 软件版本选择工具版本很关键我踩过版本不兼容的坑frp推荐用snowdreamtech/frp的0.31.2版本nginx建议1.18.0以上必须支持WebSocket证书Lets Encrypt免费证书就够用特别提醒frp的客户端和服务端版本要一致我有次因为版本不一致导致连接老是断开排查了半天才发现是这个原因。3. 本地环境配置详解3.1 nginx反向代理配置本地nginx的作用是把ESXi的HTTPS流量转换成HTTP这样frp传输时就不会受证书问题影响。这是我的配置文件server { listen 9651; server_name 127.0.0.1; location / { proxy_pass https://192.168.1.5; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; # 关键的三行配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } }配置好后用curl http://192.168.1.4:9651测试下应该能看到ESXi登录页面。如果报502错误很可能是proxy_pass地址写错了。3.2 frpc客户端配置frpc的配置相对简单但有几个参数要注意[common] server_addr 你的云服务器IP server_port 7000 token 你的认证令牌 [yionr-esxi] type http local_ip 127.0.0.1 local_port 9651 custom_domains esxi.example.com这里有个小技巧token建议设置复杂些我见过有人用简单token被爆破的案例。启动frpc后检查日志确保连接成功。4. 云端服务器配置4.1 frps服务端配置frps的配置要与frpc对应[common] bind_port 7000 token 和frpc相同的令牌 vhost_http_port 520建议开启dashboard方便监控dashboard_port 7500 dashboard_user admin dashboard_pwd 复杂密码启动后记得开防火墙端口7000和7500如果开dashboard。4.2 nginx SSL配置这部分是关键中的关键直接影响到安全性server { listen 80; server_name esxi.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name esxi.example.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; # SSL优化配置 ssl_session_timeout 1d; ssl_session_cache shared:MozSSL:10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers on; location / { proxy_pass http://127.0.0.1:520; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 同样需要WebSocket支持 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } }证书申请推荐用acme.sh脚本自动续期很方便curl https://get.acme.sh | sh acme.sh --issue -d esxi.example.com --nginx5. 常见问题排查指南5.1 控制台无法连接这个问题我遇到过好几次根本原因是WebSocket没配置好。检查两点本地和云端nginx都要有这三行proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade;浏览器控制台看有没有WebSocket错误5.2 登录页面提示刷新浏览器这通常是因为没强制HTTPS访问。确保80端口配置了跳转到443直接访问https://域名 而不是http5.3 502 Bad Gateway按这个顺序排查检查frpc是否正常运行查看本地nginx日志确认proxy_pass地址正确测试本地能否通过http://127.0.0.1:9651访问6. 安全加固建议这套方案虽然安全但还可以进一步加固IP白名单nginx配置只允许特定IP访问allow 你的办公IP; deny all;双因素认证在ESXi前再加个认证层auth_basic Restricted; auth_basic_user_file /etc/nginx/.htpasswd;访问频率限制limit_req_zone $binary_remote_addr zoneesxi:10m rate5r/s;定期更新保持frp和nginx为最新版这套方案我已经帮三个客户部署过最久的稳定运行18个月没出过问题。关键是要做好监控我习惯用Prometheus监控frp连接状态一旦异常立即告警。