VPS 自建 / 02

高级玩法:腾讯 CCN 内网 po0 + RFCHost

用 po0 广州或华东入口连接 RFCHost 香港、日本、新加坡出口:购买后先在机器详情页添加鸡险白名单,再按 Debian 示例配置 nftables 转发,并说明 5 个 /24 网段、固定槽位、Surge 模块自动加白与国内入口封禁风险。

开始前:先跑通直连节点

不建议纯新手直接从 CCN 开始。 CCN 同时涉及国内入口、境外出口、内网互通和 nftables 转发,购买与维护成本都高于单台 VPS 直连节点。

如果还没有独立完成过自建节点,先跟着搭建第一个节点:sing-box Reality + VLESS Vision跑通一台直连 VPS,并稳定使用一段时间。能够独立检查服务状态、监听端口、日志和客户端参数后,再继续本文。

po0 国内入口如果端口转发、流量用途或安全配置不当,可能引发安全通报并被封禁,封禁后不会退款;随套餐绑定的「鸡险」可以复活一次,但多次被封禁会导致账号直接被封,规则见下文「购买前必须确认的限制」。第一次尝试 CCN 时,po0 广州或华东国内入口建议先按月购买;不要仅因为年付折扣更高就直接年付,避免操作失误导致整段剩余周期损失。

CCN 链路如何工作

普通自建节点由客户端直接连接海外 VPS,体验容易受到运营商国际出口和海外服务器公网入口影响。使用 po0 CCN 时,国内入口负责接收连接,境外出口负责访问网站:

po0 广州或华东入口通过腾讯 CCN 内网连接香港、日本、美国和新加坡 SG-T1 出口

  • po0 国内入口只运行 nftables,负责 DNAT、SNAT 和 MSS 调整,不安装 sing-box、Xray 或 Docker。
  • 代理协议运行在最终出口机,客户端只把原节点的服务器地址和端口替换为 po0 入口。
  • 选出口时看最终用途:需要哪个地区的 IP、访问哪些服务,就在那个地区的出口机上测试。

这类链路常被称为“腾讯 CCN 内网玩法”。按照 po0 Wiki 的手动配置,nftables 的 DNAT 目标填写出口机 IP,SNAT 地址填写 po0 的内网互通 IP;不要自行把出口地址改成一个未经服务商确认的私网 IP。

系统建议:入口机和出口机均优先选择 Debian 12/13。 本文所有安装、服务管理、nftables 和日志命令都以 Debian 为示例。使用 Ubuntu 或其他系统时,软件包名称、服务名称和配置位置可能不同,需要自行转换,第一次搭建不建议混用。

先选对入口和出口

po0 国内入口

需要国内 BGP 入口时,在下面两类产品中选择:

  • 腾讯云广州 BGP:优先面向华南用户,香港方向通常值得先测试。
  • 腾讯云华东 BGP:优先面向华东、华北和东北用户,日本方向通常值得先测试。

不要只看最低延迟。购买前应在 po0 的服务状态和 Looking Glass中分别测试平峰与晚高峰;如果两边表现接近,优先选择离主要用户更近、流量档位更合适的入口。

时延参考:从江苏南部测试

下表是本站在江苏南部用 ping 测得的时延,单位为毫秒,整理于 2026-10-13。「合计」是两段时延相加的估算值,用来比较两个入口,不是端到端实测。

路径广州入口华东入口
江苏南部到 po0 入口2612
po0 入口到香港出口7.5530.2
po0 入口到日本出口5530.3
po0 入口到美国出口154132
合计:香港33.5542.2
合计:日本8142.3
合计:美国180144

从这组数据看:

  • 去香港,广州入口更低。 江苏南部到广州入口比到华东入口多 14 ms,但广州到香港只有 7.55 ms,合计仍比华东入口少约 9 ms。
  • 去日本和美国,华东入口更低。 日本合计 42.3 ms,约为广州入口的一半;美国少 36 ms。
  • 只买一个入口时,华东更均衡。 香港和日本都在 42 ms 左右;主要使用香港出口,再考虑广州。

ping 只反映时延,不代表晚高峰的丢包和带宽。你所在的地区和运营商不同,结果也会不同,下单前用上面的服务状态页和 Looking Glass 自己测一次。

po0 常驻优惠码

适用套餐优惠码优惠内容
全产品常规款常驻九折优惠券9 折循环优惠
全产品年付PO0年付常驻88折优惠券88 折循环优惠

首次搭建 CCN 时,po0 国内入口建议选择月付并使用常规九折券。确认链路稳定、用途符合规则,并且已经熟悉 nftables 维护后,再考虑年付与 88 折券;下单时复制对应优惠码并在结算页确认折扣已经生效。

查看 po0 广州与华东 BGP 入口

香港出口

按用途和预算考虑:

  • po0 腾讯云 T1 香港:与 po0 产品体系配合,适合希望减少选型复杂度的用户。
  • RFCHost HK-T1:价格通常低于 HK-CO;国内接入已经由 po0 BGP 入口承担时,往往更符合成本目标。
  • RFCHost HK-CO:预算充足,且还希望保留优化公网直连能力时再选。套餐与价格见自建节点 VPS 怎么选。

po0 T1 香港属于国际优化产品,官方明确提示“不包含国内优化”。在本文拓扑里,国内接入由广州或华东 BGP 入口承担,不要把 T1 香港单独当作国内优化入口。

查看 po0 香港出口

查看 RFCHost HK-T1 / HK-CO

日本出口

优先考虑 RFCHost JP-T1;JP-CO 当前可能显示为 JP2-CO,价格更高,适合同时需要日本优化公网直连的场景。华东 BGP 到日本方向通常值得优先测试,但最终仍以购买时的 Looking Glass 和产品互通说明为准。

查看 RFCHost JP-T1 / JP2-CO

美国出口

美国出口选择 po0 腾讯云 T1 美国。该产品同样是国际优化链路,不包含国内优化;本文由广州或华东 BGP 提供客户端入口。

RFCHost 美国节点不通本文所用的 po0 内网互通链路,不要购买 RFCHost US 后照抄这套配置。

查看 po0 美国出口

新加坡 SG-T1 出口

新加坡方向选择 RFCHost SG-T1 作为最终出口,使用 RFCHost HK-T1 承担香港中转。文章开头拓扑图中的紫色虚线表示这条两层转发链路;SG-T1 运行代理协议,HK-T1 只负责把流量继续转发到新加坡。

查看 RFCHost HK-T1 / SG-T1

购买前必须确认的限制

po0 官方 Wiki 明确列出了国内 BGP 产品的使用条件:

  • 广州 BGP、华东 BGP 需要实名认证。

  • 购买即同意并强制绑定「鸡险」。鸡险 9.9 元/月,已经包含在套餐价格里,不用另外付费(核验于 2026-10-13)。它包含两项内容:

    • 封禁后复活一次。 机器被通信管理部门通报或被腾讯云封禁后,可以凭鸡险复活一次。复活后的机器同样绑定鸡险,可以再次复活;但多次被封禁会导致 po0 账号直接被封,不能把它当成无限次的保障。具体条件和办理方式以 po0 工单答复为准。
    • 入站防火墙白名单。 只有白名单里的来源 /24 网段才能访问这台机器,每台最多 5 个网段。新机器创建后要先加白名单才能连上。

    鸡险不等于可以放松配置:每次封禁都会中断使用,次数多了连账号一起失去,端口、用途和白名单仍要按规则设置。

  • 禁止用于回国访问。

  • 默认双向封禁 TCP/UDP:80、443、8080、8443、8000、1080。

  • 套餐标注的是单向流量,多出口和多层中转应分别估算各段消耗。

  • T1 香港、美国是国际优化产品,不包含国内优化。

本文使用 30001~30004,避开默认封禁端口。下单前还应向 po0 与 RFCHost 确认:所选具体产品能否内网互通、出口 IP 应填写哪个地址、po0 内网 IP 是什么,以及相关带宽和流量如何计费。产品名称相同不代表任意实例都自动互通。

建议先记录这些信息:

角色需要记录的地址服务端口客户端入口端口
po0 广州/华东入口公网 IP、内网 IP不运行协议30001~30004
香港出口出口机 IP3000130001
日本出口出口机 IP3000230002
美国出口po0 US 地址3000330003
香港中转RFCHost HK-T1 地址3000430004
新加坡出口RFCHost SG-T1 地址30004经香港中转

第一步:先把最终出口部署好

