需要一台公网服务器作为中转站,也就是Server,而其他的内网机器,作为Client。

以下都采用Debian系统作为演示。

Server配置:

apt update
# 下载WireGuard,wireguard-tools包含了本体和工具
apt install wireguard-tools

# 在/etc/wireguard/目录下创建一个接口配置文件
nano /etc/wireguard/wg0.conf
# 以下是配置文件内容
[Interface]
PrivateKey = # 填写本机私钥(Server)
Address = 10.0.1.1/24 # 填写本机地址,可以自定义
ListenPort = 51820 # 监听端口
DNS = 223.5.5.5 # DNS
# 开启转发和 NAT
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE

[Peer]
PublicKey = # Client公钥
AllowedIPs = 10.0.2.0/24 # Client网段,可以自定义
PersistentKeepalive = 25 # 保持连接时间(25s能够很稳定)

# 保存配置后,启动WireGuard
wg-quick up wg0 # wg0就是WireGuard的接口,也就是对应配置文件

# 查询连接状态
wg

# 生成私钥
wg genkey > pri.key
# 通过私钥生成公钥
wg pubkey < pri.key > pub.key

Client配置:

apt update
# 下载WireGuard,wireguard-tools包含了本体和工具
apt install wireguard-tools

# 在/etc/wireguard/目录下创建一个接口配置文件
nano /etc/wireguard/wg0.conf
# 以下是配置文件内容
[Interface]
ListenPort = 51820
PrivateKey = # Client私钥
 
[Peer]
PublicKey = # Server公钥,通过在服务端执行wg命令,可获取到Server的公钥
# Server网段,表示访问10.0.0.0网段的时候,通过WireGuard接口进行转发
AllowedIPs = 10.0.0.0/24
Endpoint = 1.1.1.1:51820 # Server地址和端口
PersistentKeepalive = 25 # 保活机制

# 保存配置后,启动WireGuard
wg-quick up wg0 # wg0就是WireGuard的接口,也就是对应配置文件

# 查询连接状态
wg

OpenWRT配置:

opkg update

opkg install luci-proto-wireguard kmod-wireguard wireguard-tools

安装软件包后,可以通过创建WireGuard接口,来进行连接

(扩展)端口转发:

确保系统启用IP转发功能

# 开启系统IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward

把Server的80端口转发到1.1.1.1的80端口上,1.1.1.1可以替换为WireGuard组网后的局域网IP,以此达到端口隐藏的目的。

iptables -t nat -A POSTROUTING -d 1.1.1.1 -p tcp --dport 80 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 1.1.1.1:80

注意事项:

  1. Server和Client的网段,尽量不用一个,防止冲突,如果有需要的话,可以设置为10.0.0.1/32,10.0.0.2/32

  2. windows可以用tracert命令检查链路情况,linux可以用traceroute检查链路情况

  3. 如果存在动态公网IP的情况,OpenWRT系统自带一个看门狗脚本,在/usr/bin/wireguard_watchdog.sh上,通过添加系统定时任务中,可以解决动态公网IP的情况。

动态公网更新脚本

#!/bin/bash
# 文件: /usr/local/bin/wg-dns-check.sh
# 功能: 对比域名解析 IP 与当前 wg 实际连接 IP,若不同则更新配置并重启

CONFIG_FILE="/etc/wireguard/wg0.conf"
INTERFACE="wg0"
DOMAIN="xxx.xxx.xxx"   # ← 修改为你的实际域名
PORT="51820"
WG_BINARY="/usr/bin/wg"

# 日志函数
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') : $1"
}

# 1. 解析域名获取最新 IP
NEW_IP=$(dig +short "$DOMAIN" | head -1)
if [ -z "$NEW_IP" ]; then
    log "ERROR: 无法解析域名 $DOMAIN"
    exit 1
fi
log "域名 $DOMAIN 解析为 IP: $NEW_IP"

# 2. 获取当前 WireGuard 实际连接的 endpoint IP
CURRENT_ENDPOINT=$( $WG_BINARY show "$INTERFACE" | awk '/endpoint:/ {print $2}' | cut -d: -f1 )
if [ -z "$CURRENT_ENDPOINT" ]; then
    log "ERROR: 无法获取当前 WireGuard endpoint IP"
    exit 1
fi
log "当前 WireGuard 连接的 endpoint IP: $CURRENT_ENDPOINT"

# 3. 比较 IP
if [ "$NEW_IP" = "$CURRENT_ENDPOINT" ]; then
    log "IP 一致,无需操作。"
    exit 0
fi

log "检测到 IP 变更!原 IP: $CURRENT_ENDPOINT → 新 IP: $NEW_IP"

# 6. 重启 WireGuard
log "正在重启 WireGuard..."
wg-quick down "$INTERFACE" || true
wg-quick up "$INTERFACE"

if [ $? -eq 0 ]; then
    log "WireGuard 重启成功,已连接到新 IP: $NEW_IP"
else
    log "ERROR: WireGuard 重启失败,请检查配置!"
    exit 1
fi
chmod +777 /usr/bin/wireguard_watchdog

# 获取现有 crontab 并追加新条目
(crontab -l 2>/dev/null; echo '*/5 * * * * /usr/bin/wireguard_watchdog >> /var/log/wireguard_watchdog.log 2>&1') | crontab -

tail -100f /var/log/wireguard_watchdog.log