通过Wireguard暴露家庭内部网络及K8S集群内部网络

我之前有使用过WireGuard连接家庭内部网络,但是当时目的单一,所以研究的并不深入。最近在学习Redis等中间件的高级知识,所以我需要搭建一个Redis集群,然后连接到各个实例进行测试。

我的Redis集群建立在K8S集群中,使用K8S默认的资源暴露各个Redis实例是工作量巨大,如果不暴露各个实例,则会因为内部负载均衡的原因,导致实验效果不佳。

我曾考虑过使用OpenVPN让我的开发机连接到K8S的内部网络,但是之前的使用体验非常的不好,繁琐的配置,某些场景下无法安装Windows客户端,所以我决定研究新的VPN工具。WireGuard在原理、配置方面都非常容易理解,而且我已经再使用它了,只需要再深入研究一下,就可以胜任我连接K8S集群内部网络的需求。

为什么不考虑代理或其他成熟的工具呢?KTConnect之类的工具我也有使用经验,且在公司积累了足够的使用经验。但是我的开发机是Windows系统的,KTConnect对其支持并不是太好,只能走Socks模式。而走Socks模式,很多headless服务是无法暴露出来的,这会给我造成困扰。

使用WireGuard方案,将DNS配置成容器内部的CoreDNS,则可以通过集群内部的DNS服务,轻松访问到各个Pod、Service、Headless Service,这使得我的配置可以在不进行任何修改的情况下,从开发机迁移到集群内部。

我的网络拓补结构及对WireGuard方案的设计

如图,为我的网络拓补结构:

2022-02-16-11-06-05

WorkPC1和WorkPC2其实就是我在两种不同环境中连接这个网络的某类代表。在家庭内部时,家庭内部的网段不需要进行路由,及AllowIPs不需要配置家庭内部网段;而在外网环境下,我需要路由这个网段,即AllowIPs需要设置这个网段。

创建服务端和客户端的秘钥文件


rm ~/WireGuard -rf

mkdir -p ~/WireGuard/Server
cd ~/WireGuard/Server
wg genkey | tee privatekey | wg pubkey > publickey

mkdir -p ~/WireGuard/OpenWRT
cd ~/WireGuard/OpenWRT
wg genkey | tee privatekey | wg pubkey > publickey

mkdir -p ~/WireGuard/KubernetesWork
cd ~/WireGuard/KubernetesWork
wg genkey | tee privatekey | wg pubkey > publickey

mkdir -p ~/WireGuard/WindowsHome
cd ~/WireGuard/WindowsHome
wg genkey | tee privatekey | wg pubkey > publickey

mkdir -p ~/WireGuard/WindowsWork
cd ~/WireGuard/WindowsWork
wg genkey | tee privatekey | wg pubkey > publickey

mkdir -p ~/WireGuard/Matepad11
cd ~/WireGuard/Matepad11
wg genkey | tee privatekey | wg pubkey > publickey

mkdir -p ~/WireGuard/HonorX10
cd ~/WireGuard/HonorX10
wg genkey | tee privatekey | wg pubkey > publickey

~

创建服务端和客户端配置文件

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136

# XieFieyan
[Peer]
PublicKey = aMlUpXen7Z8qDeRnHhn51CeCQYFlbsBNOtVZu/jkP2U=
AllowedIps = 10.10.25.20/32

tee /etc/wireguard/wg0.conf <<-EOF
# Server
[Interface]
ListenPort = 12000
Address = 10.10.10.1/24
PrivateKey = $(cat ~/WireGuard/Server/privatekey)

# OpenWRT
[Peer]
PublicKey = $(cat ~/WireGuard/OpenWRT/publickey)
AllowedIPs = 10.10.10.10/32,192.168.23.0/24

# KubernetesWork
[Peer]
PublicKey = $(cat ~/WireGuard/KubernetesWork/publickey)
AllowedIPs = 10.10.10.20/32,10.244.0.0/16,10.96.0.0/12

# WindowsHome
[Peer]
PublicKey = $(cat ~/WireGuard/WindowsHome/publickey)
AllowedIPs = 10.10.10.30/32

# WindowsWork
[Peer]
PublicKey = $(cat ~/WireGuard/WindowsWork/publickey)
AllowedIPs = 10.10.10.31/32

# Matepad11
[Peer]
PublicKey = $(cat ~/WireGuard/Matepad11/publickey)
AllowedIPs = 10.10.10.32/32

# HonorX10
[Peer]
PublicKey = $(cat ~/WireGuard/HonorX10/publickey)
AllowedIPs = 10.10.10.33/32
EOF

