type
status
date
slug
summary
tags
category
icon
password
1、生成秘钥
2、准备配置文件、这一份配置文件只能连接tun0,不能访问内网设备。
3、启动
4、最终版,可以访问内网设备。
5、设置启动顺序,必须保证在sing-box启动有tun0之后再启动,否则会报错

新命令的解释

我们修改了 [Service] 部分,它做了什么?
  • ExecStart=: 第一行是空的,这是 systemd 的一个语法,用来清空原始的 ExecStart 命令,确保我们下面写的能完全覆盖它。
  • ExecStart=/bin/bash -c '...': 我们不再直接运行 wg-quick up,而是运行一小段 bash 脚本。
  • while ! ip link show tun0 &>/dev/null; do sleep 0.5; done;: 这是核心的等待循环。
    • ip link show tun0: 检查是否存在名为 tun0 的设备。
    • ! ... &>/dev/null: !表示“如果上一条命令失败”(即找不到tun0),则条件为真。&>/dev/null 是为了不让屏幕上出现“device not found”的错误信息,保持日志干净。
    • do sleep 0.5; done: 如果找不到 tun0,就暂停0.5秒,然后再次循环检查。
  • /usr/bin/wg-quick up %i: 一旦上面的循环结束(意味着 tun0 已经存在),才执行我们真正的启动命令。
这个修改让您的WireGuard服务变得非常“耐心”和“智能”,它会一直等到 tun0 万事俱备,才开始自己的工作。

WireGuard 策略分流规则详解

第1条:允许流量转发

Bash
iptables -A FORWARD -i %i -j ACCEPT
  • 一句话解释:开启“入口”许可,允许来自手机(WireGuard客户端)的数据包进入服务器的转发通道。
  • 详细分解
    • iptables -A FORWARD: 在 iptablesFORWARD 链(专门负责数据转发)中,追加(A)一条规则。
    • i %i: i 指的是输入接口(input interface),%i 会被 wg-quick 自动替换为 wg0。所以这条规则只对从 wg0 接口进来的数据包生效。
    • j ACCEPT: 对匹配的数据包执行 ACCEPT(接受)操作。
  • 在整个方案中的作用:这是第一道安检,如果没有它,基于防火墙的默认策略,所有需要转发的数据包都可能被丢弃。

第2条:给流量打上标记

Bash
iptables -t mangle -A PREROUTING -i %i -j MARK --set-mark 1
  • 一句话解释:给所有从手机进来的数据包“盖个章”,打上一个独一无二的记号 1
  • 详细分解
    • t mangle: t 指的是操作 mangle 表,这是一个专门用来修改数据包元数据(比如标记)的表。
    • A PREROUTING: 在 PREROUTING 链中追加规则。这个阶段非常早,在系统决定如何路由这个包之前。
    • j MARK --set-mark 1: 对匹配的数据包执行 MARK(标记)操作,并把标记值设置为 1
  • 在整个方案中的作用:这是实现策略路由的核心识别步骤。通过这个标记,我们就能在后续的规则中准确地识别出“哪些流量是来自WireGuard客户端的”,从而对它进行特殊处理。

第3条:制定策略路由规则

Bash
ip rule add fwmark 1 table 100
  • 一句话解释:制定一条交通总规则:所有“盖了章”(标记为1)的数据包,都必须去查阅 100 号“特殊地图”(路由表)。
  • 详细分解
    • ip rule add: 添加一条新的路由策略规则。
    • fwmark 1: 匹配条件是防火墙标记(fwmark)为 1 的数据包。
    • table 100: 执行的动作是使用 100 号路由表来决定数据包的下一跳。
  • 在整个方案中的作用:这是承上启下的一步,它将上一步的“识别”和下一步的“寻路”连接了起来。它告诉系统,不要用默认的 main 路由表,而是用我们专门为WireGuard流量准备的 100 号表。

第4条:在特殊地图上标出内网的路

Bash
ip route add 192.168.2.0/24 dev ens18 table 100
  • 一句话解释:在 100 号“特殊地图”上,画出通往您家内网的路,并标明要从 ens18 这个出口走。
  • 详细分解
    • ip route add: 添加一条路由。
    • 192.168.2.0/24: 目标地址是您的内网网段。
    • dev ens18: 通过 ens18 这个物理网卡设备出去。
    • table 100: 将这条路由规则添加到 100 号路由表中。
  • 在整个方案中的作用:这是我们最终修复的关键!它确保了即使使用了 100 号特殊路由表,去往内网的流量也能被正确地指向物理网卡 ens18

第5条:在特殊地图上标出外网的路

Bash
ip route add default dev tun0 table 100
  • 一句话解释:在 100 号“特殊地图”上,画出通往所有其他地方(即外网)的路,并标明要从 tun0 这个出口走。
  • 详细分解
    • ip route add default: 添加一条默认路由,这是一个“捕获所有”的规则。
    • dev tun0: 通过 tun0 这个 sing-box 隧道设备出去。
    • table 100: 同样,将这条规则添加到 100 号路由表中。
  • 在整个方案中的作用:实现科学上网。当数据包的目的地不是内网时,它就会匹配这条默认规则,被发送到 tun0 接口。

第6条:办理内网通行证 (NAT)

Bash
iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE
  • 一句话解释:办理“内网通行证”,让从 ens18 出去访问内网的数据包,看起来像是服务器自己发出的。
  • 详细分解
    • t nat: 操作 nat(网络地址转换)表。
    • A POSTROUTING: 在 POSTROUTING 链追加规则,这是数据包离开本机前的最后一站。
    • o ens18: o 指的是输出接口(output interface),匹配从 ens18 出去的数据包。
    • j MASQUERADE: 执行 MASQUERADE(地址伪装)操作,将数据包的源IP(手机的 192.168.30.x)改成 ens18 接口的IP。
  • 在整个方案中的作用:解决内网回程问题。内网设备收到包后,会回复给服务器的IP,而不是不认识的WireGuard客户端IP,从而保证通信畅通。

第7条:办理出国护照 (NAT)

Bash
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
  • 一句话解释:办理“出国护照”,让从 tun0 出去访问外网的数据包,看起来也像是服务器发出的。
  • 详细分解:同上一条,只是作用于 tun0 接口。
  • 在整个方案中的作用:让科学上网的流量能被正确地路由和接收。

总的来说,这个流程就是:允许进入 -> 打上标记 -> 根据标记查阅特殊地图 -> 地图上有两条路(一条通往内网,一条通往外网)-> 在出大门(网卡)前根据不同的出口办好相应的通行证(NAT)。
openwrt+WireGuard + sing-box透明代理方案Sing-box + Caddy 单端口伪装部署笔记
Loading...