不要一开始就修改 po0。最终出口机建议安装干净的 Debian 12/13,先部署协议并用客户端直连出口机验证可用。出口本身不通时,nftables 无法替你修复协议、密码或防火墙错误。

推荐 Shadowsocks 2022

主线协议使用 2022-blake3-aes-128-gcm:

  • 同时支持 TCP 和 UDP;
  • sing-box、Mihomo 等现代核心支持较好;
  • 相比 VLESS Encryption,更容易覆盖手机、电脑和软路由客户端。

以下操作只在最终出口机执行。

安装 sing-box

本文以 Debian 12/13 为例,通过 sing-box 官方 APT 源安装,并在安装后关闭 UFW,避免出口协议端口被拦截:

bash
apt update
apt install -y curl ca-certificates gnupg
mkdir -p /etc/apt/keyrings

curl -fsSL https://sing-box.app/gpg.key \
  -o /etc/apt/keyrings/sagernet.asc
chmod a+r /etc/apt/keyrings/sagernet.asc

cat >/etc/apt/sources.list.d/sagernet.sources <<'EOF'
Types: deb
URIs: https://deb.sagernet.org/
Suites: *
Components: *
Enabled: yes
Signed-By: /etc/apt/keyrings/sagernet.asc
EOF

apt update
apt install -y sing-box

systemctl stop ufw
systemctl disable ufw

生成密码并配置出口

下面的工具会在当前浏览器本地生成一个 16 字节的随机密码,并自动填进服务端配置、客户端出站和 SS 链接。密码不会发送到本站服务器。

  1. 填写出口机地址: 输入出口机的公网 IP 或域名,用于生成直连测试用的客户端配置。
  2. 确认端口: 香港示例保持 30001;日本、美国和新加坡分别改为 30002、30003、30004。
  3. 复制服务端命令: 按钮会复制包含完整 JSON 的 cat 命令,粘贴到出口机执行即可写好配置。
  4. 保存客户端配置: 复制客户端出站或 SS 链接留用,后面直连测试和接入 po0 都要用到同一个密码。
本地生成,密码不上传

Shadowsocks 2022 配置生成器

密码只在当前浏览器生成,不会发送到服务器。

加密方式2022-blake3-aes-128-gcm
密码正在生成…
服务端安装命令复制后粘贴到出口机执行
install -d -m 755 /etc/sing-box
cat > /etc/sing-box/config.json <<'EOF'
{
  "log": {
    "level": "info",
    "timestamp": true
  },
  "inbounds": [
    {
      "type": "shadowsocks",
      "tag": "ss2022-in",
      "listen": "0.0.0.0",
      "listen_port": 30001,
      "method": "2022-blake3-aes-128-gcm",
      "password": "正在生成…"
    }
  ]
}
EOF
chmod 600 /etc/sing-box/config.json
客户端出站配置sing-box 客户端出站
{
  "type": "shadowsocks",
  "tag": "CCN-HK",
  "server": "请填写出口机公网 IP",
  "server_port": 30001,
  "method": "2022-blake3-aes-128-gcm",
  "password": "正在生成…"
}
SS 链接支持链接导入的客户端可直接导入
ss://2022-blake3-aes-128-gcm:%E6%AD%A3%E5%9C%A8%E7%94%9F%E6%88%90%E2%80%A6@请填写出口机公网 IP:30001#CCN-HK

配置下一台出口机时,改好端口和节点名称再复制命令即可。多个出口共用同一个密码,还是点「重新生成密码」各用各的,按个人习惯选择:共用便于记录,分开则在某个节点的密码泄露时只需要更换那一个。

重新生成后,服务端和客户端配置会一起变化。已经写进出口机的密码不会跟着变,所以重新生成以后要把新的服务端命令再执行一遍,否则客户端会连不上。

不想在浏览器里生成时,可以在出口机上执行 openssl rand -base64 16,再把输出填进配置里的 password 字段,效果相同。

写入配置后检查语法并启动服务:

bash
sing-box check -c /etc/sing-box/config.json
systemctl enable --now sing-box
systemctl restart sing-box
systemctl status sing-box --no-pager
ss -lnptu | grep ':30001'

此时先用出口机地址直连测试。确认协议、TCP/UDP、防火墙和系统时间全部正常后,再配置 po0 转发。

第二步:给 po0 加白名单,确认公网和内网地址

先在机器详情页添加白名单

