墨少离 - 个人小站,分享一些资源以及心得~ - centos8 Wireguard https://www.msl.la/tag/centos8-Wireguard/ CentOS8 安装最新版的Wireguard https://www.msl.la/archives/89/ 2021-01-08T17:30:00+08:00 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和PrivateKeymkdir /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 = truePrivateKey则是你刚生成的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)