关于云计算:Wireguard-全互联模式full-mesh配置指南

53次阅读

共计 10337 个字符,预计需要花费 26 分钟才能阅读完成。

上篇文章给大家介绍了如何应用 wg-gen-web 来方便快捷地治理 WireGuard 的配置和秘钥,文末埋了两个坑:一个是 WireGuard 的全互联模式(full mesh),另一个是应用 WireGuard 作为 Kubernetes 的 CNI 插件。明天就来填第一个坑。

首先解释一下什么是全互联模式(full mesh),全互联模式其实就是一种网络连接模式,即所有结点之间都间接连贯,不会通过第三方节点直达流量。和后面提到的点对多点架构 其实是一个意思。

1. 全互联模式架构与配置

在 WireGuard 的世界里没有 Server 和 Client 之分,所有的节点都是 Peer。大家应用 WireGuard 的惯例做法是找一个节点作为直达节点,也就是 VPN 网关,而后所有的节点都和这个网关进行连贯,所有节点之间都通过这个网关来进行通信。这种架构中,为了不便了解,咱们能够把网关看成 Server,其余的节点看成 Client,但实际上是不辨别 Server 和 Client 的。

举个例子,假如有 4 个节点,别离是 A/B/C/D,且这 4 个节点都不在同一个局域网,惯例的做法是选取一个节点作为 VPN 网关,架构如图:

这种架构的毛病我在之前的文章里也介绍过了,毛病相当显著:

  • 当 Peer 越来越多时,VPN 网关就会变成垂直扩大的瓶颈。
  • 通过 VPN 网关转发流量的老本很高,毕竟云服务器的流量很贵。
  • 通过 VPN 网关转发流量会带来很高的提早。

那么全互联模式是什么样的架构呢?还是假如有 A/B/C/D 四个节点,每个节点都和其余节点建设 WireGuard 隧道,架构如图:

这种架构带来的间接劣势就是快!任意一个 Peer 和其余所有 Peer 都是直连,无需直达流量。那么在 WireGuard 的场景下如何实现全互联模式呢?其实这个问题不难,难点在于配置的繁琐水平,本文的次要指标就是精简 WireGuard 全互联模式的配置流程。为了让大家更容易了解,咱们还是先通过架构图来体现各个 Peer 的配置:

配置高深莫测,每个 Peer 和其余所有 Peer 都是直连,基本没有 VPN 网关这种角色。当然,事实世界的情况没有图中这么简略,有些 Peer 是没有公网 IP 的,躲在 NAT 前面,这里又分两种状况:

  1. NAT 受本人管制。这种状况能够在公网进口设置端口转发,其余 Peer 就能够通过这个公网 IP 和端口连贯以后 Peer。如果公网 IP 是动静的,能够通过 DDNS 来解决,但 DDNS 会呈现一些小问题,解决办法能够参考 WireGuard 的优化。
  2. NAT 不受本人管制。这种状况无奈在公网进口设置端口转发,只能通过 UDP 打洞来实现互联,具体能够参考 WireGuard 教程:应用 DNS-SD 进行 NAT-to-NAT 穿透。

接着上述计划再更进一步,买通所有 Peer 的公有网段,让任意一个 Peer 能够拜访其余所有 Peer 的公有网段的机器 。上述配置只是初步实现了全互联,让每个 Peer 能够互相拜访彼此而已,要想互相拜访公有网段,还得持续减少配置,还是间接看图:

红色字体局部就是新增的配置,示意容许拜访相应 Peer 的公有网段,就是这么简略。具体的配置步骤请看下一节。

2. 全互联模式最佳实际

对如何配置有了清晰的思路之后,接下来就能够进入实际环节了。我不打算从 WireGuard 装置开始讲起,而是以前几篇文章为根底添砖加瓦。所以我倡议读者先按程序看下这两篇文章:

  • WireGuard 疾速装置教程
  • WireGuard 配置教程:应用 wg-gen-web 来治理 WireGuard 的配置

咱们间接从配置开始说起。手撸配置的做法是不明智的,因为当节点增多之后工作量会很大,我还是倡议通过图形化界面来治理配置,首选 wg-gen-web。

当初还是假如有上节所述的 4 个 Peer,咱们须要从中筛选一个 Peer 来装置 wg-gen-web,而后通过 wg-gen-web 来生成配置。筛选哪个 Peer 无所谓,这个没有非凡限度,这里假如筛选 AWS 来装置 wg-gen-web

装置的步骤间接略过,不是本文的重点,不分明的能够浏览我之前的文章 WireGuard 配置教程:应用 wg-gen-web 来治理 WireGuard 的配置。Server 配置如图:

生成 Azure 的配置:

