前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于 WireGuard 和 OpenVPN 的混合云基础架构建设

基于 WireGuard 和 OpenVPN 的混合云基础架构建设

作者头像
米开朗基杨
发布2021-04-23 10:07:06
7K1
发布2021-04-23 10:07:06
举报
文章被收录于专栏:云原生实验室云原生实验室

1. 背景说明

  1. 为什么要让开发人员使用 VPN 软件连接公司内网?
  • 省钱 公司内部部署/开发了一系列的平台,不可能都绑定公网 IP 对公司用户提供服务;
  • 安全 保证内部平台被访问的可控制性、可监控性;
  • 安全 自己开发或部署的开源平台安全性能不能满足,为了防止被攻击的开口过多,借助 VPN 软件将被攻击的大门关小一些;
  • 方便 因为有一些交付运维人员,一般需要驻场开发运维,挂个 vpn 就能远程使用公司内网平台;
  1. 为什么要做适用于混合云的 VPN 方案?
  • 业务拓展 客户的系统和数据库等不可能都在一个云;开发运维测试人员需要远程支持不同云下的服务;
  1. 为什么要启用 LDAP 和 OpenVPN?
  • 管理信心 业务初期,业务网络环境为单云时,便有了 OpenVPN 的成熟的管理和监控经验;
  • 省时 补足 wireguard 用户管理的缺陷,暂时没时间基于 wireguard 开发关于用户模块 VPN 的秘钥和验证功能;
  • 管理省心 虽然牺牲了用户的连接 vpn 速度,但是为了不造新轮子,决定套娃两种 VPN,借助 OpenVPN 的 LDAP 支持功能;
  • 用户省心 避免用户直接用 wireguard 接入内网(也难控制用户访问权)、避免因云的增多而导致用户端需要配置 N 个 client.ovpn;
  1. 最终采用的方案是 Wireguard+OpenVPN+LDAP,VPN 组网核心架构是中心辐射型网络拓扑结构

2. 架构说明

必须准备的:

  • VPC A 中开一台服务器,这台服务器需要绑定一个弹性公网 IP,安全组入规则的端口需要开放 udp51820 和 udp1194 端口,前者提供给其他服务器连接 wireguard 用、后者提供给用户连接到混合云网络用;
  • 其次是一到多个其他的 VPC,注意,这些 VPC 之间的网段不要冲突了;

混合云

项目

网段/IP

属性

备注

VPC A

10.10.0.0/16

华为云 VPC A

VPC A 中的服务器

10.10.xxx.xxx

绑定了弹性公网 IP 的服务器

OpenVPN 服务端、Wireguard 服务端

VPC B

192.168.0.0/16

华为云 VPC B

LDAP 服务器(AD)

这台在哪里关联不大,只要 VPC A 中安装 OpenVPN 的服务器可以访问通即可

一台绑定了弹性公网 IP 的服务器

作用是提供 LDAP 认证服务,就是管理用户账号的;这里其实是一台 windows server 2019,安装了 AD 域;

VPC C

172.16.0.0/16

腾讯云 VPC

3. wireguard 服务端所有步骤

  1. 防火墙操作 firewalld 直接禁用 我们不使用他 我们后期用 iptables 进行访问控制
代码语言:javascript
复制
systemctl stop firewalld
systemctl disable firewalld
 firewall-cmd --state
## 如果关不上就杀掉:
pkill -f firewalld
  1. 服务端开启 ip 转发
代码语言:javascript
复制
## 开启转发
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
## 应用修改
sysctl -p
  1. 开放端口

我们这里是云服务器,在 web 管理端的服务器的安全组:

  • 入规则的 51820/udp 协议的端口打开,用作 wireguard 客户端与之通信;
  • 入规则的 1194/udp 协议的端口打开,用作 OpenVPN 客户端与之通信;

测试

可以找一台能联网的 centos7 测试一下这个端口,如果没有 nc 工具可以yum install nc安装下。:

代码语言:javascript
复制
nc -vuz 【公网IP】 51820
  1. 安装 wireguard(内核级别的)

摘自 米开朗基杨[1] 大佬的博客 WireGuard 教程:WireGuard 的搭建使用与配置详解[2]

注意:此处关于非标准内核安装 wireguard 的有些难度,容易浪费时间,最好在网络畅通的情况下进行 Ping 的通百度再继续 不解决系统的问题!

代码语言:javascript
复制
## 标准内核
yum install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum install yum-plugin-elrepo
yum install kmod-wireguard wireguard-tools

