WireGuard安装与配置(linux)

wireguard-linux配置

WireGuard安装与配置(基于Ubuntu20.04)

这是一篇有关wg的安装和配置。,已经写好的配置文件Index of /wireguard

安装(apt安装)我来自未来

首先直接用apt包对其进行安装

1
sudo apt-get install wireguard

设置IPV6和IPV4转发

修改/etc/sysctl.conf,加入以下设置

1
2
3
4
5
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
net.ipv4.ip_forward=1 # IPv4 的网络转发设置
net.ipv6.conf.all.forwarding=1 # IPv6 的网络转发设置
启动以下命令,使得上面的转发生效
1
sysctl -p

生成wireguard的配置文件

生成配置文件,主要涉及到两个,一个是server,一个是client,当然,实际上wireguard没有故意去区分,所以,直接给出成功的wireguard配置文件参考模仿

server端设置

首先,明确server只需要配置/etc/wireguard/wg0.conf,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
[Interface]
Address = 192.168.54.1/32, fd23:23:23::2/64
ListenPort = 53
PrivateKey = yLT6hNoogQ4BMGS/TDT2cGqSXdkuf2MpqFRXczc8oXw=
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o enp67s0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o enp67s0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o enp67s0 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o enp67s0 -j MASQUERADE

[Peer]
# peer_yzmin
PublicKey = U7AReWrgC+ONXLzuh7wgCArXyJ7IGj3/KX/Z+QWnxHY=
PresharedKey = LBrEthBo4GySJzr9p/KdtGJPnskEmc43FNvXaCEml4s=
AllowedIPs = 192.168.54.3/32,fd23:23:23::4/64

Interface设置了server在虚拟组网中的ip,需要设置ipv4地址,ipv6地址,监听端口53(DNS端口,可以帮助绕过认证),公私密钥需要自己生成,建议使用linuxserver/wireguard生成,然后直接复制conf文件夹的相关配置即可,其linuxserver/wireguard的使用方法(docker-compose.yaml)如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: '3'
services:
wireguard:
image: linuxserver/wireguard
container_name: wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1011
- PGID=1001
- TZ=Asia/Shanghai
- SERVERURL=lab-v4.ninglang.fun
- SERVERPORT=53 #optional
- PEERS=oneplus,yzmin,ninglang,tabs7,hk,visitor1, #optional
- PEERDNS=8.8.8.8
- INTERNAL_SUBNET=192.168.54.0/24 #optional
- ALLOWEDIPS=0.0.0.0/0,::/0 #optional
ports:
- "53:51820/udp"
volumes:
- ./config:/config
- ./modules:/lib/modules
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped

除此之外iptables -t nat -A POSTROUTING -o enp67s0 -j MASQUERADEenp67s0是服务器的网卡,需要通过ip route命令来判断和识别,找出出口网卡

Client配置

客户端的配置相对比较简单,配置文件如下

1
2
3
4
5
6
7
8
9
10
11
[Interface]
PrivateKey = yHFElIC927hOYA8cKVx9SmumTZSUbVXvX1xToIwITHQ=
ListenPort = 51820
Address = 192.168.54.3/32, fd23:23:23::4/64
DNS = 114.114.114.114, 2400:3200::1

[Peer]
PublicKey = nqUnrvuMl9NsugP4JbNdiw3o9Fgsr7eSrnEGg0Yhtzk=
PresharedKey = LBrEthBo4GySJzr9p/KdtGJPnskEmc43FNvXaCEml4s=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = lab-v4.ninglang.fun:53
主要是利用上面的docker容器生成之后就可以了,但是有一些需要注意 1. Address需要加入手动分配的v6部分 2. DNS一定要要配置 3. AllowedIPs建议全部放行(即为/0) 3. server端的设置中千万不要设置AllowedIPs=0.0.0.0/0!!!!否则Ubuntu自己的网络流量也无法出去(直接流向了wg0,形成环路)

docker对ipv6的影响

对于docker而言,docker的网络改变将会直接改变iptables,因此,当设备无法访问ipv6时一定要注意查看是否是docker-user导致的

输入

1
ip6tables -t filter -L -n

查看FORWARD CHAIN,如果这个CHAIN中DOCKER-USER排在第一,则会导致ipv6失败,因此,需要添加一句来使得DOCKER-USER的降低到第二句即可

