本文主要是介绍WireGuard Mesh 组网示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
WireGuard mesh 组网
为了能够遵循此 WireGuard Mesh VPN 配置教程,必须准备 4 台 Ubuntu 22.04 Linux 服务器,这些服务器具有静态公共 IP 地址并可从 Internet 访问 UDP/51820
。我们将为 VPN 节点使用以下名称和 IP 地址:
Name | Public IP | Allowed IPs | Local Network |
---|---|---|---|
Node1 | 120.11.11.10 | 10.0.1.1 | 192.168.11.0/24 |
Node2 | 120.11.12.10 | 10.0.2.1 | 192.168.12.0/24 |
Node3 | 120.11.13.10 | 10.0.3.1 | 192.168.13.0/24 |
Node4 | 120.11.14.10 | 10.0.4.1 | 192.168.14.0/24 |
图 WireGuard 网状 VPN 拓扑
测试环境:
VMware Workstation 新建四个仅主机类型网络 VMnet11~VMnet14
,分别分配给4台服务器,作为第二块网卡用于wireguard public ip
组网。
node1节点 vmware workstation 虚拟机示例配置如下:
- 第一块网卡ens33为NAT模式
- 第二块网卡ens37为仅主机模式(分配
VMnet11~VMnet14
) - 第三块网卡ens38为LAN区段模式,用于
local network
。
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/24nameservers:addresses:- 223.5.5.5- 223.6.6.6search: []routes:- to: defaultvia: 192.168.95.2metric: 100ens37:addresses:- 120.11.11.10/24routes:- to: defaultvia: 120.11.11.1metric: 200ens38:addresses:- 192.168.11.10/24version: 2
按照以下主要步骤配置 WireGuard Mesh VPN:
- 在 Ubuntu 服务器上安装 WireGuard
- 手动生成私钥和公钥
- VPN节点局域网IP转发
- 手动生成 WireGuard 配置文件
- 启动 WireGuard 服务器并在引导时启用它
- 验证 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.keyroot@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: wg0public key: 0Aam+o0sc/XpqHO4UevdNrjzSnQDoNMnylIWj1vG+gc=private key: (hidden)listening port: 51820peer: 40fM1eXGLdGlDbYRcnw9f45vFdYHILvJLBzNIzrUl3Y=endpoint: 120.11.14.10:51820allowed ips: 10.0.4.1/32, 192.168.14.0/24latest handshake: 1 hour, 25 minutes, 2 seconds agotransfer: 380 B received, 436 B sentpeer: UFIdkhIZdS+j6H1rJInf1WjNsTDFzH2mUZlRaylZZiE=endpoint: 120.11.13.10:51820allowed ips: 10.0.3.1/32, 192.168.13.0/24latest handshake: 1 hour, 25 minutes, 4 seconds agotransfer: 380 B received, 436 B sentpeer: AWqkGC7Pa2wdgflQjT5+AvAER9ojov5Nj7+NEJNwdAs=endpoint: 120.11.12.10:51820allowed ips: 10.0.2.1/32, 192.168.12.0/24latest handshake: 1 hour, 25 minutes, 18 seconds agotransfer: 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 1000link/none inet 10.0.1.1/32 scope global wg0valid_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
这篇关于WireGuard Mesh 组网示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!