SUBMIT 之后再查看 wg0.conf 的内容:

$ cat /etc/wireguard/wg0.conf

# Updated: 2021-02-24 07:34:23.805535396 +0000 UTC / Created: 2021-02-24 07:24:02.208816462 +0000 UTC
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = eEnHKGkGksx0jqrEDogjRj5l417BrEA39lr7WW9L9U0=

PreUp = echo WireGuard PreUp
PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -I FORWARD -o wg0 -j ACCEPT; iptables -I INPUT -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -D INPUT -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# Azure /  / Updated: 2021-02-24 07:43:52.717385042 +0000 UTC / Created: 2021-02-24 07:43:52.717385042 +0000 UTC
[Peer]
PublicKey = OzdH42suuOpVY5wxPrxM+rEAyEPFg2eL0ZI29N7eSTY=
PresharedKey = 1SyJuVp16Puh8Spyl81EgD9PJZGoTLJ2mOccs2UWDvs=
AllowedIPs = 10.0.0.2/32

这里无奈通过图形化界面增加公有网段的配置,咱们能够间接批改 wg0.conf 增加配置:

$ cat /etc/wireguard/wg0.conf

# Updated: 2021-02-24 07:34:23.805535396 +0000 UTC / Created: 2021-02-24 07:24:02.208816462 +0000 UTC
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = eEnHKGkGksx0jqrEDogjRj5l417BrEA39lr7WW9L9U0=

PreUp = echo WireGuard PreUp
PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -I FORWARD -o wg0 -j ACCEPT; iptables -I INPUT -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -D INPUT -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# Azure /  / Updated: 2021-02-24 07:43:52.717385042 +0000 UTC / Created: 2021-02-24 07:43:52.717385042 +0000 UTC
[Peer]
PublicKey = OzdH42suuOpVY5wxPrxM+rEAyEPFg2eL0ZI29N7eSTY=
PresharedKey = 1SyJuVp16Puh8Spyl81EgD9PJZGoTLJ2mOccs2UWDvs=
AllowedIPs = 10.0.0.2/32
AllowedIPs = 192.168.20.0/24

下载 Azure 配置文件:

能够看到配置文件内容为:

$ cat Azure.conf

[Interface]
Address = 10.0.0.2/32
PrivateKey = IFhAyIWY7sZmabsqDDESj9fqoniE/uZFNIvAfYHjN2o=


[Peer]
PublicKey = JgvmQFmhUtUoS3xFMFwEgP3L1Wnd8hJc3laJ90Gwzko=
PresharedKey = 1SyJuVp16Puh8Spyl81EgD9PJZGoTLJ2mOccs2UWDvs=
AllowedIPs = 10.0.0.1/32, 192.168.10.0/24
Endpoint = aws.com:51820

先不急着批改,一鼓作气生成所有 Peer 的配置文件:

这时你会发现 wg0.conf 中曾经蕴含了所有 Peer 的配置:

$ cat /etc/wireguard/wg0.conf

# Updated: 2021-02-24 07:57:00.745287945 +0000 UTC / Created: 2021-02-24 07:24:02.208816462 +0000 UTC
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = eEnHKGkGksx0jqrEDogjRj5l417BrEA39lr7WW9L9U0=

PreUp = echo WireGuard PreUp
PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -I FORWARD -o wg0 -j ACCEPT; iptables -I INPUT -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -D INPUT -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# Aliyun /  / Updated: 2021-02-24 07:57:45.941019829 +0000 UTC / Created: 2021-02-24 07:57:45.941019829 +0000 UTC
[Peer]
PublicKey = kVq2ATMTckCKEJFF4TM3QYibxzlh+b9CV4GZ4meQYAo=
PresharedKey = v818B5etpRlyVYHGUrv9abM5AIQK5xeoCizdWj1AqcE=
AllowedIPs = 10.0.0.4/32

# GCP /  / Updated: 2021-02-24 07:57:27.3555646 +0000 UTC / Created: 2021-02-24 07:57:27.3555646 +0000 UTC
[Peer]
PublicKey = qn0Xfyzs6bLKgKcfXwcSt91DUxSbtATDIfe4xwsnsGg=
PresharedKey = T5UsVvOEYwfMJQDJudC2ryKeCpnO3RV8GFMoi76ayyI=
AllowedIPs = 10.0.0.3/32

# Azure /  / Updated: 2021-02-24 07:57:00.751653134 +0000 UTC / Created: 2021-02-24 07:43:52.717385042 +0000 UTC
[Peer]
PublicKey = OzdH42suuOpVY5wxPrxM+rEAyEPFg2eL0ZI29N7eSTY=
PresharedKey = 1SyJuVp16Puh8Spyl81EgD9PJZGoTLJ2mOccs2UWDvs=
AllowedIPs = 10.0.0.2/32
AllowedIPs = 192.168.20.0/24

