✨ PortChannel Zero (Po0 腾讯云) — 从开机到配置 nftables 专线转发全流程教程(小白向)

同步来源:树洞剪藏 源站剪藏 ID:648 原文地址:https://www.nodeseek.com/post-613964-1
✨ PortChannel Zero (Po0 腾讯云) — 从开机到配置 nftables 专线转发全流程教程(小白向)
NodeSeek beta 日常 技术 情报 测评 交易 拼车 推广 DeepFlood
日常 技术 情报 测评 交易 拼车 推广 生活 Dev 贴图 曝光 内版 沙盒
✨ PortChannel Zero (Po0 腾讯云) — 从开机到配置 nftables 专线转发全流程教程(小白向)
Adolf929 楼主 12days ago edited 10days ago in 技术 #0
前言:关于 Po0
Po0(PortChannel Zero)是RFC陈总推出的广州、上海腾讯云CCN服务器。可利用 腾讯云 CCN(云联网) 与 RFCHOST T1 的内网互通,搭建 低延迟、高稳定性 的商业级专线,中转流量至 RFCHOST 落地机。
可能是目前MJJ能买得起的最强专线
🛒 产品传送门(带AFF):
• 腾讯云广州 - Spring Special
• 腾讯云华东(上海) - Spring Special
需通过腾讯云接口实名
配置:独立IP 2C 2G 200M 500G 单向流量 ,1188元/年
另有 众多月付套餐可供选择 ,,用券后最低仅79元/月起,月付优惠码:「常驻九折优惠券」
核心原理
入口 :腾讯云 12 线 BGP(国内互联性极佳)
出口 :RFCHOST HK.T1 / JP.T1
(可通过RFC 内网可延伸至 SG T1 / US T1(画饼中))
Nftables中转方式:通过 DNAT + SNAT :
入站:将访问 PO0 中转端口的流量内网转发(陈总神秘黑科技)至落地机
出站:强制使用腾讯云 ↔ RFCHOST 内网路由,绕开公网拥堵
预期表现
路径 延迟(参考)
广州 → RFC HK T1 ~6ms
广州 → RFC JP T1 ~50ms
上海 → RFC HK T1 ~24ms
上海 → RFC JP T1 ~30ms
SLA :腾讯云级别稳定性,理论0掉线率0丢包
准备工作
已购买 RFC HK或JP T1落地机 (目前HK CO和JP CO也通PO0);已购买PO0上海或广州机器
已完成 落地机配置
已完成 落地ss协议搭建
为避免触犯论坛规则,这里不对落地机配置作具体展开
第一阶段:安全加固(SSH 密钥登录 & 修改端口)
默认系统: Debian 12
- 本地生成 SSH 密钥
Windows (PowerShell) / Mac / Linux:
打开终端,输入以下命令(一路回车即可):
ssh-keygen -t ed25519 -C "po0_key"
查看并复制公钥:
cat ~/.ssh/id_ed25519.pub
- 服务器写入公钥
创建目录
mkdir -p ~/.ssh chmod 700 ~/.ssh
写入公钥
echo "ssh-ed25519 AAAA...你的公钥内容... po0_key" >> ~/.ssh/authorized_keys
设置权限
chmod 600 ~/.ssh/authorized_keys
- 修改 SSH 配置
编辑配置文件:
nano /etc/ssh/sshd_config
找到以下配置项并修改(如果找不到,可在文件末尾添加):
1. 修改默认端口 (防止简单扫描)
Port 12956(自行修改)
2. 禁止密码登录 (强制使用密钥)
PasswordAuthentication no
3. 允许密钥登录
PubkeyAuthentication yes
重启 SSH 服务
systemctl restart ssh
第二阶段:Debian 12 初始化
- 更新系统
apt update && apt upgrade -y
- 开启 IP 转发(必做)
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p
- 安装 Nftables(debian12系统内已默认安装,这步可省略)
apt install nftables -y
第三阶段:部署 Nftables 专线转发
编辑配置文件( 清空原内容 ):
nano /etc/nftables.conf
如果仅有一台落地机需要转发:
#!/usr/sbin/nft -f
=======================================================
📝 变量定义区 (务必根据实际情况修改)
=======================================================
define DEST_IP = 82.40.xx.xx # 1. RFCHOST 落地机公网 IP define DEST_PORT_OUT = 33333 # 2. RFCHOST 落地机服务端口 define RELAY_PORT_IN = 10086 # 3. PO0中转端口 define RELAY_LAN_IP = 10.100.xx.xx # 4. PO0内网 IP
=======================================================
清空旧规则
flush ruleset
--- 核心转发逻辑 (NAT表) ---
table ip nat {
1. 入站转发 (DNAT)
目的: 将访问PO0 10086端口 的流量仍给落地机
chain prerouting { type nat hook prerouting priority dstnat; policy accept;
同时转发 TCP 和 UDP
meta l4proto { tcp, udp } th dport $RELAY_PORT_IN dnat to $DEST_IP:$DEST_PORT_OUT }
2. 出站伪装 (SNAT) - 专线核心
目的: 将源地址改为内网 IP,强制流量走腾讯云-RFCHOST的内网路由
chain postrouting { type nat hook postrouting priority srcnat; policy accept;
仅匹配发往落地机的流量,执行 SNAT
ip daddr $DEST_IP meta l4proto { tcp, udp } th dport $DEST_PORT_OUT snat to $RELAY_LAN_IP } }
--- 性能优化逻辑 (Filter表) ---
目的: 防止 MTU 不匹配导致的断流
table ip filter { chain forward { type filter hook forward priority 0; policy accept;
调整 TCP MSS,解决某些情况下速度慢/断流”的问题
ip daddr $DEST_IP tcp flags syn tcp option maxseg size set 1452 } }
如果有两台落地机需要转发:
#!/usr/sbin/nft -f
=======================================================
📝 变量定义区 (务必根据实际情况修改)
=======================================================
--- 公共配置 ---
define RELAY_LAN_IP = 10.100.xx.xx # PO0内网 IP
--- 线路 1 配置 (例如RFC HK T1) ---
define PORT_IN_1 = 10086 # 中转端口 1 define DEST_IP_1 = 172.81.xx.xx # 1号落地机 IP define DEST_PORT_1 = 33333 # 1号落地机端口
--- 线路 2 配置 (例如RFC JP CO) ---
define PORT_IN_2 = 20086 # 中转端口 2 define DEST_IP_2 = 82.40.xx.xx # 2号落地机 IP define DEST_PORT_2 = 44444 # 2号落地机端口
=======================================================
清空旧规则
flush ruleset
--- 核心转发逻辑 (NAT表) ---
table ip nat {
--- 入站转发 (DNAT) ---
chain prerouting { type nat hook prerouting priority dstnat; policy accept;
[线路 1] 流量进入端口1 -> 转给落地机1
meta l4proto { tcp, udp } th dport $PORT_IN_1 dnat to $DEST_IP_1:$DEST_PORT_1
[线路 2] 流量进入端口2 -> 转给落地机2
meta l4proto { tcp, udp } th dport $PORT_IN_2 dnat to $DEST_IP_2:$DEST_PORT_2 }
--- 出站伪装 (SNAT) ---
chain postrouting { type nat hook postrouting priority srcnat; policy accept;
[线路 1] 发往落地机1的流量 -> 改源IP为内网IP (走专线)
ip daddr $DEST_IP_1 meta l4proto { tcp, udp } th dport $DEST_PORT_1 snat to $RELAY_LAN_IP
[线路 2] 发往落地机2的流量 -> 改源IP为内网IP (走专线)
ip daddr $DEST_IP_2 meta l4proto { tcp, udp } th dport $DEST_PORT_2 snat to $RELAY_LAN_IP } }
--- 性能优化逻辑 (Filter表) ---
目的: 防止 MTU 不匹配导致的断流
table ip filter { chain forward { type filter hook forward priority 0; policy accept;
调整 TCP MSS,解决某些情况下速度慢/断流”的问题
ip daddr { $DEST_IP_1, $DEST_IP_2 } tcp flags syn tcp option maxseg size set 1452 } }
如果有三台及以上落地机需要转发,则自行再增加n组定义变量,复制 dnat 和 snat 的那两行规则,修改变量即可,这里不再展开阐述。
应用并自启:
检查语法 (无输出则为正常)
nft -c -f /etc/nftables.conf
应用配置
nft -f /etc/nftables.conf
设置开机自启
systemctl enable nftables systemctl restart nftables
第四阶段:验证
ss客户端配置:
Address:PO0 公网 IP
Port:PO0 中转端口
其余参数:保持落地机一致
到此教程结束,在此感谢RyanZ董事长的教程参考
下单地址
4 8 0 75 引用 回复
1 2 3 4 5 6
dxnspj8 11days ago edited 7days ago #50
用Claude写了一个脚本 可以自动化部署 大家可以参考一下
https://www.nodeseek.com/post-615707-1
#!/bin/bash
============================================================
PO0 中转机 nftables 端口转发一键部署
IPv4 nftables 内核态转发 + 防火墙
适用: Ubuntu 22.04 / 24.04
用法: bash setup-relay.sh
============================================================
set -e
==================== 自动检测 ====================
WAN_IF=$(ip -4 route show default | awk '{print $5; exit}') if [ -z "$WAN_IF" ]; then echo "❌ 无法检测默认网卡"; exit 1 fi
RELAY_LAN_IP=$(ip -4 addr show "$WAN_IF" | awk '/inet /{print $2}' | cut -d/ -f1 | head -1) if [ -z "$RELAY_LAN_IP" ]; then echo "❌ 无法获取内网 IP"; exit 1 fi
random_port() { echo $(( RANDOM % 50000 + 10000 )) }
echo "" echo "============================================" echo " PO0 中转机端口转发部署" echo "============================================" echo "" echo " 自动检测:" echo " 网卡: $WAN_IF" echo " 内网IP: $RELAY_LAN_IP" echo ""
==================== 用户输入 ====================
read -rp " 落地机数量 [1]: " LINE_COUNT LINE_COUNT=${LINE_COUNT:-1}
if ! [[ "$LINE_COUNT" =~ ^[0-9]+$ ]] || [ "$LINE_COUNT" -lt 1 ] || [ "$LINE_COUNT" -gt 20 ]; then echo "❌ 数量无效 (1-20)"; exit 1 fi
declare -a DEST_IPS DEST_PORTS RELAY_PORTS LINE_NAMES
for i in $(seq 1 "$LINE_COUNT"); do echo "" if [ "$LINE_COUNT" -gt 1 ]; then echo " --- 线路 $i ---" read -rp " 线路名称 (如 HK-T1, JP-CO) [线路${i}]: " name LINE_NAMES[$i]=${name:-"线路${i}"} else LINE_NAMES[$i]="默认线路" fi
read -rp " 落地机 IP: " dest_ip if [ -z "$dest_ip" ]; then echo "❌ IP 不能为空"; exit 1 fi DEST_IPS[$i]=$dest_ip
read -rp " 落地机端口: " dest_port if [ -z "$dest_port" ]; then echo "❌ 端口不能为空"; exit 1 fi DEST_PORTS[$i]=$dest_port
rp=$(random_port) read -rp " 中转端口 [${rp}]: " relay_port RELAY_PORTS[$i]=${relay_port:-$rp} done
==================== 确认 ====================
echo "" echo " ========== 转发规则 ==========" for i in $(seq 1 "$LINE_COUNT"); do echo " [${LINE_NAMES[$i]}] :${RELAY_PORTS[$i]} -> ${DEST_IPS[$i]}:${DEST_PORTS[$i]}" done echo " ===============================" echo "" read -rp " 确认部署? [Y/n]: " CONFIRM CONFIRM=${CONFIRM:-Y} if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then echo "已取消"; exit 0 fi echo ""
--------------------------------------------------
echo "[1/4] 内核参数"
--------------------------------------------------
sudo tee /etc/sysctl.d/99-relay.conf >/dev/null <<'EOF' net.ipv4.ip_forward=1 net.core.default_qdisc=fq net.ipv4.tcp_congestion_control=bbr net.netfilter.nf_conntrack_max=65536 EOF sudo sysctl --system >/dev/null echo " 转发 + BBR + conntrack ✓"
--------------------------------------------------
echo "[2/4] 禁用 UFW"
--------------------------------------------------
if systemctl is-active --quiet ufw 2>/dev/null; then sudo systemctl disable --now ufw fi echo " ✓"
--------------------------------------------------
echo "[3/4] 生成 nftables 规则"
--------------------------------------------------
NFT_VARS="define RELAY_LAN_IP = $RELAY_LAN_IP " for i in $(seq 1 "$LINE_COUNT"); do NFT_VARS+="define DEST_IP_${i} = ${DEST_IPS[$i]} " NFT_VARS+="define DEST_PORT_${i} = ${DEST_PORTS[$i]} " NFT_VARS+="define PORT_IN_${i} = ${RELAY_PORTS[$i]} " done
if [ "$LINE_COUNT" -eq 1 ]; then INPUT_PORTS="$PORT_IN_1" else INPUT_PORTS="$PORT_IN_1" for i in $(seq 2 "$LINE_COUNT"); do INPUT_PORTS+=", $PORT_IN_${i}" done fi
NFT_DNAT="" for i in $(seq 1 "$LINE_COUNT"); do NFT_DNAT+=" # [${LINE_NAMES[$i]}] " NFT_DNAT+=" meta l4proto { tcp, udp } th dport $PORT_IN_${i} dnat to $DEST_IP_${i}:$DEST_PORT_${i} " done
NFT_SNAT="" for i in $(seq 1 "$LINE_COUNT"); do NFT_SNAT+=" # [${LINE_NAMES[$i]}] " NFT_SNAT+=" ip daddr $DEST_IP_${i} meta l4proto { tcp, udp } th dport $DEST_PORT_${i} snat to $RELAY_LAN_IP " done
NFT_FWD="" for i in $(seq 1 "$LINE_COUNT"); do NFT_FWD+=" ip daddr $DEST_IP_${i} meta l4proto { tcp, udp } th dport $DEST_PORT_${i} accept " done
if [ "$LINE_COUNT" -eq 1 ]; then MSS_MATCH="ip daddr $DEST_IP_1" else MSS_SET="$DEST_IP_1" for i in $(seq 2 "$LINE_COUNT"); do MSS_SET+=", $DEST_IP_${i}" done MSS_MATCH="ip daddr { ${MSS_SET} }" fi
sudo tee /etc/nftables.conf >/dev/null <<EOF #!/usr/sbin/nft -f
============================================================
PO0 中转机 nftables 规则
生成时间: $(date '+%Y-%m-%d %H:%M:%S')
============================================================
flush ruleset
$(echo -e "$NFT_VARS")
--- 防火墙 ---
table inet filter { chain input { type filter hook input priority 0; policy drop; ct state { established, related } accept iif "lo" accept ip protocol icmp accept
SSH 防扫描: 新连接限速 10/分钟
tcp dport 22 ct state new limit rate 10/minute burst 5 packets accept tcp dport 22 ct state established accept
中转端口
iifname "$WAN_IF" meta l4proto { tcp, udp } th dport { ${INPUT_PORTS} } accept }
chain forward { type filter hook forward priority 0; policy drop; ct state { established, related } accept $(echo -e "$NFT_FWD") }
chain output { type filter hook output priority 0; policy accept; } }
--- NAT 转发 ---
table ip nat { chain prerouting { type nat hook prerouting priority dstnat; policy accept; $(echo -e "$NFT_DNAT") }
chain postrouting { type nat hook postrouting priority srcnat; policy accept; $(echo -e "$NFT_SNAT") } }
--- MSS 优化 (防止 MTU 不匹配导致断流) ---
table ip mangle { chain forward { type filter hook forward priority mangle; policy accept; ${MSS_MATCH} tcp flags syn tcp option maxseg size set 1452 } } EOF
sudo nft -c -f /etc/nftables.conf && sudo nft -f /etc/nftables.conf sudo systemctl enable nftables echo " nftables ✓"
--------------------------------------------------
echo "[4/4] 安装 conntrack"
--------------------------------------------------
sudo apt install -y conntrack >/dev/null 2>&1 echo " ✓"
--------------------------------------------------
echo "" echo "============================================" echo " ✅ 部署完成" echo "============================================" echo "" for i in $(seq 1 "$LINE_COUNT"); do echo " [${LINE_NAMES[$i]}] :${RELAY_PORTS[$i]} -> ${DEST_IPS[$i]}:${DEST_PORTS[$i]}" done echo "" echo " 防火墙: policy drop" echo " 开放: SSH(22, 限速防扫描) + 中转端口" echo " 其余入站全部丢弃" echo " BBR: 已开启" echo " MSS clamp: 1452" echo " conntrack max: 65536" echo "" echo " 常用命令:" echo " sudo nft list ruleset # 查看规则" echo " sudo nft -a list ruleset # 带 handle 查看" echo " sudo conntrack -C # 当前连接数" echo " sudo conntrack -L -d <落地机IP> # 查看转发连接" echo "============================================"
1 2 0 引用 回复
xiaocaiji 12days ago
#30
多出口的情况下, # 调整 TCP MSS下,$DEST_IP 需要分别改成对应的 $DEST_IP_1和$DEST_IP_2
本人小菜鸡,什么都不懂
0 1 0 引用 回复
whqijy 12days ago
#32
多出口的配置下最后一行有虫子,前面定义的是DEST_IP1和DEST_IP2,建议改为:
ip daddr { $DEST_IP_1, $DEST_IP_2 } tcp flags syn tcp option maxseg size set 1452
0 1 0 引用 回复
Adolf929 楼主 10days ago edited 10days ago
#53
@雪秋千 #52 https://www.nodeseek.com/post-613245-1
https://www.nodeseek.com/post-494880-1
0 1 0 引用 回复
cnrun 12days ago #1
学习。
0 0 0 引用 回复
Grey 12days ago #2
专业!
✨ 长期拼车 JP/SG 平均成本8折
【OpenClaw TG 交流群(筹备中)】
☻☻☻ +¥1000 收 V.PS 新加坡 166.66o ☻☻☻
0 0 0 引用 回复
Meandro 12days ago #3
思路差不多.学习
✈️ | 私
0 0 0 引用 回复
mjj终结者 12days ago #4
??? 我表示买不起
可能是目前MJJ能买得起的最强专线
Komari | 剩余价值计算器
0 0 0 引用 回复
Kedaya 12days ago #5
感觉还是realm方便,多端口nft转发修改起来麻烦
0 0 0 引用 回复
djsx 12days ago #6
先收藏慢慢看
0 0 0 引用 回复
佛如来 12days ago #7
很专业,但我没有。就此为你颂诗一首
有心无相,相由心生;有相无心,相由心灭。
0 0 0 引用 回复
syrcco 12days ago #8
@Kedaya #5 一股脑全丢给ai直接生成配置文件也挺方便的其实
0 0 0 引用 回复
n0p1nt3 12days ago #9
手动设置 /etc/nftables.conf 和 ufw 是冲突的吧
nftables.conf 里面一 flush ruleset 直接把 ufw 规则都冲掉了
要么不用 ufw,要么得把规则写到 /etc/ufw/before.rules 里面
0 0 0 引用 回复
Adolf929 楼主 12days ago #10
@n0p1nt3 #9 哈哈哈确实,把这忘了,我去掉
0 0 0 引用 回复
1 2 3 4 5 6
内容 预览 对照
支持 markdown语法
鼓励友善发言,禁止人身攻击
xxxxxxxxxx
1
1
AC娘
洋葱头
小黄鸡
Fluent
App
发布评论
88
等级 Lv 6 鸡腿 3907 星辰 1 通知 0
主题帖 15 评论数 478 粉丝 2 收藏 422 发帖
快捷功能区 推荐阅读 管理记录 幸运抽奖 邀请好友 合作商家 友站链接
📈用户数目📈
目前论坛共有48499位seeker
🎉欢迎新用户🎉
pepinwoo
Masta
安和
NqZUaEde
felt-tip0027
白露横江-bai11
wesseek
yaobaobao
相关网站 LowEndTalk LowEndSpirit HostLoc ServerHunter
站内导航 关于本站 隐私协议 RSS订阅 sitemap
商业推广 商家申请规则 Premium Provider 合作商家展示 广告合作
其他平台 电报频道 电报群组
联系我们
Copyright © 2022 - 2026 All rights Reserved