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)
8 条评论
客户机的alowedips设置 为0.0.0.0/0还是没有用,我一开始就是这样设置的。debian10上,我是按https://doubibackup.com/qbc20cn3.html安装wireguard的,应该它也基本上通用于centos啊,centos上的内核更新/安装wireguard-tools,wireguard-dkms,wireguard这3个包我都已经成功。难道是逗逼文章里的配置文件不适合centos8??你帮忙去看看,看它适合吗
iptable的nat转发设置好了吗? 我现在广州回去了给你我服务器的配置文件
oh,
重启一下我的centos8 vps,就解决问题了
haha.其实也不是重启一下我的centos8 vps,就能解决问题。而是我想起你说的iptable的nat转发规则,就去仔细看了一下服务器上的配置文件wg0.conf里的PostUp的值和PostDown的值,原来我复制网文时,iptables 命令结尾处的分号的后面空了一格才接 下一个iptables 命令,我把空格去掉,
然后sudo wg-quick down wg0
然后sudo wg-quick up wg0
这样,客户端就能正常连接服务器而成功翻墙了。
都是分号后面的空格惹的祸
能解决就好
怪事 。不稳定,又不行了。可贴出你服务器的配置文件内容吗
hi.
我在debian10 vps上,成功安装/配置此VPN,并在Mac机器上也做了配置,然后我可用此VPN成功翻#墙。在另一台centos8 vps上,也安装/配置了此VPN,并在Mac机器上也做了配置,但是死活就是不能用此VPN成功翻#墙。按你文章,我即使修改客户机器上的配置文件,把AllowedIPs 的值写为了服务器端的IP地址段19.0.0.1/24 ,我还是翻#墙失败。不知为何?谢谢回复
客户机的alowedips设置 0.0.0.0/0这样继承所以ip经过vpn