持续批改 wg0.conf 增加公有网段配置:

cat /etc/wireguard/wg0.conf

# Updated: 2021-02-24 07:57:00.745287945 +0000 UTC / Created: 2021-02-24 07:24:02.208816462 +0000 UTC
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = eEnHKGkGksx0jqrEDogjRj5l417BrEA39lr7WW9L9U0=

PreUp = echo WireGuard PreUp
PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -I FORWARD -o wg0 -j ACCEPT; iptables -I INPUT -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -D INPUT -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# Aliyun /  / Updated: 2021-02-24 07:57:45.941019829 +0000 UTC / Created: 2021-02-24 07:57:45.941019829 +0000 UTC
[Peer]
PublicKey = kVq2ATMTckCKEJFF4TM3QYibxzlh+b9CV4GZ4meQYAo=
PresharedKey = v818B5etpRlyVYHGUrv9abM5AIQK5xeoCizdWj1AqcE=
AllowedIPs = 10.0.0.4/32
AllowedIPs = 192.168.40.0/24

# GCP /  / Updated: 2021-02-24 07:57:27.3555646 +0000 UTC / Created: 2021-02-24 07:57:27.3555646 +0000 UTC
[Peer]
PublicKey = qn0Xfyzs6bLKgKcfXwcSt91DUxSbtATDIfe4xwsnsGg=
PresharedKey = T5UsVvOEYwfMJQDJudC2ryKeCpnO3RV8GFMoi76ayyI=
AllowedIPs = 10.0.0.3/32
AllowedIPs = 192.168.30.0/24

# Azure /  / Updated: 2021-02-24 07:57:00.751653134 +0000 UTC / Created: 2021-02-24 07:43:52.717385042 +0000 UTC
[Peer]
PublicKey = OzdH42suuOpVY5wxPrxM+rEAyEPFg2eL0ZI29N7eSTY=
PresharedKey = 1SyJuVp16Puh8Spyl81EgD9PJZGoTLJ2mOccs2UWDvs=
AllowedIPs = 10.0.0.2/32
AllowedIPs = 192.168.20.0/24

当初问题就好办了,咱们只需将 wg0.conf 中的 Aliyun 和 GCP 局部的配置拷贝到 Azure 的配置中,并删除 PresharedKey 的配置,再增加 Endpoint 的配置和 PostUP/PostDown 规定:

$ cat Azure.conf

[Interface]
Address = 10.0.0.2/32
PrivateKey = IFhAyIWY7sZmabsqDDESj9fqoniE/uZFNIvAfYHjN2o=

PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -I FORWARD -o wg0 -j ACCEPT; iptables -I INPUT -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -D INPUT -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE


[Peer]
PublicKey = JgvmQFmhUtUoS3xFMFwEgP3L1Wnd8hJc3laJ90Gwzko=
PresharedKey = 1SyJuVp16Puh8Spyl81EgD9PJZGoTLJ2mOccs2UWDvs=
AllowedIPs = 10.0.0.1/32, 192.168.10.0/24
Endpoint = aws.com:51820

# Aliyun /  / Updated: 2021-02-24 07:57:45.941019829 +0000 UTC / Created: 2021-02-24 07:57:45.941019829 +0000 UTC
[Peer]
PublicKey = kVq2ATMTckCKEJFF4TM3QYibxzlh+b9CV4GZ4meQYAo=
AllowedIPs = 10.0.0.4/32
AllowedIPs = 192.168.40.0/24
Endpoint = aliyun.com:51820

# GCP /  / Updated: 2021-02-24 07:57:27.3555646 +0000 UTC / Created: 2021-02-24 07:57:27.3555646 +0000 UTC
[Peer]
PublicKey = qn0Xfyzs6bLKgKcfXwcSt91DUxSbtATDIfe4xwsnsGg=
AllowedIPs = 10.0.0.3/32
AllowedIPs = 192.168.30.0/24
Endpoint = gcp.com:51820

同理,GCP 的配置如下:

$ cat GCP.conf

[Interface]
Address = 10.0.0.3/32
PrivateKey = oK2gIMBAob67Amj2gT+wR9pzkbqWGNtq794nOoD3i2o=

PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -I FORWARD -o wg0 -j ACCEPT; iptables -I INPUT -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -D INPUT -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE


[Peer]
PublicKey = JgvmQFmhUtUoS3xFMFwEgP3L1Wnd8hJc3laJ90Gwzko=
PresharedKey = T5UsVvOEYwfMJQDJudC2ryKeCpnO3RV8GFMoi76ayyI=
AllowedIPs = 10.0.0.1/32, 192.168.10.0/24
Endpoint = aws.com:51820

