6 min read

Wireguard企业部署案例

Wireguard企业部署案例

一、背景

  某制造企业因业务扩展,成立2个分公司,因涉及IT数据交互,故而公司分部需要与公司总部进行数据交互。考虑成本投入,不打算通过专线链路--通过开源VPN技术来实现企业内部互联。企业网络拓扑如下:

vpn_topo

  关于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/wiregurad

生成服务端证书密钥

# 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]
[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 start  wg-quick@wg0
systemctl enable wg-quick@wg0

查看监听端口

# ss -tunl | grep :55380
udp    UNCONN     0      0         *:55380                 *:*

4.3.2 公司分部A VPN服务器配置

进入/etc/wiregurad目录

# mkdir -p /etc/wireguard/
# cd /etc/wiregurad

生成服务端证书密钥

# 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/server_private.key)
export INET_NAME=eth0

cat >/etc/wireguard/wg-client0.conf<<EOF
[Interface]
[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服务使用,可以看到带宽基本跑满状态。

iperf3