背景:
某公司有多个分支机构,分支机机构与总部通过广域网链路相连,广域网走的是OSPF协议,公司总部有互联网出口,分支机构没有互联网出口。现在分支机构想通过总部出口访问互联网,但广域网中的路由还是由OSPF自动生成,不得手动更改。
问题:
分支机构的内部业务可以通过OSPF协议路由互访,但访问互联网的路由无法正确走到公司总部的互联网网关。因特殊原因,广域网的路由也不允许手动添加静态的默认路由。
解决方式:
在公司总部部署一台wireguard节点,公支机构也部署节点。通过建立wireguard隧道打通分支到总部的路由。拓扑见下图。其中黄色部分是wireguard的隧道通路。
WireGuard简介:
WireGuard是一个易于配置、快速且安全的开源 VPN,它利用了最新的加密技术,目的是提供一种更快、更简单、更精简的通用 VPN,连Linux 创建者Linus Torvalds,也对 WireGuard 很感兴趣,在Linux 5.6内核 中,已内置了Wireguard。
配置过程:
两侧节点均以Ubuntu20.04为例,其他Linux发行版安装方式类似。
- 先安装总部侧10.60.171.18:更新系统并安装wireguard.sudo apt update;sudo apt upgrade;sudo apt install wireguard
- 通过wireguard自身工具生成公钥私钥wg genkey | tee privatekey | wg pubkey > publickey这样会在当前目录下 生成privatekey和publickey文件查看私钥信息,可以复制下来,下面配置要用。cat privatekey
- 在总部节点 10.60.171.18上配置sudo vim /etc/wireguard/wg0.conf具体配置内容如下:[Interface]Address = 10.18.18.1/29 #wiregurad隧道虚拟地址MTU = 1500 #MTU,默认是1300的,现在外部默认包都是1500的,务必改成大于等于1500SaveConfig = truePostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens18 -j MASQUERADE#启动添加转发策略和nat策略,ens18是本机网卡名名,需根据实际修改PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens18 -j MASQUERADE#停止时删除转发策略和nat策略ListenPort = 51820#监听的UDP端口,一般约定为51820PrivateKey=<<私钥>>
- 启动WireGuardsudo wg-quick up wg0
- 检查wiregurad运行正常。sudo wg
- 安装分支侧节点 10.50.176.18:安装wireguard,生成公钥私钥 ,方法与总部侧一致。
- 在公支节点 10.50.176.18上配置sudo vim /etc/wireguard/wg0.conf具体配置内容如下: [Interface]Address = 10.18.18.2/29#wiregurad隧道虚拟地址MTU = 1500SaveConfig = truePostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE#接口启动时 配置添加转发和nat策略,代理分支节点上网通过该节点PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE#接口关闭时 删除相关转发和nat策略PrivateKey = <<私钥>>[Peer]PublicKey = <<总部节点公钥>>AllowedIPs = 0.0.0.0/0# AllowdIps为在本地路由表中加进这些网段指向wireguard网卡的路由,# 0.0.0.0/0 表示将默认网关指向 wireguard网卡Endpoint = 10.60.171.18:51820#对端也就是总部侧的节点 和 监听端口PersistentKeepalive = 30#为避免广域网中有安全设备超时断开连接,添加这个参数保持长连接,30时表示每隔30秒就向对端发# 送连接信息。
- 启动WireGuardsudo wg-quick up wg0sudo wg
查看并记下分支节点的的公钥 - 切换到总部侧节点10.60.171.18,配置分支节点公钥和允许IPsudo wg set wg0 peer <<分支节点公钥>> allowed-ips 10.18.18.2/32AllowedIps用了32位掩码只设定允许分支节点一个IP通过总部出口
- 分别检查总部节点和分支节点,发现已正常在连接。sudo wg-quick up wg0sudo wg以分支节点为例截图如下:
- 在分支节点和总部节点 开启转发,将节点变成路由器,以转发客户的连接请求。cat /proc/sys/net/ipv4/ip_forward如果是0的话,修改成1:sudo sysctl -w net.ipv4.ip_forward=1持久化修改:sudo vim /etc/sysctl.conf启用 net.ipv4.ip_forward=1
- 测试连通性。在分支节点进行ping ping 8.8.8.8再到总部节点捕获主机8.8.8.8的流量,查看是从分支节点过来的就说明已连通。sudo tcpdump -envi wg0 host 8.8.8.8
- 通过以上配置,就实现了分支节点共享总部节点的互联网链路访问互联网了。分支节点的其他计算机构只要将网关指向该分支节点wireguard服务器,即可实现连上互联网。