WireGuard Mesh 组网示例

WireGuard mesh 组网

为了能够遵循此 WireGuard Mesh VPN 配置教程,必须准备 4 台 Ubuntu 22.04 Linux 服务器,这些服务器具有静态公共 IP 地址并可从 Internet 访问 UDP/51820。我们将为 VPN 节点使用以下名称和 IP 地址:

NamePublic IPAllowed IPsLocal Network
Node1120.11.11.1010.0.1.1192.168.11.0/24
Node2120.11.12.1010.0.2.1192.168.12.0/24
Node3120.11.13.1010.0.3.1192.168.13.0/24
Node4120.11.14.1010.0.4.1192.168.14.0/24

图 WireGuard 网状 VPN 拓扑
在这里插入图片描述

测试环境:

VMware Workstation 新建四个仅主机类型网络 VMnet11~VMnet14,分别分配给4台服务器,作为第二块网卡用于wireguard public ip组网。
在这里插入图片描述
node1节点 vmware workstation 虚拟机示例配置如下:

  • 第一块网卡ens33为NAT模式(不属于wireguard网络范围,仅用于方便连接外网下载安装包)
  • 第二块网卡ens37为仅主机模式(分配VMnet11~VMnet14),模拟公有云云主机绑定的公网IP地址。
  • 第三块网卡ens38为LAN区段模式(隔离网络,仅同区段可互访),用于local network,模拟公有云云主机VPC私有IP地址。

在这里插入图片描述

node1节点网络配置示例:

root@node1:~# cat /etc/netplan/00-installer-config.yaml 
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens33:
      addresses:
      - 192.168.95.11/24
      nameservers:
        addresses:
        - 223.5.5.5
        - 223.6.6.6
        search: []
      routes:
        - to: default
          via: 192.168.95.2
          metric: 100
    ens37:
      addresses:
      - 120.11.11.10/24
      routes:
        - to: default
          via: 120.11.11.1
          metric: 200
    ens38:
      addresses:
      - 192.168.11.10/24
  version: 2

按照以下主要步骤配置 WireGuard Mesh VPN:

  1. 在 Ubuntu 服务器上安装 WireGuard
  2. 手动生成私钥和公钥
  3. VPN节点局域网IP转发
  4. 手动生成 WireGuard 配置文件
  5. 启动 WireGuard 服务器并在引导时启用它
  6. 验证 Mesh VPN 连接

警告:以 root 身份或通过 sudo 命令对 Linux 系统进行特权访问。

下面给出的所有命令都应使用 root 权限执行,可以直接作为 root 用户执行,也可以使用 sudo 命令执行。

1.在Ubuntu服务器上安装WireGuard

Ubuntu 22.04 Linux 服务器将配置为 WireGuard VPN 节点。按照以下步骤轻松在所有 Ubuntu VPN 节点上安装 WireGuard:

1、通过运行以下命令确保 Ubuntu 节点是最新的:

sudo apt update && sudo apt upgrade -y

2、通过运行以下命令来安装 WireGuard 本身及其所有依赖项:

sudo apt install -y wireguard wireguard-tools

安装 WireGuard 后,请按照以下步骤进一步配置服务器。

1. 手动生成私钥和公钥

WireGuard 的主要优点之一是它基于最先进的加密原语。它允许通过使用一对加密密钥加密连接来创建安全的 VPN 隧道。每个对等方都必须拥有自己的私钥和公钥,以确保双向通信的安全。要使用 WireGuard,每个节点必须生成自己的密钥对,然后交换公钥。

请注意,在 WireGuard VPN 上,私钥永远不会离开其节点。其重要性在于,私钥具有在 WireGuard 会话协商期间可能假定该节点身份的唯一能力。因此,只有该特定节点才有能力对源自其自身的数据包进行编码或对发往自身的数据包进行解码。记住这一点至关重要:WireGuard 节点连接遵循零信任网络访问 (ZTNA) 原则,从头到尾进行加密。

