2025-06-29 23:05:07
毕业了,抱着服务器润了。托管的地方网络结构不怎么复杂,相反很死板不可变,所以比较需要能异地组网不然一堆端口访问起来太麻烦了。
这时候想到ncc用过的wireguard了,刚好有个公网服务器,开造。
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]
下的Address
是10.13.13.1
,那么下载下来的配置的AllowedIPs
就改成10.13.13.0/24
使用docker exec -it wireguard bash
进入容器并在/app
下创建脚本add-peer
:
#!/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-wireguard
和wireguard-tools
。之后找到你下载的peer_xxx.conf
并在终端中执行:
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
,使用如下命令生成供移动设备扫描的二维码:
qrencode -t ansiutf8 < ./peer_xxx.conf
完成后应该会生成一个二维码,在wireguard客户端即可扫描添加连接。
果然,挺好用的,也不需要自己一个一个端口穿透了,直接用虚拟子网的ip访问就行。