2017年,新一代VPN技术wireguard诞生。wireguard基于linux kernel内核运行,效率极高,速度很快,而且支持设备IP地址漫游功能,不仅适合服务器之间的互联,还适合在NAT环境下使用,包括家中的智能路由器,配合openwrt等路由器,可安装wireguard,实现路由器绑定wireguard代理功能。

其实我已经用Wireguard 很久了,但是一直没有时间去写如何配置,抽空写一篇博客来证明一下我自己还躺下

一、 Wireguard 服务器配置

我用的是CentOS 8 64bit系统,
首先先更新系统内核,我们执行以下命令

#1.导入key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
#2.安装 ELRepo for RHEL-8 or CentOS-8:
dnf install https://www.elrepo.org/elrepo-release-8.1-1.el8.elrepo.noarch.rpm
#3.安装内核
dnf --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml

重启服务器后确认下内核是否安装成功

grubby --default-kernel
/boot/vmlinuz-5.5.5-1.el8.elrepo.x86_64

uname -r
5.5.5-1.el8.elrepo.x86_64

启动完毕后我们加入 Wireguard 的 yum 源

sudo curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
sudo yum install epel-release -y
sudo yum install wireguard-dkms wireguard-tools -y

记得要开启IPv4的转发

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

随后,使用命令创建Publickey和PrivateKey

mkdir /etc/wireguard
cd /etc/wireguard
wg genkey | tee privatekey | wg pubkey > publickey
chmod 777 -R /etc/wireguard
vim /etc/wireguard/wg0.conf

服务器端内容如下:

[Interface]
Address = 10.0.0.1/24
ListenPort = 6677
PrivateKey = <Private Key>
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
SaveConfig = true

PrivateKey则是刚生成的PrivateKey,需要填入进去。PostUP和PostDown是开启和关闭时分别执行的命令,你需要根据需求自行修改。

创建服务器端的自动启动

systemctl enable wg-quick@wg0

启动服务器端

wg-quick up wg0

至此,服务器端已经配置完毕,我们需要配置客户端

二、客户端配置

安装过程与服务器一致,但是配置文件是不一样的,具体的需要看你的需求。

假设我们需要将两台服务器互联,以便访问其内网中设备。我们的配置将如下:

[Interface]
Address = 10.0.0.2/24
ListenPort = 6677
PrivateKey = <Private Key>
PostUp = bash /etc/route-add 
PostDown = bash /etc/route-del
SaveConfig = true
 
[Peer]
PublicKey = <服务器端的Public Key>
AllowedIPs = 10.0.0.1/32
Endpoint = 服务器端的公网IP:6677

然后,这边需要注意的是AllowedIPs 如果你写了0.0.0.0/0,你可能会被全部reroute,从而导致连不上服务器。因此我这边推荐你设置为两边的IP先测试完毕再调全局。

随后一样的,启动wireguard。

在服务器端设置以下内容

wg set wg0 peer <客户端的Public Key> allowed-ips 10.0.0.1/32

然后你会发现两个内网IP可以互通,

ping -c 10 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=28.5 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=28.4 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=28.5 ms
64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=28.5 ms
64 bytes from 10.0.0.1: icmp_seq=5 ttl=64 time=28.5 ms
64 bytes from 10.0.0.1: icmp_seq=6 ttl=64 time=28.3 ms
64 bytes from 10.0.0.1: icmp_seq=7 ttl=64 time=28.6 ms
64 bytes from 10.0.0.1: icmp_seq=8 ttl=64 time=28.6 ms
64 bytes from 10.0.0.1: icmp_seq=9 ttl=64 time=28.3 ms
64 bytes from 10.0.0.1: icmp_seq=10 ttl=64 time=28.5 ms

--- 10.0.0.1 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9012ms
rtt min/avg/max/mdev = 28.360/28.522/28.688/0.207 ms

那么,我们的wireguard就算是通了,现在要仔细来调整这个路由让他来符合我们的需求。

就拿刚刚所说,如果是为了访问互相的内网,你需要把内网IP加入到 AllowedIPs 里面,用逗号区分。

例如:

[Interface]
Address = 10.0.0.2/24
ListenPort = 56677
PrivateKey = <Private Key>
PostUp = bash /etc/route-add
PostDown = bash /etc/route-del
SaveConfig = true

[Peer]
PublicKey = <服务器端的Public Key>
AllowedIPs = 10.0.0.1/32, 192.168.0.0/16
Endpoint = 服务器端的公网IP:6677

在你启动wireguard后,你能访问到服务器端的192.168.0.0/16这个段,当然,这种可以认为是对等互联,所以不存在服务器或者客户端这种说法。

而另外一种做法,是在路由器上部署的,实现翻墙功能,这种配置应该是这么写的

[Interface]
Address = 10.0.0.2/24
ListenPort = 56660
PrivateKey = <Private Key>
PostUp = bash /etc/route-add
PostDown = bash /etc/route-del
SaveConfig = true

[Peer]
PublicKey = <服务器端的Public Key>
AllowedIPs = 0.0.0.0/0
Endpoint = 服务器端的公网IP:6677
PersistentKeepalive = 25

另外一点,你需要编辑一下 /etc/route-add 来确保你的服务器IP不走wireguard,否则可能会连不上。

启动后,默认会将你所有流量都通过wg0这个接口到你的服务器上,实现翻墙

另外附送一个配置脚本(并非安装哈):

#! /bin/bash

config_dir="$HOME/.wireguard/"

mkdir -p "$config_dir"
cd "$config_dir" || {
    echo 切换目录失败,程序退出
    exit
}
# 生成两对密钥,分别用作服务器和客户端使用
wg genkey | tee pri1 | wg pubkey >pub1
wg genkey | tee pri2 | wg pubkey >pub2

# 设置密钥访问权限
chmod 600 pri1
chmod 600 pri2

interface=$(ip -o -4 route show to default | awk '{print $5}')
ip=$(ip -4 addr show "$interface" | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

# 生成服务端配置文件
cat >wg0.conf <<EOL
[Interface] 
PrivateKey = $(cat pri1)
Address = 10.10.10.1
ListenPort = 54321
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o $interface -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o $interface -j MASQUERADE
[Peer]
PublicKey = $(cat pub2)
AllowedIPs = 10.10.10.2/32
EOL

# 生成客户端配置文件
cat >client.conf <<EOL
[Interface]
PrivateKey = $(cat pri2)
Address = 10.10.10.2
DNS = 8.8.8.8

[Peer]
PublicKey = $(cat pub1)
Endpoint = $ip:54321
AllowedIPs = 0.0.0.0/0
EOL

# 复制配置文件并启动
sudo cp wg0.conf /etc/wireguard/ || {
    echo 复制失败,请检查/etc/wireguard目录或wg0.conf是否存在
    exit
}
sudo systemctl start wg-quick@wg0 || {
    echo 启动wireguard失败,请检查/etc/wireguard/wg0.conf是否存在错误
    exit
}

sudo systemctl enable wg-quick@wg0

# 显示客户端配置文件
echo "----------以下是客户端配置文件,请保存并在客户端中使用----------"
cat client.conf

echo "----------以下是客户端配置二维码----------"
echo "qrencode -t ansiutf8 <~/.wireguard/client.conf   再次显示"
qrencode -t ansiutf8 <client.conf

参考文章:https://wiki.archlinux.org/index.php/WireGuard_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

最后修改:2021 年 04 月 10 日
如果觉得我的文章对你有用,请随意赞赏