## 非标准内核,需要安装 DKMS 包
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
yum install wireguard-dkms wireguard-tools
  1. 配置

到 wireguard 目录生成服务器私钥和公钥 privatekey、publickey;

公钥私钥成对出现,如果丢了,可以重新用此命令生成

代码语言:javascript
复制
cd /etc/wireguard
wg genkey | tee privatekey | wg pubkey > publickey

编写服务端配置文件vim /etc/wireguard/wg0.conf写入如下内容:

代码语言:javascript
复制
[Interface]
PrivateKey = 【服务端私钥privatekey】
Address = 10.12.0.1/16
PreUp = iptables -t nat -A POSTROUTING -s 10.11.0.0/16 -o wg0 -j MASQUERADE
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o 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 -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
DNS = 114.114.114.114
MTU = 1420

## VPC B
[Peer]
PublicKey = 【中继器B私钥】
AllowedIPs = 10.12.0.2/32,192.168.0.0/16

## VPC C
[Peer]
PublicKey = 【中继器C私钥】
AllowedIPs = 10.12.0.3/32,172.16.0.0/16

详细解释(若有不详细和错误请指正):

  • Address 是我们规划的给 wireguard vpn 的服务器和各中继器规划的地址和网段,这里指定的网段是 10.12.0.1/16,服务端占用 10.12.0.1 这个虚拟 IP;
  • PreUp 在 wireguard 虚拟网卡 wg0 启动之前运行的命令,这里命令的作用是 【用 wg0 网卡转发处理 10.11.0.0/16 网段进来的流量】
  • PostUp、PostDown 是启动和关闭 wireguard 时候执行的命令,这里是允许 wireguard 的网卡 wg0 转发流量,允许本地网卡 eth0 进来的流量的来源 ip 被 wg0 网卡分配的 IP 伪装包裹;
  • ListenPort 是服务端开放的 udp 端口,给各中继器连接和维持连接时通信用;
  • DNS 和 MTU 是解析和分包大小,不太了解,一般是 1500
  • Peer 是其他 VPC 中找的一台用于转发其所在 VPC 流量的机器的 wireguard 配置
  • AllowedIPs 10.12.0.2/32 最开始填的是给中继器分配的虚拟 wg ip,192.168.0.0/16 后面这个是此中继器所在 VPC 的网段;切记所有 peer 不能有任何冲突!
  1. wireguard 服务操作命令
代码语言:javascript
复制
## 运行
wg-quick up wg0
## 查看连接状态
wg
## 设置开机自启
systemctl enable wg-quick@wg0.service
## 重载 每次加完VPC中继器后运行下 实际上根据经验还是有点问题,新加入的VPC可能连不上,还是需要先down然后up服务端(会引起所有VPC的短暂失联)
systemctl reload wg-quick@wg0
## 停止
wg-quick down wg0

如果在/etc/wireguard/目录下,运行就好了`` 停止服务是wg-quick down wg0输入命令wg即可看到服务运行情况

输入ip a可以看到多了一个 wg0 虚拟网卡

4. wireguard【客户端/中继器】(新增 VPC 全步骤)

说明:客户端指的是 VPC B 的一台服务器,其实是 wireguard 的中继服务器(子网服务器在 nat 后面,这台服务器并没有绑定弹性公网 IP)。安装方式和服务端一样

  1. 【中继器】开启 IP 转发
代码语言:javascript
复制
## 开启转发
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
## 应用修改
sysctl -p
  1. 【中继器】安装 wireguard 内核空间
代码语言:javascript
复制
## 非标准内核,需要安装 DKMS 包
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
yum install wireguard-dkms wireguard-tools
  1. 【中继器】生成秘钥公钥
代码语言:javascript
复制
cd /etc/wireguard
wg genkey | tee privatekey | wg pubkey > publickey
  1. 【中继器】配置客户端 wg0.conf 配置文件,尽量都命名为 wg0,这样参数就不用改了,维护起来方便
代码语言:javascript
复制
[Interface]
PrivateKey = 【客户端私钥】
Address = 10.12.0.2/16
DNS = 114.114.114.114
MTU = 1420

PreUp = iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o wg0 -j MASQUERADE
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o 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 -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = 【服务端公钥】
Endpoint = 【服务端IP:51820】
AllowedIPs = 10.12.0.0/16,10.10.0.0/24
PersistentKeepalive = 25

详细解释:

  • [Peer] 中继器的 peer 都只填写一个服务端的就好了,除了 AllowedIPs 要修改,其他的不修改
  • Address 中继器的 wg 虚拟 IP
  • AllowedIPs 第一个 IP 填写的是一样的 10.12.0.0/16 代表 wireguard 的虚拟 IP 网段,后面加的是此 VPC 相访问的其他 VPC 的本地 IP 网段,此处先填写了服务端 VPC 的网段
  • PersistentKeepalive 是保持连接的间隔
  1. 中继器常用 wireguard 操作命令
代码语言:javascript
复制
## 运行
wg-quick up wg0
## 查看连接状态
wg
## 设置开机自启
systemctl enable wg-quick@wg0.service
## 停止
wg-quick down wg0

5. OpenVPN 服务端

  1. 需要先安装依赖包
代码语言:javascript
复制
yum install -y lz4-devel lzo-devel pam-devel openssl-devel systemd-devel sqlite-devel
yum -y install autoconf
yum install -y automake
yum install -y libtool libtool-ltdl
  1. 下载源码再编译安装 OpenVPN
代码语言:javascript
复制
## 请将源码tar包下载到/etc目录下并解压编译安装
cd /etc
## 下载源码 版本选择最新的发行版即可 【稍微等几分钟 可以直接复制网址下载包】
wget https://github.com/OpenVPN/openvpn/archive/v2.5.1.tar.gz
## 修改名称
mv v2.5.1.tar.gz openvpn-2.5.1.tar.gz
## 解压
tar -zxf openvpn-2.5.1.tar.gz
## 重命名解压后的文件夹并进入文件夹
mv openvpn-2.5.1 openvpn
cd openvpn
## autoreconf命令
autoreconf -i -v -f
## 检测你的安装平台的目标特征
./configure --prefix=/usr/local/openvpn --enable-lzo --enable-lz4 --enable-plugins --enable-port-share --enable-iproute2 --enable-pf --enable-plugin-auth-pam --enable-pam-dlopen --enable-systemd
## 编译 安装
make && make install
## 创建软连接 如果上面解压后的openvpn文件夹不在/etc/目录下,请自行挪进去
ln -s /usr/local/openvpn/sbin/openvpn /usr/local/sbin/openvpn
## 修改配置文件 【客户端配置下面这几部有不同】
vim /usr/local/openvpn/lib/systemd/system/openvpn-server\@.service
## 下面这行请完整替换为
ExecStart=/usr/local/openvpn/sbin/openvpn --config server.conf
## 这一步有了 才能用systemctl管理服务
cp -a /usr/local/openvpn/lib/systemd/system/openvpn-server@.service /usr/lib/systemd/system/openvpn.service

## 每次修改这个service文件就要执行下这句
systemctl daemon-reload

## 设置开机自启动
systemctl enable openvpn.service
## 将证书配置文件拷贝到/etc/openvpn/server中
。。。。。
## 下面启动步骤可以在证书都准备ok的情况下运行
systemctl start openvpn.service

遇到的问题:怎么安装 openvpn-auth-ldap 后保持 openvpn 的最新版呢

代码语言:javascript
复制
## 安装openvpn-auth-ldap
 这一步骤完成后,会安装2.4.10的openvpn依赖
yum install openvpn-auth-ldap -y
## 进入openvpn服务器认证配置文件夹
cd /etc/openvpn/auth/

然后我们可以重新将我们前面的软连接挂到/usr/sbin/openvpn 上,通常会遇到说文件已经存在,先删掉,然后再挂一遍;然后再看版本就可以了

代码语言:javascript
复制
[root@xxx openvpn]## ln -s /usr/local/openvpn/sbin/openvpn /usr/sbin/openvpn
ln: failed to create symbolic link ‘/usr/sbin/openvpn’: File exists
[root@xxx openvpn]## rm -rf /usr/sbin/openvpn
[root@xxx openvpn]## ln -s /usr/local/openvpn/sbin/openvpn /usr/sbin/openvpn
[root@xxx openvpn]## openvpn --version
OpenVPN 2.5.1 x86_64-unknown-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD] built on Mar  9 2021
library versions: OpenSSL 1.0.2k-fips  26 Jan 2017, LZO 2.06
Originally developed by James Yonan
Copyright (C) 2002-2018 OpenVPN Inc <sales@openvpn.net>
Compile time defines: enable_async_push=no enable_comp_stub=no enable_crypto_ofb_cfb=yes enable_debug=yes enable_def_auth=yes enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown enable_fast_install=yes enable_fragment=yes enable_iproute2=yes enable_libtool_lock=yes enable_lz4=yes enable_lzo=yes enable_management=yes enable_multihome=yes enable_pam_dlopen=yes enable_pedantic=no enable_pf=yes enable_pkcs11=no enable_plugin_auth_pam=yes enable_plugin_down_root=yes enable_plugins=yes enable_port_share=yes enable_selinux=no enable_shared=yes enable_shared_with_static_runtimes=no enable_small=no enable_static=yes enable_strict=no enable_strict_options=no enable_systemd=yes enable_werror=no enable_win32_dll=yesenable_x509_alt_username=no with_crypto_library=openssl with_gnu_ld=yes with_mem_check=no with_sysroot=no
然后将ldap.conf复制到/etc/openvpn/auth中就好了
  1. 证书生成,这个放在 opt 目录即可,一劳永逸;