可以按照以下步骤为所有Mesh VPN 节点生成私钥和公钥对:

# node1
wg genkey | sudo tee /etc/wireguard/node1_private.key | wg pubkey | sudo tee /etc/wireguard/node1_public.key

# node2
wg genkey | sudo tee /etc/wireguard/node2_private.key | wg pubkey | sudo tee /etc/wireguard/node2_public.key

# node3
wg genkey | sudo tee /etc/wireguard/node3_private.key | wg pubkey | sudo tee /etc/wireguard/node3_public.key

# node4
wg genkey | sudo tee /etc/wireguard/node4_private.key | wg pubkey | sudo tee /etc/wireguard/node4_public.key

这会将私钥和公钥保存到 /etc/wireguard 目录中。

警告:私钥不应与任何人共享,并应始终保持安全。

TIP:请记下以下步骤中将用于更新 WireGuard 配置文件的密钥对。

这里作为演示,在node1生成所有公钥和私钥并分发到所有其他节点。实际配置建议在各个节点单独生成公钥和私钥,然后将本地公钥分发到其他节点。

root@node1:~# ls /etc/wireguard/
node1_private.key  node1_public.key  node2_private.key  node2_public.key  node3_private.key  node3_public.key  node4_private.key  node4_public.key

root@node1:~# scp /etc/wireguard/* 120.11.12.10:/etc/wireguard
root@node1:~# scp /etc/wireguard/* 120.11.13.10:/etc/wireguard
root@node1:~# scp /etc/wireguard/* 120.11.14.10:/etc/wireguard

2. VPN节点通过其他VPN节点访问局域网

您可能希望通过 WireGuard 为所有 VPN 节点授予对每个站点网络/LAN 的访问权限。为此,您可能需要配置防火墙规则,包括 IP 转发和 NAT。

为了使 VPN 服务器能够在 VPN 节点和 LAN 之间路由数据包,您必须在所有 WireGuard 节点上启用 IP 转发。您可以按照下面列出的说明在所有节点上启用 IP 转发:

执行以下命令:

cat <<EOF | sudo tee /etc/sysctl.d/wireguard.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.proxy_arp = 1
EOF
sudo sysctl --system

3.手动生成WireGuard配置文件

开始配置 WireGuard,方法是在每个节点上的 /etc/wireguard 文件夹中创建一个名为 wg0.conf 的新配置文件。

Node1 生成的 WireGuard VPN 配置文件如下所示:

cat >/etc/wireguard/wg0.conf<<EOF
[Interface]
# Name: NODE1
Address = 10.0.1.1/32
PrivateKey = $(cat /etc/wireguard/node1_private.key)
ListenPort = 51820
PreUp = echo WireGuard PreUp
PostUp = iptables -I FORWARD -i %i -j ACCEPT; iptables -I FORWARD -o %i -j ACCEPT; iptables -I INPUT -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens37 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -D INPUT -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens37 -j MASQUERADE

[Peer]
# Name: NODE2
PublicKey = $(cat /etc/wireguard/node2_public.key)
Endpoint = 120.11.12.10:51820
AllowedIPs = 10.0.2.1/32,192.168.12.0/24

[Peer]
# Name: NODE3
PublicKey = $(cat /etc/wireguard/node3_public.key)
Endpoint = 120.11.13.10:51820
AllowedIPs = 10.0.3.1/32,192.168.13.0/24

[Peer]
# Name: NODE4
PublicKey = $(cat /etc/wireguard/node4_public.key)
Endpoint = 120.11.14.10:51820
AllowedIPs = 10.0.4.1/32,192.168.14.0/24
EOF