po0 机器创建成功后,先不要急着连 SSH。鸡险的防火墙默认生效,白名单为空时所有入站连接都会被丢弃,MobaXterm 只会一直超时,后面要用的 30001~30004 转发端口也一样。

先关闭代理,再打开 po0 控制台。 这一步最容易出错:浏览器走代理时,控制台识别到的是代理节点的出口,加进白名单的就是代理的网段,你自己的宽带仍然连不上,还白白占掉一个位置。

  1. 关闭代理客户端或把 console.po0.io 设为直连,用准备连 SSH 的那条网络登录 po0 控制台。
  2. 打开刚创建的机器详情页,找到「防火墙」卡片。左侧「当前 /24 网段」显示控制台识别到的来源网段,先确认它是你自己宽带的网段,而不是代理节点的。
  3. 点击右下角的「添加当前网段」,右侧「白名单」里出现这个网段、计数加一后,再用 MobaXterm 连接。

po0 控制台机器详情页的防火墙卡片:左侧为当前 /24 网段,右侧为 S0 到 S4 五个白名单槽位,下方是复制添加网段链接和添加当前网段按钮

截图里的白名单已经用满 5 个,[S0]~[S4] 是槽位号,点网段右侧的叉号可以删除。

家里宽带、公司网络和手机蜂窝通常不在同一个 /24 网段。哪条网络要连这台入口,就要用哪条网络各加一次。

手动添加只够完成首次配置。家庭宽带重拨、手机切换网络后网段会变,长期使用请按下文「鸡险白名单:5 个网段、槽位与自动加白」设置自动加白。

登录并记录两个地址

在 MobaXterm 中新建或打开 po0 广州/华东入口的 SSH 会话,使用服务商提供的地址、端口、用户名和密码登录。还没用过 MobaXterm,先看用 MobaXterm 登录 Linux VPS。

po0 入口同样建议使用干净的 Debian 12/13,下面的 nftables、sysctl 和服务管理命令均以 Debian 为示例。如果现有系统已经稳定可控,并不要求为了本文强制重装;重装前必须确认控制台或救援方式可用。

bash
ip -br address
ip route

需要区分两个地址:

  • po0 公网 IP:客户端最终连接的地址。
  • po0 内网 IP:nftables snat 使用的地址,用于让去往出口的流量进入内网互通链路。

官方手动教程用 RELAY_LAN_IP 表示后者。它必须来自 po0 控制台或本机真实网卡信息,不能照抄示例,也不能填成 po0 公网 IP。

先从 po0 测试出口机:

bash
ip route get 出口机IP
ping -c 4 出口机IP
nc -vz 出口机IP 出口协议端口

部分目标可能禁 Ping,最终应以 TCPing、nc 和实际协议测试为准。若出口端口从 po0 完全不可达,先检查产品互通、出口服务和防火墙,不要急着添加 NAT。

po0 入口的 DNAT、FORWARD、SNAT 与返回数据包路径

第三步:在 po0 入口配置 nftables

入口只运行 nftables。下面采用 po0 Wiki 的手动维护思路:

  1. PREROUTING / DNAT: 把客户端访问的入口端口改写为出口机 IP 和端口,决定流量要去哪里。
  2. FORWARD: 允许数据包经过 po0 转发,并把 TCP MSS 调整为 1452,减少 MTU 不匹配造成的卡顿。
  3. POSTROUTING / SNAT: 把源地址改为 po0 内网 IP,让出口机能沿内网互通链路正确返回数据。

安装并开启 IPv4 转发

bash
apt update
apt install -y nftables
systemctl stop ufw
systemctl disable ufw

cat >/etc/sysctl.d/99-po0-forward.conf <<'EOF'
net.ipv4.ip_forward=1
EOF

sysctl --system
sysctl net.ipv4.ip_forward

返回 net.ipv4.ip_forward = 1 才继续。

先备份现有规则

bash
nft list ruleset >"/root/nftables-before-po0-$(date +%F-%H%M%S).conf"
cp -a /etc/nftables.conf "/root/nftables.conf.$(date +%F-%H%M%S).bak"

下面是一份完整 /etc/nftables.conf,其中包含 flush ruleset,加载时会替换现有 nftables 规则。如果机器上还有 SSH 防火墙、Docker 或其他业务规则,必须先合并配置,不能直接覆盖。

