wireguard搭建笔记

毕业了,抱着服务器润了。托管的地方网络结构不怎么复杂,相反很死板不可变,所以比较需要能异地组网不然一堆端口访问起来太麻烦了。

这时候想到ncc用过的wireguard了,刚好有个公网服务器,开造。


公网侧

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
version: '3.8'

services:
wireguard:
image: linuxserver/wireguard
container_name: wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- SERVERURL=你的公网IP或域名
- SERVERPORT=51820
- PEERS=archlinux,client1,client2,...
- ALLOWEDIPS=0.0.0.0/0
volumes:
- ./config:/config
- /lib/modules:/lib/modules
ports:
- 51820:51820/udp
sysctls:
- net.ipv4.ip_forward=1
- net.ipv6.conf.all.forwarding=1
restart: unless-stopped

这里注意可以先添加好几个想要的密钥。后面要添加密钥的话相对麻烦一点。

完成之后在./config下找到peer_xxx即为客户端的配置文件。把这些配置文件下载下来准备给客户端导入,或者是移动端的话有其他方法。

注意:配置文件下载下来之后记得修改一下[Peer]中的AllowedIPs配置项,改为你的网段对应的子网。例如我这里的服务端配置的[Interface]下的Address10.13.13.1,那么下载下来的配置的AllowedIPs就改成10.13.13.0/24

额外工具-创建peer

使用docker exec -it wireguard bash进入容器并在/app下创建脚本add-peer

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
#!/bin/bash  

# Usage: /app/add-peer <peer_name> <ip_suffix>
# Example: /app/add-peer laptop 5

set -e

PEER_NAME=$1
PEER_IP_SUFFIX=$2

if [[ -z "$PEER_NAME" || -z "$PEER_IP_SUFFIX" ]]; then
 echo "Usage: $0 <peer_name> <ip_suffix>"
 exit 1
fi

WG_CONFIG_DIR="/config"
SERVER_CONF="${WG_CONFIG_DIR}/wg_confs/wg0.conf"
PEER_DIR="${WG_CONFIG_DIR}/peer_${PEER_NAME}"
PEER_CONF="${PEER_DIR}/peer_${PEER_NAME}.conf"

mkdir -p "$PEER_DIR"

# Generate keys
umask 077
wg genkey | tee "${PEER_DIR}/privatekey" | wg pubkey > "${PEER_DIR}/publickey"
wg genpsk > "${PEER_DIR}/presharedkey"

PRIVATE_KEY=$(cat "${PEER_DIR}/privatekey")
PUBLIC_KEY=$(cat "${PEER_DIR}/publickey")
PRESHARED_KEY=$(cat "${PEER_DIR}/presharedkey")

# Get server public key
SERVER_PUBLIC_KEY="pubkey in your ./config/wg-confs/wg0.conf"

# Extract public endpoint from server conf
SERVER_ENDPOINT="addr of your server:51820"

# Assign IP
CLIENT_IP="10.13.13.${PEER_IP_SUFFIX}"

# === 1. Write client config ===
cat > "$PEER_CONF" <<EOF
[Interface]
Address = ${CLIENT_IP}
PrivateKey = ${PRIVATE_KEY}
ListenPort = 51820
DNS = 10.13.13.1

[Peer]
PublicKey = ${SERVER_PUBLIC_KEY}
PresharedKey = ${PRESHARED_KEY}
Endpoint = ${SERVER_ENDPOINT}
AllowedIPs = 10.13.13.0/24
EOF

# === 2. Append to server config ===
cat >> "$SERVER_CONF" <<EOF

[Peer]
# ${PEER_NAME}
PublicKey = ${PUBLIC_KEY}
PresharedKey = ${PRESHARED_KEY}
AllowedIPs = ${CLIENT_IP}/32
EOF

echo "[ok] Peer ${PEER_NAME} created at ${PEER_CONF}"
echo "[ok] Remember to restart wireguard container to apply changes:"
echo "    docker restart <container_name>"

之后添加新的peer只需要docker exec -it wireguard /app/add-peer device-name endpointID之后,手动重启容器即可。

设备侧

NetworkManager

确保安装了networkmanager-wireguardwireguard-tools。之后找到你下载的peer_xxx.conf并在终端中执行:

1
2
sudo nmcli connection import type wireguard file /etc/wireguard/peer_xxx.conf
sudo nmcli connection up peer_xxx

即可导入配置文件并激活连接。完成后试试ping 10.13.13.1,能通说明就ok了。

qrencode

服务器安装qrencode后找到对应的./config/peer_xxx/peer_xxx.conf,使用如下命令生成供移动设备扫描的二维码:

1
qrencode -t ansiutf8 < ./peer_xxx.conf

完成后应该会生成一个二维码,在wireguard客户端即可扫描添加连接。


果然,挺好用的,也不需要自己一个一个端口穿透了,直接用虚拟子网的ip访问就行。

作者

xeonds

发布于

2025-06-29

更新于

2025-07-09

许可协议

评论