WireGuard 配置文件中的设置说明如下:

  • PrivateKey :VPN节点的私钥,可以在之前生成的 /etc/wireguard/node#n_private.key 文件中找到。
  • Address :定义 WireGuard 节点的私有 IPv4 和 IPv6 地址。 VPN 网络中的每个对等点都应该有一个唯一的 IP 地址。
  • ListenPort :指定 WireGuard 将用于传入连接的端口。可自由选择高端口范围。如果不指定端口,则默认为 51820/UDP
  • PublicKey :对应VPN对等节点的公钥,可以在之前生成的 /etc/wireguard/node#n_public.key 文件中找到。
  • Endpoint :对应 VPN 对等节点的公共/WAN IP 地址和端口号。
  • AllowedIPs :相应 VPN 对等节点可访问或路由的网络和 IP 地址。您可以在列表中设置 IP 地址范围,以逗号分隔。
  • PersistentKeepalive :每 25 秒向对等方发送一个经过身份验证的空数据包,以保持连接处于活动状态。如果未启用 PersistentKeepalive,VPN 节点可能无法相互 ping 通。

Node2 生成的 WireGuard VPN 配置文件如下所示:

cat >/etc/wireguard/wg0.conf<<EOF
[Interface]
# Name: NODE2
Address = 10.0.2.1/32
PrivateKey = $(cat /etc/wireguard/node2_private.key)
ListenPort = 51820
PreUp = echo WireGuard PreUp
PostUp = iptables -I FORWARD -i %i -j ACCEPT; iptables -I FORWARD -o %i -j ACCEPT; iptables -I INPUT -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens37 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -D INPUT -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens37 -j MASQUERADE

[Peer]
# Name: NODE1
PublicKey = $(cat /etc/wireguard/node1_public.key)
Endpoint = 120.11.11.10:51820
AllowedIPs = 10.0.1.1/32,192.168.11.0/24

[Peer]
# Name: NODE3
PublicKey = $(cat /etc/wireguard/node3_public.key)
Endpoint = 120.11.13.10:51820
AllowedIPs = 10.0.3.1/32,192.168.13.0/24

[Peer]
# Name: NODE4
PublicKey = $(cat /etc/wireguard/node4_public.key)
Endpoint = 120.11.14.10:51820
AllowedIPs = 10.0.4.1/32,192.168.14.0/24
EOF

Node3 生成的 WireGuard VPN 配置文件如下所示:

cat >/etc/wireguard/wg0.conf<<EOF
[Interface]
# Name: NODE3
Address = 10.0.3.1/32
PrivateKey = $(cat /etc/wireguard/node3_private.key)
ListenPort = 51820
PreUp = echo WireGuard PreUp
PostUp = iptables -I FORWARD -i %i -j ACCEPT; iptables -I FORWARD -o %i -j ACCEPT; iptables -I INPUT -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens37 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -D INPUT -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens37 -j MASQUERADE

[Peer]
# Name: NODE1
PublicKey = $(cat /etc/wireguard/node1_public.key)
Endpoint = 120.11.11.10:51820
AllowedIPs = 10.0.1.1/32,192.168.11.0/24

[Peer]
# Name: NODE2
PublicKey = $(cat /etc/wireguard/node2_public.key)
Endpoint = 120.11.12.10:51820
AllowedIPs = 10.0.2.1/32,192.168.12.0/24

[Peer]
# Name: NODE4
PublicKey = $(cat /etc/wireguard/node4_public.key)
Endpoint = 120.11.14.10:51820
AllowedIPs = 10.0.4.1/32,192.168.14.0/24
EOF

Node4 生成的 WireGuard VPN 配置文件如下所示:

cat >/etc/wireguard/wg0.conf<<EOF
[Interface]
# Name: NODE4
Address = 10.0.4.1/32
PrivateKey = $(cat /etc/wireguard/node4_private.key)
ListenPort = 51820
PreUp = echo WireGuard PreUp
PostUp = iptables -I FORWARD -i %i -j ACCEPT; iptables -I FORWARD -o %i -j ACCEPT; iptables -I INPUT -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens37 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -D INPUT -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens37 -j MASQUERADE

