Wireguard安装
WireGuard是一种极其简单但快速且现代的 VPN,采用最先进的加密技术。它的目标是比 IPsec更快、更简单、更精简、更有用,同时避免令人头疼的问题。它的性能远高于 OpenVPN。WireGuard 被设计为通用 VPN,可在嵌入式接口和超级计算机上运行,适合许多不同的情况。它最初针对 Linux 内核发布,现在已跨平台(Windows、macOS、BSD、iOS、Android)且可广泛部署。
服务器安装
Linux内核必须>5.6
yum install wireguard-tools
Quick Start
-
密钥生成
umask 077
wg genkey | tee privatekey | wg pubkey > publickey -
生成配置文件
当客户端配置了AllowedIPs = 0.0.0.0/0代理所有流量,服务器端必须添加PostUp的iptables来转发流量客户端才能正常使用,是支持多个Peer的也就是能同时配置多个远程端点。
AllowedIPs
通俗的来说就是本地需要经过wireguard的ip网段都要配置上umask 077
cat <<EOF > /etc/wireguard/wg0.conf
[Interface]
PrivateKey = `cat privatekey`
Address = 172.16.100.1/24 #地址须唯一
ListenPort = 51820 #udp端口
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = sysctl -w net.ipv4.ip_forward=0
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = <客户端的publickey>
AllowedIPs = 172.16.100.2/32
EOF -
启动wireguard
wg-quick up wg0
#设置开机自启
systemctl enable wg-quick@wg0 -
停止wireguard
wg-quick down wg0
#删除开机自启
systemctl disable wg-quick@wg0
客户端安装
客户端需要全局流量走wireguard需要添加AllowedIPs = 0.0.0.0/0配置,不行全局流量都走wireguard只需要在AllowedIPs 配置需要经过vpn的网段或ip即可
如果是在windows上客户端打通隧道需要在连接局域网的网卡上设置Internet连接共享允许本地wireguard Tunnel创建的网卡
[Interface]
PrivateKey = <客户端的privatekey>
Address = 172.16.100.2/24 #地址须唯一且同服务器为同一网段
DNS = 8.8.8.8,1.1.1.1
[Peer]
PublicKey = <服务器的publickey>
AllowedIPs = 0.0.0.0/0,::/0
Endpoint = <server>:51820
PersistentKeepalive = 25 #当服务器位于NAT或防火墙后面时需要配置keepalive
疑难解答
使用动态域名之类的ip发生变化不会自动重连
git clone https://git.zx2c4.com/wireguard-tools /usr/share/wireguard-tools
cat <<EOF > /etc/systemd/system/wireguard_reresolve-dns.timer
[Unit]
Description=Periodically reresolve DNS of all WireGuard endpoints
[Timer]
OnCalendar=*:*:0/30
[Install]
WantedBy=timers.target
EOF
cat <<EOF > /etc/systemd/system/wireguard_reresolve-dns.service
[Unit]
Description=Reresolve DNS of all WireGuard endpoints
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'for i in /etc/wireguard/*.conf; do /usr/share/wireguard-tools/contrib/reresolve-dns/reresolve-dns.sh "$i"; done'
EOF
systemctl enable wireguard_reresolve-dns.timer --now
遇到运营商UDP限速(QOS)
WireGuard 在国内网络环境下会遇到一个致命的问题:UDP 封锁/限速。虽然通过 WireGuard 可以在隧道内传输任何基于 IP 的协议(TCP、UDP、ICMP、SCTP、IPIP、GRE 等),但 WireGuard 隧道本身是通过 UDP 协议进行通信的,而国内运营商几乎全部采取一刀切的手段:对 UDP 进行限速甚至封锁。
解决方法:使用Phantun将UDP伪装成TCP连接。