WireGuard 首先是一个“协议”,我们日常使用的是实现该协议的“程序”。
作为“协议”:它是一套定义好的规则和标准,规定了网络数据如何被加密、封装和传输。比如,它规定了使用先进的 Noise 协议框架进行身份验证,使用 Curve25519 进行密钥交换,使用 ChaCha20Poly1305 进行数据加密等。
作为“程序”:在 Ubuntu 上安装的,是 WireGuard 协议的具体软件实现。它包括一个负责实际加密解密工作的内核模块(wireguard.ko),以及我们用来配置和管理它的用户空间命令行工具(如 wg 和 wg-quick)。
极致精简与高效:WireGuard 的代码量极少,核心部分仅约 4000 行代码。这意味着代码逻辑清晰,更容易进行安全审计,潜在漏洞和攻击面也更小。同时,轻量级的代码也让它的运行效率极高。
现代密码学,无冗余:它没有历史包袱,只选用经过时间考验的最先进的现代密码学套件,抛弃了所有过时的、不安全的旧算法,确保了安全性的同时避免了臃肿。
原生集成于 Linux 内核:自 Linux 5.6 版本起,WireGuard 就被正式收录进 Linux 内核,Ubuntu 22.04/24.04 等现代 Linux 发行版都开箱即用,无需额外编译驱动,性能更好、更稳定。
部署与运维极简:它的配置非常简单,通过一个简短的文本文件(wg0.conf)就能完成。同时,由于基于密钥对进行身份验证,使得网络扩展非常方便。
WireGuard 的流行,是因为极简和现代的方式,解决了传统 VPN 复杂、臃肿和低效的痛点。是当前网络世界里前沿、优雅的解决方案之一。
wireguard的虚拟网卡,比如默认的虚拟网卡默认名称wg0,连接着一条加密的点对点隧道,只有两个端点,所以不需要网关,直接用AllowedIPs指定路由。(点对点,所以不需要指路人 网关)
以下为ubuntu24.04安装wireguard并配置
以下配置基于服务端有公网ip,客户端没有公网ip
注意:wireguard的通信协议使用UDP,因此ikuai端口转发请求给wireguard的机器必须选择UDP
sudo -i # 进入管理员模式 sudo apt install wireguard -y # 下载wireguard wg --version # 查看版本 cd /etc/wireguard wg genkey | tee privatekey | wg pubkey > publickey # 生成公钥和私钥 cat /etc/wireguard/privatekey # 查看私钥 cat /etc/wireguard/publickey # 查看公钥 vim /etc/wireguard/wg0.conf # 在两个wg都创建配置文件
[Interface] #服务端A PrivateKey = Address = 10.0.9.1/24 ListenPort = 51820 PostUp = sysctl -w net.ipv4.ip_forward=1 #临时开启内核数据包转发,否则流量进来出不去 [Peer] PublicKey = #wg会自动为设置的allowedIPs创建路由,来自配置的ip的数据包都将由wireguard进行处理。 AllowedIPs = 10.0.9.2/32, 192.168.248.0/24 [Interface] #客户端B PrivateKey = Address = 10.0.9.2/24 PostUp = sysctl -w net.ipv4.ip_forward=1 [Peer] PublicKey = #注意:b的allowedIPs里的网段不要与endpoint冲突,否则就会回环,请求会在wg间一直转圈 AllowedIPs = 10.0.9.1/24 Endpoint = 192.168.150.38:51820 #服务端的ip与端口,服务端ikuai需要映射端口到下面linux PersistentKeepalive = 10
sudo wg-quick up wg0 # 开启隧道wg0 sudo wg-quick down wg0 # 关闭wg0 sudo wg show # 展示wg状态 sudo systemctl enable wg-quick@wg0 # 将隧道wg0设置为开机自启
sudo ufw allow ssh # 允许ssh远程连接ei sudo ufw allow 51820/udp # 放行 WireGuard 端口 (UDP) sudo vim /etc/default/ufw # 将输入输c转发设置为ACCEPT sudo ufw route allow in on wg0 # 允许来自隧道网卡wg0的流量 sudo ufw route allow out on wg0 # 允许发往隧道网卡wg0的流量 sudo ufw enable # 开启防火墙 sudo vim /etc/ufw/before.rules # 持久化 nat规则 :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 10.0.9.0/24 -j MASQUERADE sudo ufw reload # 重启ufw
由于B端是主动连接方,如果A断电重启,A的公网ip变化,B端有可能还在使用原来的ip去连接,导致隧道不通
因此如下在B端创建定时任务,每分钟检测一次隧道是否连通,否则直接关闭重启隧道,这样就会使用新的ip去连接
1.创建定时任务文件
sudo vim /etc/wireguard/check_wg_reconnect.sh2.写入定时任务代码
TARGET_IP="10.0.9.1" # A 端 WireGuard 的隧道内部 IP
# 尝试 Ping 对端 3 次,每次超时 2 秒
if ! ping -c 3 -W 2 $TARGET_IP > /dev/null 2>&1; then
echo "$(date): Ping $TARGET_IP 失败,正在重新解析域名并重启 $WG_INTERFACE..." >> /etc/wireguard/reconnect.log
sudo wg-quick down wg0 # 关闭wg
sudo wg-quick up wg0 # 开启wg
fi
3.添加定时任务
sudo crontab -e #进入root的crontab * * * * * /bin/bash /etc/wireguard/check_wg_reconnect.sh #添加到crontab文件,每分钟执行一次4.查看定时任务日志与系统时间
cat /etc/wireguard/reconnect.log # 查看定时任务日志 timedatectl status # 查看当前时间