如何在Ubuntu上部署WireGuard
WireGuard是一种开源的、高性能的VPN协议,旨在提供简单、安全和现代化的虚拟私人网络(VPN)解决方案。相比于传统的VPN协议,如IPsec和OpenVPN,WireGuard具有以下特点:
- 简单轻巧:WireGuard的代码库非常小巧,易于理解和审计。相比之下,传统VPN协议的代码库庞大复杂,容易出现安全漏洞。
- 高性能:WireGuard在内核层面运行,利用了现代加密算法和协议设计,以提供更高的性能和较低的延迟。它避免了复杂的加密过程和隧道封装,实现了更高效的数据传输。
- 强大的安全性:WireGuard使用最先进的加密算法(如Curve25519、ChaCha20和Poly1305)来保护通信数据的隐私和完整性。它通过身份验证和密钥交换来建立安全的连接,并提供前向保密(Forward Secrecy)。
- 灵活性和易用性:WireGuard具有简洁的配置和管理接口,易于设置和使用。它支持动态IP地址分配,并能适应网络环境的变化。
相对于传统VPN协议,WireGuard的设计更加现代化和优化,具有更好的性能、安全性和易用性。它的目标是简化VPN的部署和管理,并提供更出色的用户体验。
然而,需要注意的是,WireGuard是相对较新的技术,并且在广泛应用之前还需要进行更多的实践和审计。它与其他VPN协议(如OpenVPN、IPsec、L2TP等)相比,可能在某些方面具有不同的特点和适用场景。因此,在选择使用WireGuard还是其他VPN工具时,需要根据具体需求和情况进行评估和比较。
下文将依次介绍:
- WireGuard 服务端部署
- WireGuard 客户端部署
WireGuard 服务端部署
WireGuard 安装
sudo apt update sudo apt install wireguard
WireGuard 配置
1、生成公钥和私钥
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
2、创建配置文件
sudo vim /etc/wireguard/wg0.conf
[Interface] Address = 192.168.0.1/24 #SaveConfig = true ListenPort = 51820 PrivateKey = SERVER_PRIVATE_KEY PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
接口的命名可以是任何你喜欢的名称,但是建议使用诸如wg0
或wgvpn0
之类的名称。可以让我们能快速分清是物理接口还是虚拟接口即可。
- Address
wg0
接口的IPv4或IPv6的地址。请使用保留给私有网络范围内的IP地址,比如10.0.0.0/8、172.16.0.0/12或192.168.0.0/16等等。 - ListenPort 是接口监听的端口。
- PrivateKey 由
wg genkey
命令生成的私钥。你可以使用sudo cat /etc/wireguard/privatekey
命令要查看私钥文件的内容。 - SaveConfig 设置为true时,当关闭接口时将当前配置将保存到配置文件中,这里被我注释掉了。
- PostUp 在启动接口之前执行的命令或脚本,请记得使用您可访问网络的接口名称替换eth0。
- PostDown 在关闭接口之前删除执行的命令。
3、启用Wireguard接口
完成以上步骤后,我们可以通过wg-quick
启动wireguard服务器。这在wireguard中就是将接口状态设置为开启,运行wg-quick up
命令将启用wg0
接口。
sudo wg-quick up wg0
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 192.168.0.1/24 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
要检查接口状态和配置,请运行wg show
命令。因为wg0
是一个虚拟网卡,因此您也可以运行ip a show wg0
来验证wg0
接口状态。
sudo wg show wg0
interface: wg0 public key: 2bxILv/v71q6RlNG6DU6OOjh0gKUgY+29hMu/IAT9TM= private key: (hidden) listening port: 51820
ip a show wg0
21: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.168.0.1/24 scope global wg0 valid_lft forever preferred_lft forever
wireguard作为内核模块运行,默认情况wireguard会自动启动,但接口wg0
虚拟网卡不会自动启动。
你可以通过systemctl命令将wg0
设置为自动启动。要在启动时启用WireGuard的wg0
接口。请运行sudo systemctl enable wg-quick@wg0
命令。
sudo systemctl enable wg-quick@wg0
4、开启IPv4转发,设置防火墙
在之前的步骤中我们在启动wg0
接口postup
前配置了一条iptables的NAT路由。为使NAT路由可正常工作,必须启用IP转发。
sudo vim /etc/sysctl.conf
添加下面的配置到文件中
net.ipv4.ip_forward=1
启用配置
sudo sysctl -p
防火墙放行端口51820
的UDP连接
sudo ufw allow 51820/udp
WireGuard 客户端部署
在wireguard服务端使用脚本生成客户端配置文件,分发给客户端使用
vim /etc/wireguard/wireguard_peer_manager.sh
#!/bin/bash # WireGuard path WG_PATH="/etc/wireguard" # VPN subnet VPN_NET="192.168.0" # Get the last part of the last used IP address LAST_IP=$(grep AllowedIPs $WG_PATH/wg0.conf | awk -F'[ ./]' '{print $6}' | sort -n | tail -1) # If there's no AllowedIPs in wg0.conf, use 192.168.0.2 if [ -z "$LAST_IP" ]; then LAST_IP=1 fi # New client IP NEW_IP="$VPN_NET.$((LAST_IP + 1))" # Example Create a directory for saving client configuration mkdir $WG_PATH/client/ &>/dev/null # Ask for username and device name, if the configuration file already exists, ask again while true; do read -p "Enter username: " USERNAME read -p "Enter device name: " DEVICE CLIENT_CONF="$WG_PATH/client/$USERNAME-$DEVICE.conf" if [ -e "$CLIENT_CONF" ]; then echo "Configuration file $CLIENT_CONF already exists. Please choose a different username or device name." else break fi done # Generate new key pair PRIVATE_KEY=$(wg genkey) PUBLIC_KEY=$(echo $PRIVATE_KEY | wg pubkey) # Create client configuration file cat > $CLIENT_CONF <<EOF [Interface] PrivateKey = $PRIVATE_KEY Address = $NEW_IP/24 DNS = 114.114.114.114,8.8.8.8 [Peer] PublicKey = 服务器端公钥值(内容在/etc/wireguard/publickey) AllowedIPs = 0.0.0.0/0 Endpoint = 服务器端IP:服务器端配置开放的端口(我这里因该是51820) EOF # Add client to server configuration cat << EOF >> /etc/wireguard/wg0.conf [Peer] # $USERNAME-$DEVICE PublicKey = $PUBLIC_KEY AllowedIPs = $NEW_IP/32 EOF # Restart WireGuard wg-quick down wg0 wg-quick up wg0 echo "Client configuration $CLIENT_CONF created."
脚本添加执行权限
chmod +x /etc/wireguard/wireguard_peer_manager.sh
脚本讲解
- 标红的地方根据实际情况修改。
- 客户端ip地址从192.168.0.2开始递增,不会重复。
- 执行脚本生成的客户端配置文件存放在/etc/wireguard/client/下面
测试:
bash /etc/wireguard/wireguard_peer_manager.sh
Enter username: nico Enter device name: windows [#] ip link delete dev wg0 [#] iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 192.168.0.1/24 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE Client configuration /etc/wireguard/client/nico-windows.conf created.
直接把配置文件导入客户端中即可使用(客户端软件在这里下载:https://www.wireguard.com/install/)