VPN Gate 上有几千个免费节点,但它们是 OpenVPN 服务器,不是代理——你没法直接把浏览器指过去用。这篇讲一个我自己写的小工具 fanout:把这些节点变成本机的 SOCKS5 端口,一个端口一个出口 IP,还能和 3X-UI 联动,让面板里的每个入站各走各的出口。
先看效果。四条隧道跑在一台机器上,四个端口对应日、韩、泰、美四个出口,母机自己的 IP 不受影响:

它解决什么问题
常见的做法是在机器上跑一个 OpenVPN 客户端,然后全机流量走它。问题很明显:只能同时用一个节点,而且 VPN 一连上就接管默认路由,SSH 当场掉线——这坑我自己踩过,只能去控制台重启机器。
fanout 的思路是每个节点关在自己的 network namespace 里:
客户端 ──▶ 母机 SOCKS5 :30546 ──▶ netns fo1 ──▶ openvpn ──▶ 日本节点
客户端 ──▶ 母机 SOCKS5 :40442 ──▶ netns fo2 ──▶ openvpn ──▶ 韩国节点
SOCKS5 监听在母机,出站连接用 setns 切进对应的 netns 建立。这样 VPN 的路由劫持只影响它自己那个 netns,母机的 SSH 一点事没有;多个节点之间也互不干扰。
先装 3X-UI(可选,但推荐)
fanout 单独用也行——直接拿 SOCKS5 端口。但配上 3X-UI 才好用:你的客户端连一个固定的节点,服务端想从哪个国家出去随时切。
没装的话先装:
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
装完记住面板地址和账号密码。然后随便建一个入站——协议用 VLESS,传输 TCP,安全选 reality 就行,端口随意。这个入站就是你客户端要连的那个,配一次以后不用动。
fanout 会自动读面板的端口、路径和 API token,不用你手工填任何东西。如果面板开了 SSL 也没关系,会自动识别走 https。
装 fanout
需要 root,Linux(依赖 netns)。一条命令:
bash <(curl -fsSL https://raw.githubusercontent.com/byJoey/fanout/main/install.sh)
会自动按架构下载预编译二进制,装完打印管理地址、访问路径和口令。路径是随机生成的(类似 3X-UI 那样),路径不对一律返回 404,扫端口的看不到这里跑着什么。

装完敲 f 打开管理菜单,启停、看日志、改端口口令路径、更新卸载都在里面。也可以直接 f list、f restart 这样用。
加节点
打开管理界面,点「添加节点」,列表是实时从 VPN Gate 拉的,按带宽排序,标了延迟和当前会话数:

点启动,十几秒后左栏就会显示分配到的端口和实际出口 IP。直接用 socks5://你的IP:端口 就行。

说个实话:VPN Gate 是志愿者节点,死节点比例不低,随手点一个有可能连不上(满员会回 AUTH_FAILED,下线的直接拒连)。所以启动时连不上会自动顺着同地区的候选往下试,最多 6 个,不用你手动一个个碰运气。
和 3X-UI 联动
这是我觉得最有用的部分。同机装了 3X-UI 的话,右栏会自动列出面板里已有的入站——面板端口、路径、API token 都是自动探测的,不用手工填。
每个入站后面有个下拉框,选一个节点,这个入站的流量就从那个节点出去。改完立即生效。
更省事的是「按出口复制」:左栏勾选几个出口,右栏选一个入站当模板,点一下就为每个出口复制一个入站。复制出来的入站共用模板的客户端,所以你的 UUID 不变,客户端那边只改端口就能切换出口,不用维护好几套配置。

点入站备注能看详情:出口 IP、对应节点、协议、Xray tag、客户端 UUID,还有可以直接复制的分享链接。省得在两个面板之间来回跳。
勾选后点「导出链接」,一次拿到所有链接,粘进客户端就能用:

掉线了怎么办
免费节点说没就没。健康检查每 10 秒探一次,连续两次失败就判定掉线,自动换同地区的其他节点重连,端口保持不变——已经发出去的客户端配置不会失效。如果对接了 3X-UI,原先指向它的入站会自动改绑到新节点,备注里的地区和 IP 也跟着更新。
这里有个坑值得说一下。最早我的健康检查只是在 netns 里 curl 一下看通不通,结果发现测不出掉线——因为 netns 通过 veth 走母机 NAT,openvpn 死掉之后照样能出网,只是出口变回了母机 IP。后来改成比对出口 IP 是否还是隧道那个,才真正测得准。
顺手说说 IPv6 泄漏
如果你的机器有全局 IPv6,这事值得注意:隧道里只有 IPv4,但访问双栈站点时,连接可能选中 AAAA 记录,那条流量就绕开隧道从母机的 IPv6 出去了——真实地址直接暴露。
我一开始想在系统层解决,往 /etc/gai.conf 里加了 IPv4 优先。结果是:系统的 curl 确实改走 IPv4 了,但同一时刻 Xray 还是从 IPv6 出去。原因是 gai.conf 只影响 glibc 的 getaddrinfo,而 Xray 和 fanout 都是 Go 写的,自己做 DNS 解析,根本不吃这套。
所以最后是在程序里收口的:netns 拨号强制 tcp4、SOCKS5 拒绝 IPv6 目标、Xray 的 freedom 出站设 domainStrategy=UseIPv4。测试的时候记得用 api64.ipify.org 这种双栈地址,用纯 IPv4 的站点是测不出泄漏的。
已知限制
- 只转发 TCP。SOCKS5 收到域名时在本机解析,隧道内不跑 UDP/DNS。
- VPN Gate 节点质量看运气,速度和稳定性都不保证,拿来当固定线路不合适。
- 管理界面只有随机路径加口令,没有 HTTPS,放公网建议前面套一层反代。
地址
开源在 https://github.com/byJoey/fanout ,MIT 协议,有问题提 issue。
最后提一句:VPN Gate 是筑波大学的学术实验项目,节点由志愿者提供。这工具只是调它公开的节点列表、用官方 openvpn 客户端去连,别拿来干什么出格的事。