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: 在iptables的FORWARD链(专门负责数据转发)中,追加(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)。
- 作者:老白
- 链接:https://preston.us.kg/article/example-12
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

