在 OpenWRT 路由器上配置 VPN 客户端。






4.88/5 (8投票s)
使用 openvpn 和 mwan3 在 OpenWRT 路由器上启用 VPN 客户端的步骤。
警告 - 仅适用于OpenWRT版本19.XX。更高版本的mwan3中的某些改动破坏了此实现。
当设备使用应用程序连接到VPN时,它会打开一个到VPN服务器的加密隧道,如下图中的绿线所示。任何记录流量的间谍都无法查看隧道内部,从而使通信安全。红线表示可被记录的常规流量。
按照本文所述配置OpenWRT路由器后,所有连接到LAN和WiFi的设备都将通过路由器打开的单个VPN隧道访问互联网。这将比单个设备直接连接到VPN更高效,因为所有与VPN相关的处理都在这个专用设备上完成,而不是在每个连接的设备上单独完成。如下图所示。
引言
OpenWRT是一款安全的开源基于Linux的固件,兼容多种路由器。它易于使用和配置,适用于多种不同应用。它的包管理器opkg
中有很多有用的库,我们将使用openvpn
和mwan3
包来创建一个多WAN VPN路由器。VPN服务提供商通常会为他们的服务器提供OpenVPN配置文件。这些*.ovpn文件可用于创建隧道,该隧道在OpenWRT设备中显示为“/dev/tun0”。
一旦设置好一个可用的隧道,就可以配置多WAN (mwan3
) 和一个新的网络,以使所有连接到LAN和WiFi的设备都能使用VPN。有关mwan3
的更多信息,请在此处阅读。mwan3
允许在网络接口之间无缝切换,因此当VPN连接失败或在命令重启期间,网络会切换回常规互联网,这样我们的视频就能继续播放,并在VPN网络再次可用时切换回VPN网络。
在以下章节中,可以将uci命令复制粘贴到OpenWRT shell中,并通过luci在配置页面中进行一些更改,到您到达最后一节时,路由器将完全配置好。
刷写OpenWRT
如果您的路由器没有OpenWRT固件,请在此处检查它是否与OpenWRT兼容。使用这个方便的工具查找您的固件,并刷写您的路由器。这可以被认为是本文中最难的步骤,我建议您手边准备一份救砖手册。下面的配置是为OpenWRT版本19.07.3编写的,应该在更新的版本上也能正常工作。刷写完成后,将您的PC连接到其中一个LAN端口,将互联网连接到路由器的WAN端口并重启。通过ssh root@openwrt.lan SSH到路由器,以输入您将在后续步骤中遇到的命令。您可以通过http://openwrt.lan/cgi-bin/luci/访问luci。
初始配置
全新刷写后的配置将默认包含wan
和lan
接口的网络、DHCP和防火墙设置。有两个防火墙区域wan
和lan
。通常,我会将lan
接口地址更改为192.168.2.1,而不是默认的192.168.1.1,这可以使用以下uci
命令完成。您可以在此处遵循额外的说明。
uci set network.lan.proto='static'
uci set network.lan.ipaddr='192.168.2.1'
uci set network.lan.netmask='255.255.255.0'
uci commit network
/etc/init.d/network restart
最后一个命令会重启网络,然后可以通过http://192.168.2.1以及http://openwrt.lan访问luci
界面。
启用 WiFi
要启用WiFi,必须创建一个新的接口wif24
并将WiFi设备附加到此新接口。运行以下命令设置wifi24
网络接口。
uci set network.wifi24='interface'
uci set network.wifi24.proto='static'
uci set network.wifi24.ipaddr='192.168.3.1'
uci set network.wifi24.netmask='255.255.255.0'
uci set dhcp.wifi24='dhcp'
uci set dhcp.wifi24.interface='wifi24'
将新接口添加到lan
防火墙区域。
uci add_list firewall.@zone[0].network='wifi24'
uci commit dhcp
uci commit network
uci commit firewall
/etc/init.d/firewall restart
/etc/init.d/network restart
此时,我们已经创建了一个网络,但网络设备不存在。
这个新接口可以在luci
中的http://openwrt.lan/cgi-bin/luci/admin/network/wireless与无线电关联。
保存配置后,luci
界面状态此时应如下所示。
在继续下一步之前,请测试LAN和WiFi连接设备中的互联网。如果您愿意,可以使用此页面http://openwrt.lan/cgi-bin/luci/admin/system/flash下载备份,以便您可以快速回到此初始状态。
安装软件包
从opkg
安装所需的软件包
opkg update
opkg install openvpn-openssl openvpn-easy-rsa luci-app-openvpn curl mwan3 luci-app-mwan3
以上命令安装了openvpn
和mwan3
软件包。
创建VPN网络接口
可以使用以下命令创建一个名为ovpn
的新网络接口,该接口将与隧道设备tun0
连接。
uci set network.ovpn='interface'
uci set network.ovpn.proto='none'
uci set network.ovpn.ifname='tun0'
uci commit network
将ovpn
接口添加到wan
防火墙区域。
uci show firewall.@zone[1]
uci add_list firewall.@zone[1].network='ovpn'
uci commit firewall
/etc/init.d/firewall restart
/etc/init.d/network restart
既然网络接口已经设置好,我们继续配置mwan3
。我们将在配置mwan3
之后打开隧道tun0
。同时,由于tun0
不存在,luci
界面页面将显示“网络设备不存在”。
配置多WAN (mwan3)
默认的mwan3
配置包含一些虚拟配置,因此在配置之前会清空文件。
rm /etc/config/mwan3
touch /etc/config/mwan3
输入以下uci
命令来创建使用wan
和ovpn
网络的mwan3。
uci set mwan3.globals='globals'
uci set mwan3.globals.mmx_mask='0x3F00'
uci set mwan3.globals.rtmon_interval='5'
uci set mwan3.ovpn='interface'
uci set mwan3.ovpn.enabled='1'
uci set mwan3.ovpn.family='ipv4'
uci set mwan3.ovpn.initial_state='offline'
uci add_list mwan3.ovpn.track_ip='8.8.8.8'
uci add_list mwan3.ovpn.track_ip='8.8.4.4'
uci set mwan3.ovpn.track_method='ping'
uci set mwan3.ovpn.reliability='2'
uci set mwan3.ovpn.count='1'
uci set mwan3.ovpn.size='56'
uci set mwan3.ovpn.max_ttl='60'
uci set mwan3.ovpn.check_quality='0'
uci set mwan3.ovpn.failure_interval='5'
uci set mwan3.ovpn.recovery_interval='5'
uci set mwan3.ovpn.timeout='5'
uci set mwan3.ovpn.interval='5'
uci set mwan3.ovpn.down='3'
uci set mwan3.ovpn.up='3'
uci set mwan3.wan=interface
uci set mwan3.wan.enabled='1'
uci add_list mwan3.wan.track_ip='8.8.8.8'
uci add_list mwan3.wan.track_ip='8.8.4.4'
uci set mwan3.wan.family='ipv4'
uci set mwan3.wan.reliability='2'
uci set mwan3.wan.count='1'
uci set mwan3.wan.timeout='2'
uci set mwan3.wan.failure_latency='1000'
uci set mwan3.wan.recovery_latency='500'
uci set mwan3.wan.failure_loss='20'
uci set mwan3.wan.recovery_loss='5'
uci set mwan3.wan.interval='5'
uci set mwan3.wan.down='3'
uci set mwan3.wan.up='8'
uci set mwan3.wan_m1=member
uci set mwan3.wan_m1.interface='wan'
uci set mwan3.wan_m1.metric='2'
uci set mwan3.wan_m1.weight='3'
uci set mwan3.ovpn_m1=member
uci set mwan3.ovpn_m1.interface='ovpn'
uci set mwan3.ovpn_m1.metric='1'
uci set mwan3.ovpn_m1.weight='6'
uci set mwan3.wan_policy=policy
uci set mwan3.wan_policy.last_resort='default'
uci add_list mwan3.wan_policy.use_member='wan_m1'
uci set mwan3.default_policy=policy
uci set mwan3.default_policy.last_resort='default'
uci add_list mwan3.default_policy.use_member='ovpn_m1'
uci add_list mwan3.default_policy.use_member='wan_m1'
uci set mwan3.default_rule_v4=rule
uci set mwan3.default_rule_v4.dest_ip='0.0.0.0/0'
uci set mwan3.default_rule_v4.family='ipv4'
uci set mwan3.default_rule_v4.use_policy='default_policy'
uci commit mwan3
/etc/init.d/mwan3 restart
此时,mwan3
已配置好,您可以在页面底部的http://openwrt.lan/cgi-bin/luci/admin/status/overview查看mwan3
状态。ovpn
接口状态将显示为已禁用,打开隧道tun0
将解决此问题。
如果您看不到这两个接口,请使用reboot命令重启路由器。下一步是打开隧道tun0
,以便ovpn
接口开始工作。
创建隧道“tun0”
启动隧道的所有信息都包含在一个*.ovpn文件中。此文件还需要添加一些额外的选项,其中之一是route-noexec
行,这样openvpn
客户端就不会修改路由表,因为路由由mwan3
自动管理。另一个是dev tun0
行,以便打开的隧道将被命名为tun0
。
下载ovpn文件
我使用NordVPN,因此可以从此页面下载*.ovpn文件。
path=/etc/openvpn/server1.ovpn
ovpnurl=
https://downloads.nordcdn.com/configs/files/ovpn_legacy/servers/in101.nordvpn.com.udp1194.ovpn
curl --output $path $ovpnurl
创建凭证文件
echo "vpn_username" >> /etc/openvpn/credentials
echo "vpn_password" >> /etc/openvpn/credentials
修改ovpn文件
现在,要将所需的自定义选项(auth-user-pass
、dev tun0
和route-noexec
)添加到文件中,请运行以下命令
if grep -F "auth-user-pass" $path
then
sed -i "/auth-user-pass/c\auth-user-pass /etc/openvpn/credentials" $path
else
echo -e "auth-user-pass /etc/openvpn/credentials\n$(cat $path)" > $path
fi
if grep -F "dev tun" $path
then
sed -i "/dev tun/c\dev tun0" $path
else
echo -e "dev tun0\n$(cat $path)" > $path
fi
if grep -F "route-noexec" $path
then
echo "already present in file..."
else
echo -e "route-noexec\n$(cat $path)" > $path
fi
配置openvpn实例
默认的openvpn
配置包含一些虚拟配置,因此清空该文件。
rm /etc/config/openvpn
touch /etc/config/openvpn
现在创建一个新的openvpn
实例。
uci set openvpn.ovpn1=openvpn
uci set openvpn.ovpn1.config=$path
uci set openvpn.ovpn1.enabled='1'
uci commit openvpn
/etc/init.d/openvpn restart
完成此步骤后,您可以通过http://openwrt.lan/cgi-bin/luci/admin/vpn/openvpn访问openvpn
实例。启用并启动此实例ovpn1
。
如果实例未启动:您可以手动运行openvpn
命令并检查问题所在。
openvpn --config $path
测试和验证
您现在可以使用ping -I tun0 8.8.8.8测试隧道。mwan3
现在将自动检测ovpn
作为工作接口,并将所有流量通过它切换。验证您连接设备的公共IP地址是否已更改。
此时,luci
中mwan3
状态下的两个接口都必须显示为绿色。
状态LED配置
您可以使用路由器上可用的一个LED来显示ovpn
网络的状态。可以配置LED在ovpn
接口连接时亮起,断开时熄灭。这将有助于快速显示VPN连接的状态。
设备的LED在/sys/class/leds目录中列为文件,可以使用以下行通过编程方式打开和关闭它们。
echo default-on > /sys/class/leds/<led_file>/trigger
echo none > /sys/class/leds/<led_file>/trigger
mwan3
有一个通知脚本(/etc/mwan3.user),帮助我们在它管理的接口启动或关闭时运行命令。您可以在http://openwrt.lan/cgi-bin/luci/admin/network/mwan/notify修改此脚本。将以下行附加到其中。
if [ $ACTION == 'ifup' ]; then
if [ $INTERFACE == 'ovpn' ]; then
echo default-on > /sys/class/leds/<led_file>/trigger
fi
fi
if [ $ACTION == 'ifdown' ]; then
if [ $INTERFACE == 'ovpn' ]; then
echo none > /sys/class/leds/<led_file>/trigger
fi
fi
防止DNS泄漏
上述配置将通过wan接口泄漏DNS请求,嗅探器可以记录DNS请求。为了避免这种情况,请输入以下命令。检查DNS泄漏测试以确认DNS没有泄漏。
uci set network.wan.peerdns='0'
uci commit network
/etc/init.d/network restart
进一步增强
由于mwan3
可以管理任意数量的接口,例如当wan
和ovpn
都关闭时,USB 4G加密狗将充当最后的手段。我们还可以实现一个kill switch配置,以便当VPN关闭时,互联网也会关闭,而不是回退到未受保护的互联网。这些可以通过调整mwan3
配置和添加新策略来完成。
我还在此处以zip文件形式附带了一些配置文件config_files.zip,以防它们有所帮助。
此处有另一种更简洁、更兼容(无需mwan3)的OpenWRT路由器VPN实现方法:OpenWRT路由器中带Kill Switch的自愈随机VPN
历史
- 2021年3月1日:初始版本