[Peer]
# Name: NODE1
PublicKey = $(cat /etc/wireguard/node1_public.key)
Endpoint = 120.11.11.10:51820
AllowedIPs = 10.0.1.1/32,192.168.11.0/24

[Peer]
# Name: NODE2
PublicKey = $(cat /etc/wireguard/node2_public.key)
Endpoint = 120.11.12.10:51820
AllowedIPs = 10.0.2.1/32,192.168.12.0/24

[Peer]
# Name: NODE3
PublicKey = $(cat /etc/wireguard/node3_public.key)
Endpoint = 120.11.13.10:51820
AllowedIPs = 10.0.3.1/32,192.168.13.0/24
EOF

4. 启动 WireGuard Server 并在启动时启用它

现在我们已经完成了配置,准备启动服务器。 WireGuard 有一个名为 wg-quick 的方便包装器,可用于启动新接口,而无需了解配置详细信息。

在所有 VPN 节点上启动 WireGuard 服务。要启动 WireGuard 服务并启动 WireGuard 接口 ( wg0 ),请在服务器上运行以下命令:

sudo wg-quick up wg0

这将加载配置文件 /etc/wireguard/wg0.conf ,成功启动界面后您应该会看到如下所示的输出:

[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.1.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0

要停止 VPN 节点上的 WireGuard 服务,请运行以下命令:

sudo wg-quick down wg0

可以使用 systemd 服务通过运行以下命令来启动 WireGuard:

sudo systemctl start wg-quick@wg0.service

可以使用以下命令检查 WireGuard 状态和配置。其状态应为活动(已退出)。

sudo wg show wg0

应该看到类似于以下内容的输出:

root@node1:~# sudo wg show wg0
interface: wg0
  public key: 0Aam+o0sc/XpqHO4UevdNrjzSnQDoNMnylIWj1vG+gc=
  private key: (hidden)
  listening port: 51820

peer: 40fM1eXGLdGlDbYRcnw9f45vFdYHILvJLBzNIzrUl3Y=
  endpoint: 120.11.14.10:51820
  allowed ips: 10.0.4.1/32, 192.168.14.0/24
  latest handshake: 1 hour, 25 minutes, 2 seconds ago
  transfer: 380 B received, 436 B sent

peer: UFIdkhIZdS+j6H1rJInf1WjNsTDFzH2mUZlRaylZZiE=
  endpoint: 120.11.13.10:51820
  allowed ips: 10.0.3.1/32, 192.168.13.0/24
  latest handshake: 1 hour, 25 minutes, 4 seconds ago
  transfer: 380 B received, 436 B sent

peer: AWqkGC7Pa2wdgflQjT5+AvAER9ojov5Nj7+NEJNwdAs=
  endpoint: 120.11.12.10:51820
  allowed ips: 10.0.2.1/32, 192.168.12.0/24
  latest handshake: 1 hour, 25 minutes, 18 seconds ago
  transfer: 980 B received, 860 B sent

要在系统启动时自动启用 WireGuard 接口,请运行以下命令:

sudo systemctl enable wg-quick@wg0

现在 WireGuard 服务器已启动并正在运行,它已准备好接受 VPN 节点连接。

5. 验证 Mesh VPN 连通性

可以在每个 VPN 节点上运行以下命令来验证 WireGuard 接口状态:

ip a show wg0

应该看到类似于以下 Node1 的输出:

root@node1:~# ip a show wg0
4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.0.1.1/32 scope global wg0
       valid_lft forever preferred_lft forever

可以尝试通过运行 ping 命令从每个 VPN 节点访问所有其他节点。每个 VPN 对等体都会响应另一个对等体的 ping 命令,表明 VPN 连接处于活动状态。

对于我们的示例,在 Node1 上运行以下命令。然后应该访问所有 VPN 对等点:

访问对等点2

root@node1:~# ping 10.0.2.1 -c 4
PING 10.0.2.1 (10.0.2.1) 56(84) bytes of data.
64 bytes from 10.0.2.1: icmp_seq=1 ttl=64 time=2.12 ms
64 bytes from 10.0.2.1: icmp_seq=2 ttl=64 time=1.23 ms
64 bytes from 10.0.2.1: icmp_seq=3 ttl=64 time=1.50 ms
64 bytes from 10.0.2.1: icmp_seq=4 ttl=64 time=1.25 ms

--- 10.0.2.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.234/1.526/2.116/0.356 ms

访问对等点3

root@node1:~# ping 10.0.3.1 -c 4
PING 10.0.3.1 (10.0.3.1) 56(84) bytes of data.
64 bytes from 10.0.3.1: icmp_seq=1 ttl=64 time=1.87 ms
64 bytes from 10.0.3.1: icmp_seq=2 ttl=64 time=2.44 ms
64 bytes from 10.0.3.1: icmp_seq=3 ttl=64 time=2.04 ms
64 bytes from 10.0.3.1: icmp_seq=4 ttl=64 time=0.963 ms

--- 10.0.3.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 0.963/1.826/2.439/0.540 ms

访问对等点4

root@node1:~# ping 10.0.4.1 -c 4
PING 10.0.4.1 (10.0.4.1) 56(84) bytes of data.
64 bytes from 10.0.4.1: icmp_seq=1 ttl=64 time=2.21 ms
64 bytes from 10.0.4.1: icmp_seq=2 ttl=64 time=1.15 ms
64 bytes from 10.0.4.1: icmp_seq=3 ttl=64 time=3.68 ms
64 bytes from 10.0.4.1: icmp_seq=4 ttl=64 time=3.92 ms

--- 10.0.4.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.145/2.738/3.921/1.130 ms

已使用 WireGuard 成功建立了网状网络,使您的节点能够安全、私密地相互交互。由于没有中央服务器,即使其中一个对等点发生故障,网络也将保持运行。

6. 验证 Mesh VPN 本地转发

从node1访问node2 local network

root@node1:~# ping 192.168.12.10 -c 4
PING 192.168.12.10 (192.168.12.10) 56(84) bytes of data.
64 bytes from 192.168.12.10: icmp_seq=1 ttl=64 time=1.03 ms
64 bytes from 192.168.12.10: icmp_seq=2 ttl=64 time=1.05 ms
64 bytes from 192.168.12.10: icmp_seq=3 ttl=64 time=3.63 ms
64 bytes from 192.168.12.10: icmp_seq=4 ttl=64 time=3.35 ms

--- 192.168.12.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.034/2.266/3.630/1.228 ms

从node1访问node3 local network

root@node1:~# ping 192.168.13.10 -c 4
PING 192.168.13.10 (192.168.13.10) 56(84) bytes of data.
64 bytes from 192.168.13.10: icmp_seq=1 ttl=64 time=4.18 ms
64 bytes from 192.168.13.10: icmp_seq=2 ttl=64 time=1.11 ms
64 bytes from 192.168.13.10: icmp_seq=3 ttl=64 time=3.61 ms
64 bytes from 192.168.13.10: icmp_seq=4 ttl=64 time=1.41 ms

--- 192.168.13.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.109/2.575/4.176/1.336 ms

从node1访问node4 local network

root@node1:~# ping 192.168.14.10 -c 4
PING 192.168.14.10 (192.168.14.10) 56(84) bytes of data.
64 bytes from 192.168.14.10: icmp_seq=1 ttl=64 time=1.93 ms
64 bytes from 192.168.14.10: icmp_seq=2 ttl=64 time=1.12 ms
64 bytes from 192.168.14.10: icmp_seq=3 ttl=64 time=1.18 ms
64 bytes from 192.168.14.10: icmp_seq=4 ttl=64 time=0.878 ms

--- 192.168.14.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 0.878/1.276/1.931/0.394 ms

参考:https://www.zenarmor.com/docs/network-security-tutorials/how-to-configure-wireguard-mesh-vpn

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值