毕业了,抱着服务器润了。托管的地方网络结构不怎么复杂,相反很死板不可变,所以比较需要能异地组网不然一堆端口访问起来太麻烦了。
这时候想到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]
下的Address
是10.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
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"
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")
SERVER_PUBLIC_KEY="pubkey in your ./config/wg-confs/wg0.conf"
SERVER_ENDPOINT="addr of your server:51820"
CLIENT_IP="10.13.13.${PEER_IP_SUFFIX}"
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
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-wireguard
和wireguard-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访问就行。