1
ip6tables -t filter -I FORWARD -j ACCEPT

特殊设备下的ipv6转发设置

这里主要描述的arm设备的ipv6访问情况,以hinas为例,我发现其和实验室服务器(x64)有所不同,主要体现在以下几点

  1. hinas的ipv6怎么开?

参考网上,最重要的一点就是修改/etc/network/interfaces.d/eth0,在其里面添加一句

1
iface eth0 inet6 dhcp

并且修改/etc/sysctl.conf,在其中添加net.ipv6.conf.all.disable_ipv6 = 0.除此之外,需要开启ipv6的转发,而无需开启ipv4的转发,这是因为有关ipv4和ipv6的设置在/proc/sys/net/文件夹中,其具体细节如下图。

因此,对于ipv4的ip_forwading功能而言是一直启动的,而对于ipv6而言则要分很多网卡来确定

首先对于ipv6的conf中可以看出,有all,eth0wg0,故如果要设置ipv6全部转发,则可以设置ipv6全部转发,但是对于eth0而言,一般全部转发会影响到物理机自身的ipv6网络,因此,对于这种情况下,给出了eth0之外所有的网口设置转发是最好的选择,于是设置如下代码

修改文件/etc/sysctl.conf

1
2
net.ipv6.conf.all.forwarding = 1   #ipv6全部转发
net.ipv6.conf.eth0.forwarding = 0 #修改eth0为不转发流量

ip6tables更新设置

由上面的内容可以知道,每次要使得ip6tables能够正常转发,必须使用

1
ip6tables -t filter -I FORWARD -j ACCEPT

经过测试原有的

1
ip6tables -A FORWARD -i %i -j ACCEPT

经过系统参数替换之后变为如下情况

1
ip6tables -A FORWARD -i wg0 -j ACCEPT

但是这条命令并没有作用,因此在原有的配置中使用ip6tables -t filter -A FORWARD -j ACCEPT,代替ip6tables -A FORWARD -i %i -j ACCEPT,除此之外,对于删除wg0网卡时,使用ip6tables -t filter -D FORWARD -j ACCEPT代替ip6tables -D FORWARD -i %i -j ACCEPT

对于新朋友(YSU可用)

建议直接采用openvpn,登录之后共享实验室的流量账号,部分请参考

你好

Wireguard windwos使用

有时候我们会在特定的机器下安装wireguard后,并不想被随意的更改(不被容易发现),就需要让wireguard以windows服务的形式去运行。正常安装wireguard windows版本,然后不要打开Wireguard UI。我们用命令行形式去安装通道服务。不过你得提前准备好配置文件,复制到磁盘上某个位置。安装Tunnel Service服务命令如下:

1
wireguard /installtunnelservice D:\wg\hinas.conf

开机自启动

  1. 配置文件

对于hinas.conf,配置如下

1
2
3
4
5
6
7
8
9
10
11
[Interface]
PrivateKey = CFI82HDnrAAJtBRfaHu9JntX9AQoy+ezyDtlBFFSIVw=
ListenPort = 51820
Address = 192.168.54.3/32, fd23:23:23::3/128
DNS = 8.8.8.8

[Peer]
PublicKey = nqUnrvuMl9NsugP4JbNdiw3o9Fgsr7eSrnEGg0Yhtzk=
PresharedKey = LBrEthBo4GySJzr9p/KdtGJPnskEmc43FNvXaCEml4s=
AllowedIPs = 10.17.182.214/32, 192.168.54.1/24
Endpoint = 10.17.182.109:53

为什么在EndPoint参数这里没有使用域名呢,是因为如果使用域名的话,这个无法直接DNS解析出来,导致连接失败,这个可以通过wireguard的日志看出,所以这里建议直接使用IP.

  1. 设置任务计划程序

打开任务计划程序,新建一个任务,在操作中设置,设置脚本程序为wireguard的地址

1
"C:\Program Files\WireGuard\wireguard.exe"

在参数中设置开启服务和配置文件

1
/tunnelservice "D:\wg\hinas.conf"

常规中设置如下图

计划任务设置
计划任务设置

开机自启动设置记录:2025-11-14-14-42

这次使用设置的方法如下:

  • 直接在wireguard里面设置连接(选择v6,我也不知道为什么不支持v4)
  • 找到服务中的wireguardmanger个wireguardTunnel两个服务,设置方式如下图,两个都要设置:发现这样就可以正常工作了