代码语言:javascript
复制
## 可以在/opt文件夹完成以上操作
cd /opt
## 下载easy-rsa源码 也可以直接打开https://github.com/OpenVPN/easy-rsa/ 到页面上下载包
wget https://github.com/OpenVPN/easy-rsa/archive/v3.0.8.tar.gz
tar -zxf v3.0.8.tar.gz
mv EasyRSA-3.0.8/ easyrsa
cd easyrsa/
## 根据/opt/easyrsa-3.0.8/easyrsa/vars.example文件生成全局配置文件vars
cp -a vars.example vars
vim vars

修改vars解开一下部分的注释并修改为:
## 国家
set_var EASYRSA_REQ_COUNTRY     "CN"
## 省份
set_var EASYRSA_REQ_PROVINCE    "SH"
## 城市
set_var EASYRSA_REQ_CITY        "Shanghai"
## 组织
set_var EASYRSA_REQ_ORG "组织名称"
## 邮件
set_var EASYRSA_REQ_EMAIL       "邮箱"
## 拥有者
set_var EASYRSA_REQ_OU          "拥有者名称"
## 长度
set_var EASYRSA_KEY_SIZE        2048
## 算法
set_var EASYRSA_ALGO            rsa
## CA证书过期时间,单位天
set_var EASYRSA_CA_EXPIRE      36500
## 签发证书的有效期是多少天,单位天
set_var EASYRSA_CERT_EXPIRE    36500
  1. 初始化所需证书
代码语言:javascript
复制
## 初始化 会在当前目录创建PKI目录,用于存储一些中间变量及最终生成的证书
cd /opt/easyrsa
./easyrsa init-pki

## 这里 输入三次,都输入了 testsre
需要输入PEM密码 PEM pass phrase,输入两次,此密码必须记住,不然以后不能为证书签名。
还需要输入common name 通用名,如:testsre,这个你自己随便设置个独一无二的。
./easyrsa build-ca

## 生成服务端证书 为服务端生成证书对并在本地签名。nopass参数生成一个无密码的证书;在此过程中会让你确认ca密码
./easyrsa build-server-full server nopass

## 创建Diffie-Hellman,确保key穿越不安全网络的命令,时间会有点长,耐心等待
./easyrsa gen-dh

## 生成客户端证书
 为客户端生成证书对并在本地签名。nopass参数生成一个无密码的证书;在此过程中都会让你确认ca密码
#./easyrsa build-client-full client nopass    ## 无密码,实际应用中不推荐,客户端有密码可提高安全性
#./easyrsa build-client-full admin    ## 让你输入密码,后续VPN连接时会使用

## 为了提高安全性生成ta.key
openvpn --genkey secret ta.key
加强认证方式,防攻击。如果配置文件中启用此项(默认是启用的),就需要执行上述命令,并把ta.key放到/etc/openvpn/server目录。
配置文件中服务端第二个参数为0,同时客户端也要有此文件,且client.conf中此指令的第二个参数需要为1。【服务端有该配置,那么客户端也必须要有】

## 整理服务端证书
mkdir -p /etc/openvpn/server/
cp -a /opt/easyrsa/pki/ca.crt /etc/openvpn/server/
cp -a /opt/easyrsa/pki/private/server.key /etc/openvpn/server/
cp -a /opt/easyrsa/pki/issued/server.crt /etc/openvpn/server/
cp -a /opt/easyrsa/pki/dh.pem /etc/openvpn/server/
cp -a /opt/easyrsa/ta.key /etc/openvpn/server/

