Skip to content

Releases: byJoey/fanout

v1.3.1

Choose a tag to compare

@github-actions github-actions released this 30 Sep 04:43

这版修了什么

所有节点连不上的问题。 v1.3.0 上有概率出现这种情况:客户端导入的节点全部超时,可服务端看着一切正常——Xray 进程在跑、配置校验通过、日志干净、隧道 up、出口 IP 也探得到。只有在母机上敲 ss -lnt 才会发现,节点端口一个都没监听。

原因是 Xray 整个进程被拉进了某条隧道的网络命名空间,它的入站端口只在那条隧道内部监听,母机上压根不存在。

要让出站走隧道,fanout 得把线程切进隧道的命名空间。线程是锁住的,但 Go 在这条线程阻塞时会从它克隆出新线程去干别的活,克隆出来的线程继承了隧道的命名空间、而且没被锁住。之后凡是落在这种线程上启动的子进程,就跟着掉进去了。VPN Gate 握手慢、长期占着线程,把这个窗口放得很大。

现在启动时会先记下母机的网络命名空间,所有"在当前命名空间里生效"的操作都显式切回去再执行:建虚拟网卡、改 iptables、开转发、探母机公网 IP、拉起 Xray 和 OpenVPN。

同一个原因还连带修了几处:iptables 规则可能加进隧道内部(母机上等于没加)、探测母机公网 IP 时可能拿到某条出口的 IP(那样分享链接里的地址就全写错了)、挑内网段时读到的是隧道里的地址表。

谁该升

装了 v1.3.0 的都建议升。 这个问题是概率性的——有人一直好好的,有人所有节点全挂。判断自己中没中,在服务器上敲:

ss -lnt | head -20

看不到你那些节点端口,就是中了。

安装 / 升级

