Skip to main content

极空间和阿里云搭建wireguard局域网

资源地址

配置ECS服务端相关的端口

端口配置清单

  • wireguard采用的是UDP端口,需要配置UDP端口
  • 服务端UDP端口: 23399

端口配置

  • 配置截图image-20241204004029785
  • 单独进行UDP端口验证
# 开启端口监听
$ nc -ul 23399
# 查看端口监听
$ netstat -anup | grep 23399
udp 0 0 172.18.2xx.1xx:23399 118.114.2xx.1xx:4875 ESTABLISHED 602669/nc
# 验证端口
$ echo "test message" | nc -u 47.1xx.9x.1x 23399
# "nc -ul 23399"监听结果:
test message

ECS安装wireguard服务端

安装

$ apt update
$ apt search wireguard
$ apt show wireguard
$ apt install wireguard
$ which wg

创建公钥和私钥

  • 第一组公钥和私钥(服务端使用,分配ip 192.168.2.1)
  • 第二组公钥和私钥(客户端1用,分配ip 192.168.2.2)
  • 第三组公钥和私钥(客户端2用,分配ip 192.168.2.3)
$ wg genkey | tee privatekey | wg pubkey > publickey
$ wg genkey | tee client1_privatekey | wg pubkey > client1_publickey
$ wg genkey | tee client2_privatekey | wg pubkey > client2_publickey

创建服务端wireguard配置

$ cd /etc/wireguard/
$ vim wg0.conf

添加配置文件内容:

########################### 配置例子地址 ###########################
# https://www.wireguard.com/#simple-network-interface
########################### 配置例子地址 ###########################

########################### 服务器配置 ###########################
[Interface]
# VPN网段的 服务器地址
Address = 192.168.2.1/24
# 监听端口
ListenPort = 23399
# 服务器私钥
PrivateKey = <privatekey>
########################### 服务器配置 ###########################


########################### 客户端1配置 ###########################
[Peer]
# 客户端1的公钥
PublicKey = <client1_publickey>
# VPN网段的 客户端1的地址
AllowedIPs = 192.168.2.2/32
########################### 客户端1配置 ###########################

########################### 客户端2配置 ###########################
[Peer]
# 客户端2的公钥
PublicKey = <client2_publickey>
# VPN网段的 客户端2的地址
AllowedIPs = 192.168.2.3/32
########################### 客户端2配置 ###########################

启动服务

# 1 启动或关闭虚拟网卡
$ systemctl disable wg-quick@wg0
$ systemctl enable wg-quick@wg0
# 2 启动wg服务
$ systemctl start wg-quick@wg0
# 3 查看wg服务状态
$ systemctl status wg-quick@wg0

测试和验证

  • 服务状态验证
# 执行systemctl status wg-quick@wg0 显示:
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/usr/lib/systemd/system/wg-quick@.service; enabled; preset: enabled)
Active: active (exited) since Mon 2024-12-23 14:20:38 CST; 6s ago
Docs: man:wg-quick(8)
man:wg(8)
https://www.wireguard.com/
https://www.wireguard.com/quickstart/
https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
Process: 594586 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
Main PID: 594586 (code=exited, status=0/SUCCESS)
CPU: 36ms