强调:需要在安全组开放 1194 端口,允许用户客户端通过 弹性公网 IP:1194 与服务端建立连接

  1. 配置环节 主要是 openvpn 的安装配置和 LDAP 配置 LDAP 配置/etc/openvpn/auth/ldap.conf ldaps 有些问题,是 openvpn-auth-ldap 的问题,因此我们只能暂时配置成 ldap 协议(白名单模式:只让我们规定的几台机子通过弹性公网 IP 访问 AD 服务器) 多谈一下为什么没有配置用户个性化证书,而是所有用户公用证书,——是为了省事,减少证书签发的麻烦;还有我们虽然有了 ldap 认证,但是最好优化为多因子验证,可以搜一下,这个后期会补上。
代码语言:javascript
复制
<LDAP>
 URL ldap://xxx:389
 BindDN CN=Administrator,CN=Users,DC=【域名】,DC=com
 Password 【密码】
 Timeout 15
 TLSEnable no
 FollowReferrals yes
</LDAP>

<Authorization>
 BaseDN "OU=XXX,DC=【域名】,DC=com"
 SearchFilter "(sAMAccountName=%u)"
 RequireGroup false
</Authorization>

服务端配置/etc/openvpn/server/server.conf

代码语言:javascript
复制
dev tun
proto udp
port 1194
local 【服务端本地IP 这里要填写下】
## 证书
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
tls-auth /etc/openvpn/server/ta.key 0

## 拓扑模式为subnet 除了ovpn服务器占用了10.11.0.1 其他10.11.0.0/16都供用户使用
## 而默认的net30会浪费ip作连接用
topology subnet
## 用户虚拟IP池10.11.0.0/16 此处支持256^2-4==65532个IP
server 10.11.0.0 255.255.0.0
## 推送给客户端的路由 到10.10.0.0/16网段的流量都走openvpn网卡; 服务端配置文件只配置这一条
push "route 10.10.0.0 255.255.0.0"

## 固定用户虚拟IP的路径 此处我们将初始化为大家生成UUAP账号同名文件夹
client-config-dir /etc/openvpn/ccd
keepalive 10 120
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
## 最大客户端人数
max-clients 5000
persist-key
persist-tun
## 日志
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
## ldap插件
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so "/etc/openvpn/auth/ldap.conf sAMAccountName=%u"
## 客户端证书 无
verify-client-cert none
username-as-common-name
## 当服务器重新启动时 通知客户端以便其可以自动重新连接 仅在UDP协议时可用
explicit-exit-notify 1

因为考虑到客户端有些用户还有的 2.4 的,因此关于 OpenVPN 待弃用的参数警告就不管了;但是仍然会推荐新用户使用 2.5 的客户端,旧用户也可以覆盖安装,并清除其他配置文件

代码语言:javascript
复制
2021-02-24 10:45:51 Z02XXXX/58.40.70.86:52335 Data Channel: using negotiated cipher 'AES-256-GCM'
2021-02-24 10:45:51 Z02XXXX/58.40.70.86:52335 Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
2021-02-24 10:45:51 Z02XXXX/58.40.70.86:52335 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
2021-02-24 11:05:35 event_wait : Interrupted system call (code=4)
2021-02-24 11:05:37 Closing TUN/TAP interface
2021-02-24 11:05:37 /usr/sbin/ip addr del dev tun0 10.12.0.3/16
2021-02-24 11:05:37 SIGTERM[hard,] received, process exiting
2021-02-24 11:05:37 DEPRECATED OPTION: --cipher set to 'AES-256-CBC' but missing in --data-ciphers (AES-256-GCM:AES-128-GCM). Future OpenVPN version will ignore --cipher for cipher negotiations. Add 'AES-256-CBC' to --data-ciphers or change --cipher 'AES-256-CBC' to --data-ciphers-fallback 'AES-256-CBC' to silence this warning.
2021-02-24 11:05:37 WARNING: POTENTIALLY DANGEROUS OPTION --verify-client-cert none|optional may accept clients which do not present a certificate
2021-02-24 11:05:37 Could not determine IPv4/IPv6 protocol. Using AF_INET

6. OpenVPN 客户端

客户端的 OpenVPN 安装基本上和服务端一致,但是遇到 server 的地方需要改成 client:

代码语言:javascript
复制
## 客户端的service需要把路径改下
vim /usr/lib/systemd/system/openvpn.service

WorkingDirectory=/etc/openvpn/client
ExecStart=/usr/local/openvpn/sbin/openvpn --config client.conf

注意client下面客户端配置文件修改名字为client.conf