单出口完整配置

下面假设香港出口机 IP 为 203.0.113.10、协议端口为 30001、po0 内网 IP 为 10.100.0.10。复制前先把四个 define 示例值替换成自己的真实信息:

bash
cat > /etc/nftables.conf <<'EOF'
#!/usr/sbin/nft -f

define DEST_IP = 203.0.113.10
define DEST_PORT_OUT = 30001
define RELAY_PORT_IN = 30001
define RELAY_LAN_IP = 10.100.0.10

flush ruleset

table ip nat {
  chain prerouting {
    type nat hook prerouting priority dstnat; policy accept;

    meta l4proto { tcp, udp } th dport $RELAY_PORT_IN \
      dnat to $DEST_IP:$DEST_PORT_OUT
  }

  chain postrouting {
    type nat hook postrouting priority srcnat; policy accept;

    ip daddr $DEST_IP meta l4proto { tcp, udp } th dport $DEST_PORT_OUT \
      snat to $RELAY_LAN_IP
  }
}

table ip filter {
  chain forward {
    type filter hook forward priority filter; policy accept;

    ip daddr $DEST_IP tcp flags syn tcp option maxseg size set 1452
  }
}
EOF

执行上面的 cat 命令后,先检查语法,再应用规则:

bash
nft -c -f /etc/nftables.conf
nft -f /etc/nftables.conf
systemctl enable nftables
systemctl restart nftables
nft list ruleset

nft -c 没有输出通常表示语法通过。客户端保持协议、密码和加密方式不变,只把服务器替换成:

纯文本
po0公网IP:30001

同一入口连接多个出口

香港、日本、美国分别使用独立入口端口。下面的三个出口 IP 都是保留测试地址,复制前必须替换全部 IP 和 RELAY_LAN_IP,不能直接执行示例值:

bash
cat > /etc/nftables.conf <<'EOF'
#!/usr/sbin/nft -f

define RELAY_LAN_IP = 10.100.0.10

define PORT_IN_HK = 30001
define DEST_IP_HK = 203.0.113.10
define DEST_PORT_HK = 30001

define PORT_IN_JP = 30002
define DEST_IP_JP = 198.51.100.20
define DEST_PORT_JP = 30002

define PORT_IN_US = 30003
define DEST_IP_US = 192.0.2.30
define DEST_PORT_US = 30003

flush ruleset

table ip nat {
  chain prerouting {
    type nat hook prerouting priority dstnat; policy accept;

    meta l4proto { tcp, udp } th dport $PORT_IN_HK dnat to $DEST_IP_HK:$DEST_PORT_HK
    meta l4proto { tcp, udp } th dport $PORT_IN_JP dnat to $DEST_IP_JP:$DEST_PORT_JP
    meta l4proto { tcp, udp } th dport $PORT_IN_US dnat to $DEST_IP_US:$DEST_PORT_US
  }

  chain postrouting {
    type nat hook postrouting priority srcnat; policy accept;

    ip daddr $DEST_IP_HK meta l4proto { tcp, udp } th dport $DEST_PORT_HK snat to $RELAY_LAN_IP
    ip daddr $DEST_IP_JP meta l4proto { tcp, udp } th dport $DEST_PORT_JP snat to $RELAY_LAN_IP
    ip daddr $DEST_IP_US meta l4proto { tcp, udp } th dport $DEST_PORT_US snat to $RELAY_LAN_IP
  }
}

table ip filter {
  chain forward {
    type filter hook forward priority filter; policy accept;

    ip daddr { $DEST_IP_HK, $DEST_IP_JP, $DEST_IP_US } \
      tcp flags syn tcp option maxseg size set 1452
  }
}
EOF

写入后先检查语法,确认没有输出再加载规则:

bash
nft -c -f /etc/nftables.conf && nft -f /etc/nftables.conf

新加坡 SG-T1:通过 RFCHost HK-T1 二次中转

这条链路涉及 po0、HK-T1 和 SG-T1 三台机器。不要一次写完全部规则,按图示从最终出口向入口逐段验收。

