概述
WireGuard 作为新一代虚拟专用网络协议,除了具有更快和更安全的优势外,安装配置也非常简便灵活,以至于在 Linux 内核 5.6 开始被并入到了内核。
虽然 WireGuard 作为点对点的连接协议,没有服务端和客户端的概念,但我们仍然可以按需定义它们的角色。WireGuard 并不强制要求使用静态 IP 地址,但为了连接的稳定性,这里定义服务端使用静态IP,客户端使用动态地址。
需要注意的是,WireGuard 设计初衷是为了保证数据在传输过程中相对安全的同时配置更加简便和高效,所以没有考虑过隐藏自己,流量特征较为明显,因此并不适合需要经过 Firewall 的场景。
最后是加密方式,WireGuard 使用了 ChaCha20-Poly1305 作为单一的加密算法,没办法像 IPsec 那样可以根据使用场景选择适合的加密算法。以纯软件的方式速度比 AES 快,因而广泛应用与移动互联网时代。但是现如今各大硬件平台都已经对 AES 做了相关的优化和硬件加速,速度上早已不分伯仲,甚至 AES 更优。
WireGuard 服务端
安装
环境:Ubuntu 20.04
sudo apt update -y && sudo apt install wireguard wireguard-tools -y && wg --version
生成 WireGuard 密钥对
私钥
wg genkey | sudo tee /etc/wireguard/privatekey
公钥
sudo cat /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
配置 wg0 虚拟网卡
cat << EOF >/etc/wireguard/wg0.conf
[Interface]
Address = 172.16.16.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = $(cat /etc/wireguard/privatekey)
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -t nat -I POSTROUTING -o $(ip -o -4 route show to default | awk '{print $5}') -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o $(ip -o -4 route show to default | awk '{print $5}') -j MASQUERADE
EOF
PreUp、PostUp、PreDown、PostDown,将在设置/拆除接口之前/之后由 bash 执行的脚本片段,特殊字符串
%i
是 INTERFACE 名字,每个命令都可以指定多次,在这种情况下命令将按顺序执行。多条命令也可以用分号分隔,多个IP用逗号分隔。
增强安全性
chmod 600 /etc/wireguard/{privatekey,wg0.conf}
防火墙放行端口和开启转发功能
如果开启了防火墙,记得放行51820/udp
端口。
服务器开启转发功能
echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf
echo "net.ipv4.conf.all.proxy_arp = 1" >>/etc/sysctl.conf
sysctl -p
运行服务
systemctl start wg-quick@wg0 && systemctl enable wg-quick@wg0
或
wg-quick up wg0
查看服务状态
systemctl status wg-quick@wg0 && netstat -anp | grep 51820 && wg show wg0
添加端点
命令方式(实时生效)
wg set wg0 peer 你另一端的公钥 allowed-ips 你需要访问的网段
配置文件方式(重启接口生效),加入以下配置到wg0.conf
。需要特别注意,修改配置文件之前需要先停止端口,否则重启接口后,你刚才加入的配置会被覆盖。这是因为设置了SaveConfig = true
会在停止接口前将之前通过命令等方式添加的配置会自动保存到配置文件,效果等同于手动保存配置wg-quick save wg0
。
[Peer]
PublicKey = 你另一端的公钥
AllowedIPs = 允许访问的网段(通常填你另一端的隧道地址)
Endpoint = 客户端地址:监听端口(可选)
因为之后添加的客户端是动态IP地址,所以这里的Endpoint
可以不填,让其自动识别。也因此,两端服务在正式建立连接之前,需要让客户端首先发起交互(先ping下服务端的隧道地址,可在客户端 Peer 设置PersistentKeepalive = 25
表示每隔25秒检查一次连通性),让服务端识别到客户端的公网地址后自动建立Endpoint
地址,之后两端才能正常互相访问。
删除端点
wg set wg0 peer 你另一端的公钥 remove
问题排查流程
- 检查系统日志。
- 确认 WireGuard 配置文件中的信息,确保公钥和私钥正确。
- 检查防火墙设置是否允许 WireGuard 端口上的流量。
- 查看允许的 IP 列表。
- 检查 WireGuard 接口的状态。
- 如果遇到连接问题,可以尝试调整 MTU 设置。
- 升级 WireGuard。
- 禁用与 WireGuard 冲突的软件。
- 确认路由表中路由的正确性。
Windows 安装 WireGuard(作为客户端角色)
到官网下载 WireGuard Installer for Windows,安装的时候需要下载相关组件,可能需要魔法。
新建隧道 wg0 会自动生成私钥和公钥,我们需要配置的就是定义自己的隧道地址, 例如 172.16.16.5/24
;Peer里面的公钥填上面服务端生成的公钥;AllowedIPs
填0.0.0.0/0
,也就是所有出去流量走隧道;Endpoint
填你上面服务端的公网IP和端口;若你公网 IP 是动态的,还需要设置下PersistentKeepalive = 25
。红框里面的不需要打钩,如果你这是虚拟机,打钩的话可能会中断远程连接。
配置完成后点击连接,看到有进出数据一般就没问题了。正常来说你电脑现在已经可以正常经过服务端出去上网了,因此,你现在的对外公网IP地址应该就是你服务器的公网IP。
评论区