fanout:把 VPN Gate 免费节点变成本地 SOCKS5 端口,一个端口一个出口 IP

VPN Gate 上有几千个免费节点,但它们是 OpenVPN 服务器,不是代理——你没法直接把浏览器指过去用。这篇讲一个我自己写的小工具 fanout:把这些节点变成本机的 SOCKS5 端口,一个端口一个出口 IP,还能和 3X-UI 联动,让面板里的每个入站各走各的出口。

先看效果。四条隧道跑在一台机器上,四个端口对应日、韩、泰、美四个出口,母机自己的 IP 不受影响:

四个端口四个出口 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 listf 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 客户端去连,别拿来干什么出格的事。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