OPNsense与Ubuntu VPS使用WireGuard建立点对点连接,实现VPN策略路由

WireGuard是什么

简单地说,WireGuard是一种最新的开源VPN程序和协议,它比传统的VPN更简单,传输速度也更快。

WireGuard的优点

  • 比OpenVPN、IPSec等传统VPN协议更轻巧,速度更快。
  • 比传统VPN在加密技术方面更先进,拥有更好的安全性。
  • 以UDP协议传输数据,可以避免TCP阻断,在IP被墙的情况下仍然可以使用。
  • 因为在不使用时WireGuard不进行数据传输,所以使用起来更省电。
  • 因为比较新,用户还没有那么多,所以还没有像传统VPN一样受到大规模的干扰和屏蔽。

WireGuard的缺点

  • 因为比较新,可能存在BUG,可靠性还需要进一步验证。
  • 不提供类似于的SSR的隐藏自身和混淆功能,容易暴露。
  • 由于用户日志的使用,在隐私保护方面有一定缺陷。
  • 因为WireGuard使用UDP协议,所以搭建服务器时无法使用如锐速、BBR等TCP网络加速工具。
  • 部分网络运营商对UDP进行限速,会使WireGuard的使用受到到影响。
  • 对客户端分流(如使用GFWList来分控国内、国外流量)的支持不足。

WireGuard VPN 服务器搭建

本文介绍如何在Ubuntu 20.04 LTS Linux 服务器上安装和设置 WireGuard VPN服务器,并与OPNsense建立点对点连接,实现VPN策略路由。本教程使用的服务器是运行Ubuntu 20.04 LTS 系统的板瓦工VPS,VPN隧道所使用的子网为:10.0.0.0/24,其中Ubuntu WireGuard服务器的WG接口地址为10.0.0.1,OPNsense的WG接口地址为10.0.0.10。在linux上安装WireGuard分以下几个步骤:

安装WireGuard

首先运行以下命令更新系统:

apt upgrade

再运行以下命令,安装WireGuard

apt install wireguard

配置WireGuard

首先,我们需要为WireGuard 服务器创建一个私钥和公钥对。先必须获取管理员权限,然后使用 cd 命令进入 /etc/wireguard ,再执行密钥创建命令。查看创建的密钥,可以使用cat 命令和 ls 命令:

首先取得管理员权限:

sudo -i

进入wireguard目录:

cd /etc/wireguard/

生成公钥和私钥:

umask 077; wg genkey | tee privatekey | wg pubkey > publickey

查看生成的私钥和公钥,并记录到记事本

ls -l privatekey publickey
cat privatekey
cat publickey

编辑配置文件

使用Vim编辑/etc/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 = CDFMDzpL12pQFwm/mqvUvRdA6omIosDsi1tW487nPEY=
MTU = 1420

[Peer]
PublicKey = CnKt9tFS05879pLHdKtbrRuHJwM2VoJ/F1eyhHSWkCI=
AllowedIPs = 10.0.0.10/32

其中Peer的PublicKey(公钥)在OPNsense客户端上复制。

打开防火墙的端口

ufw allow 51820/udp

启动WireGuard 服务

启用WireGuard服务:

systemctl enable wg-quick@wg0

运行WireGuard服务:

systemctl start wg-quick@wg0

查看服务状态:

systemctl status wg-quick@wg0

使用ip命令验证wg0 的接口状态:

wg
ip a show wg0

防火墙设置

设置防火墙的目地是使用 iptables为 WireGuard VPN 客户端启用 IP 转发和 NAT 规则,以便为客户端提供 Internet 访问。

1、确保所有传出的数据包都通过 VPN 进行转换:

iptables -t nat -I POSTROUTING 1 -s 10.0.0.0/24 -o eth0 -j MASQUERADE

2、允许 wg0 接口上的所有流量:

iptables -I INPUT 1 -i wg0 -j ACCEPT

3、通过设置FORWARD 规则允许数据包通过 WireGuard 服务器进行路由:

iptables -I FORWARD 1 -i eth0 -o wg0 -j ACCEPT
iptables -I FORWARD 1 -i wg0 -o eth0 -j ACCEPT

4、打开WireGuard 所使用的UDP端口51820

iptables -I INPUT 1 -i eth0 -p udp --dport 51820 -j ACCEPT

5、打开IP转发(ipv4):

sysctl -w net.ipv4.ip_forward=1

上述命令,可以集中起来一起运行:

iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
iptables -D INPUT -i wg0 -j ACCEPT
iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT
iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT
iptables -D INPUT -i eth0 -p udp --dport 51820 -j ACCEPT
sysctl -w net.ipv4.ip_forward=1

OPNsense防火墙WireGuard客户端设置

详细的配置过程,可以参考pfSense、OPNsense使用WireGuard VPN建立站点到站点连接和配置策略路由示例,注意修改WG接口IP为10.0.0.10,静态路由可以不用配置。

测试

在OPNsense上完成策略路由的设置以后,在客户端先检查是否能PING通VPS服务器WG接口IP,如果能通,再检查是否能正常上网。先查看上网IP,检查是否为VPS的IP。

测试播放视频的速度,稳定在9.7万。

speedtest的测速,下载基本跑满了300M的带宽。

使用体会:打开国外网站的速度比较快,访问国内的网站则慢很多,部分国内网站会存在无法访问的问题。

参考文章:

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