65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (8投票s)

2021年3月1日

CPOL

7分钟阅读

viewsIcon

49881

downloadIcon

372

使用 openvpn 和 mwan3 在 OpenWRT 路由器上启用 VPN 客户端的步骤。

警告 - 仅适用于OpenWRT版本19.XX。更高版本的mwan3中的某些改动破坏了此实现。

当设备使用应用程序连接到VPN时,它会打开一个到VPN服务器的加密隧道,如下图中的绿线所示。任何记录流量的间谍都无法查看隧道内部,从而使通信安全。红线表示可被记录的常规流量。

按照本文所述配置OpenWRT路由器后,所有连接到LAN和WiFi的设备都将通过路由器打开的单个VPN隧道访问互联网。这将比单个设备直接连接到VPN更高效,因为所有与VPN相关的处理都在这个专用设备上完成,而不是在每个连接的设备上单独完成。如下图所示。

引言

OpenWRT是一款安全的开源基于Linux的固件,兼容多种路由器。它易于使用和配置,适用于多种不同应用。它的包管理器opkg中有很多有用的库,我们将使用openvpnmwan3包来创建一个多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。

初始配置

全新刷写后的配置将默认包含wanlan接口的网络、DHCP和防火墙设置。有两个防火墙区域wanlan。通常,我会将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

以上命令安装了openvpnmwan3软件包。

创建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命令来创建使用wanovpn网络的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-passdev tun0route-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地址是否已更改。

此时,lucimwan3状态下的两个接口都必须显示为绿色。

状态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可以管理任意数量的接口,例如当wanovpn都关闭时,USB 4G加密狗将充当最后的手段。我们还可以实现一个kill switch配置,以便当VPN关闭时,互联网也会关闭,而不是回退到未受保护的互联网。这些可以通过调整mwan3配置和添加新策略来完成。

我还在此处以zip文件形式附带了一些配置文件config_files.zip,以防它们有所帮助。

此处有另一种更简洁、更兼容(无需mwan3)的OpenWRT路由器VPN实现方法:OpenWRT路由器中带Kill Switch的自愈随机VPN

历史

  • 2021年3月1日:初始版本
© . All rights reserved.