RFCHost SG-T1 从直连出口、加入香港中转到接入 po0 的三段验收顺序

  1. 先验证新加坡出口: 在 RFCHost SG-T1 部署 Shadowsocks 2022 并监听 30004,先用 SG-T1 公网地址直连成功。
  2. 再加入香港中转: 在 HK-T1 上把 30004 转发到 SG-T1 的 30004,随后用 HK-T1 公网地址验证中转链路。
  3. 最后接入 po0: 在 po0 上把 30004 转发到 HK-T1 的 30004,客户端再改用 po0 公网地址。

HK-T1 的中转规则同样采用 DNAT + SNAT,但 SNAT 地址必须使用 RFCHost 为这段互联分配并确认可用的源地址,不能照抄 po0 的 RELAY_LAN_IP。如果验证失败,先看上图对应步骤:第二步失败检查香港到新加坡这一段,第三步失败再检查 po0 到香港这一段。

可选:使用 po0 Wiki 收录的菜单脚本

po0 Wiki 还收录了社区 nftables 菜单脚本,适合通过菜单初始化、添加和删除转发:

bash
curl -L http://script.gu.ax:2052/nftables.sh -o nft.sh
chmod +x nft.sh
less nft.sh
./nft.sh

这是社区脚本且下载地址为 HTTP,运行前应先阅读脚本并备份现有规则。首次使用选择初始化,再填写 po0 监听端口、出口机 IP 和出口端口。脚本模式与手写 /etc/nftables.conf 二选一,不要混用两套规则管理方式。

鸡险白名单:5 个网段、槽位与自动加白

第二步里手动点「添加当前网段」只能应付当下。家庭宽带的公网 IP 会变,手机在 Wi-Fi 和蜂窝之间切换也会换网段;白名单没跟上时,表现就是所有 CCN 节点突然一起超时。

下面的规则、命令和模块来自 po0 Wiki 的防火墙白名单自动加白教程与开源项目 po0fw,核验于 2026-10-13。命令或接口有变化时,以这两个页面为准。

白名单规则

项目规则
放行单位来源 IPv4 所在的 /24 网段,例如 203.0.113.0/24;同一网段内换 IP 不用重新加
数量上限每台机器 5 个网段
满额以后按写入时间淘汰最早的一个;重复上报已有网段不占新位置
槽位号0~4,控制台显示为 [S0]~[S4];可以自己指定,固定槽位不参与淘汰
生效范围这台机器的入站端口,包括 SSH 和 nftables 转发端口
IPv6不支持,只按 IPv4 加白

5 个网段要覆盖所有会连这台入口的网络。常见分配是家里宽带占 1 个,公司网络占 1 个,其余留给手机蜂窝。蜂窝网络换 IP 频繁而且经常跨网段,最容易把位置占满。

获取加白凭证

在机器详情页「防火墙」卡片点击**「复制添加网段链接」**(不是「添加当前网段」),复制到的内容里以 pgnfw_ 开头的那一串就是这台机器的加白凭证。po0 Wiki 里把这个按钮写作「复制添加脚本」。

  • 每台 po0 机器的凭证不同。
  • 拿到凭证的人可以把自己的网段加进白名单,不要发到群里、截图或提交到 Git。

自动加白的做法很简单:设备定时向 po0 的接口发一个请求,服务端按请求来源识别网段并写入白名单。

纯文本
POST https://124.221.*.*/api/firewall/你的凭证/add

接口的 IP 这里做了打码。完整地址就在你点「复制添加网段链接」得到的内容里,以自己复制到的为准。

家里有软路由:装在 OpenWrt 上

家里所有设备都通过路由器上网,出口是同一个公网 IP,所以只在路由器上装一份,连着家里 Wi-Fi 的手机和电脑就都被覆盖了。SSH 登录路由器后执行:

sh
curl -sSL https://raw.githubusercontent.com/w0ven/po0fw/main/openwrt/install-openwrt.sh -o /tmp/i.sh
PO0FW_TOKENS="pgnfw_你的凭证" sh /tmp/i.sh

安装后每 10 分钟检查一次,宽带重拨时会立即上报。执行 po0fw 可以马上加白一次,po0fw status 查看当前白名单,日志在 /tmp/po0fw.log。

还不熟悉路由器的角色和网关设置,先读软路由入门:主路由、旁路由与代理分流。

iPhone 与 Mac:Surge 模块

