服务器集群(二)WireGuard组网

本文章已收录至本站专栏
服务器集群系列

1、前言

1.1、服务器介绍

云厂商地域公网IPWireGuard虚拟IP操作系统内核版本
腾讯云中国上海1.x.x.x192.168.100.1CentOS 7.9.2009Kernel 5.18.15-1.el7.elrepo.x86_64
腾讯云中国上海121.x.x.x192.168.100.2Ubuntu 20.04.4 LTS x86_64Kernel 5.4.0-123-generic
腾讯云中国香港150.x.x.x192.168.100.3CentOS 7.9.2009Kernel 5.18.15-1.el7.elrepo.x86_64
腾讯云美国硅谷23.x.x.x192.168.100.4CentOS 7.9.2009Kernel 5.18.15-1.el7.elrepo.x86_64
腾讯云美国硅谷49.x.x.x192.168.100.5Ubuntu 20.04.4 LTS x86_64Kernel 5.4.0-123-generic

1.2、WireGuard介绍

WireGuard是由Jason A. Donenfeld开发的开放源代码VPN程序及协议,基于Linux内核实现,利用Curve25519进行密钥交换,ChaCha20用于加密,Poly1305用于数据认证,BLAKE2用于散列函数运算,支持IPv4和IPv6的第3层。
——维基百科

2、升级内核

WireGuard需要Kernel 5.x及以上内核。

CentOS:

Bash
1
2
yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum install --enablerepo=elrepo-kernel kernel-ml

Ubuntu:

Bash
1
sudo apt-get upgrade linux-image-generic

完成后,执行:

Bash
1
cat /boot/grub2/grub.cfg | grep -v rescue | grep ^menuentry

查看安装的内核,以Kernel 5.18.15为例,执行:

Bash
1
grub2-set-default 'CentOS Linux (5.18.15-1.el7.elrepo.x86_64) 7 (Core)'

并重启。

3、防火墙设置

先执行

Bash
1
route -n

记录返回的网段。

执行

Bash
1
2
3
4
5
6
7
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wg0 -o wg0 -m conntrack --ctstate NEW -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.100.1/24 -o eth0 -j MASQUERADE

注意:

  • 请把192.168.100.1/24替换为你想要的虚拟网段,不可和上一步返回的网段重复。
  • 可能重复的网段:192.168.x.0/24,10.0.x.0/24,172.x.0.0/16
  • 请把wg0替换你想要的虚拟网卡名称,此处可以自定义,但是需要注意把下文中的wg0全部替换掉。

建议:

在各节点对其他节点开放

Text
1
2
TCP 1-65535
UDP 1-65535

必需:

在各节点对其他节点开放

Text
1
UDP 5418

注意:5418为WireGuard监听端口,可以自定义。

4、安装WireGuard

CentOS:

Bash
1
2
yum install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum install yum-plugin-elrepo kmod-wireguard wireguard-tools -y

Ubuntu:

Bash
1
sudo apt install wireguard

5、配置WireGuard

执行

Bash
1
2
3
mkdir /etc/wireguard/
cd /etc/wireguard/
wg genkey | tee privatekey | wg pubkey > publickey

创建密钥,查看密钥:

Bash
1
cat privatekey publickey

返回类似:

Text
1
2
EMWcI01iqM4zkb7xfbaaxxxxxxxxDo2GJUA=
0ay8WfGOIHndWklSIVBqrsp5LDWxxxxxxxxxxxxxxQ=

即代表创建成功。

5.1、自动配置

配置文件较复杂,这里提供一个PHP脚本:

此处内容需要评论回复(自动审核)或加入 QQ 技术交流群(立即获得内容)后方可阅读。赞助(二维码在文章下方)后联系作者可一次性解锁所有(包括之后的新文章)。

放在某网站下,例如https://example.com/wireguard/config.php

/etc/wireguard/wan
/etc/wireguard/lan

分别填入该服务器的公网IP和WireGuard虚拟IP

即可执行

Bash
1
2
cd /etc/wireguard/
wget -O --no-check-certificate https://example.com/wireguard/config.php?ip=$(cat /etc/wireguard/lan) && wg-quick up wg0

5.2、手动配置

每个配置文件都为

/etc/wireguard/wg0.conf

需要填入一个:

Text
1
2
3
4
[Interface]
PrivateKey = EMWcI01iqM4zkb7xfbaaxxxxxxxxDo2GJUA=
Address = 192.168.100.1
ListenPort = 5418

即本机的私钥虚拟IP绑定端口

和若干个

Text
1
2
3
4
[Peer]
PublicKey = 3izpVbZgPhlM+S5szOogTDTxxxxxxxxxuKuDGn4=
EndPoint = x.x.x.x:5418
AllowedIPs = 192.168.100.x/32

即集群内其他机器的公钥公网IP:绑定端口虚拟IP

5.3、错误排查

如果提示

Text
1
2
3
4
5
[#] ip link add wg0 type wireguard
RTNETLINK answers: Operation not supported
Unable to access interface: Protocol not supported
[#] ip link delete dev wg0
Cannot find device "wg0"

就代表内核版本过低,请检查是否已升级,或是否设置为默认启动内核。

如果没有报错,就组网完成了。

6、调试

Bash
1
2
3
4
5
6
wg-quick up wg0 # 启动
wg-quick down wg0 # 关闭
systemctl enable wg-quick@wg0 # 开启开机自启动
systemctl disable wg-quick@wg0 # 关闭开机自启动
wg syncconf wg0 <(wg-quick strip wg0) # 热重载 不影响已有连接
wg # 查看当前配置

完成后,可以通过

Bash
1
2
3
4
telnet 192.168.100.x 22
telnet 192.168.100.x 3306
curl 192.168.100.x
curl https://192.168.100.x

等方式检测连通性。检测时,测试的端口无需在外网开放,因为通过WireGuard连接。

另外,也可以通过

Bash
1
route -n

列出的路由表检测是否已完成组网。

7、参考

多云搭建 K3S 集群
https://www.cnsre.cn/posts/211119132529/

服务器集群(二)WireGuard组网

https://blog.tsinbei.com/archives/621/

文章作者
Hsukqi Lee
发布于

2022-08-06

修改于

2022-08-29

许可协议

CC BY-NC-ND 4.0

评论

昵称
邮箱
网址
1 条

Hsukqi Lee

Hsukqi Lee 作者

大家注意啦~这篇文章的隐藏内容为空,如果需要获取php源码,可以打赏之后再评论联系我哦。

  回复