bash <(curl -fsSL https://raw.githubusercontent.com/byJoey/fanout/main/install.sh)

已经装过的,敲 f 进菜单选更新,或者直接跑上面这条命令覆盖安装,配置和隧道都不会丢。

下载哪个文件

先在服务器上敲 uname -m 看芯片类型:

uname -m 的输出 下载这个 常见机器
x86_64 fanout-linux-amd64.tar.gz 绝大多数 VPS、云服务器
aarch64 或 arm64 fanout-linux-arm64.tar.gz 甲骨文 ARM、树莓派、部分 ARM 云主机

不确定就用上面的一键安装命令,它会自己判断。

几个容易卡住的地方

升级后节点还是连不上:先确认 Xray 真的重启了(ss -lnt 能看到节点端口),再看客户端里的地址端口有没有变。

校验文件完整性时报 "no file was verified":sha256sum -c 要求文件名和 checksums.txt 里写的完全一致,下载时别改名。

装完隧道一直连不上:宿主必须放开 /dev/net/tun,先自查 ls -l /dev/net/tun。没有这个文件说明宿主没放开(LXC 小鸡上很常见),跟发行版无关。

Alpine 上装不了:先 apk add bash,安装脚本需要 bash。

Full Changelog: v1.3.0...v1.3.1

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 30 Sep 01:42

这版改了什么

节点链接支持订阅了。 开了五个出口就是五条链接,一条条复制到客户端太笨。现在点「订阅」拿一条地址,填进客户端的订阅里,以后加出口、删出口都会自己跟上,换节点也不用重配(端口不变,链接就不变)。

地址形如 http://<服务器IP>:<端口>/<访问路径>/sub?token=<口令>。默认出 base64,各家客户端通吃;想看明文就在后面加 &target=links。默认只放绑了出口的节点,走直连的不往里混,想全都要加 &bound=0。

订阅要给客户端直接拉,所以这条地址不需要登录,那串 token 就等于密码,别发到群里。泄露了在订阅弹窗里点「换一串口令」,旧地址立刻失效。

默认只用家宽节点。 VPN Gate 的清单里混着一批它自己的机房服务器(public-vpn-* 和 219.100.37.0/24),出口一眼看得出是数据中心,还更容易满员。现在挑节点、地区可用数、自动重连的备选都只看志愿者家宽,想连机房的一起用就去设置里关掉「只用家宽节点」。

这个开关只管新挑的节点,已经跑着的出口不会因为改设置被换掉。

换节点不会再换回刚用过的那个。 以前只排除"正在用"的节点,可 A 换成 B 之后 A 就空出来了,而候选是按速度排的、A 往往排最前,于是再点一次又换回 A,看着像没换。现在每条出口会记住自己换过的节点一并避开,连点几次每次都是新 IP。

出口和节点的名字改成国旗加中文。 原来叫 JP-243,现在是 🇯🇵 日本 243。界面上的地区选择、出口行、进度条目也一起换掉了。自己改过的名字不会被覆盖——换节点时只重写 fanout 自动起的那些。

顺带修了两个老毛病:拿一个复制出来的节点当模板再复制,名字会叠成 fanout-JP-243-VN-165;换节点改名时会把自己起的备注切坏。

一键给每个国家都开。 新建出口的地区里多了「每个国家」,每个有空闲节点的国家各开几条,一次把所有地区铺开。槽位不够时先开节点多的地区,不会中途报错。

SOCKS5 支持 UDP ASSOCIATE。 DNS、QUIC 这类 UDP 也能走隧道了,hysteria2 这类客户端不再因为 UDP 被拒而连不上。感谢 @zsawi 的 #22。

修了两个藏在状态机里的老问题。

一个是同一台机器上跑两份 fanout 会互相把隧道拆掉。netns 名、网卡名、网段原来只按槽位编号生成,两个实例必然重名,后起的那个建隧道时会顺手把前一个正在用的删掉,表现是好端端的出口突然"已掉线,正在换节点重连"。独立工作目录和独立端口都挡不住,冲突在内核命名空间那一层。现在每个工作目录一套自己的名字——默认目录 /var/lib/fanout 保持原样,升级上来的机器行为完全不变,换了目录才自动隔离。顺带加了目录锁,同一个 -dir 只许跑一个实例。

一个是换节点换到一半崩溃或重启,那条出口的节点会掉成"未绑定出口",流量悄悄回到直连,界面上看不出哪里不对。换节点是两步(先连新节点、再把节点改绑过来),中间断了两边就对不上。现在动手之前先把"原来绑的是谁"落盘,重启时发现没收尾就自己接回来。

安装 / 升级

bash <(curl -fsSL https://raw.githubusercontent.com/byJoey/fanout/main/install.sh)

已经装过的,敲 f 进菜单选更新,或者直接跑上面这条命令覆盖安装,配置和隧道都不会丢。

升上来之后「只用家宽」是默认开着的,所以可选节点会比以前少一些(机房那批被剔掉了)——这是有意的,不习惯就去设置里关掉。

下载哪个文件

先在服务器上敲 uname -m 看芯片类型:

uname -m 的输出 下载这个 常见机器
x86_64 fanout-linux-amd64.tar.gz 绝大多数 VPS、云服务器
aarch64 或 arm64 fanout-linux-arm64.tar.gz 甲骨文 ARM、树莓派、部分 ARM 云主机

不确定就用上面的一键安装命令,它会自己判断。

几个容易卡住的地方

订阅地址打不开:先确认防火墙放行了管理端口。订阅跟管理界面共用一个端口,也在同一个随机访问路径下面,路径写错会直接 404(和 token 填错的表现一样,都是 404,这是故意的,不给扫端口的任何提示)。

订阅拉下来是空的:订阅只放绑了出口的节点。刚装好还没开出口、或者开了出口但没建节点链接时,会回 404 而不是空文件——这样客户端会保留上一份,不至于把已有节点清光。

校验文件完整性时报 "no file was verified":sha256sum -c 要求文件名和 checksums.txt 里写的完全一致,下载时别改名。

装完隧道一直连不上:fanout 靠 netns 里跑 OpenVPN 建隧道,宿主必须放开 /dev/net/tun。先自查:

ls -l /dev/net/tun

没有这个文件就说明宿主没放开(LXC 小鸡上很常见),需要联系服务商或改宿主配置,跟用什么发行版无关。

Alpine 上装不了:先 apk add bash,安装脚本需要 bash。

New Contributors

  • @zsawi made their first contribution in #22

Full Changelog: v1.2.1...v1.3.0

v1.2.1

Choose a tag to compare

@github-actions github-actions released this 11 Aug 15:52

Full Changelog: v1.2.0...v1.2.1

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 11 Aug 14:47

这版改了什么

新增 xray-cf-lite 后端。 机器上装了 xray-cf-lite 的话,fanout 会自动接管它生成的三个节点(vless / trojan / vmess),把它们分别导向不同的家宽出口。

这个模式下节点归 xray-cf-lite 管,fanout 只负责"这个节点走哪条出口",所以界面上不提供新建、删除、改节点的入口——要改端口或 UUID 去 xray-cf-lite 那边改。两边共用同一份 Xray 配置,fanout 只往里加自己前缀的出站和分流规则,互不覆盖。

配套修复需要 xray-cf-lite 一起更新到最新版,否则在那边改 UUID 或端口会把 fanout 配好的出口绑定冲掉(表现为绑定悄悄失效、流量回到直连,且没有任何报错)。

后端可以在界面里切换了。 以前只能靠启动参数固定,现在设置面板里能直接选:自动探测 / xray-cf-lite / 3x-ui / 自建 Xray。本机没装的会置灰并说明原因,选过之后会记住,重启仍然生效。

避开外部 Xray 占用的端口。 分配或校验入站端口时会读一下系统级 Xray 的配置,撞不上已被占用的端口。没装那些工具的机器行为完全不变。

安装 / 升级

bash <(curl -fsSL https://raw.githubusercontent.com/byJoey/fanout/main/install.sh)

已经装过的,敲 f 进菜单选更新,或者直接跑上面这条命令覆盖安装,配置和隧道都不会丢。

下载哪个文件

先在服务器上敲 uname -m 看芯片类型:

uname -m 的输出 下载这个 常见机器
x86_64 fanout-linux-amd64.tar.gz 绝大多数 VPS、云服务器
aarch64 或 arm64 fanout-linux-arm64.tar.gz 甲骨文 ARM、树莓派、部分 ARM 云主机

不确定就用上面的一键安装命令,它会自己判断。

几个容易卡住的地方

校验文件完整性时报 "no file was verified":sha256sum -c 要求文件名和 checksums.txt 里写的完全一致,下载时别改名。

装完隧道一直连不上:fanout 靠 netns 里跑 OpenVPN 建隧道,宿主必须放开 /dev/net/tun。先自查:

ls -l /dev/net/tun

没有这个文件就说明宿主没放开(LXC 小鸡上很常见),需要联系服务商或改宿主配置,跟用什么发行版无关。

Alpine 上装不了:先 apk add bash,安装脚本需要 bash。

v1.1.1

Choose a tag to compare

@github-actions github-actions released this 07 Aug 03:22

这版改了什么

拉 VPN Gate 节点列表时,如果直连拿不到(连不上、被拦截、或者返回的不是节点数据而是运营商的门户页),会自动换成走 Cloudflare 反代再试一次。以前这种情况直接就是「节点列表拉取失败」。

直连正常的时候不会碰反代,行为和以前一样。

装哪个包

机器 下载
普通 VPS / 云服务器(Intel、AMD) fanout-linux-amd64.tar.gz
ARM 机器(甲骨文免费 ARM、树莓派等) fanout-linux-arm64.tar.gz

不确定选哪个,在服务器上执行 uname -m:出现 x86_64 选 amd64,出现 aarch64 选 arm64。

安装 / 升级

已经装过的,直接在面板里点检查更新,或者跑 fanout 菜单里的更新。

新装:

bash <(curl -fsSL https://raw.githubusercontent.com/byJoey/fanout/main/install.sh)

不想用反代

反代只在直连失败时才启用。要完全关掉,给 fanout 服务加个环境变量:

FANOUT_VPNGATE_MIRROR=

也可以设成你自己的地址,配套的 Worker 代码见仓库。

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 03 Aug 10:08

Full Changelog: v1.0.6...v1.1.0

v1.0.6

Choose a tag to compare

@github-actions github-actions released this 28 Jul 13:00

修复

未启用 SSL 的 3x-ui 被误判为 HTTPS(#8)

面板没开 SSL 时打印的是 Warning: Panel is not secure with SSL,
它包含 Panel is secure with SSL 这个子串,被子串匹配当成了开启 TLS,
随后所有面板 API 调用都报 http: server gave HTTP response to HTTPS client。
另外 cert: 为空时正则里的 \s* 会跨过换行,把下一行的 key: 当成证书路径,
兜底判断也跟着错。现在字段值一律限定在本行内取,并优先采信面板明确给出的 SSL 状态。

3x-ui 模式下 vmess 入站看不到分享链接

面板给 vmess 的链接是 vmess://<base64 JSON>,地址和端口都在 JSON 里面,
而 fanout 按 :端口? 的 URI 形式筛选,一条也匹配不上。现在会先解码再比对。

新增

入站可以单个删除

此前只有"清理全部未绑定入站"一个入口。现在节点详情弹窗和未绑定列表里
都能删掉单独一个入站,原来的批量清理保留。

接管 3x-ui 时也能新建入站

之前只有自建模式可以建,装了面板就得跳到面板里操作。现在走面板的
panel/api/inbounds/add API 建,入站照常归面板管,分享链接由面板生成。
支持 VLESS / VMess / Trojan,TCP / WS / gRPC / HTTPUpgrade / XHTTP,
TLS(不填证书就自签)与 REALITY(密钥和 shortId 自动生成)。

验证

sg 生产实例(3x-ui 接管模式)实测:三种协议经面板 API 建站后分别绑不同出口,
用 Xray 客户端实连,出口 IP 与绑定逐条对上;单删只影响目标入站,
删除后路由规则无残留。issue #8 的判定路径单独构造场景验证(scheme 正确为 http),
并补了表驱动单测覆盖各分支。

v1.0.5

Choose a tag to compare

@github-actions github-actions released this 28 Jul 09:32

新增

  • SOCKS5 端口加用户名口令认证(RFC1929)。此前每条隧道的 SOCKS5 端口对公网无认证敞开,端口虽随机但扫到即可白嫖出口 IP。现在每条隧道一套独立随机凭据,泄露一条不牵连其他出口。
  • 界面可查看 / 修改 / 随机重置凭据。出口行的 SOCKS5 变成可点按钮,弹窗内直接看完整 socks5://user:pass@host:port 地址、改用户名口令、一键随机、复制地址。改完即时生效,已连上的会话不断。

兼容与升级

  • 凭据随 state.json 持久化,从旧版本升级时字段缺失会自动补生成一套,无需手动配置。
  • 本机 Xray(自建模式或接管的 3x-ui)的 socks 出站同步带上认证字段。
  • 修复 3x-ui 模式升级时存量绑定会断:恢复隧道后自动对账一次面板出站,把旧的无认证出站补上凭据。

验证

  • 两种后端各跑一遍:3x-ui 升级路径与自建 native 模式,正确凭据可连、错误口令与无认证均被拒、改密码后新凭据通旧凭据拒且面板出站同步更新。
  • go vet 与 go test(含新增的认证测试)全过。

v1.0.4

Choose a tag to compare

@github-actions github-actions released this 27 Jul 13:49
v1.0.4

v1.0.3

Choose a tag to compare

@byJoey byJoey released this 27 Jul 12:59
d9433a0

What's Changed

  • 修复 3x-ui 入站标签推导导致的出口绑定失效 by @answerzx in #5

New Contributors

Full Changelog: v0.1.2...v1.0.3