Technology Sharing

  • 首页
  • 资料分享
  • 在线工具
    • 随机密码生成器
  • 介绍
  • RSS
  • privacy
  • 云产品推广
    • 腾讯云
    • 阿里云
Share IT knowledge
  1. 首页
  2. linux
  3. 正文

如何在Ubuntu上部署WireGuard

2023年6月28日 247点热度 1人点赞 0条评论

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

接口的命名可以是任何你喜欢的名称,但是建议使用诸如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 客户端部署

1、在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."

2、脚本添加执行权限

chmod +x /etc/wireguard/wireguard_peer_manager.sh

3、脚本讲解

  • 标黄的地方根据实际情况修改。
  • 客户端ip地址从192.168.0.2开始递增,不会重复。
  • 执行脚本生成的客户端配置文件存放在/etc/wireguard/client/下面

4、测试:

生成nico的windows配置

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.

5、把配置文件导入客户端中即可使用(客户端软件在这里下载:https://www.wireguard.com/install/)

打赏微海报分享
标签: 暂无
最后更新:2023年6月29日

nico

Linux运维工程师 软考网络工程师 && 软考信息安全工程师

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

nico

Linux运维工程师
软考网络工程师 && 软考信息安全工程师

最新 热点 随机
最新 热点 随机
linux部署JDK环境 [Solved] MariaDB import issue: Error at line 1: Unknown command '\-'. Could not retrieve mirrorlist http://mirrorlist.centos.org/ CentOS 7 Kubernetes如何删除卡在“Terminating”状态的命名空间 解决GitLab Runner签名无效 如何禁用 Ubuntu "Daemons using outdated libraries" 弹出窗口
docker-compose部署elasticsearch+kibana 简单实用:Linux 下格式化显示 XML 文件 如何使用 visudo 让 sudo 命令无需输入密码 gitlab解锁用户 docker部署Elasticsearch集群 掌握 Google 搜索输入框的高级技巧
最近评论
woodcockkienzlelsj8o9+73s48g9rr3m0@gmail.com 发布于 10 个月前(07月17日) necessitatibus corporis et odit nam quo harum et c...
RonaldG 发布于 10 个月前(07月07日) Very interesting topic, thank you for putting up.&...
小黑 发布于 1 年前(12月28日) 不错
nico 发布于 2 年前(02月09日) 嘻嘻嘻!!!
Bruse 发布于 2 年前(02月09日) 我来啦!!!
nico 发布于 2 年前(12月10日) 方便查询
Justin 发布于 2 年前(12月10日) 写的很好,谢谢分享!我 Mark 一下~
nico 发布于 3 年前(11月18日) 主题的原因吧
Justin 发布于 3 年前(09月22日) 这篇文章的质量很高呀!写得很详细~ 话说你的文章是隐藏了发布时间吗?
Justin 发布于 3 年前(08月27日) 好家伙,这标题乍一看还以为你打算进军英文技术写作领域了🤓

COPYRIGHT © 2023 Technology Sharing. ALL RIGHTS RESERVED.

备案图标 皖公网安备34132402000202 皖ICP备2023004851号-1