安装成功后,客户端不需要特别配置,只要将服务器上生成的证书和客户端配置文件拷贝到客户端配置目录中。在/etc/openvpn目录下创建客户端文件夹client,然后将客户端配置文件放进去。

客户端配置文件(通用)

代码语言:javascript
复制
client
dev tun
proto udp
remote 【服务端公网IP】 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
compress lz4-v2
verb 3
auth-user-pass
## 内联文件支持 为tls-auth参数内置到配置文件提供支持
key-direction 1
<ca>
-----BEGIN CERTIFICATE-----
HGDJjCCAg6gAwIBAgIJANykxpDuwJKZMA0GCSqGSIb3DQEBCwUAMBExDzANBgNV
BAMMBnNyZXZwbjAgFw0yMTAxMjIwODA1NDlaGA8yMTIwMTIyOTA4MDU0OVowETEP
MA0GA1UEAwwGc3JldnBuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
xekYy9xIm89tpzJc+xxxxxxxxxxxxxxxxxxxxxxxxxUERHIPiXGLRLladkl5jkLi/3Q+8An7
xRanKa3ColZXePTVq7s7091/NnTosrnbKCyNnh9lolTim4jtC4G6KHtP9ork3dHg
bRWgj8ETy7PuMbmWJVd5vzhHZxO9adqkVDRrSEDATvhcrOn2NU8EY3QeUIhrOMXr
39neAznKHvqIEElaWjH31inpJLw33YLDOI7we3oEzyine5zCrZth2YhgKdm+8k5H
bpL9VUfU/rOxKOfZ06iexxxxxxxxxxxxxxxxxx3NdEJM1x/FpUEWfGkFdTk4lCTPxXAc
sAld/BYinq15Hpp81vTC9xxxxxxxxxxxxxxxxxx3wfTAdBgNVHQ4EFgQUF/iBE6/GM3dNMb70
JS/jCXzNuWkwQQYDVxxxxxxxxxxxxxxxxxxxx3dNMb70JS/jCXzNuWmhFaQTMBEx
DzANBgNVBAMMBnNyxxxxxxxxxxxxxxxxxx3wJKZMAwGA1UdEwQFMAMBAf8wCwYDVR0P
BAQDAgEGMA0GCSqGxxxxxxxxxxxxxxxxxx3QCxVV+rn3MISiAYKQx7GQAL6I4qsdFS
qcBi99jAy4p7Uhk8IlEQF+xxxxxxxxxxxxxxxxxx3hvRLkOkrW8CHhrHRJxNVyOLc18D
zNBpBF2Yd44wINiv5FcX6xxxxxxxxxxxxxxxxxx3ECTeYeJ3up1cYhfb84LhwhW5us/TN
vUmWTjD4YLZczXc9ZsfGYxH3lEud93pRB0Jw8BcLW1AFlKTeqAhBo3px3ZdhxywG
KRNWUDCqOXWGft+DCKomLlgUqVmER4IOp/hD6tOVgYktcf8yjvFjoAkvMzE77/vo
Sq+tFQXOWpWsDTuGbC8/jNOu/BHdFUyUa6h+LnL3rLZ2zQ6KHYhJFJyv
-----END CERTIFICATE-----
</ca>
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
1ad48bb3c09f26ce5351a7017672f502
aef648396e345345444ad816e26d18f
0271dff4ae5ecb7745a4f418e9b4671f
45edc40ec9b6666666666684c6043f4c6
06415fabb8c666666666666fc81d2cb3e
2cd71cc177c666666666666666f0b8899
cf310ebb1b19666666666666fc45162
17e34f7e5d97666666666666fd946d9
9be734894666666666666f135780fae21
dc350ccf3c807666666666f6ae3285917f
6941ce1f7a1d666666666666f307f0cc69c9e
933276f78f576681c82e97fc802c8b95
1e0b83957df504b328c37ef7e75afc6a
ecbb0fa9ec10f535906b95857dc43e12
e2a0ec2b1d89c68d9c81d2b604df9605
14bf4f35e5f8962469f41aac5aa988dc
-----END OpenVPN Static key V1-----
</tls-auth>

难点:

  • tls-auth 参数——OpenVPN 内联文件——将客户端证书内置到配置文件[3]
  • OpenVPN 能连接上但 ping 不通服务器——最终原因是服务器虚拟 ip 默认是 10.0.0.1, 但是测试用户我用 ccd 也给固定成 10.0.0.1,两者冲突了 尝试:https://www.nowfox.com/article/5771
  • 手动编译安装 OpenVPN 在启动服务时报错 No such file or directory?configure 步骤记得加参数--enable-systemd,OpenVPN 解压后路径要保证在/etc 下面,否则需要 service 里面修改工作路径