image-20251114144541812
image-20251114144541812

Wirguard设置问题1

问题

在使用wireguard实现学校B和家A里的组网的时候,我发现我无法通过wg访问家里ip192.168.1.0/24的部分端口,这个问题很奇怪,也很隐蔽,因为只有部分ip会出现这个情况,而不是所有1.0/24ip,经过排查,B访问.25服务器时确实实现了正常路由,192.168.1.1里面也设置了静态路由,那么之所以出现这个问题,是因为家庭的linux服务器没有设置如下规则

1
iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE

是 Linux 系统中用于配置 NAT(网络地址转换) 的一条 iptables 规则,它的作用是让从 ens3 接口发出的数据包自动进行 地址伪装(Masquerading) 。

1
2
3
[WireGuard客户端]
↓ (192.168.54.x)
[wg-school 接口] → [Linux 路由器] → [ens3 接口] → 局域网(192.168.1.0/24)

当你在这台“Linux 路由器”上添加了这条规则后:

  • 来自 WireGuard 客户端(如 192.168.54.10)的请求被转发到局域网设备(如 192.168.1.25)
  • 局域网设备响应时会把回复发给路由器(因为静态路由或默认网关指向它)
  • 路由器收到响应后,需要将源地址(比如 192.168.1.25)返回给 WireGuard 客户端(192.168.54.10)
  • 因为 WireGuard 客户端不能直接理解 192.168.1.x 的地址,所以路由器会对这个回程流量做 MASQUERADE:
    • 把源地址改成自己的 ens3 接口的 IP(比如 192.168.1.16)
    • 确保响应能正确回到 WireGuard 客户端
image-20250513214334590
image-20250513214334590

对网络进行抓包如上图,这是通过192.168.54.1对192.168.1.25:80进行请求,可以查看,现在的流量不在识别为192.168.54.1,而是直接转发给192.168.1.16

解决方案

在配置文件中加入如下命令,这部分放在Interface下:

1
2
3
4
5
6
7
[Interface]
Address = 192.168.54.17/32, fd23:23:23::17/128
PrivateKey = ##
DNS = 114.114.114.114, 2400:3200::1
MTU = 1420
PostUp = iptables -w -A FORWARD -i %i -j ACCEPT; iptables -w -A FORWARD -o %i -j ACCEPT; iptables -w -t nat -A POSTROUTING -o ens3 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o ens3 -j MASQUERADE;
PostDown = iptables -w -D FORWARD -i %i -j ACCEPT; iptables -w -D FORWARD -o %i -j ACCEPT; iptables -w -t nat -D POSTROUTING -o ens3 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o ens3 -j MASQUERADE;

针对Tailscale和Wg联合的方式实现

由于学校的v6消失了,所以从家到学校这块不能使用v6,只能是TS组网了,现在拓扑如下 image-20251128160403855

在这种拓扑下,原来的wg的配置如下

1
2
3
4
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; 

PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;

这种方式会把原来的192.168.1.1的流量包丢到eth0,但是这个端口无法访问,所以应该将192.168.1.1和192.168.10.1丢到Tailscale0网口,故应该进行如下的一个修改,其他的不变,因为其他的还要访问外网,ip6tables也不变。测试可行

1
2
3
PostUp = iptables -A FORWARD -i %i -o tailscale0 -d 192.168.1.0/24 -j ACCEPT; iptables -A FORWARD -i %i -o tailscale0 -d 192.168.10.0/24 -j ACCEPT; iptables -A FORWARD -i tailscale0 -s 192.168.1.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -A FORWARD -i tailscale0 -s 192.168.10.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -A POSTROUTING -s 192.168.54.0/24 -d 192.168.1.0/24 -o tailscale0 -j MASQUERADE; iptables -t nat -A POSTROUTING -s 192.168.54.0/24 -d 192.168.10.0/24 -o tailscale0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o tailscale0 -j MASQUERADE

PostDown = iptables -D FORWARD -i %i -o tailscale0 -d 192.168.1.0/24 -j ACCEPT; iptables -D FORWARD -i %i -o tailscale0 -d 192.168.10.0/24 -j ACCEPT; iptables -D FORWARD -i tailscale0 -s 192.168.1.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -D FORWARD -i tailscale0 -s 192.168.10.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -D POSTROUTING -s 192.168.54.0/24 -d 192.168.1.0/24 -o tailscale0 -j MASQUERADE; iptables -t nat -D POSTROUTING -s 192.168.54.0/24 -d 192.168.10.0/24 -o tailscale0 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o tailscale0 -j MASQUERADE