手机出门后走蜂窝网络,路由器覆盖不到,需要在手机上单独加白。使用 Surge 时安装 po0fw 的模块:

  1. 用 Safari 打开 po0fw 安装页,在页面顶部粘贴凭证,再点 Surge 一栏的「一键安装」。

  2. 按钮没有反应时,在 Surge 的模块页面选择从 URL 安装,填入下面的地址:

    纯文本
    https://raw.githubusercontent.com/w0ven/po0fw/main/surge/po0-firewall-whitelist.sgmodule
    
  3. 在模块参数 tokens 中填入凭证。

模块装好后会做三件事:

  • 切换网络时立即加白,另外每 10 分钟检查一次,用来发现 Wi-Fi 没断但公网 IP 已经变化的情况。
  • 内置直连规则,保证加白请求不经过代理。
  • 首页增加「po0 防火墙加白」面板,显示当前出口网段和已用数量(例如 3/5),点击可以手动刷新。

其他 iOS 客户端在同一个安装页安装,填写凭证的位置不同:

客户端形式凭证填写位置
Loon插件插件设置里的 API tokens
Stash覆写编辑覆写,补全两处 argument: tokens=
Shadowrocket模块长按模块选择编辑纯文本,替换两行 argument=tokens= 后的占位
Egern模块模块参数 tokens
Quantumult X任务片段手动加入 [task_local],凭证用 BoxJs 写入 po0fw_tokens

没有代理 App 时可以用系统「快捷指令」发同一个请求,但它没有后台定时,只在切换 Wi-Fi 时触发。

电脑与安卓

Linux 和 macOS 执行一条命令,每 10 分钟自动检查:

sh
curl -sSL https://raw.githubusercontent.com/w0ven/po0fw/main/install-linux.sh | PO0FW_TOKENS="pgnfw_你的凭证" sh

Windows 在管理员 PowerShell 中执行:

powershell
irm https://raw.githubusercontent.com/w0ven/po0fw/main/windows/install-windows.ps1 -OutFile i.ps1
powershell -ExecutionPolicy Bypass -File i.ps1 -Tokens "pgnfw_你的凭证"

安卓可以用 MacroDroid 建两个宏,动作都是向自己复制到的加白链接发送 POST 请求:一个在「网络连接变化」时触发,一个每 15 分钟触发一次,然后关闭 MacroDroid 的电池优化。

电脑一直在家里使用、路由器已经装了 po0fw 时,不用再重复安装。

固定槽位:把家里宽带钉在 0 号

白名单满了以后,最早写入的网段会被挤掉。手机在外面换几次蜂窝网段,就可能把家里宽带挤出去,全家的设备一起断线。在凭证后面加 @槽位号,可以把这台设备上报的网段固定在指定槽位,不再参与淘汰:

sh
# 路由器上的 /etc/po0fw.conf
PO0FW_TOKENS="pgnfw_你的凭证@0"

使用时注意:

  • 槽位号 0~4 是自己指定的编号,对应控制台里的 [S0]~[S4],不是网段当前排在第几位。
  • @0 要写进配置文件才长期有效;只在命令行临时敲一次,下个周期就恢复成普通模式。
  • 每个 IP 只占一个槽位。更换槽位号之前,先到控制台「防火墙」卡片点叉号删除旧槽位的记录。
  • 同一网段内换 IP 会自动跟随,不用重新固定。
  • 手机、外出用的笔记本不要固定槽位。它们被挤掉后,最迟一个检查周期就会自动补回。

推荐的分配:家里宽带固定在 @0,剩下 4 个留给手机和其他临时网络。

有多台 po0 入口时,把各自的凭证用英文逗号连起来,一次更新全部机器;Shadowrocket 和 Quantumult X 改用 | 分隔:

纯文本
pgnfw_广州入口@0,pgnfw_华东入口@0

加白请求必须直连

服务端按请求的来源 IP 加白。如果这个请求被代理带走,加进白名单的就是代理出口,你自己的宽带仍然连不上。

  • 接口直接使用 IP 地址,按域名分流的代理一般不会接管它;Surge 等模块已经内置直连规则。

  • 使用 TUN 或透明代理全局接管流量时,手动加一条规则:

    纯文本
    IP-CIDR,124.221.*.*/32,DIRECT,no-resolve
    

    把打码的部分换成加白链接里的完整 IP 后再使用。

  • 在软路由上运行脚本时,确认路由器自身的流量没有进入代理,例如 OpenClash 的「绕过本机」。

