通过 WireGuard 中继网关内网穿透
date
Jan 31, 2024
slug
wiregurad
status
Published
tags
wireguard
summary
通过 WireGuard 中继网关内网穿透
type
Post
Language
介绍
WireGuard 是由 Jason Donenfeld 等人用 C 语言编写的一个开源 VPN 协议,被视为下一代 VPN 协议,旨在解决许多困扰 IPSec/IKEv2、OpenVPN 或 L2TP 等其他 VPN 协议的问题。它与 Tinc 和 MeshBird 等现代 VPN 产品有一些相似之处,即加密技术先进、配置简单。从 2020 年 1 月开始,它已经并入了 Linux 内核的 5.6 版本,这意味着大多数 Linux 发行版的用户将拥有一个开箱即用的 WireGuard
特性
- WireGuard 没有服务端、客户端区分,所有节点都是 peer,接入虚拟子网的 peer 就可以互联;本文以公网服务器作为中继 peer 的方式实现内网穿透
- WireGuard 是一种 VPN 服务,且只能通过
UDP连接,因为运营商对 UDP 的QoS导致限速,下文会配置通过udp2raw伪装成TCP连接 WireGuard
架构
在拥有公网的服务器上搭建 WireGuard 服务端组作为 VPN 网关,接入 VPN 网关的没有公网的服务器就可以互联;例:VPN 网关配置 IP 为
10.10.0.1,客户端 A 配置 IP 为 10.10.0.2,客户端 B 配置 IP 为 10.10.0.3,当客户端 A 和 客户端 B 都接入 VPN 网关,客户端 B 就可以通过 10.10.0.2 访问客户端 A
安装 WireGuard
- 安装
注意:Linux 内核的 5.6 版本自带 WireGuard,可通过 uname -r 可查看内核版本,大于等于 5.6 可跳过此步骤sudo add-apt-repository ppa:wireguard/wireguard
sudo apt update
sudo apt install wireguard- 开启 WireGuard 模块
sudo modprobe wireguard- 生成 key
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey- 配置
/etc/wireguard/wg0.conf
参照下文 VPN 网关配置和客户端配置
- 配置 IP 转发,编辑
/etc/sysctl.conf,执行sudo sysctl -p生效
net.ipv4.ip_forward=1- 启动 WireGuard
sudo wg-quick up wg0- 关闭 WireGuard
sudo wg-quick down wg0- 查看 WireGuard 状态
sudo wg配置 VPN 网关
- 参照上一节安装 WireGuard
- 配置
/etc/wireguard/wg0.conf
[Interface]
PrivateKey = <privateKey>
Address = 10.10.0.1/24
SaveConfig = true
MTU = 1280
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;- 启动 WireGuard
sudo wg-quick up wg0配置客户端
- 参照上一节安装 WireGuard
- 配置
/etc/wireguard/wg0.conf
[Interface]
PrivateKey = <privateKey>
Address = 10.10.0.2/32
SaveConfig = true
MTU = 1280
[Peer]
PublicKey = <publickey>
AllowedIPs = 10.10.0.0/24
Endpoint = <gateway>:51820
PersistentKeepalive = 25- 在 VPN 网关服务器执行添加 peer
publickey 为当前 peer 生成的 publickey 文件内容allowedIps 为当前 peer 的 Address,本例中为 10.10.0.2/32sudo wg set wg0 peer <publickey> allowed-ips <allowedIps>- 在 VPN 网关服务器执行删除 peer(option)
sudo wg set wg0 peer <publickey> allowed-ips <allowedIps> remove- 启动 WireGuard
sudo wg-quick up wg0通过 TCP 连接 WireGuard
使用
udp2raw 把 UDP 流量伪装成 tcp/icmp、模拟 TCP 3 次握手,将 UDP 伪装成 TCP,改善 QoS 带来的限速问题Linux 服务端安装
下载 https://github.com/wangyu-/udp2raw-tunnel/releases 二进制包,得到
udp2raw_amd64sudo mv udp2raw_amd64 udp2raw
sudo chmod +x udp2raw
sudo mv udp2raw /usr/local/bin/启动 udp2raw
-s 以服务端启动-l TCP 出口-r WireGuard 监听地址-k 密码--raw-mode 伪装模式--log-level 2 日志等级 error-a 自动添加 iptables 规则如果退出 shell 后 udp2raw 进程自动退出,就在 nohup & 后加 disown ‣
nohup sudo udp2raw -s -l 0.0.0.0:10005 -r 127.0.0.1:51820 -k <passwd> --raw-mode faketcp --log-level 2 -a & disown Windows 客户端安装
下载 https://github.com/wangyu-/udp2raw-multiplatform/releases 二进制包,得到
udp2raw_mp.exe ,将解压后的文件夹 udp2raw_mp_binaries 移动到 C:\Program Files\WireGuard 目录下(此操非必要)在
C:\Program Files\WireGuard\udp2raw_mp_binaries 编写 start.bat 后台启动客户端,其中 path 为二进制包绝对路径, server 为的 ip,passwd 为密码if "%1"=="hide" goto CmdBegin
start mshta vbscript:createobject("wscript.shell").run("""%~0"" hide",0)(window.close)&&exit
:CmdBegin
<path>\udp2raw_mp.exe -c -l 127.0.0.1:8800 -r <server>:10005 -k <passwd> --raw-mode faketcp --log-level 2在
C:\Program Files\WireGuard\udp2raw_mp_binaries 编写 stop.bat 停止客户端@echo off
rem 查找udp2raw_mp.exe的进程PID
for /F "tokens=2" %%i in ('tasklist /FI "IMAGENAME eq udp2raw_mp.exe" ^| findstr udp2raw_mp.exe') do (
set "pid=%%i"
)
echo udp2raw_mp.exe pid: %pid%
if "%pid%" == "" (
echo Process not running
exit /b
)
rem 使用任务kill命令结束该进程
taskkill /F /PID %pid%
echo Process stopped successfully
pause修改
WireGuard 客户端配置- 以管理员打开命令提示符,执行以下命令赋予 WireGuard 权限
reg add HKLM\Software\WireGuard /v DangerousScriptExecution /t REG_DWORD /d 1 /f - 配置
PostUp设置启动时执行C:\Program Files\WireGuard\udp2raw_mp_binaries\start.bat
- 配置
PostDown设置关闭时执行C:\Program Files\WireGuard\udp2raw_mp_binaries\stop.bat
[Interface]
PrivateKey = <privateKey>
Address = 10.10.0.2/32
SaveConfig = true
MTU = 1280
PostUp = "C:\Program Files\WireGuard\udp2raw_mp_binaries\start.bat"
PostDown = "C:\Program Files\WireGuard\udp2raw_mp_binaries\stop.bat"
[Peer]
PublicKey = <publickey>
AllowedIPs = 10.10.0.0/24
Endpoint = <gateway>:51820
PersistentKeepalive = 25安全
- 只允许
10.10.0.2被10.10.0.5访问,
sudo iptables -I FORWARD 1 -i wg0 -d 10.10.0.2 -j DROP
sudo iptables -I FORWARD 1 -i wg0 -s 10.10.0.5 -d 10.10.0.2 -j ACCEPT
10.10.0.2 无法访问虚拟局域网的其他节点# 允许从 10.10.0.2 返回到 10.10.0.5 的已建立连接
sudo iptables -A FORWARD -i wg0 -s 10.10.0.2 -d 10.10.0.5 -m state --state ESTABLISHED,RELATED -j ACCEPT