可选(关闭NetworkManger对Wg的管理)

创建:

1
sudo nano /etc/NetworkManager/conf.d/10-ignore-wg0.conf

写入

1
2
[keyfile]
unmanaged-devices=interface-name:wg0

保存之后退出:

1
sudo systemctl restart NetworkManager

具体原理图

考虑到现在组网方案已经比较复杂,由于发现192.168.1.1无法访问edunetwork,所以继续修改如下

EcoPaste_fsN6VCkzFAzoR_CF2j-ev
EcoPaste_fsN6VCkzFAzoR_CF2j-ev

这次的主要改变在A端,主要是对A端的访问B网络做了调整,之前的wg可以访问B端,但是我这次将B的allowip修改为只允许54.17(我懒得改回来了)所以我决定在A端修改这个,使得对所有A→B的流量实现一个伪装,假装都是192.168.54.17访问的。

多跳组网实现

image-20251128220238080
image-20251128220238080

首先,对于这种模式下,如果Peer1是Linux,那么开启转发,使用和Server一样PostDown的配置应该可以work,但是如果Peer1是windows,那么配置如下

Peer1的WG设置,公钥在Windows最上面,这个需要填到Peer2和Server的Peer栏中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Interface]
PrivateKey =
ListenPort = 53
Address = 192.168.54.18/32, 192.168.64.18/32, fd23:23:23::18/128
DNS = 114.114.114.114, 2400:3200::1

[Peer]
PublicKey = 来自Server
PresharedKey =
AllowedIPs = 192.168.54.18/24, 192.168.1.18/24, 192.168.10.18/24
Endpoint = hinas-v4.ninglang.top:53
PersistentKeepalive = 16

[Peer]
PublicKey = 来自Peer2
AllowedIPs = 192.168.64.20/32
PersistentKeepalive = 16
# 可以不用EndPoint,因为这个是Server

对于Peer2来说,应该这样填写,这里就不需要Server的了,主要原因是Server不是连不上嘛,干脆直接连接Peer1

1
2
3
4
5
6
7
8
9
10
11
12
[Interface]
PrivateKey =
ListenPort = 53
Address = 192.168.64.20/32, fd23:23:23::20/128
DNS = 114.114.114.114, 2400:3200::1

[Peer]
PublicKey = Peer1的公钥
AllowedIPs = ::/1, 8000::/1, 0.0.0.0/1, 128.0.0.0/1
Endpoint = 10.17.182.214:53
PersistentKeepalive = 16

除此之外,如果是Linux,则需要再Peer1开启转发,如果在Windwos下,则需要开启IP转发

1
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v IPEnableRouter /t REG_DWORD /d 1 /f

然后重启,应该可以从Server ping通192.168.64.20了

✔ 开启 IP 转发 ✔ 添加路由 ✔ WireGuard 本身已经连向 Server 与 Peer2

TailScale子网穿透

安装软件登录

在子网的一台机器中输入

1
tailscale up --advertise-routes=192.168.10.0/24,192.168.1.0/24
image-20250812163808522
image-20250812163808522

然后再选择允许即可

image-20250812163855408
image-20250812163855408

WIRGUARD其他配置

设置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
PostUp = iptables -w -A FORWARD -i %i -j ACCEPT; iptables -w -A FORWARD -o %i -j ACCEPT; iptables -w -t nat -A POSTROUTING -o ens3 -j MASQUERADE; iptables -w -t nat -A POSTROUTING -o %i -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o ens3 -j MASQUERADE;
PostDown = iptables -w -D FORWARD -i %i -j ACCEPT; iptables -w -D FORWARD -o %i -j ACCEPT; iptables -w -t nat -D POSTROUTING -o ens3 -j MASQUERADE; iptables -w -t nat -D POSTROUTING -o %i -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o ens3 -j MASQUERADE;




