WireGuard 详细说明使用和配置
一、快速开始
1. 安装
WireGuard 安装
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i wg0 -o wg0 -m conntrack --ctstate NEW -j ACCEPT iptables -t nat -A POSTROUTING -s 192.168.1.1/24 -o eth0 -j MASQUERADE
注意:
wg0:虚拟网卡为您定义
192.168.1.1: 为你的虚拟IP地址段
eth0:物理网卡
2.编制配置文件
配置文件可以放在任何路径下,但必须引用绝对路径。默认路径是
/etc/wireguard/wg0.conf
生成秘钥
#生成私钥 wg genkey > example.key # 生成公钥 wg pubkey < example.key > example.key.pub
启动与停止
使用 wg-quick 快速启动或停止
# wg-quick up wg0 wg-quick up /full/path/to/wg0.conf # wg-quick down wg0 wg-quick down /full/path/to/wg0.conf
添加/删除 操作命令
# 注册/注销 VPN 网络接口 ip link add dev wg0 type wireguard ip link delete dev wg0 # 启动/停止 VPN 网络接口 ip link set wg0 up ip link set wg0 down # 注册/注销 本地 VPN 地址 ip address add dev wg0 192.0.2.3/32 ip address delete dev wg0 192.0.2.3/32 # 添加/删除 VPN 路由 ip route add 192.0.2.3/32 dev wg0 ip route delete 192.0.2.3/32 dev wg0
开机自启
系统重启后,
WireGuard创建的网卡设备将丢失,脚本将自动化
systemctl enable wg-quick@wg0
配置热重载
wg-quick重载相关指令没有提供,但提供了
strip指令,可以 conf 文件转换为 wg 能够识别指令的格式
# 实现热重载 wg syncconf wg0 <(wg-quick strip wg0)
查看信息
查看接口信息
# 查看系统 VPN 接口信息 ip link show wg0 # 查看 VPN 接口详细信息 wg show all wg show wg0
查看地址信息
# 查看 VPN 接口地址 ip address show wg0
路由
# 查看系统路由表 $ ip route show table main $ ip route show table local # 获取到特定 IP 的路由 $ ip route get 192.0.2.3
二、配置详解
WireGuard 使用 INI 语法作为其配置文件格式。
配置文件可以放在任何路径下,但必须引用绝对路径。默认路径是
/etc/wireguard/wg0.conf。
配置文件的命名形式必须是
${WireGuard 接口名称}.conf。通常情况下 WireGuard 接口名称以
wg并从0开始编号,但只要符合正则表达式,也可以使用其他名称^[a-zA-Z0-9_= .-]{1,15}$就行。
可选择使用
wg手动配置命令 VPN,但一般建议使用wg-quick,通过配置文件管理配置,提供了更强大、更友好的配置体验。
[Interface]
# Name = node1.example.tld Address = 192.0.2.3/32 ListenPort = 51820 PrivateKey = localPrivateKeyAbcAbcAbc= DNS = 1.1.1.1
,8.8.8.8 Table = 12345 MTU = 1500 PreUp = /bin/example arg1 arg2 %i PostUp = /bin/example arg1 arg2 %i PreDown = /bin/example arg1 arg2 %i PostDown = /bin/example arg1 arg2 %i
[Peer
]
# Name = node2-node.example.tld AllowedIPs = 192.0.2.1/24 Endpoint = node1.example.tld
:
51820 PublicKey = remotePublicKeyAbcAbcAbc= PersistentKeepalive = 25
[Interface]
定义本地VPN配置, 示例:
[Interface]
# Name = phone.example-vpn.dev
Address = 192.0.2.5/32
PrivateKey = <private key for phone.example-vpn.dev>
[Interface]
# Name = public-server1.example-vpn.tld
Address = 192.0.2.1/24
ListenPort = 51820
PrivateKey = <private key for public-server1.example-vpn.tld>
DNS = 1.1.1.1
# Name
这是
INI语法中的标准注释,用于展示该配置部分属于哪个节点。这部分配置会被 WireGuard 完全忽略,对 VPN 的行为没有任何影响。
Address
为本机设置vpn私有地址(段),不同peer节点,可以设置不同段
定义本地节点应该对哪个地址范围进行路由。
如果是常规的客户端,则将其设置为节点本身的单个 IP(使用 CIDR 指定,例如 192.0.2.3/32);
如果是中继服务器,则将其设置为可路由的子网范围
- 常规客户端,只路由自身的流量:
Address = 192.0.2.3/32 - 中继服务器,可以将流量转发到其他对等节点(peer):
Address = 192.0.2.1/24 - 也可以指定多个子网或 IPv6 子网:
Address = 192.0.2.1/24,2001:DB8::/64
ListenPort
当本地节点是中继服务器时,需要通过该参数指定端口来监听传入 VPN 连接,默认端口号是
51820。常规客户端不需要此选项。
PrivateKey
本地节点的私钥,所有节点(包括中继服务器)都必须设置。不可与其他服务器共用。
私钥可通过命令
wg genkey > example.key来生成
DNS
通过 DHCP 向客户端宣告 DNS 服务器。
客户端将会使用这里指定的 DNS 服务器来处理 VPN 子网中的 DNS 请求,但也可以在系统中覆盖此选项。例如:
- 如果不配置则使用系统默认 DNS
- 可以指定单个 DNS:
DNS = 1.1.1.1 - 也可以指定多个 DNS:
DNS = 1.1.1.1,8.8.8.8
Table
定义 VPN 子网使用的路由表,默认不需要设置。该参数有两个特殊的值需要注意:
- : 禁止创建路由
- : 将路由添加到系统默认的 table 中,并启用对默认路由的特殊处理。
MTU
定义连接到对等节点(peer)的
MTU(Maximum Transmission Unit,最大传输单元),默认不需要设置,一般由系统自动确定。
PreUp
启动 VPN 接口之前运行的命令。这个选项可以指定多次,按顺序执行。
例如:
- 添加路由:
PreUp = ip rule add ipproto tcp dport 22 table 1234
PostUp
启动 VPN 接口之后运行的命令。这个选项可以指定多次,按顺序执行。
例如:
PostUp = wg set %i private-key /etc/wireguard/wg0.key <(some command here)
PostUp = echo "$(date +%s) WireGuard Started" >> /var/log/wireguard.log
PostUp = curl https://events.example.dev/wireguard/started/?key=abcdefg
PostUp = ip rule add ipproto tcp dport 22 table 1234
# 接口名称需要改为服务器网卡名称
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostUp = resolvectl domain %i "~."; resolvectl dns %i 192.0.2.1; resolvectl dnssec %i yes
PreDown
停止 VPN 接口之前运行的命令。这个选项可以指定多次,按顺序执行。
例如:
PreDown = echo "$(date +%s) WireGuard Going Down" >> /var/log/wireguard.log
PreDown = curl https://events.example.dev/wireguard/stopping/?key=abcdefg
PostDown
停止 VPN 接口之后运行的命令。这个选项可以指定多次,按顺序执行。
例如:
PostDown = echo "$(date +%s) WireGuard Going Down" >> /var/log/wireguard.log
PostDown = curl https://events.example.dev/wireguard/stopping/?key=abcdefg
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
定义能够为一个或多个地址路由流量的对等节点(peer)的 VPN 设置。
对等节点(peer)可以是将流量转发到其他对等节点(peer)的中继服务器,也可以是通过公网或内网直连的客户端。
中继服务器必须将所有的客户端定义为对等节点(peer),除了中继服务器之外,其他客户端都不能将位于 NAT 后面的节点定义为对等节点(peer),因为路由不可达。
对于那些只为自己路由流量的客户端,只需将中继服务器作为对等节点(peer),以及其他需要直接访问的节点。
-
[peer] :
public-server2,home-server,laptop,phone -
[peer] :
public-server1 -
[peer] :
public-server1,public-server2 -
[peer] :
public-server1,public-server2 -
[peer] :
public-server1,public-server2
-
对等节点(peer)是中继服务器,用来将流量转发到其他对等节点(peer)
[Peer] # Name = public-server1.example-vpn.tld Endpoint = public-server1.example-vpn.tld:51820 PublicKey = <public key for public-server1.example-vpn.tld> # 路由整个 VPN 子网的流量 AllowedIPs = 192.0.2.1/24 PersistentKeepalive = 25 -
对等节点(peer)是路由可达的客户端,只为自己路由流量
[Peer] # Name = public-server2.example-vpn.dev Endpoint = public-server2.example-vpn.dev:51820 PublicKey = <public key for public-server2.example-vpn.dev> AllowedIPs = 192.0.2.2/32 -
对等节点(peer)是位于 NAT 后面的客户端,只为自己路由流量
[Peer] # Name = home-server.example-vpn.dev Endpoint = home-server.example-vpn.dev:51820 PublicKey = <public key for home-server.example-vpn.dev> AllowedIPs = 192.0.2.3/32
Endpoint
指定远端对等节点(peer)的公网地址。
如果对等节点(peer)位于 NAT 后面或者没有稳定的公网访问地址,就忽略这个字段。
通常只需要指定的
Endpoint,当然有稳定公网 IP 的节点也可以指定。例如:
-
Endpoint = 123.124.125.126:51820 -
Endpoint = public-server1.example-vpn.tld:51820
AllowedIPs
允许该对等节点(peer)发送过来的 VPN 流量中的源地址范围。
同时这个字段也会作为本机路由表中 wg0 绑定的 IP 地址范围。
如果对等节点(peer)是常规的客户端,则将其设置为节点本身的单个 IP;如果对等节点(peer)是中继服务器,则将其设置为可路由的子网范围。
可以使用
,来指定多个 IP 或子网范围。该字段也可以指定多次。
当决定如何对一个数据包进行路由时,系统首先会选择最具体的路由,如果不匹配再选择更宽泛的路由。
例如,对于一个发往
192.0.2.3的数据包,系统首先会寻找地址为192.0.2.3/32的对等节点(peer),如果没有再寻找地址为192.0.2.1/24的对等节点(peer),以此类推。例如:
-
AllowedIPs = 192.0.2.3/32 -
AllowedIPs = 192.0.2.1/24 -
AllowedIPs = 0.0.0.0/0,::/0 -
AllowedIPs = 192.0.2.3/32,192.0.2.4/32 -
AllowedIPs = 192.0.2.3/32,192.168.1.1/24
PublicKey
对等节点(peer)的公钥,所有节点(包括中继服务器)都必须设置。可与其他对等节点(peer)共用同一个公钥。
公钥可通过命令
wg pubkey < example.key > example.key.pub来生成,其中example.key是上面生成的私钥。例如:
PublicKey = somePublicKeyAbcdAbcdAbcdAbcd=
PersistentKeepalive
如果连接是从一个位于 NAT 后面的对等节点(peer)到一个公网可达的对等节点(peer),那么 NAT 后面的对等节点(peer)必须定期发送一个出站 ping 包来检查连通性,如果 IP 有变化,就会自动更新
Endpoint。例如:
- 本地节点与对等节点(peer)可直连:该字段不需要指定,因为不需要连接检查。
- 对等节点(peer)位于 NAT 后面:该字段不需要指定,因为维持连接是客户端(连接的发起方)的责任。
- 本地节点位于 NAT 后面,对等节点(peer)公网可达:需要指定该字段
PersistentKeepalive = 25,表示每隔25秒发送一次 ping 来检查连接。
三、配置示例:
配置规则写法要领:指定位置写指定规则
Interface: 确定本机的内网ip(Address指定),本机监听端口(ListenPort)
Peer: 其他机器内网ip或网段(AllowedIPs) ,这样发送数据包给相应内网ip时网卡就将该包转发给设置的外网ip (Endpoint)私钥公钥用于数据加密安全
Server
在server节点(82.157.xxx.xxx)
vi /etc/wireguard/wg0.conf
之后wireguard会根据该文件名自动生成wg0虚拟网卡
[Interface]
Address = 10.10.10.1/24
ListenPort = 51820
PrivateKey = oMdhm2x+c6K0CKOm3p40Jkkq1YSsHs6hrkJxvm/g/0Q=
[Peer]
Endpoint = 47.106.xxx.xxx:51820
PublicKey = aH/GnX3kTbmieairpLYtZMIdTfom0C9NWETSSQyCb0c=
AllowedIPs = 10.10.11.1/24
[Peer]
Endpoint = 52.199.xxx.xxx:51820
PublicKey = 9ys4TqyO3R2nOdoRSba+wLFquJI+aeqmMYfBg0Xo4CU=
AllowedIPs = 10.10.12.1/24
Client1
在 Clinet1 47.106.xxx.xxx
vi /etc/wireguard/wg0.conf
[Interface]
Address = 10.10.11.1/24
ListenPort = 51820
PrivateKey = oMdhm2x+c6K0CKOm3p40Jkkq1YSsHs6hrkJxvm/g/0Q=
[Peer]
Endpoint = 82.157.xxx.xxx:51820
PublicKey = /uoGEOucdpTrEPfpE8PH8qsY6vY1JT02D7x/8D7r9zI=
AllowedIPs = 10.10.10.1/24
Client2
在 Clinet2 52.199.xxx.xxx
vi /etc/wireguard/wg0.conf
[Interface]
# Name = public-server2.example-vpn.tld
Address = 10.10.12.1/24
ListenPort = 51820
PrivateKey = oMdhm2x+c6K0CKOm3p40Jkkq1YSsHs6hrkJxvm/g/0Q=
[Peer]
Endpoint = 82.157.xxx.xxx:51821
PublicKey = aH/GnX3kTbmieairpLYtZMIdTfom0C9NWETSSQyCb0c=
AllowedIPs = 10.10.10.1/24
四、高级特性
IPv6
WireGuard 也支持
IPv6。例如:
[Interface]
AllowedIps = 192.0.2.3/24, 2001:DB8::/64
[Peer]
...
AllowedIPs = 0.0.0.0/0, ::/0
转发所有流量
如果你想通过 VPN 转发所有的流量,包括 VPN 子网和公网流量,需要在
[Peer]的AllowedIPs中添加0.0.0.0/0, ::/0。
即便只转发
IPv4流量,也要指定一个IPv6网段,以避免将IPv6数据包泄露到 VPN 之外。详情参考: reddit.com/r/WireGuard/comments/b0m5g2/ipv6_leaks_psa_for_anyone_here_using_wireguard_to
[Interface]
# Name = phone.example-vpn.dev
Address = 192.0.2.3/32
PrivateKey = <private key for phone.example-vpn.dev>
[Peer]
# Name = public-server1.example-vpn.dev
PublicKey = <public key for public-server1.example-vpn.dev>
Endpoint = public-server1.example-vpn.dev:51820
AllowedIPs = 0.0.0.0/0, ::/0
NAT-to-NAT 连接
如果两个对等节点(peer)都位于 NAT 后面,想不通过中继服务器直接连接,需要保证至少有一个对等节点(peer)具有稳定的公网出口,使用静态公网 IP 或者通过
DDNS动态更新FQDN都可以。
WebRTC协议可以动态配置两个 NAT 之间的连接,它可以通过信令服务器来检测每个主机的IP:Port组合。而 WireGuard 没有这个功能,它没有没有信令服务器来动态搜索其他主机,只能硬编码
Endpoint+ListenPort,并通过PersistentKeepalive来维持连接。
- 至少有一个对等节点(peer)有固定的公网 IP,如果都没有固定的公网 IP,也可以使用
DDNS来维护一个稳定的域名。 - 至少有一个对等节点(peer)指定 UDP
ListenPort,而且它的 NAT 路由器不能做 UDP 源端口随机化,否则返回的数据包将被发送到之前指定的ListenPort,并被路由器丢弃,不会发送到新分配的随机端口。 - 所有的对等节点(peer)必须在
[Peer]配置中启用其他对等节点(peer)的PersistentKeepalive,这样就可以维持连接的持久性。
UDP 打洞
对于通信双方来说,只要所在的 NAT 路由器没有指定到 NAT 后面的对等节点(peer)的转发规则,就需要进行 UDP 打洞。
UDP 打洞的原理:
Peer1向Peer2发送一个 UDP 数据包,不过Peer2的 NAT 路由器不知道该将这个包发给谁,直接丢弃了,不过没关系,这一步的目的是让Peer1的 NAT 路由器能够接收 UDP 响应并转发到后面的Peer1。Peer2向Peer1发送一个 UDP 数据包,由于上一步的作用,Peer1的 NAT 路由器已经建立临时转发规则,可以接收 UDP 响应,所以可以接收到该数据包,并转发到Peer1。Peer1向Peer2发送一个 UDP 响应,由于上一步的作用,Peer2的 NAT 路由器已经可以接收 UDP 响应,所以可以接收到该数据包,并转发到Peer2。
当你发送一个 UDP 数据包出去时,路由器通常会创建一个临时规则来映射源地址/端口和目的地址/端口,反之亦然。从目的地址和端口返回的 UDP 数据包会被转发到原来的源地址和端口,这就是大多数 UDP 应用在 NAT 后面的运作方式(如 BitTorrent、Skype 等)。
这个临时规则会在一段时间后失效,所以 NAT 后面的客户端必须通过
PersistentKeepalive定期发送数据包来维持连接的持久性。
当两个对等节点(peer)都位于 NAT 后面时,要想让 UDP 打洞生效,需要两个节点在差不多的时间向对方发送数据包,这就意味着双方需要提前知道对方的公网地址和端口号,可以在
wg0.conf中指定。
UDP 打洞的局限性
从 2019 年开始,很多以前用过的老式打洞方法都不再有效了。
以前很著名的就是 pwnat 开创的一种新的打洞方法,它能够在不需要代理、第三方服务器、upnp、DMZ、sproofing、dns 转换的情况下实现 NAT 中的 P2P 通信。它的原理也很简单:
通过让客户端假装成为一个互联网上任意的
ICMP跳跃点( a random hop on the Internet)来解决这个问题,从而让服务端能够获取到客户端的 IP 地址。traceroute命令也是使用这项技术来检测 Internet 上的跳跃点。
具体来说,当服务器启动时,它开始向固定地址
3.3.3.3发送固定的 (ICMP echo request packets)。显然,我们无法从
3.3.3.3收到返回的 (ICMP echo packets)。然而,3.3.3.3并不是我们可以访问的主机,我们也不是想伪装成它来发 ICMP 回应数据包。相反,pwnat 技术的实现原理在于,当我们的客户端想要连接服务端时,客户端(知道服务器IP地址)会向服务端送 (ICMP Time Exceeded packet)。
这个 ICMP 数据包里面包含了服务端发送到
3.3.3.3的原始固定 。
为什么要这样做呢?好吧,我们假装是互联网上的一个 ICMP 跳越点,礼貌地告诉服务器它原来的 无法传递到
3.3.3.3。而你的 NAT 是一个聪明的设备,它会注意到 内的数据包与服务器发出 相匹配。然后它将 转发回 NAT 后面的服务器,包括来自客户端的完整 IP 数据包头,从而让服务端知道客户端 IP 地址是什么!
现在这种类似的 UDP 打洞方法受到了很多的限制。除了 UDP 打洞之外,我们仍然可以使用硬编码的方式指定两个对等节点(peer)的公网地址和端口号,这个方法对大多数 NAT 网络都有效。
源端口随机化
如果所有的对等节点(peer)都在具有严格的 UDP 源端口随机化的 NAT 后面(比如大多数蜂窝网络),那么无法实现
NAT-to-NAT连接。因为双方都无法协商出一个
ListenPort,并保证自己的 NAT 在发出 ping 包后能够接收发往该端口的流量,所以就无法初始化打洞,导致连接失败。因此,一般在
LTE/3G网络中无法进行 p2p 通信。
使用信令服务器
如果所有的对等节点(peer)都在具有严格的 UDP 源端口随机化的 NAT 后面,就无法直接实现
NAT-to-NAT连接,但通过第三方的信令服务器是可以实现的。信令服务器相当于一个中转站,它会告诉通信双方关于对方的
IP:Port信息。这里有几个项目可以参考:
- takutakahashi/wg-connect
- git.zx2c4.com/wireguard-tools/tree/contrib/nat-hole-punching
动态 IP 地址
WireGuard 只会在启动时解析域名,如果你使用
DDNS来动态更新域名解析,那么每当 IP 发生变化时,就需要重新启动 WireGuard。目前建议的解决方案是使用
PostUp钩子每隔几分钟或几小时重新启动 WireGuard 来强制解析域名。
总的来说,
NAT-to-NAT连接极为不稳定,而且还有一堆其他的限制,所以还是建议通过中继服务器来通信。
[Interface]
...
ListenPort = 12000
[Peer]
...
Endpoint = peer2.example-vpn.dev:12000
PersistentKeepalive = 25
[Interface]
...
ListenPort = 12000
[Peer]
...
Endpoint = peer1.example-vpn.dev:12000
PersistentKeepalive = 25
- samyk/pwnat
- en.wikipedia.org/wiki/UDP_hole_punching
- stackoverflow.com/questions/8892142/udp-hole-punching-algorithm
- stackoverflow.com/questions/12359502/udp-hole-punching-not-going-through-on-3g
- stackoverflow.com/questions/11819349/udp-hole-punching-not-possible-with-mobile-provider
- WireGuard/WireGuard@
master/contrib/examples/nat-hole-punching - staaldraad.github.io/2017/04/17/nat-to-nat-with-wireguard
- golb.hplar.ch/2019/01/expose-server-vpn.html
动态分配子网 IP
这里指的是对等节点(peer)的 VPN 子网 IP 的动态分配,类似于 DHCP,不是指
Endpoint。WireGuard 官方已经在开发动态分配子网 IP 的功能,具体的实现可以看这里: WireGuard/wg-dynamic
当然,你也可以使用
PostUp在运行时从文件中读取 IP 值来实现一个动态分配 IP 的系统,类似于 Kubernetes 的 CNI 插件。例如:
[Interface]
...
PostUp = wg set %i allowed-ips /etc/wireguard/wg0.key <(some command)
奇技淫巧
共享一个 peers.conf 文件
介绍一个秘密功能,可以简化 WireGuard 的配置工作。
如果某个
peer的公钥与本地接口的私钥能够配对,那么 WireGuard 会忽略该peer。利用这个特性,我们可以在所有节点上共用同一个 peer 列表,每个节点只需要单独定义一个
[Interface]就行了,即使列表中有本节点,也会被忽略。具体方式如下:
- 每个对等节点(peer)都有一个单独的
/etc/wireguard/wg0.conf文件,只包含[Interface]部分的配置。 - 每个对等节点(peer)共用同一个
/etc/wireguard/peers.conf文件,其中包含了所有的 peer。 - Wg0.conf 文件中需要配置一个 PostUp 钩子,内容为
PostUp = wg addconf /etc/wireguard/peers.conf。
关于
peers.conf的共享方式有很多种,你可以通过ansible这样的工具来分发,可以使用Dropbox之类的网盘来同步,当然也可以使用ceph这种分布式文件系统来将其挂载到不同的节点上。
从文件或命令输出中读取配置
WireGuard 也可以从任意命令的输出或文件中读取内容来修改配置的值,利用这个特性可以方便管理密钥
例如可以在运行时从
Kubernetes Secrets或AWS KMS等第三方服务读取密钥。
容器化
WireGuard 也可以跑在容器中,最简单的方式是使用
--privileged和--cap-add=all参数,让容器可以加载内核模块。
你可以让 WireGuard 跑在容器中,向宿主机暴露一个网络接口;也可以让 WireGuard 运行在宿主机中,向特定的容器暴露一个接口。
下面给出一个具体的示例,本示例中的
vpn_test容器通过 WireGuard 中继服务器来路由所有流量。本示例中给出的容器配置是
docker-compose的配置文件格式。
中继服务器:
容器配置
version: '3'
services:
wireguard:
image: linuxserver/wireguard
ports:
- 51820:51820/udp
cap_add:
- NET_ADMIN
- SYS_MODULE
volumes:
- /lib/modules:/lib/modules
- ./wg0.conf:/config/wg0.conf:ro
WireGuard 配置
wg0.conf:
[Interface]
# Name = relay1.wg.example.com
Address = 192.0.2.1/24
ListenPort = 51820
PrivateKey = oJpRt2Oq27vIB5/UVb7BRqCwad2YMReQgH5tlxz8YmI=
DNS = 1.1.1.1,8.8.8.8
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# Name = peer1.wg.example.com
PublicKey = I+hXRAJOG/UE2IQvIHsou2zTgkUyPve2pzvHTnd/2Gg=
AllowedIPs = 192.0.2.2/32
客户端配置:
容器配置
version: '3'
services:
wireguard:
image: linuxserver/wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
volumes:
- /lib/modules:/lib/modules
- ./wg0.conf:/config/wg0.conf:ro
vpn_test:
image: curlimages/curl
entrypoint: curl -s http://whatismyip.akamai.com/
network_mode: 'service:wireguard'
客户端 WireGuard 配置
wg0.conf:
[Interface]
# Name = peer1.wg.example.com
Address = 192.0.2.2/32
PrivateKey = YCW76edD4W7nZrPbWZxPZhcs32CsBLIi1sEhsV/sgk8=
DNS = 1.1.1.1,8.8.8.8
[Peer]
# Name = relay1.wg.example.com
Endpoint = relay1.wg.example.com:51820
PublicKey = zJNKewtL3gcHdG62V3GaBkErFtapJWsAx+2um0c0B1s=
AllowedIPs = 192.0.2.1/24,0.0.0.0/0
PersistentKeepalive = 21
引用:
WireGuard 教程:WireGuard 的搭建使用与配置详解 – 云原生实验室