# Aliyun /  / Updated: 2021-02-24 07:57:45.941019829 +0000 UTC / Created: 2021-02-24 07:57:45.941019829 +0000 UTC
[Peer]
PublicKey = kVq2ATMTckCKEJFF4TM3QYibxzlh+b9CV4GZ4meQYAo=
AllowedIPs = 10.0.0.4/32
AllowedIPs = 192.168.40.0/24
Endpoint = aliyun.com:51820

# Azure /  / Updated: 2021-02-24 07:57:00.751653134 +0000 UTC / Created: 2021-02-24 07:43:52.717385042 +0000 UTC
[Peer]
PublicKey = OzdH42suuOpVY5wxPrxM+rEAyEPFg2eL0ZI29N7eSTY=
PresharedKey = 1SyJuVp16Puh8Spyl81EgD9PJZGoTLJ2mOccs2UWDvs=
AllowedIPs = 10.0.0.2/32
AllowedIPs = 192.168.20.0/24
Endpoint = azure.com:51820

Aliyun 的配置如下:

$ cat Aliyun.conf

[Interface]
Address = 10.0.0.4/32
PrivateKey = +A1ZESJjmHuskB4yKqTcqC3CB24TwBKHGSffWDHxI28=

PostUp = iptables -I FORWARD -i wg0 -j ACCEPT; iptables -I FORWARD -o wg0 -j ACCEPT; iptables -I INPUT -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -D INPUT -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE


[Peer]
PublicKey = JgvmQFmhUtUoS3xFMFwEgP3L1Wnd8hJc3laJ90Gwzko=
PresharedKey = v818B5etpRlyVYHGUrv9abM5AIQK5xeoCizdWj1AqcE=
AllowedIPs = 10.0.0.1/32, 192.168.10.0/24
Endpoint = aws.com:51820

# GCP /  / Updated: 2021-02-24 07:57:27.3555646 +0000 UTC / Created: 2021-02-24 07:57:27.3555646 +0000 UTC
[Peer]
PublicKey = qn0Xfyzs6bLKgKcfXwcSt91DUxSbtATDIfe4xwsnsGg=
AllowedIPs = 10.0.0.3/32
AllowedIPs = 192.168.30.0/24
Endpoint = gcp.com:51820

# Azure /  / Updated: 2021-02-24 07:57:00.751653134 +0000 UTC / Created: 2021-02-24 07:43:52.717385042 +0000 UTC
[Peer]
PublicKey = OzdH42suuOpVY5wxPrxM+rEAyEPFg2eL0ZI29N7eSTY=
PresharedKey = 1SyJuVp16Puh8Spyl81EgD9PJZGoTLJ2mOccs2UWDvs=
AllowedIPs = 10.0.0.2/32
AllowedIPs = 192.168.20.0/24
Endpoint = azure.com:51820

最初在各自的节点上通过各自的配置文件把 WireGuard 跑起来,就搞定了。

整个图形化界面配置过程中会呈现好几个中央须要手动调整配置,这是因为 wg-gen-web 的性能目前还不欠缺,须要给它肯定的工夫。如果你无奈承受手动调整配置,能够尝试另外一个我的项目:wg-meshconf,这个我的项目专门用来生成 mesh 的配置,但没有图形化治理界面。各有利弊吧,大家自行抉择。

3. 总结

我晓得,很多人可能还是一头雾水,这玩意儿的利用场景有哪些?我轻易举个简略的例子,假如你在云服务器上部署了 Kubernetes 集群,能够用本地的机器和云服务器的某台节点组建 WireGuard 隧道,而后在本地的 AllowedIPs 中加上 Pod 网段和 Service 网段,就能够那啥了,你懂吧?

好吧,又埋了一个坑,对于如何在家中间接拜访云服务器 k8s 集群的 Pod IP 和 Service IP,前面会有专门的文章给大家解说,尽管我也不确定是多久当前。。


Kubernetes 1.18.2 1.17.5 1.16.9 1.15.12 离线安装包公布地址 http://store.lameleg.com,欢送体验。应用了最新的 sealos v3.3.6 版本。作了主机名解析配置优化,lvscare 挂载 /lib/module 解决开机启动 ipvs 加载问题,修复 lvscare 社区 netlink 与 3.10 内核不兼容问题,sealos 生成百年证书等个性。更多个性 https://github.com/fanux/sealos。欢送扫描下方的二维码退出钉钉群,钉钉群曾经集成 sealos 的机器人实时能够看到 sealos 的动静。

正文完
 0