PostUp = \
# 启用 IPv4 包转发:
# 允许从 WireGuard 接口 (%i) 进入的流量进行转发
iptables -w -A FORWARD -i %i -j ACCEPT; \
# 允许从 WireGuard 接口 (%i) 出去的流量进行转发
iptables -w -A FORWARD -o %i -j ACCEPT; \
# 对从 WireGuard 隧道发出并通过 ens3 物理接口离开的 IPv4 流量执行网络地址转换 (NAT/伪装),
# 使其看起来像是源自 ens3 接口,而不是 WireGuard 客户端的 IP。
iptables -w -t nat -A POSTROUTING -o ens3 -j MASQUERADE; \
# 针对从 WireGuard 接口 (%i) 离开的 IPv4 流量也进行 NAT/伪装。
# 这通常用于当 WireGuard 接口本身需要将流量路由到其他网络,且自身作为网关时。
# 但在典型的WireGuard服务器设置中,流量通常通过公共接口(如ens3)出去,此规则可能与前一条有重叠或不同目的,具体取决于网络拓扑。
iptables -w -t nat -A POSTROUTING -o %i -j MASQUERADE; \
\
# 启用 IPv6 包转发:
# 允许从 WireGuard 接口 (%i) 进入的 IPv6 流量进行转发
ip6tables -A FORWARD -i %i -j ACCEPT; \
# 允许从 WireGuard 接口 (%i) 出去的 IPv6 流量进行转发
ip6tables -A FORWARD -o %i -j ACCEPT; \
# 对从 WireGuard 隧道发出并通过 ens3 物理接口离开的 IPv6 流量执行网络地址转换 (NAT/伪装)。
ip6tables -t nat -A POSTROUTING -o ens3 -j MASQUERADE;

PostDown = \
# 禁用 IPv4 包转发规则:
# 删除允许从 WireGuard 接口进入的 IPv4 转发规则
iptables -w -D FORWARD -i %i -j ACCEPT; \
# 删除允许从 WireGuard 接口出去的 IPv4 转发规则
iptables -w -D FORWARD -o %i -j ACCEPT; \
# 删除 IPv4 NAT/伪装规则 (针对 ens3 接口)
iptables -w -t nat -D POSTROUTING -o ens3 -j MASQUERADE; \
# 删除 IPv4 NAT/伪装规则 (针对 WireGuard 接口 %i)
iptables -w -t nat -D POSTROUTING -o %i -j MASQUERADE; \
\
# 禁用 IPv6 包转发规则:
# 删除允许从 WireGuard 接口进入的 IPv6 转发规则
ip6tables -D FORWARD -i %i -j ACCEPT; \
# 删除允许从 WireGuard 接口出去的 IPv6 转发规则
ip6tables -D FORWARD -o %i -j ACCEPT; \
# 删除 IPv6 NAT/伪装规则
ip6tables -t nat -D POSTROUTING -o ens3 -j MASQUERADE;








