wg-mimic-fabric:把 WireGuard 伪装成 TCP 穿透 UDP 封锁的一键中转组网脚本
仓库:https://github.com/ike-sh/wg-mimic-fabric · 许可:MIT · 版本:v1.0.1
先一句话总结:一条命令,把「公网入口 ⇄ IX/落地」用 WireGuard 组网,再用 Mimic(eBPF)把 WG 的 UDP 流量在链路上伪装成 TCP,绕过运营商/防火墙对 UDP 的封锁、限速和 DPI;IX 侧用 nftables 转发到落地服务。 全程一个全局命令 wm,交互菜单 + CLI 全覆盖,IX 生成「接入码」、公网入口粘贴即组网。
客户端 ──Mimic(伪TCP)承载的 WireGuard──► 公网入口 ⇄ IX ──nft──► 落地:端口
一、先说痛点:为什么要给 WireGuard «套壳»
WireGuard 又快又稳,但它只跑 UDP。问题是在很多网络环境里 UDP 是「二等公民」:
- 部分运营商/机房对 UDP 限速、丢包、QoS 降权,表现就是「能连但卡、客户端不显示延迟、晚高峰惨不忍睹」;
- 一些防火墙/DPI 直接封 UDP 或对 WireGuard 特征流量识别后阻断;
- 纯 TCP 隧道(如某些 TCP 代理)虽然能过,但有「TCP over TCP」队头阻塞、性能塌方的老毛病。
理想方案是:底层还是 WireGuard 的 UDP(性能好、无 TCP-over-TCP),但在链路上让它看起来像一条普通 TCP 连接,骗过中间设备。这正是 Mimic 干的事,而 wg-mimic-fabric 把「WG 组网 + Mimic 伪装 + nft 转发」的搭建与运维全自动化。
二、核心原理:Mimic 是怎么把 UDP «变成» TCP 的
Mimic 是一个基于 eBPF(XDP + TC) 的流量伪装工具。它不改 WireGuard 本身,而是在网卡收发路径上就地改写报文头,做到对 WG 完全透明。
2.1 收发两条路径
| 方向 | eBPF 挂载点 | 做的事 |
|---|---|---|
| 发包 | TC egress | 把出站的 WireGuard UDP 包改写成「伪 TCP」——加上看似合法的 TCP 头、序列号/确认号,链路上呈现为一条正常 TCP 流 |
| 收包 | XDP ingress | 把入站的「伪 TCP」还原成 UDP,原样交还给内核里的 WireGuard |
关键点:
- 对 WG 完全透明——WireGuard 自始至终以为自己在收发 UDP,无需任何改动;
- 两端都要跑 Mimic,各自做双向 encode(TC 出)+ decode(XDP 入),这是正常设计,不是配置错误;
- 改写发生在内核态(eBPF),几乎零拷贝、性能开销极小,不像用户态封装那样吃 CPU。
2.2 用 filter 选流:local= vs remote=
Mimic 用 filter 决定「处理哪条流」:
- 被动监听侧(IX):
filter = local=IP:端口—— 等对端来连; - 主动连接侧(公网入口):
filter = remote=IP:端口—— 主动发起伪 TCP 握手。
2.3 一个最容易踩坑的细节:精确 IP 匹配
Mimic 在 XDP/TC 看到的是网卡上的真实目的 IP。在 NAT / 浮动公网 IP 的机器上,公网流量进网卡前,目的地址早已被改写成内网 IP。所以 IX 侧的 filter = local= 必须用网卡的真实内网 IP,而不是公网 IP——否则 XDP 永远匹配不到,隧道死活不通。
这个坑本脚本自动处理(自动探测 WAN 网卡的真实 IP 绑定,必要时可用
MIMIC_LOCAL_IP覆盖),省去手动排查。
2.4 XDP 的两种挂载模式
native:驱动层挂载,最快,但需网卡驱动支持;skb:通用模式,任意网卡可用,略慢。
virtio_net 等虚拟网卡通常只能用 skb,脚本会自动识别并切换,不会在不支持 native 的网卡上反复试错把线路弄挂。
2.5 ⚠️ 安全组必读:TCP 和 UDP 都要放行
Mimic 链路上是 TCP,但发起方仍是 UDP 行为——netfilter 入站识别为 TCP、出站识别为 UDP。所以云安全组/防火墙必须对 WG 端口同时放行 TCP 和 UDP,这是新手最常见的「不握手」原因。
三、wg-mimic-fabric 到底能做什么
把上面整套东西全自动化成一个 wm 命令,并补齐生产级运维能力:
- 一键组网:IX/落地侧一条命令建线路、生成「接入码」;公网入口粘贴接入码即自动组网,末尾还会问「现在就启动吗」。
- 一隧道多规则:一条 WG 隧道承载多条转发规则,每条规则独立的中转端口 → 不同落地,互不干扰。
- 改规则不断流:增/改/删规则自动重生成接入码且不换密钥,公网入口重新导入即可,隧道不中断。
- 自动处理脏活:NAT 机器的 Mimic 绑定、网卡 XDP 模式选择(virtio 自动 skb)、systemd 单元、防火墙放行,全自动。
- 线路质量自检 + 自动切换:
wm test实测隧道真实丢包/延迟;多中转候选可按丢包阈值自动切到最优线路。 - 生产特性齐全:IPv4/IPv6 双栈、落地域名 DDNS、线路主备分组切换、健康检查与诊断。
角色分工
| 角色 | 机器 | 职责 |
|---|---|---|
nat-transit |
IX / 落地侧 | WG 监听 + Mimic + nft 转发到落地 + 生成接入码 |
nat-ingress |
公网入口 | 导入接入码 + WG 连入 + Mimic + 对客户端开放入口端口 |
四、完整数据链路
客户端
→ 公网入口 公网IP:客户端入口端口(client_port)
→ 公网入口 nft DNAT
→ WireGuard 隧道(入口 10.88.0.1 ⇄ IX 10.88.0.2;Mimic 把 WG 的 UDP 伪装为 TCP)
→ IX 虚拟IP 10.88.0.2:中转端口(transit_port)
→ IX nft DNAT
→ 落地 landing_host:landing_port
一条 WG 隧道承载全部规则;规则差异只体现在两端 nft DNAT 与入口 client_port。接入码(WMGF1:,code_schema=5)携带 WG 组网密钥、虚拟 IP、端口、落地与多规则数组,由 IX 单向生成、公网入口导入。
五、系统要求(很重要,先自查再装)
Mimic 用到较新的 eBPF/kfunc,两端都要满足:
| 项 | 要求 |
|---|---|
| 内核 | Linux ≥ 6.1(低于 6.1 无法运行) |
| BTF | 需 /sys/kernel/btf/vmlinux(CONFIG_DEBUG_INFO_BTF=y) |
| 模块 | mimic 内核模块(经 DKMS 按当前内核编译)+ mimic 用户态 CLI |
| 依赖 | bash、python3、wireguard-tools、nftables、curl、iproute2、systemd、root |
| Secure Boot | 若开启,DKMS 模块需 MOK 签名/入册,否则内核拒绝加载 |
发行版兼容评级(装前先跑 wm compat)
| 评级 | 发行版 | 说明 |
|---|---|---|
| ✅ 推荐 | Debian 13 / Ubuntu 24.04 | 官方 apt install mimic mimic-dkms,内核 ≥ 6.1 |
| 良好 | Arch | AUR:mimic-bpf |
| 有条件 | Fedora / RHEL 系 | 默认内核常 < 6.1,需 elrepo kernel-ml 或换 Debian/Ubuntu |
| 实验 | Alpine / OpenWrt | 无 DKMS 需源码编译,生产不推荐 |
安装脚本会自动装 mimic(apt → GitHub
.deb→ 源码编译,三级回退)并按当前内核用 DKMS 编译模块。RHEL/CentOS 默认内核 5.14 不达标,首选直接换 Debian/Ubuntu VPS。
六、快速部署(三步)
0. 安装(两端都执行)
curl -fsSL https://raw.githubusercontent.com/ike-sh/wg-mimic-fabric/main/scripts/bootstrap.sh | sudo bash
装完用全局命令 wm(无参数进交互菜单)。wm compat 看兼容评级。
1. IX / 落地侧(nat-transit)
wm create-transit
# 填:公网入口可达的 IX 公网地址/中转IP、WG 端口、IP 版本(4/6/dual)、(可选)端口池、首条落地 IP/端口
# 复制输出的 WMGF1: 接入码
2. 公网入口(nat-ingress)
wm import-code
# 粘贴接入码;为每条规则分配「客户端入口端口」(默认与落地端口一致,回车即可)
3. 客户端
连接 公网入口IP:<客户端入口端口>,用 wm show-port-map <ID>-ingress 查看完整端口地图。
七、进阶功能
多转发规则 + 商家端口池
一条隧道挂多条规则,每条独立中转端口 → 不同落地:
wm list-rules <ID>
wm add-rule <ID> # 新增(自动重生成接入码,密钥不变)
wm edit-rule / delete-rule / enable-rule / disable-rule <ID> <规则ID>
wm refresh-code <ID> # 按当前规则刷新接入码(不换密钥、不断流)
商家给的 IX 端口有限?设个中转端口池,新增规则自动从池里取空闲端口、强制落在池内、禁止重复:
wm set-pool ix-nat 18300-18399 # 设置;留空=清除
端口池仅 IX 侧分配状态,不进接入码、不影响公网入口。
线路质量自检 + 自动切换(专治「能连但卡」)
很多「能连但卡 / 不显示延迟」其实是中转线路丢包,不是配置错。注意:要走隧道实测,而不是对中转网关裸 ping。
wm test <ID> [包数] # 实测隧道真实丢包/延迟并判定质量(默认100包)
wm set-endpoint <ID> <中转IP> # 切换该线路用的 IX 公网/中转地址(入口侧即时生效)
wm set-endpoints <入口线路> IP1,IP2,IP3 # 设候选中转列表(均指向同一 IX)
wm autoswitch <入口线路> [阈值%] # 超阈值(默认10%)自动探测切到最优候选
wm autoswitch-enable / autoswitch-disable <入口线路> # 定时自动切换(每5分钟)
判定:丢包 ≤2% 良好 / ≤10% 一般 / >10% 建议换中转。
IPv6 / 双栈
create-transit 时选 IP 版本 4 / 6 / dual;落地可填 IPv6 或域名(nft 自动按 A/AAAA 解析),MTU 建议 IPv6/dual 用 1408。
DDNS(落地/端点是域名时自动跟 IP)
wm ddns-enable # 每3分钟定时刷新(systemd timer)
wm ddns-refresh # 手动刷新一次
公网入口域名变化热更新 wg set endpoint;落地域名渲染 nft 时自动解析跟随。
主备切换(手动,安全边界清晰)
wm set-group <ID> <组名> primary 100
wm set-group <ID2> <组名> backup 90
wm switch-line <组名> <目标线路ID> # 启用目标、停同组其它、重建 nft
wm primary-backup-check <组名> / wm health-all
想要「同一 IX 多中转按丢包自动切」,用上面的
autoswitch;主备是跨 IX 的手动切换。
八、常用命令速查
| 命令 | 说明 |
|---|---|
wm |
交互菜单 |
wm create-transit / import-code |
IX 建线路出码 / 公网入口导入码 |
wm start|stop|restart [ID] |
启停线路(两端均需 WG+Mimic) |
wm show-code [ID] / refresh-code [ID] |
显示 / 刷新接入码(不换密钥) |
wm rotate-keys [ID] |
轮换密钥(仅密钥泄露时用,会重启 IX) |
wm test [ID] [包数] |
实测隧道丢包/延迟 |
wm set-endpoint(s) / autoswitch* |
切中转 / 自动切换 |
wm health [ID] / diagnose [ID] |
健康检查 / 诊断预检 |
wm set-mtu / set-xdp-mode |
调参(MTU / XDP 模式) |
wm update-mimic [版本] |
升级 mimic(重载模块 + 重启线路) |
wm upgrade-script / uninstall / purge |
维护 |
九、踩坑速查
| 现象 | 排查 |
|---|---|
| WG 不握手 | 入口能到 IX:WG_PORT?安全组对 WG 端口 TCP+UDP 都放行?两端 Mimic 都 active? |
| 能连但卡 / 不显示延迟 | 多半中转丢包:wm test 看丢包,>10% 就 set-endpoint 换中转或开 autoswitch |
| IX 侧 mimic 不匹配 | NAT 机 local= 须用网卡真实内网 IP(脚本自动,可 MIMIC_LOCAL_IP 覆盖) |
mimic 仍未启动 |
virtio 网卡 native 起不来会自动回退 skb;卡住就 ip link set dev <网卡> xdp off 后 wm restart |
| MTU 大包不通 | wm set-mtu <ID> 1380(两端同改) |
诊断三件套:wm diagnose <ID>、wm test <ID>、wg show / mimic show <网卡>。
十、安全提示
- 接入码含 WG 组网私钥与落地信息,按密钥对待、勿公开;泄露后
wm rotate-keys轮换并重导。 wm只维护自己的 nft 表wg_mimic_fabric,不接管全局防火墙。wm purge删除全部配置/密钥/服务(WMF_PURGE_NO_MIMIC=1可保留 mimic 系统包)。
十一、适用 / 不适用
适合:UDP 被封/被限速的线路想跑 WireGuard;需要「公网入口 → IX 中转 → 落地」分发;一个入口挂多条落地;中转线路质量飘要自动切换。
不适合:内核 < 6.1 且无法升级;不能装内核模块的极简/容器环境(无 DKMS/BTF);只想要纯 TCP 代理而不在意 WG。
总结
wg-mimic-fabric = WireGuard 的性能 + Mimic 伪 TCP 的穿透力 + 一键化的运维体验。原理上靠 eBPF 在内核收发路径就地改写报文头,把 WG 的 UDP 在链路上伪装成 TCP,对 WG 透明、性能损耗极小;工程上把组网、伪装、转发、多规则、线路自检/切换、双栈、DDNS、主备全收进一个 wm 命令。
仓库(含完整文档):https://github.com/ike-sh/wg-mimic-fabric ,欢迎 Star / Issue / PR。
友情提示:装前先
wm compat自查内核 ≥ 6.1 与 BTF;部署后第一件事是确认安全组对 WG 端口同时放行 TCP + UDP——九成「连不上」都栽在这。
好的很 能过傲盾吗
@ois #1 看你落地用什么 我是VLESS Encryption 毫无压力
高端玩法,我不会
@又菜又爱玩 #3 所以这就是为什么要搓这个脚本 哈哈哈哈
这个跟您写的另一个区别在于组网方式不同吗,没有ix的话,可以用在阿里云国内和香港之间的组网吗,落地用ss行不行
@syqman #5 组网核心不一样 这个是WireGuard 你可以试试 应该是没问题 因为我没有机器没办法测试
还在输出
点赞
@ois #1
傲盾不查wireguard的吧
一会儿试试,先收藏下