wireguard搭建笔记

xeonds

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]下的Address10.13.13.1,那么下载下来的配置的AllowedIPs就改成10.13.13.0/24

额外工具-创建peer

使用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

确保安装了networkmanager-wireguardwireguard-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访问就行。