PostUp = \
# ================================================================
# IPv4 转发规则 (PostUp)
# ================================================================
# 允许从 WireGuard 接口 (%i) 进入,并发送到 Tailscale 接口 (tailscale0),目标为 192.168.1.0/24 子网的 IPv4 流量。
# 这使得 WireGuard 客户端可以通过 Tailscale 访问 192.168.1.0/24。
iptables -A FORWARD -i %i -o tailscale0 -d 192.168.1.0/24 -j ACCEPT; \
# 允许从 WireGuard 接口 (%i) 进入,并发送到 Tailscale 接口 (tailscale0),目标为 192.168.10.0/24 子网的 IPv4 流量。
# 这使得 WireGuard 客户端可以通过 Tailscale 访问 192.168.10.0/24。
iptables -A FORWARD -i %i -o tailscale0 -d 192.168.10.0/24 -j ACCEPT; \
\
# 允许从 Tailscale 接口 (tailscale0) 进入,源自 192.168.1.0/24 子网,并发送到 WireGuard 接口 (%i) 的 IPv4 流量。
# 仅允许 RELATED,ESTABLISHED 状态的连接,确保返回流量正确通过。
iptables -A FORWARD -i tailscale0 -s 192.168.1.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; \
# 允许从 Tailscale 接口 (tailscale0) 进入,源自 192.168.10.0/24 子网,并发送到 WireGuard 接口 (%i) 的 IPv4 流量。
# 仅允许 RELATED,ESTABLISHED 状态的连接。
iptables -A FORWARD -i tailscale0 -s 192.168.10.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; \
\
# ================================================================
# IPv4 NAT (MASQUERADE) 规则 (PostUp)
# ================================================================
# 对源自 192.168.54.0/24 子网 (可能是 WireGuard 客户端的 IP 范围),目标为 192.168.1.0/24 子网,
# 并通过 Tailscale 接口 (tailscale0) 出去的 IPv4 流量执行 NAT (伪装)。
# 这使得 WireGuard 客户端访问 192.168.1.0/24 时,流量看起来像是源自 Tailscale 接口的 IP。
iptables -t nat -A POSTROUTING -s 192.168.54.0/24 -d 192.168.1.0/24 -o tailscale0 -j MASQUERADE; \
# 对源自 192.168.54.0/24 子网,目标为 192.168.10.0/24 子网,
# 并通过 Tailscale 接口 (tailscale0) 出去的 IPv4 流量执行 NAT (伪装)。
# 这使得 WireGuard 客户端访问 192.168.10.0/24 时,流量看起来像是源自 Tailscale 接口的 IP。
iptables -t nat -A POSTROUTING -s 192.168.54.0/24 -d 192.168.10.0/24 -o tailscale0 -j MASQUERADE; \
\
# ================================================================
# IPv6 转发规则 (PostUp)
# ================================================================
# 允许从 WireGuard 接口 (%i) 进入的所有 IPv6 流量进行转发。
ip6tables -A FORWARD -i %i -j ACCEPT; \
# 允许发送到 WireGuard 接口 (%i) 的所有 IPv6 流量进行转发。
ip6tables -A FORWARD -o %i -j ACCEPT; \
\
# ================================================================
# IPv6 NAT (MASQUERADE) 规则 (PostUp)
# ================================================================
# 对通过 Tailscale 接口 (tailscale0) 出去的所有 IPv6 流量执行 NAT (伪装)。
# 这使得 WireGuard 客户端的 IPv6 流量通过 Tailscale 访问外部网络时,看起来像是源自 Tailscale 接口的 IPv6 地址。
ip6tables -t nat -A POSTROUTING -o tailscale0 -j MASQUERADE;

PostDown = \
# ================================================================
# IPv4 转发规则 (PostDown) - 删除与 PostUp 对应的规则
# ================================================================
# 删除允许从 WireGuard 到 Tailscale (目标 192.168.1.0/24) 的 IPv4 转发规则。
iptables -D FORWARD -i %i -o tailscale0 -d 192.168.1.0/24 -j ACCEPT; \
# 删除允许从 WireGuard 到 Tailscale (目标 192.168.10.0/24) 的 IPv4 转发规则。
iptables -D FORWARD -i %i -o tailscale0 -d 192.168.10.0/24 -j ACCEPT; \
\
# 删除允许从 Tailscale (源 192.168.1.0/24) 返回 WireGuard 的 RELATED,ESTABLISHED 状态的 IPv4 转发规则。
iptables -D FORWARD -i tailscale0 -s 192.168.1.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; \
# 删除允许从 Tailscale (源 192.168.10.0/24) 返回 WireGuard 的 RELATED,ESTABLISHED 状态的 IPv4 转发规则。
iptables -D FORWARD -i tailscale0 -s 192.168.10.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; \
\
# ================================================================
# IPv4 NAT (MASQUERADE) 规则 (PostDown) - 删除与 PostUp 对应的规则
# ================================================================
# 删除 WireGuard 客户端通过 Tailscale 访问 192.168.1.0/24 时的 IPv4 NAT 伪装规则。
iptables -t nat -D POSTROUTING -s 192.168.54.0/24 -d 192.168.1.0/24 -o tailscale0 -j MASQUERADE; \
# 删除 WireGuard 客户端通过 Tailscale 访问 192.168.10.0/24 时的 IPv4 NAT 伪装规则。
iptables -t nat -D POSTROUTING -s 192.168.54.0/24 -d 192.168.10.0/24 -o tailscale0 -j MASQUERADE; \
\
# ================================================================
# IPv6 转发规则 (PostDown) - 删除与 PostUp 对应的规则
# ================================================================
# 删除允许从 WireGuard 接口进入的所有 IPv6 流量转发规则。
ip6tables -D FORWARD -i %i -j ACCEPT; \
# 删除允许发送到 WireGuard 接口的所有 IPv6 流量转发规则。
ip6tables -D FORWARD -o %i -j ACCEPT; \
\
# ================================================================
# IPv6 NAT (MASQUERADE) 规则 (PostDown) - 删除与 PostUp 对应的规则
# ================================================================
# 删除通过 Tailscale 接口出去的所有 IPv6 流量的 NAT 伪装规则。
ip6tables -t nat -D POSTROUTING -o tailscale0 -j MASQUERADE;