tee ~/WireGuard/OpenWRT/wg0.conf <<-EOF
# OpenWRT
[Interface]
Address = 10.10.10.10/24
PrivateKey = $(cat ~/WireGuard/OpenWRT/privatekey)

# Server
[Peer]
PublicKey =$(cat ~/WireGuard/Server/publickey)
Endpoint = ${SERVER_IP}:12000
AllowedIPs = 10.10.10.0/24
PersistentKeepalive = 25
EOF

tee ~/WireGuard/KubernetesWork/wg0.conf <<-EOF
# KubernetesWork
[Interface]
Address = 10.10.10.20/24
PrivateKey = $(cat ~/WireGuard/KubernetesWork/privatekey)

PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# Server
[Peer]
PublicKey =$(cat ~/WireGuard/Server/publickey)
Endpoint = ${SERVER_IP}:12000
AllowedIPs = 10.10.10.0/24
PersistentKeepalive = 25
EOF

tee ~/WireGuard/WindowsHome/wg0.conf <<-EOF
# WindowsHome
[Interface]
Address = 10.10.10.30/24
DNS = 10.96.0.10
PrivateKey = $(cat ~/WireGuard/WindowsHome/privatekey)


# Server
[Peer]
PublicKey =$(cat ~/WireGuard/Server/publickey)
Endpoint = ${SERVER_IP}:12000
AllowedIPs = 10.10.10.0/24,192.168.23.0/24,10.244.0.0/16,10.96.0.0/12
PersistentKeepalive = 25
EOF

tee ~/WireGuard/WindowsWork/wg0.conf <<-EOF
# WindowsWork
[Interface]
DNS = 10.96.0.10
Address = 10.10.10.31/24
PrivateKey = $(cat ~/WireGuard/WindowsWork/privatekey)

# Server
[Peer]
PublicKey =$(cat ~/WireGuard/Server/publickey)
Endpoint = ${SERVER_IP}:12000
AllowedIPs = 10.10.10.0/24,10.244.0.0/16,10.96.0.0/12
PersistentKeepalive = 25
EOF

tee ~/WireGuard/Matepad11/wg0.conf <<-EOF
# Matepad11
[Interface]
DNS = 10.96.0.10
Address = 10.10.10.32/24
PrivateKey = $(cat ~/WireGuard/Matepad11/privatekey)

# Server
[Peer]
PublicKey =$(cat ~/WireGuard/Server/publickey)
Endpoint = ${SERVER_IP}:12000
AllowedIPs = 10.10.10.0/24,192.168.23.0/24,10.244.0.0/16,10.96.0.0/12
PersistentKeepalive = 25
EOF

tee ~/WireGuard/HonorX10/wg0.conf <<-EOF
# HonorX10
[Interface]
DNS = 10.96.0.10
Address = 10.10.10.33/24
PrivateKey = $(cat ~/WireGuard/HonorX10/privatekey)

# Server
[Peer]
PublicKey =$(cat ~/WireGuard/Server/publickey)
Endpoint = ${SERVER_IP}:12000
AllowedIPs = 10.10.10.0/24,192.168.23.0/24,10.244.0.0/16,10.96.0.0/12
PersistentKeepalive = 25
EOF

配置服务端

  1. 下载wireguard-tools(针对内核版本大于5.6的Linux系统)(我使用的是Debain 11)
1
2
3
4

apt update
apt install wireguard

  1. 配置IP地址转发
1
2
3
4
5

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

  1. 启动wg服务

wg-quick up wg0

配置OpenWRT旁路由

OpenWRT配置相对比较简单,步骤如下:

  1. 安装必要软件

2022-02-17-19-33-08

  1. 重启一下添加wg0接口,注意协议类型

2022-02-17-19-34-38

  1. 配置wg0接口,因为我的OpenWRT上的WireGuard是做客户端,所以不需要配置监听端口

2022-02-17-19-35-51

  1. 配置wg0接口,增加peer:

2022-02-17-19-39-41

  1. 配置wg0接口,修改防火墙类型为lan

2022-02-17-19-44-31

  1. 因为我的OpenWRT上的Wireguard有暴露192.168.23.0/24网段的任务,所以还需要配置防火墙,另外我防火墙默认是丢弃任何数据包的,所以还需要Accept来自10.10.10.0/24的数据包

2022-02-17-19-41-55

在配置OpenWRT上的WireGuard时遇到的问题:

  1. 如果把wg0接口的防火墙设置成wan口,导致WireGuard不起作用,具体表现是接受的数据包不增加。我在OpenWRT上配置WireGuard服务端的经验,我大概猜到什么原因了,我将WireGuard的防火墙配置成了Wan口,但是我没有在Traffic Rules增加规则,使放行所有UDP流量。

配置KubernetesWork

参考资料