linux

如何在Ubuntu上部署WireGuard


WireGuard是一种开源的、高性能的VPN协议,旨在提供简单、安全和现代化的虚拟私人网络(VPN)解决方案。相比于传统的VPN协议,如IPsec和OpenVPN,WireGuard具有以下特点:

  1. 简单轻巧:WireGuard的代码库非常小巧,易于理解和审计。相比之下,传统VPN协议的代码库庞大复杂,容易出现安全漏洞。
  2. 高性能:WireGuard在内核层面运行,利用了现代加密算法和协议设计,以提供更高的性能和较低的延迟。它避免了复杂的加密过程和隧道封装,实现了更高效的数据传输。
  3. 强大的安全性:WireGuard使用最先进的加密算法(如Curve25519、ChaCha20和Poly1305)来保护通信数据的隐私和完整性。它通过身份验证和密钥交换来建立安全的连接,并提供前向保密(Forward Secrecy)。
  4. 灵活性和易用性: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

接口的命名可以是任何你喜欢的名称,但是建议使用诸如wg0wgvpn0之类的名称。可以让我们能快速分清是物理接口还是虚拟接口即可。

  • 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/

留言

您的电子邮箱地址不会被公开。 必填项已用 * 标注