[Interface]
Address = 192.168.54.1/32, fe80::1111:211:22ff:fe33:4455/64
ListenPort = 53
PrivateKey = yLT6hNoogQ4BMGS/TDT2cGqSXdkuf2MpqFRXczc8oXw=
DNS= 114.114.114.114
PostUp = iptables -A FORWARD -i %i -o tailscale0 -d 192.168.1.0/24 -j ACCEPT; iptables -A FORWARD -i %i -o tailscale0 -d 192.168.10.0/24 -j ACCEPT; iptables -A FORWARD -i tailscale0 -s 192.168.1.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -A FORWARD -i tailscale0 -s 192.168.10.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -A POSTROUTING -s 192.168.54.0/24 -d 192.168.1.0/24 -o tailscale0 -j MASQUERADE; iptables -t nat -A POSTROUTING -s 192.168.54.0/24 -d 192.168.10.0/24 -o tailscale0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o tailscale0 -j MASQUERADE

PostDown = iptables -D FORWARD -i %i -o tailscale0 -d 192.168.1.0/24 -j ACCEPT; iptables -D FORWARD -i %i -o tailscale0 -d 192.168.10.0/24 -j ACCEPT; iptables -D FORWARD -i tailscale0 -s 192.168.1.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -D FORWARD -i tailscale0 -s 192.168.10.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -D POSTROUTING -s 192.168.54.0/24 -d 192.168.1.0/24 -o tailscale0 -j MASQUERADE; iptables -t nat -D POSTROUTING -s 192.168.54.0/24 -d 192.168.10.0/24 -o tailscale0 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o tailscale0 -j MASQUERADE




# B端设置

[Interface]
# WireGuard 接口的 IPv4 地址和子网掩码。
# 192.168.54.1/32 表示服务器在这个 WireGuard 隧道中的私有 IP 地址。
# fe80::1111:211:22ff:fe33:4455/64 是 WireGuard 接口的 IPv6 地址和子网掩码。
Address = 192.168.54.1/32, fe80::1111:211:22ff:fe33:4455/64
# WireGuard 监听的 UDP 端口。
ListenPort = 53
# WireGuard 客户端将使用的 DNS 服务器地址。
DNS= 114.114.114.114

# ======================================================================================================================
# PostUp 命令:在 WireGuard 接口启动后执行的命令。
# 这些命令主要用于设置防火墙规则,以便 WireGuard 客户端能够访问 Tailscale 网络。
# ======================================================================================================================
PostUp = \
# IPv4 转发规则:
# 允许从 WireGuard 接口 (%i) 进入,并发送到 Tailscale 接口 (tailscale0),目标为 192.168.1.0/24 子网的 IPv4 流量。
# 这使得 WireGuard 客户端可以通过 Tailscale 访问 192.168.1.0/24。
iptables -A FORWARD -i %i -o tailscale0 -d 192.168.1.0/24 -j ACCEPT; \
# 允许从 WireGuard 接口 (%i) 进入,并发送到 Tailscale 接口 (tailscale0),目标为 192.168.10.0/24 子网的 IPv4 流量。
# 这使得 WireGuard 客户端可以通过 Tailscale 访问 192.168.10.0/24。
iptables -A FORWARD -i %i -o tailscale0 -d 192.168.10.0/24 -j ACCEPT; \
\
# 允许从 Tailscale 接口 (tailscale0) 进入,源自 192.168.1.0/24 子网,并发送到 WireGuard 接口 (%i) 的 IPv4 流量。
# 仅允许 RELATED,ESTABLISHED 状态的连接,确保返回流量正确通过。
iptables -A FORWARD -i tailscale0 -s 192.168.1.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; \
# 允许从 Tailscale 接口 (tailscale0) 进入,源自 192.168.10.0/24 子网,并发送到 WireGuard 接口 (%i) 的 IPv4 流量。
# 仅允许 RELATED,ESTABLISHED 状态的连接。
iptables -A FORWARD -i tailscale0 -s 192.168.10.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; \
\
# IPv4 NAT (MASQUERADE) 规则:
# 对源自 192.168.54.0/24 子网 (WireGuard 客户端的 IP 范围),目标为 192.168.1.0/24 子网,
# 并通过 Tailscale 接口 (tailscale0) 出去的 IPv4 流量执行 NAT (伪装)。
# 这使得 WireGuard 客户端访问 192.168.1.0/24 时,流量看起来像是源自 Tailscale 接口的 IP。
iptables -t nat -A POSTROUTING -s 192.168.54.0/24 -d 192.168.1.0/24 -o tailscale0 -j MASQUERADE; \
# 对源自 192.168.54.0/24 子网,目标为 192.168.10.0/24 子网,
# 并通过 Tailscale 接口 (tailscale0) 出去的 IPv4 流量执行 NAT (伪装)。
# 这使得 WireGuard 客户端访问 192.168.10.0/24 时,流量看起来像是源自 Tailscale 接口的 IP。
iptables -t nat -A POSTROUTING -s 192.168.54.0/24 -d 192.168.10.0/24 -o tailscale0 -j MASQUERADE; \
\
# IPv6 转发规则:
# 允许从 WireGuard 接口 (%i) 进入的所有 IPv6 流量进行转发。
ip6tables -A FORWARD -i %i -j ACCEPT; \
# 允许发送到 WireGuard 接口 (%i) 的所有 IPv6 流量进行转发。
ip6tables -A FORWARD -o %i -j ACCEPT; \
\
# IPv6 NAT (MASQUERADE) 规则:
# 对通过 Tailscale 接口 (tailscale0) 出去的所有 IPv6 流量执行 NAT (伪装)。
# 这使得 WireGuard 客户端的 IPv6 流量通过 Tailscale 访问外部网络时,看起来像是源自 Tailscale 接口的 IPv6 地址。
ip6tables -t nat -A POSTROUTING -o tailscale0 -j MASQUERADE

