CentOS 安装Wireguard

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

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

1. Wireguard 服务器配置

我用的是CentOS 7 64bit系统,而内核我使用的是 Linux 4.11.2-1.el7.elrepo 这个版本,因为这个版本是支持lotServer的,如果没有lotServer的授权,你也可以用nanqinglang 魔改版BBR。

首先先更新系统内核,我们执行以下命令

sudo yum update -y 

设置 grub 来使使用新内核默认启动

sudo grub2-set-default 0
sudo grub2-mkconfig

启动完毕后我们加入 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 = 56660
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
wg-quick down wg0 && wg-quick up wg0 

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

2.客户端配置

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

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

[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 = 10.0.0.1/32
Endpoint = 服务器端的公网IP:56660

然后,这边需要注意的是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 = 56660
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:56660

在你启动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:56660
PersistentKeepalive = 25

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

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

2.用 wg-quick 调用 wg0.conf 管理 WireGuard

可以把 WireGuard 的配置保存在一个配置文件中(见 1.用 Linode 主机搭建 WireGuard 网络 ),启动虚拟网卡时直接调用。配置文件可以起任何文件名,扩展名必须为 .conf ,默认存储在 /etc/wireguard/ 目录,也可以存储到其它系统默认的查找路径中,以下假设使用的配置文件为 wg0.conf 。

1. wg0.conf 参数

配置文件分两部分,一个是 [Interface] 部分,用于设置本机的参数;一个是 [Peer] 部分,用于设置连接到本机的其它电脑的参数,[Peer] 部分可以包含多个节点。

[Interface]
Address =  
ListenPort =  
PrivateKey =  
DNS =  

[Peer]
AllowedIPs =  
Endpoint =  
PublicKey =  
PersistentKeepalive =  

1.1 [Interface] 部分介绍

  1. Address:设置虚拟网卡的内网地址(可选子网掩码),填写规则:
    • 可以填写任何符合规范(内网地址可选范围见链接 1,2)的内网地址,但要保证不与虚拟局域网内其它电脑的内网地址相同;
    • 可以写两行;(可选)可以写成自己的IPV6地址: Address = fd86:ea04:1115::1/64 。
  2. ListenPort:设置 udp 监听端口,可选范围为 49152 到 65535 。
  3. PrivateKey:填写本机的私钥,默认存储在本机的 /etc/wireguard/private.key 文本中。
  4. PostUp:wg-quick up wg0 启动后执行的内核防火墙( iptables )规则,可以打通 VPN ,服务器端需此参数。
  5. PostDown:wg-quick down wg0 执行删除启动时定义的内核防火墙( iptables )规则 ,服务器端需此参数。
  6. DNS ,设置 DNS ,不正确设置客户端浏览器网页会无法访问外网地址。
  7. SaveConfig:设为 true 之后,每次重启服务(stop service时)都会自动保存 config 。
  8. MTU:一般不用改,1500没问题

1.2 [Peer] 部分介绍

  1. PublicKey :连接来节点的公钥,默认存储在其它电脑的 /etc/wireguard/public.key 文本中。
  2. AllowedIPs:允许连接的内网 ip 地址。
    • 服务器与客户端应该在同一网段,如客户端的IP为 10.0.2.1/24 ,那么这里可以设置为 10.0.2.0/24 ;
    • 可以写多个,用逗号隔开。
    • 如果写为 0.0.0.0/0 表示允许任何节点连接。
  3. Endpoint :节点的外网 IP 及端口号,服务器端不需要填写。
  4. PersistentKeepalive:用来保持连接检查的,每过25s会自动检查连通性,如果IP有变化,也是通过这个自动更新endpoint。

2. 服务器配置实例

以下是一对实际可用的服务器及本地机配置文件。

文件位置:服务器 /etc/wireguard/wg0.conf

[Interface]
Address = 10.0.0.1
ListenPort = 39814
PrivateKey = UA0je5EciV9i2+dSbf5mWAvRkUDVLxE/4ijMb1VnWWw=
DNS = 8.8.8.8
PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[peer]
AllowedIPs = 10.0.0.2 
PublicKey = odnA2mMWrxRuKydr61bOL3xyGcKiD0KY7O33X8Rm4Hg= 

注:服务器端必须填写路由规则,也就是 PostUp 、PostDown ;如果执行 ifconfig 显示服务器的网卡设备名称不是 eth0 而是别的名称 ,需要把 PostUp 与 PostDown 参数中的 eth0 改为你设备的名称。

3. 本地机可用配置

文件位置:本地机 /etc/wireguard/wg0.conf

[Interface]
Address = 10.0.0.2
ListenPort = 39815
PrivateKey = +JzG3eOIR0gNPzU3IDIDSR0sYgHKGH3Otr4ronpAVHw=
DNS = 8.8.8.8

[Peer]
AllowedIPs = 0.0.0.0/0
Endpoint = 139.162.88.79:39814
PublicKey = hIGcDUcR1Ob+GyLKQ9NJhx4qjWmXpOcKURXWkMDYKjc=
PersistentKeepalive = 25

4. 虚拟网络的启动与关闭

启动虚拟网络执行 wg-quick up wg0 ,正确执行后显示如下:

[#] ip link add wg1 type wireguard
[#] wg setconf wg1 /dev/fd/63
[#] ip address add 10.0.0.2 dev wg1
[#] ip link set mtu 1420 dev wg1
[#] ip link set wg1 up
[#] resolvconf -a tun.wg1 -m 0 -x
[#] wg set wg1 fwmark 51820
[#] ip -4 route add 0.0.0.0/0 dev wg1 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0

关闭虚拟网络执行 wg-quick down wg0 ,正确执行后显示如下:

[#] ip -4 rule delete table 51820
[#] ip -4 rule delete table main suppress_prefixlength 0
[#] ip link delete dev wg1
[#] resolvconf -d tun.wg1

5. 参考链接

https://github.com/wgredlong/WireGuard

参考 https://www.wireguard.com/install/
参考 https://kotori.net/2018/10/21/centos-安装最新版的wireguard/

发表回复

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