家里那台迷你主机跑着 Proxmox,虚拟上面挂了五六个虚拟机。机内平时在公司想连回去拿个文件、网穿调个服务,虚拟光靠路由器端口转发根本不现实——运营商早把公网 IP 收回了,机内动态 DNS 也救不了 NAT 后面的网穿内网地址。这事折腾了我小半年,虚拟最后靠一套组合拳才算跑通。机内
最直接的网穿思路是给虚拟机装个反向代理客户端。拿 frp 来说,虚拟公网服务器跑 frps,机内虚拟机里跑 frpc,网穿配置文件里把本地 22 端口映射到服务器的虚拟 6000 端口。ssh 连服务器 6000 就进了虚拟机。机内这套方案的网穿好处是流量走 TCP 裸奔,延迟低,配置也简单。坏处同样明显:frps 的端口得暴露在公网,被扫到就是活靶子。我试过把 frps 的 bindPort 改成高位端口,结果三天两头被爆破,日志里全是尝试登录的记录。后来加了个 token 认证才消停。
WireGuard 是另一个路子。在公网服务器和虚拟机之间建个 VPN 隧道,虚拟机的内网 IP 直接可达。配置不算复杂,但有个坑:WireGuard 的握手包需要一方有公网地址。如果服务器是 NAT 后的云主机,还得做 UDP 端口映射。我现在的做法是服务器开 WireGuard,虚拟机作为客户端主动连接,PersistentKeepalive 设成 25 秒,NAT 超时问题就绕过去了。连上之后,虚拟机的 10.0.0.2 地址在本地直接 ping 通,比 frp 那种端口映射灵活得多。
ZeroTier 和 Tailscale 这类 overlay 网络更省事。装完客户端,网页后台点几下,虚拟机和笔记本就进了同一个虚拟局域网。Tailscale 的 DERP 中继在两边都对称 NAT 的情况下也能打洞,实测延迟在 30ms 左右,看个网页够用。但流量要经过第三方中继,敏感数据得掂量一下。我拿它连过家里的 NAS 看视频,1080p 不卡,4K 就有点吃力了。
说个具体场景。上个月出差,酒店 Wi-Fi 把 UDP 全封了。WireGuard 和 Tailscale 的直连全挂,只剩 frp 的 TCP 通道还能用。当时急着改一个 Nginx 配置,就是靠 frp 映射的 22 端口 ssh 进去搞定的。所以别指望一种方案吃遍天,多备几条路才是正经事。
还有个细节容易被忽略:虚拟机的网卡模式。Proxmox 里默认的 VirtIO 网卡性能最好,但如果你在虚拟机里跑 frpc 或者 WireGuard,记得把防火墙规则检查一遍。我有次折腾半天连不上,最后发现是虚拟机自带的 iptables 把转发流量全 drop 了。这种问题排查起来最费时间,因为从外面看就是连接超时,没有任何报错。
现在我的方案是 WireGuard 为主,frp 做备用,ZeroTier 装在笔记本上应急。三个客户端同时跑着,内存占用加起来不到 50MB。公网服务器用最便宜的那档,一年也就几十块钱。整套东西跑了大半年,除了有次服务器机房网络抖动断了十分钟,其他时间都稳得很。
真要给建议的话,先想清楚你的使用场景。只是偶尔 ssh 进去改个配置,frp 足够。需要频繁访问内网多个服务,WireGuard 更合适。完全不想碰命令行,Tailscale 点两下就能用。别一上来就追求完美方案,先把最基础的那条路跑通,后面再慢慢加。
顶: 82481踩: 699





评论专区