# ======================================================================================================================
# PostDown 命令:在 WireGuard 接口关闭后执行的命令。
# 这些命令用于删除 PostUp 中添加的防火墙规则,以清理环境。
# ======================================================================================================================
PostDown = \
# IPv4 转发规则 (删除):
# 删除允许从 WireGuard 到 Tailscale (目标 192.168.1.0/24) 的 IPv4 转发规则。
iptables -D FORWARD -i %i -o tailscale0 -d 192.168.1.0/24 -j ACCEPT; \
# 删除允许从 WireGuard 到 Tailscale (目标 192.168.10.0/24) 的 IPv4 转发规则。
iptables -D FORWARD -i %i -o tailscale0 -d 192.168.10.0/24 -j ACCEPT; \
\
# 删除允许从 Tailscale (源 192.168.1.0/24) 返回 WireGuard 的 RELATED,ESTABLISHED 状态的 IPv4 转发规则。
iptables -D FORWARD -i tailscale0 -s 192.168.1.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; \
# 删除允许从 Tailscale (源 192.168.10.0/24) 返回 WireGuard 的 RELATED,ESTABLISHED 状态的 IPv4 转发规则。
iptables -D FORWARD -i tailscale0 -s 192.168.10.0/24 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; \
\
# IPv4 NAT (MASQUERADE) 规则 (删除):
# 删除 WireGuard 客户端通过 Tailscale 访问 192.168.1.0/24 时的 IPv4 NAT 伪装规则。
iptables -t nat -D POSTROUTING -s 192.168.54.0/24 -d 192.168.1.0/24 -o tailscale0 -j MASQUERADE; \
# 删除 WireGuard 客户端通过 Tailscale 访问 192.168.10.0/24 时的 IPv4 NAT 伪装规则。
iptables -t nat -D POSTROUTING -s 192.168.54.0/24 -d 192.168.10.0/24 -o tailscale0 -j MASQUERADE; \
\
# IPv6 转发规则 (删除):
# 删除允许从 WireGuard 接口进入的所有 IPv6 流量转发规则。
ip6tables -D FORWARD -i %i -j ACCEPT; \
# 删除允许发送到 WireGuard 接口的所有 IPv6 流量转发规则。
ip6tables -D FORWARD -o %i -j ACCEPT; \
\
# IPv6 NAT (MASQUERADE) 规则 (删除):
# 删除通过 Tailscale 接口出去的所有 IPv6 流量的 NAT 伪装规则。
ip6tables -t nat -D POSTROUTING -o tailscale0 -j MASQUERADE