Dec 23 14:20:38 iZ2********Z systemd[1]: Starting wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0...
Dec 23 14:20:38 iZ2********Z wg-quick[594586]: [#] ip link add wg0 type wireguard
Dec 23 14:20:38 iZ2********Z wg-quick[594586]: [#] wg setconf wg0 /dev/fd/63
Dec 23 14:20:38 iZ2********Z wg-quick[594586]: [#] ip -4 address add 192.168.2.1/24 dev wg0
Dec 23 14:20:38 iZ2********Z wg-quick[594586]: [#] ip link set mtu 1420 up dev wg0
Dec 23 14:20:38 iZ2********Z systemd[1]: Finished wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0.
  • wg show验证
$ wg show
#执行 wg show 显示:
nterface: wg0
public key: s8**********************************VI=
private key: (hidden)
listening port: 23399

peer: /x**********************************U4=
allowed ips: 192.168.2.2/32

peer: fp**********************************v1k=
allowed ips: 192.168.2.3/32
  • 端口验证(使用 ss 检查 UDP 状态)
$ ss -tunlp | grep 23399
# 显示:
udp UNCONN 0 0 0.0.0.0:23399 0.0.0.0:*
udp UNCONN 0 0 [::]:23399 [::]:*

# 通过 ss -tunlp | grep 23399,我们已经确认:
233990.0.0.0:23399 和 [::]:23399 上以 UDP 模式监听,正常运行。
  • 检查网络接口状态
# 验证虚拟网络接口是否创建成功
$ ip link show wg0
14: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/none

# 检查接口的绑定 IP
$ ip addr show wg0
14: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 192.168.2.1/24 scope global wg0
valid_lft forever preferred_lft forever
  • 本地和远程向端口发送数据验证(使用 tcpdump 验证数据包流量)
# 服务端执行tcpdump -i any port 23399 监听端口流量:
$ tcpdump -i any port 23399

# 测试1:服务端本机到23399端口通讯
$ echo "test message" | nc -u 127.0.0.1 23399
# tcpdump侧监听结果:
17:37:09.483430 lo In IP localhost.32898 > localhost.23399: UDP, length 13

# 测试2:服务端本机到23399端口通讯
$ echo "test message" | nc -u 172.18.23x.17x 23399
#tcpdump侧监听结果:
17:36:35.443600 lo In IP iZ2********Z.50990 > iZ2********Z.23399: UDP, length 13

# 测试3:远程到23399端口通讯
$ echo "test message" | nc -u 47.xxx.9x.1x 23399
17:35:41.978146 eth0 In IP 118.114.24x.15x.4518 > iZ2********Z.23399: UDP, length 13

注意事项

  • wg客户端配置好后,
    • 客户端A "ping 192.168.2.1(服务端)" 成功,
    • 客户端A "ping 192.168.2.2(自己)" 成功,
    • 客户端A "ping 192.168.2.3(其他客户端)" 失败
# 原因是服务端需要配置ip转发
########################### 启用服务器端的 IP 转发 ###########################
# 1.编辑 /etc/sysctl.conf 文件,启用 IP 转发
$ vim /etc/sysctl.conf
# 添加或确保以下行存在:
net.ipv4.ip_forward=1
# 2.立即生效
$ sysctl -p
# 3.验证设置
$ sysctl net.ipv4.ip_forward
# 输出应为:net.ipv4.ip_forward = 1
########################### 启用服务器端的 IP 转发 ###########################
  • 服务器防火墙规则检查
# 确保服务器的防火墙允许 WireGuard 使用的 UDP 端口(如 23399)
$ ufw allow 23399/udp
# 检查当前防火墙状态
$ iptables -L -v -n
# 添加对应规则
$ iptables -A INPUT -p udp --dport 23399 -j ACCEPT

Mac安装wireguard客户端

安装

$ brew search wireguard
$ brew info wireguard-tools
$ brew install wireguard-tools
$ brew info wireguard-tools

配置wireguard客户端

$ cd /opt/homebrew/etc/wireguard
$ vim wg0.conf

添加配置文件内容:

########################### 配置例子地址 ###########################
# https://www.wireguard.com/#simple-network-interface
########################### 配置例子地址 ###########################

########################### 客户端2配置 ###########################
[Interface]
# client IP
Address = 192.168.2.3/24
PrivateKey = <client2_privatekey>
########################### 客户端2配置 ###########################

########################### 服务器配置 ###########################
[Peer]
PublicKey = <publickey>
Endpoint = 47.1xx.9x.1x:23399
# 192.168.2.1/24 request throw VPN
AllowedIPs = 192.168.2.0/24
########################### 服务器配置 ###########################

启动wireguard客户端

# 启动客户端
$ sudo wg-quick up wg0

# 查看客户端
$ sudo wg show
interface: utun4
public key: fp6****************************v1k=
private key: (hidden)
listening port: 49799

peer: s8P****************************QVI=
endpoint: 47.1xx.9x.1x:23399
allowed ips: 192.168.2.0/24

# 关停客户端
$ sudo wg-quick down wg0

# 测试 ping通了算正常
$ ping -c 6 192.168.2.1 && ping -c 6 192.168.2.2 && ping -c 6 192.168.2.3
$ ping 192.168.2.1
$ ping 192.168.2.2
$ ping 192.168.2.3

极空间安装wireguard客户端

安装

#在ubuntu docker中依次安装 ping curl nc 和 wireguard
$ apt update
$ apt install wireguard
$ apt install vim
$ apt install iproute2
$ apt install iputils-ping

配置wireguard客户端

$ cd /etc/wireguard/
$ vim wg0.conf

添加配置文件内容:

########################### 配置例子地址 ###########################
# https://www.wireguard.com/#simple-network-interface
########################### 配置例子地址 ###########################

########################### 客户端2配置 ###########################
[Interface]
# client IP
Address = 192.168.2.2/24
PrivateKey = <client1_privatekey>
########################### 客户端2配置 ###########################

########################### 服务器配置 ###########################
[Peer]
PublicKey = <publickey>
Endpoint = 47.1xx.9x.1x:23399
# 192.168.2.1/24 request throw VPN
AllowedIPs = 192.168.2.0/24
PersistentKeepalive = 30
########################### 服务器配置 ###########################

启动wireguard客户端

# 启动客户端
$ wg-quick up wg0

# 查看客户端
$ wg show
interface: utun4
public key: fp6****************************v1k=
private key: (hidden)
listening port: 49799

peer: s8P****************************QVI=
endpoint: 47.1xx.9x.1x:23399
allowed ips: 192.168.2.0/24

# 关停客户端
$ wg-quick down wg0

# 测试 ping通了算正常
$ ping -c 6 192.168.2.1 && ping -c 6 192.168.2.2 && ping -c 6 192.168.2.3
$ ping 192.168.2.1
$ ping 192.168.2.2
$ ping 192.168.2.3

注意事项

########################### 启动失败 ###########################
$ wg-quick up wg0
[#] ip link add wg0 type wireguard
RTNETLINK answers: Operation not permitted
Unable to access interface: Operation not permitted

# 原因是ubuntu docker的权限不足导致
创建ubuntu docker容器时 容器能力一栏,要开启 NET_ADMIN
########################### 启动失败 ###########################

NAT跨网段转发配置

家里的极空间所在局域网为192.168.10.0/24, 通过极空间NAT转发 实现远程访问家里局域网

wg客户端1:极空间NAT转发配置

# 1 开启ip转发功能
$ echo "net.ipv4.ip_forward=1" | tee -a /etc/sysctl.conf
$ sysctl -p

# 2 配置NAT端口映射
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -d 192.168.1.0/24 -j MASQUERADE

# 3 重启服务
$ wg-quick down wg0
$ wg-quick up wg0
$ wg show

########################### iptables命令介绍 ###########################
# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -d 192.168.10.0/24 -j MASQUERADE
1. iptables
这是 Linux 系统中一个强大的命令行工具,用于配置防火墙规则和网络流量的管理。

2. -t nat
指定要操作的表,nat 表专门用于网络地址转换(NAT),例如:源 NAT (SNAT):修改数据包的源地址。目标 NAT (DNAT):修改数据包的目标地址。

3. -A POSTROUTING
-A 表示追加规则(Append)到指定的链末尾。
• POSTROUTING 是 nat 表中的一个链,它的作用是:在数据包离开接口前对其进行处理,通常用于修改源地址。适用于源 NAT (SNAT) 或伪装 (MASQUERADE)

4. -s 192.168.2.0/24
指定源 IP 地址范围:192.168.2.0/24 是一个子网表示法,表示 IP 地址范围为 192.168.2.0 到 192.168.2.255。
数据包的源地址必须在此范围内,规则才会生效。

5. -d 192.168.1.0/24
指定目标 IP 地址范围:192.168.1.0/24 表示目标子网的范围是 192.168.1.0 到 192.168.1.255。
数据包的目标地址必须属于此范围,规则才会匹配。

6. -j MASQUERADE
-j 表示跳转到目标操作(Jump)。
• MASQUERADE 是一个特殊的目标操作,用于源地址伪装:会将数据包的源地址修改为 NAT 网关的外部地址。常用于动态 IP 地址的网络(比如通过 DHCP 分配 IP 的场景)。MASQUERADE 的主要特点是:
• 不需要手动指定外部 IP 地址(与 SNAT 不同)。
• 外部地址发生变化时,规则依然有效。

# 如何删除添加的记录?
# 步骤 1:查看规则
先列出当前 nat 表中的所有规则,找到要删除的规则的编号:
$ iptables -t nat -L POSTROUTING --line-numbers -n -v
num target prot opt source destination
1 MASQUERADE all -- 192.168.2.0/24 192.168.1.0/24
# num 列表示规则的编号。找到 MASQUERADE 规则对应的编号(如 1)。

# 步骤 2:删除规则 根据规则编号删除规则:
$ iptables -t nat -D POSTROUTING 1

# 步骤 3:验证删除 再次列出 nat 表中的 POSTROUTING 链,确保规则已被删除:
$ iptables -t nat -L POSTROUTING -n -v
########################### iptables命令介绍 ###########################

wg服务端:Wireguard服务端配置

# 1 修改配置
$ vim /etc/wireguard/wg0.conf
# “客户端1配置”的“AllowedIPs”项 增加“192.168.10.0/24”:
# AllowedIPs = 192.168.2.2/32, 192.168.10.0/24

# 2 重启服务
$ systemctl stop wg-quick@wg0
$ systemctl start wg-quick@wg0
$ systemctl status wg-quick@wg0

wg客户端2:远程的Wireguard客户端配置

# 1 修改配置
$ vim /opt/homebrew/etc/wireguard/wg0.conf
# “客户端1配置”的“AllowedIPs”项 增加“192.168.10.0/24”:
# AllowedIPs = 192.168.2.0/24, 192.168.10.0/24

# 2 重启服务
$ sudo wg-quick down wg0
$ sudo wg-quick up wg0
$ sudo wg show

验证

$ ping -c 6 192.168.2.1 && ping -c 6 192.168.2.2 && ping -c 6 192.168.2.3 && ping -c 6 192.168.10.1
$ ping 192.168.2.1
$ ping 192.168.2.2
$ ping 192.168.2.3
$ ping 192.168.10.1