WireGuard部署

官网教程

https://www.wireguard.com/quickstart/open in new window

案例

WireGuard 实现三台位于不同地区局域网内的电脑与一台公网服务器打通

离线下载

apt download wireguard

离线安装

dpkg -i wireguard_1.0.20210914-3_all.deb

安装 WireGuard

apt install wireguard

生成密钥

cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey

查看内容

cat server_privatekey
cat server_publickey

查看默认出口接口:

ip route show default

创建 /etc/wireguard/wg0.conf

vim /etc/wireguard/wg0.conf

编写 /etc/wireguard/wg0.conf

[Interface]
PrivateKey = <服务器私钥>
Address = 10.8.0.1/24
ListenPort = 51820
# DNS = 10.0.0.1

# 配置 NAT,让客户端的流量可以通过服务器转发到互联网
# 注意:将 eth0 修改为你实际的主网卡名称
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -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

# Peer A
[Peer]
PublicKey = <客户端A公钥>
AllowedIPs = 10.8.0.2/32, 192.168.10.0/24

# Peer B
[Peer]
PublicKey = <客户端B公钥>
AllowedIPs = 10.8.0.3/32, 192.168.20.0/24

# Peer C
[Peer]
PublicKey = <客户端C公钥>
AllowedIPs = 10.8.0.4/32, 192.168.30.0/24

讲解下规则

iptables -A FORWARD -i wg0 -j ACCEPT;  # 允许从wg0进入的流量转发(入向)
iptables -A FORWARD -o wg0 -j ACCEPT;  # 允许转发到wg0的流量(出向)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;  # NAT伪装
#用%i动态指代当前 WireGuard 接口(比如 wg0、wg1),是 “适配性写法”接口指定方式
iptables -A FORWARD -i %i -j ACCEPT;  # 入向转发(动态接口)允许从wg0进入的流量转发(入向)
iptables -A FORWARD -o %i -j ACCEPT;  # 出向转发(动态接口)允许转发到wg0的流量(出向)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;  # NAT伪装

启动服务 & 开机自启

wg-quick up wg0
systemctl enable wg-quick@wg0

开启 IP 转发(/etc/sysctl.conf)

vim /etc/sysctl.conf
#写入
net.ipv4.ip_forward=1
#执行
sysctl -p
#检查是否开启,若输出 net.ipv4.ip_forward = 1,则表示配置成功。
sysctl net.ipv4.ip_forward

永久开启转发

vim /etc/sysctl.d/99-ipforward.conf
#写入
net.ipv4.ip_forward=1
#配置
sysctl --system
#检查当前值
cat /proc/sys/net/ipv4/ip_forward

重启服务

wg-quick down wg0 && wg-quick up wg0

配置客户端

生成密钥

wg genkey | tee clientA_private | wg pubkey > clientA_public

户端 A配置

[Interface]
PrivateKey = <客户端A私钥>
Address = 10.8.0.2/24
DNS = 8.8.8.8

[Peer]
PublicKey = <服务器公钥>
Endpoint = your.public.server:51820
AllowedIPs = 10.8.0.0/24, 192.168.10.0/24, 192.168.20.0/24, 192.168.30.0/24
PersistentKeepalive = 25

启动客户端

wg-quick up clientA

整个局域网互通 → 需在客户端所在路由器部署 WireGuard(推荐 OpenWRT)

  • 将 WireGuard 隧道接口加入 LAN 防火墙区域;
  • 添加静态路由:192.168.20.0/24 via 10.8.0.1

让对方局域网设备能回访 → 配置 SNAT

公网服务器上,添加 iptables 规则,使去往某局域网的流量伪装成来自该局域网的网关:

# 举例:让 A 能访问 B 的局域网,且 B 的设备能回包
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -d 192.168.20.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -d 192.168.10.0/24 -j MASQUERADE
# 同理添加 C 的规则...

防火墙配置

ufw allow 51820/udp
# 或 iptables
iptables -I INPUT -p udp --dport 51820 -j ACCEPT

windows部署

开机服务启动

配置文件名字:Q-01

开启服务(加密配置)

"C:\Program Files\WireGuard\wireguard.exe" /installtunnelservice "C:\Program Files\WireGuard\Data\Configurations\Q-01.conf.dpapi"

开启服务(明文配置)

"C:\Program Files\WireGuard\wireguard.exe" /installtunnelservice "C:\Program Files\WireGuard\Q-01.conf"

卸载服务

"C:\Program Files\WireGuard\wireguard.exe" /uninstalltunnelservice Q-01

预共享密钥

WireGuard的PresharedKey是通过对称加密算法生成的32字节随机密钥

wg genpsk > peer1_psk  # 生成peer1的预共享密钥
wg genpsk > peer2_psk  # 生成peer2的预共享密钥

客户端、服务端配置

[Peer]
PublicKey = <服务端公钥>
PresharedKey = <共享密钥>  # 必须与服务端一致

UDP端口测试

A机器发送

echo "hello" | nc -u 192.168.8.11 7474

B机器监听7474端口

nc -u -l -p 7474