7. 测试 (截图包含旧的)

从用户角度,登录 openvpn 连接到混合云网络,然后访问另一个 VPC 的子网某一台机器,观察 wireguard 服务端客户端流量:

旧的,从 win10 客户端到一个 VPC wireguard 结点和子网的实验

目前影响用户访问混合云网络的原因就更为复杂了,有 OpenVPN 用户本身有没有权限、服务器本身有没有相关安全组规则、VPC 的 ACL 规则等

  • 测试 win10 直接通过 wireguard 接入混合云的过程

8. 待优化拓展点

  • 探究清楚新增 VPC 情况下 wireguard 服务端 reload 的问题
  • 用 wireguard 打通 k8s——使大家可以直接访问集群 Node Pod(用户空间的 wireguard)
  • 用户访问权限控制和监控?结合 cmdb 将网络权限具象成服务模型、管理端的重构(方便管理)
  • 如何管理 wireguard 和监控 wg 结点?

9. 运维思路

  1. 关于网络畅通的
代码语言:javascript
复制
## 测试服务端的51820/udp端口是否畅通
nc -vuz 公网IP 51820
## 查服务器的出口IP/公网IP
curl icanhazip.com
  1. 检查 iptables 规则
代码语言:javascript
复制
## 查看 input 表
iptables -L INPUT --line-numbers
## 删除 INPUT 表第3条规则
iptables -D INPUT 3
## 查看 FORWARD 表
iptables -L FORWARD --line-numbers
## 删除 FORWARD 表第8条规则
iptables -D FORWARD 8
  1. 抓包
代码语言:javascript
复制
tcpdump -n -i eth0 icmp
tcpdump -i tun0
tcpdump -i wg0
  1. 错误的 wireguard 路由配置导致服务器不能 ssh 连接了 如果因为启动 Wireguard 导致某条服务器突然不能 ssh 连接,需要进到华为云管理端进入服务器,将 wg-quick down wg0 服务停止,然后修改配置 wg0,将 allowedips 参数与本机所在子网网段冲突的网段删掉或改小,然后重启 wg-quick up wg0,稍等下等服务刷新路由,即可恢复 ssh 连接
  2. 检查某用户的 VPN 权限
代码语言:javascript
复制
#查询规则表找到10.12.0.3的规则
## 最后多个空格
iptables -t nat -nL --line-number | grep '10.12.0.3  '
  1. iptables 规则会在 iptables 重启时丢失 重启前,将规则写入文件,重启后,从文件恢复权限;这一点需要完整的测试!!之前翻过车
  2. 用户 ccd 文件分配的虚拟 IP 失效
  1. 在新增节点的时候,出现这个,则说明不是标准内核
代码语言:javascript
复制
[#] ip link add wg0 type wireguard
RTNETLINK answers: Operation not supported
Unable to access interface: Protocol not supported
[#] ip link delete dev wg0
Cannot find device "wg0"
  1. 新增 VPC 错误,配置好 wg 后 reload 服务端,然后 ping 新 VPC wireguard 时遇到错误

你 wg-quick down wg0 然后再 up 下服务端,一分钟之内所有 VPC 就都恢复了;

这时候就好了。

代码语言:javascript
复制
[root@vpn-server ccd]## ping 10.252.0.3
PING 10.252.0.3 (10.252.0.3) 56(84) bytes of data.
From 10.252.0.1 icmp_seq=1 Destination Host Unreachable
ping: sendmsg: Required key not available
From 10.252.0.1 icmp_seq=2 Destination Host Unreachable
ping: sendmsg: Required key not available
  1. 新增 VPC 后。服务端也重载(启)过了,wg 服务端能到新 VPC 的 wg 客户端(静态 IP),但是到不了它的子网

以前的测试示例:

解决:

因为私有网段多了一层 NAT,所以需要 masquerade;客户端配置也加上 PostUp 和 PostDown 参数;

后面将 wireguard 服务端和客户端都应用上了 masquerade 命令

  1. 在 Openvpn 服务端的 iptables 操作-iptables 控制访问规则
代码语言:javascript
复制
## 允许 tun0 网卡进行 FORWARD
iptables -I FORWARD -i tun0 -j ACCEPT
iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -L -n
## 如果openvpn服务端重启,要保留并恢复用户的大量临时iptables规则
iptables-save > /etc/iptables-rules    #保存配置
vim /etc/iptables-rules                 #编辑保存的配置文件,不要的删掉
iptables-restore < /etc/iptables-rules   #恢复配置文件
## 把来自10.11.0.1/16网段的请求 全部通过openvpn服务器的eth0网卡转发出去 也就是我们平时所说的IPtables的NAT规则
iptables -t nat -A POSTROUTING -s 10.11.0.0/16 -o eth0 -j MASQUERADE
## openvpn服务端要先配置这句规则 这样把openvpn客户端用户的流量转发给wireguard网卡,然后wg0网卡就知道转发给wg结点了!! 卡了我一周【7】
iptables -t nat -A POSTROUTING -s 10.11.0.0/16 -o wg0 -j MASQUERADE

## 然后再把这个固定的规则保存到iptables-rules里面
## 【要反复重启服务端测试下会变化的配置】

10. 参考资料

  • WireGuard 教程:WireGuard 的工作原理[4]
  • Wireguard 全互联模式(full mesh)配置指南[5]
  • 个人办公用 wireguard 组网笔记[6]
  • 使用 OpenVPN 连通管理多个阿里云 VPC 网络[7]
  • https://openvpn.net/community-resources/how-to/#expanding-the-scope-of-the-vpn-to-include-additional-machines-on-either-the-client-or-server-subnet[8]
  • https://community.openvpn.net/openvpn/wiki/RoutedLans[9]
  • https://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=96195[10]
  • 云网融合的多云网络[11]
  • 如何解决混合云组网难题?[12]

脚注

[1]

米开朗基杨: https://fuckcloudnative.io/about/

[2]

WireGuard 教程:WireGuard 的搭建使用与配置详解: https://fuckcloudnative.io/posts/wireguard-docs-practice/

[3]

OpenVPN内联文件——将客户端证书内置到配置文件: https://my.oschina.net/randolphcyg/blog/4930996

[4]

WireGuard 教程:WireGuard 的工作原理: https://fuckcloudnative.io/posts/wireguard-docs-theory/

[5]

Wireguard 全互联模式(full mesh)配置指南: https://fuckcloudnative.io/posts/wireguard-full-mesh/

[6]

个人办公用 wireguard 组网笔记: https://zhangguanzhang.github.io/2020/08/05/wireguard-for-personal/#udp%E8%A2%AB-qos-%E4%B8%8B%E9%85%8D%E5%90%88-udp2raw-%E4%BD%BF%E7%94%A8

[7]

使用OpenVPN连通管理多个阿里云VPC网络: https://www.bbsmax.com/A/E35pGYBgJv/

[8]

https://openvpn.net/community-resources/how-to/#expanding-the-scope-of-the-vpn-to-include-additional-machines-on-either-the-client-or-server-subnet: https://openvpn.net/community-resources/how-to/#expanding-the-scope-of-the-vpn-to-include-additional-machines-on-either-the-client-or-server-subnet

[9]

https://community.openvpn.net/openvpn/wiki/RoutedLans: https://community.openvpn.net/openvpn/wiki/RoutedLans

[10]

https://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=96195: https://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=96195

[11]

云网融合的多云网络: https://www.sdnlab.com/21293.html

[12]

如何解决混合云组网难题?: https://zhuanlan.zhihu.com/p/40198634

你可能还喜欢

点击下方图片即可阅读

记一次 Kubernetes 中严重的安全问题

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 背景说明
  • 2. 架构说明
  • 3. wireguard 服务端所有步骤
  • 4. wireguard【客户端/中继器】(新增 VPC 全步骤)
  • 5. OpenVPN 服务端
  • 6. OpenVPN 客户端
  • 7. 测试 (截图包含旧的)
  • 8. 待优化拓展点
  • 9. 运维思路
  • 10. 参考资料
    • 脚注
    相关产品与服务
    私有网络
    私有网络(Virtual Private Cloud,VPC)是基于腾讯云构建的专属云上网络空间,为您在腾讯云上的资源提供网络服务,不同私有网络间完全逻辑隔离。作为您在云上的专属网络空间,您可以通过软件定义网络的方式管理您的私有网络 VPC,实现 IP 地址、子网、路由表、网络 ACL 、流日志等功能的配置管理。私有网络还支持多种方式连接 Internet,如弹性 IP 、NAT 网关等。同时,您也可以通过 VPN 连接或专线接入连通腾讯云与您本地的数据中心,灵活构建混合云。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档