Wireguard企业部署案例
一、背景
某制造企业因业务扩展,成立2个分公司,因涉及IT数据交互,故而公司分部需要与公司总部进行数据交互。考虑成本投入,不打算通过专线链路--通过开源VPN技术来实现企业内部互联。企业网络拓扑如下:
关于VPN的方案选型在OpenVPN与Wireguard中进行对比,最终采用Wireguard方案,考虑如下:
- 速度够快
- 配置简单
- 目前已并入到Linux内核
- 业务需求不复杂,仅
Site-to-Site
二、业务需求
公司分部A
与公司分部B
可正常访问公司总部业务系统,如MES系统、AD域控等系统公司总部
可以访问公司分部网络,如网络管理员需监控分部节点网络流量,交换机需求- 由于该公司采用了AD域控管理,公司分部也需要加入到AD域管控(同时不打算在分部创建RODC)
三、网络/系统信息
网络地址规划
- 公司总部:
172.20.0.0/16
- 公司分部A:
172.21.0.0/16
- 公司分部B:
172.22.0.0/16
- VPN网络段:
10.0.20.0/24
- VPN端口:
55380/UDP
VPN服务器列表
序号 | 名称 | IP地址 | 操作系统 | 备注 |
---|---|---|---|---|
01 | 公司总部 | 172.20.100.20/25 | CentOS 7 | |
02 | 公司分部A | 172.21.100.20/25 | CentOS 7 | |
03 | 公司分部B | 172.22.100.20/25 | CentOS 7 |
四、部署配置
4.1 系统环境准备
所涉及的VPN服务器都同样配置
4.1.1 系统内核升级
我们将开启BBR算法,因CentOS7的系统缺省是3.10
,所以需要将系统内核进行升级,步骤如下:
添加镜像源
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
安装最新内核RPM包
yum --enablerepo=elrepo-kernel install kernel-ml -y
查看当前安装的内核包
rpm -qa | grep kernel
查看GRUB2的启动条目
sudo egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'
配置对应的内核,0表示第一个内核
sudo grub2-set-default 1
系统重启后,查看当前运行的内核版本是否为新安装的
4.1.2 开启BBR算法
启用BBR算法,并同时追加内核参数让其开机启动生效
echo 'net.core.default_qdisc=fq' | sudo tee -a /etc/sysctl.d/bbr.conf
echo 'net.ipv4.tcp_congestion_control=bbr' | sudo tee -a /etc/sysctl.d/bbr.conf
sudo sysctl -p
查看启用状态
lsmod | grep bbr
4.1.3 内核参数优化
将以下配置追加至/etc/sysctl.conf
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.ip_forward=1
net.ipv4.tcp_syncookies=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
主要开启如下网络数据转发、禁用IPv6、启用tcp_syncookies等
4.2 Wireguard安装
所涉及VPN服务器使用yum 安装wireguard
yum install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y
yum -y install yum-plugin-elrepo
yum install kmod-wireguard wireguard-tools -y
4.3 Wireguard 配置
4.3.1 总部VPN服务器配置
进入/etc/wiregurad目录
# mkdir -p /etc/wireguard/ && cd /etc/wireguard
生成服务端证书密钥
# wg genkey | sudo tee /etc/wireguard/server_private.key | \
wg pubkey | \
sudo tee /etc/wireguard/server_public.key
此时目录中已经生成了公钥与私钥
# ls
server_private.key server_public.key
生成主配置文件,使用wg0 虚拟接口名称
export VPN_IP='10.0.20.1/24'
export VPN_PORT=55380
export PRI_KEY=$(cat /etc/wireguard/server_private.key)
export INET_NAME=eth0
cat >/etc/wireguard/wg0.conf<<EOF
[Interface]
Address = ${VPN_IP}
MTU = 1420
SaveConfig = false
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ${INET_NAME} -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ${INET_NAME} -j MASQUERADE
ListenPort = ${VPN_PORT}
PrivateKey = ${PRI_KEY}
EOF
由于VPN节点为固定,
SaveConfig
配置为false。
服务启动
初始化并启动服务
wg-quick up wg0
推荐使用systemd 来控制服务
systemctl enable wg-quick@wg0 --now
新增Peer,又不想重启服务,可以使用
wg syncconf wg0 <(wg-quick strip wg0)
来热加载
查看监听端口
# ss -tunl | grep :55380
udp UNCONN 0 0 *:55380 *:*
4.3.2 公司分部A VPN服务器配置
进入/etc/wiregurad目录
# mkdir -p /etc/wireguard/ && cd /etc/wireguard
生成服务端证书密钥
# wg genkey | sudo tee /etc/wireguard/client_private.key | \
wg pubkey | \
sudo tee /etc/wireguard/client_public.key
此时目录中已经生成了公钥与私钥
# ls
client_private.key client_public.key
生成主配置文件,使用wg-client0 虚拟接口名称
export VPN_IP='10.0.20.2/24'
export PRI_KEY=$(cat /etc/wireguard/client_private.key)
export INET_NAME=eth0
cat >/etc/wireguard/wg-client0.conf<<EOF
[Interface]
Address = ${VPN_IP}
MTU = 1420
SaveConfig = false
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ${INET_NAME} -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ${INET_NAME} -j MASQUERADE
ListenPort = ${VPN_PORT}
PrivateKey = ${PRI_KEY}
[Peer]
PublicKey = 总部VPN PublicKey
AllowedIPs = 10.0.20.1/32, 172.20.0.0/16, 100.250.0.53, 100.250.0.54
Endpoint = xx.xx.xx.xx:55380
PersistentKeepalive = 30
EOF
由于该分部的出口是动态ADSL,建议添加
PersistentKeepalive
参数
由于我们新增了1个VPN节点,所以需要在总部VPN服务器
配置里需要有对应的信息,要不然无法正常互联,在总部VPN服务器的/etc/wireguard/wg0.conf
文件中追加如下内容:
[Peer]
PublicKey = 公司分部A VPN公钥证书内容
AllowedIPs = 10.0.20.2/32,172.21.0.0/16
总部VPN服务器 上操作
重启服务
systemctl restart wg-quick@wg0
总部VPN服务器 上操作
启动本分部的VPN服务
systemctl restart wg-quick@wg-client0
查看VPN连接状态
# wg
interface: wg0
public key: eL1lUDM2Iupo3h1NPBabbUdUqT93R5k6LLv/qg1fCDA=
private key: (hidden)
listening port: 55380
peer: loZX75vW0e6dN7ij43NS2NnNDVugDeGFnoXVYaoImHo=
endpoint: xx.xx.xx.xx.:48456
allowed ips: 10.0.20.2/32, 172.21.0.0/16
latest handshake: 46 seconds ago
transfer: 4.79 GiB received, 651.60 MiB sent
总部VPN服务器 上操作
4.3.2 公司分部B VPN服务器配置
<略>
五、其它
5.1 网络流量测试
总部划分了20M带宽给VPN服务使用,可以看到带宽基本跑满状态。