WireGuard是一种最新的开源VPN程序和协议,它比传统的VPN更简单,传输速度也更快。本文介绍如何在Ubuntu 20.04 LTS Linux 服务器上安装和设置 WireGuard VPN服务器,并与pfSense建立点对点连接,实现VPN策略(分流)路由。
本示例服务器运行Ubuntu 20.04 LTS。VPN隧道子网:10.10.0.0/24,服务器WG接口地址10.10.0.1,pfSense防火墙WG接口地址10.10.0.2。
服务器配置
在Ubuntu 20.04 LTS系统上安装WireGuard分以下几个步骤:
安装WireGuard
运行以下命令更新系统:
apt upgrade
运行以下命令,安装WireGuard:
apt install wireguard
配置WireGuard,进入wireguard目录:
cd /etc/wireguard/
生成公钥和私钥:
umask 077; wg genkey | tee privatekey | wg pubkey > publickey
在当前目录下,运行以下命令,查看生成的私钥并记录到记事本:
cat privatekey
IPb6tTT+M6V428O1RPV4p5AwwiLdG2Ul1I3AJiy2FVE=
在当前目录下,运行以下命令,查看生成的公钥,并记录到记事本:
cat publickey
HaFVrLOzDyWZrutPYi0jsc2ZKrSa4e/UWkPJZGi00wk=
运行以下命令,安装vim文本编辑程序
apt install vim
运行以下命令,编辑WireGuard的配置文件wg0.conf:vim /etc/wireguard/wg0.conf
内容如下:
[Interface] Address = 10.0.0.1/24
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = IPb6tTT+M6V428O1RPV4p5AwwiLdG2Ul1I3AJiy2FVE=
[Peer]
PublicKey = vqWe0YTUvZIXGkQp8XfZX3kx8ljihLiObc5d7A3NfC0=
AllowedIPs = 10.10.0.1/32
其中Peer的PublicKey(公钥)在pfSense隧道上复制。注意,这里的eth0为服务器公网网卡名称,可以用”ip a”或”ifconfig”命令查看。
设置服务器防火墙监听端口
这里假设已经配置了UFW(如何配置可以参考这篇文章。使用ufw 命令打开服务器的UDP端口51820,如下所示:
ufw allow 51820/udp
验证设置:
ufw status
启动WireGuard 服务
启用WireGuard服务:
systemctl enable wg-quick@wg0
运行WireGuard服务:
systemctl start wg-quick@wg0
查看服务状态:
systemctl status wg-quick@wg0
使用ip命令验证wg 的接口状态:
wg ip a show wg0
服务器防火墙NAT设置
使用iptables为WireGuard VPN客户端启用IP转发,允许客户端通过隧道进行Internet 访问。
确保所有出站的数据包都通过VPN进行NAT转发:
iptables -t nat -I POSTROUTING 1 -s 10.0.0.0/24 -o eth0 -j MASQUERADE
允许wg0 接口上的所有流量:
iptables -I INPUT 1 -i wg0 -j ACCEPT
允许数据包通过WireGuard 服务器进行路由:
iptables -I FORWARD 1 -i eth0 -o wg0 -j ACCEPT iptables -I FORWARD 1 -i wg0 -o eth0 -j ACCEPT
打开WireGuard 所使用的UDP端口51820:
iptables -I INPUT 1 -i eth0 -p udp --dport 51820 -j ACCEPT
打开IP转发(ipv4):
sysctl -w net.ipv4.ip_forward=1
pfSense配置
使用的软件版本为pfSense plus 22.01。
添加隧道
转到VPN>WireGuard,隧道选项卡,单击右下侧添加隧道按钮,新建一个隧道。注意,这里的隧道公钥必须与服务器上配置的peer的隧道公钥相同。
配置接口
在接口配置部分,为隧道添加一个接口,地址为隧道端点的地址。
配置完成后如下图所示:
添加远程端点
导航到VPN>WireGuard,端点选项卡,单击右下侧的添加端点按钮,添加服务器远程端点。端点地址为服务器的公网IP地址,将前面在服务器上生成的公钥复制到本页的公钥栏,允许IP输入 0.0.0.0/0。
配置完成后如下图所示:
启用隧道
转到VPN>WireGuard,设置选项卡,选中启用WireGuard并保存。
添加网关
在pfSense上添加远程网关,以便通过WireGuard服务器进行策略路由。
转到系统>路由管理,网关状态选项卡,单击右侧添加按钮,添加远程网关。接口选前面添加的WG接口,网关IP地址填入远程服务器的WG接口地址。
配置防火墙规则
包含三个方面,一是允许WG接口与远程服务器上的WireGuard服务器通信,二是放开WAN接口上的UDP 51820端口,三是进行策略分流。
转到防火墙>规则策略,在新建立的WG接口上,添加允许通行的规则,如下图所示。简单处理也可以添加一个any to any规则。
在WAN接口上,添加一条规则,放行UDP端口51820。
内外地址访问策略分流,必须建立一个国内或国外IP地址的别名,建立一种即可。国内IP地址段可以从这里下载。
转到防火墙>别名管理, IP选项卡,点击右下的导入按钮,导入国内IP段并保存。
保存后如下图所示:
转到防火墙>规则策略,LAN选项卡,修改默认规则并添加一条策略路由规则。默认规则目标修改为国内IP段别名,默认网关修改为WAN网关,该规则必须放在列表的首位。添加另一条通过VPS网关出站的策略路由规则,该规则必须放在默认规则的后面,否则所有的访问都会从VPS网关出站。经过设置以后,访问国内IP地址会走国内网关,访问国外地址走VPS网关。
测试
完成设置以后,先检查两端隧道是否已通,再检查是否能正常上网。访问国外的IP查询网站,查看出站公网IP是否为VPS的公网地址。
访问国内的IP查询网站,查看公网IP是否为WAN接口地址。
经过测试 ,访问国外主要网站正常,国内网站正常。
查看防火墙对应规则,检查是否有流量产生。
参考文章: