pfSense使用WireGuard建立点对点连接,实现策略路由

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接口地址。

经过测试 ,访问国外主要网站正常,国内网站正常。

查看防火墙对应规则,检查是否有流量产生。

参考文章:

  1. Ubuntu 20.04 set up WireGuard VPN server
  2. How To Set Up WireGuard Firewall Rules in Linux
  3. pfSense、OPNsense使用WireGuard VPN建立站点到站点连接和配置策略路由示例

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注