VLESS + Encryption 作为兼容性较窄的备选

VLESS Encryption 可以作为进阶方案,但很多客户端和订阅工具仍不完整支持。使用前必须同时确认:

  • 服务端核心明确支持 VLESS Encryption,而不是普通 VLESS 的 encryption=none。
  • 手机、桌面、软路由上的客户端内核支持完全相同的 Encryption 参数。
  • Sub-Store 能正确保存并输出相关字段。
  • 保留一条 Shadowsocks 2022 节点作为维护通道。

需要多个平台共用订阅时,优先使用 Shadowsocks 2022;只有所有设备都完成兼容性测试后,再启用 VLESS Encryption。

客户端与 Sub-Store

客户端最终都连接 po0 公网 IP:

节点名称客户端地址端口实际出口
CCN-HKpo0 公网 IP30001po0 HK / RFCHost HK
CCN-JPpo0 公网 IP30002RFCHost JP
CCN-USpo0 公网 IP30003po0 US
CCN-SGpo0 公网 IP30004经 RFCHost HK-T1 中转至 SG-T1

服务器地址和端口以外的参数沿用对应出口节点,包括协议、加密方式、密码和插件参数。建议在 Sub-Store 中保留 CCN 前缀,同时保留少量公网直连节点作为维护备用:

纯文本
CCN-HK-RFC-T1
CCN-JP-RFC-T1
CCN-US-PO0
CCN-SG-RFC-VIA-HK

按链路逐段排错

1. 出口协议

bash
sing-box check -c /etc/sing-box/config.json
systemctl status sing-box --no-pager
journalctl -u sing-box -n 100 --no-pager
ss -lnptu | grep ':30001'

必须先确认客户端直连出口可用。

2. po0 到出口

bash
ip route get 出口机IP
ping -c 4 出口机IP
nc -vz 出口机IP 出口协议端口

检查使用的产品是否支持互通、出口防火墙是否放行,以及端口是否命中 po0 默认封禁范围。

3. nftables 命中情况

bash
sysctl net.ipv4.ip_forward
nft list ruleset
systemctl status nftables --no-pager

若需要观察计数,可临时为目标规则增加 counter。只有去程没有回程时,优先核对 RELAY_LAN_IP 和 SNAT,而不是反复修改客户端密码。

4. 客户端到 po0

bash
nc -vz po0公网IP 30001

确认客户端已经换成 po0 公网 IP,监听端口与 nftables 一致。

昨天还正常、今天所有 CCN 节点一起超时,而 po0 的 SSH 也连不上时,先查白名单:

  1. 关闭代理后打开 po0 控制台,在「防火墙」卡片核对「当前 /24 网段」是否在白名单里;不在就点「添加当前网段」。
  2. 已经装了 po0fw 的设备执行 po0fw status,或在 Surge 面板点击刷新。
  3. 列表里出现了陌生网段,多半是加白请求走了代理,按「加白请求必须直连」一节处理。

上面的 nc 测试也要在已加白的网络里执行,否则结果一定是超时。

5. 新加坡双层链路

按上面的“SG-T1 三段验收顺序”图逐步回查,从最早失败的步骤定位故障。不要同时修改三台机器,否则很难确定问题在哪一段。

稳定性与维护建议

  • 官方手动示例将 TCP MSS 设为 1452,用于降低内网封装与路径 MTU 不匹配导致的卡顿;不要删除后只靠降低所有网卡 MTU碰运气。
  • 先新增出口服务端口,再配置 nftables,最后更新客户端;删除线路时按相反顺序操作。
  • 每次改规则前备份 /etc/nftables.conf 和当前 ruleset。
  • 不要在同一台入口上交替使用菜单脚本和手写配置。
  • 换宽带、搬家或更换主要使用的网络后,到控制台「防火墙」卡片清理不再使用的网段,给新网络留出位置。
  • 用 po0 状态页、Looking Glass 和真实客户端长期观察,单次最低延迟不能代表晚高峰稳定性。
  • 多层链路会增加维护成本和流量消耗;先稳定运行香港或日本单出口,再增加美国和新加坡。

配置时分清四类地址:客户端连接 po0 的公网地址、po0 做 SNAT 使用的内网地址、境外出口的内网地址,以及协议本身的端口和参数。任何一项填错,链路都会中断。