Pages

Wednesday, 31 October 2018

在OpenWRT路由器上,安装和配置WireGuard

AzireVPN 有一篇很好的文章讲解了安装和配置的过程,这里将要点重复一下。
首先是安装OpenWRT到路由器,我使用的是小米路由器Mini,安装的是OpenWrt 18.06.1,下载地址为https://downloads.openwrt.org/releases/18.06.1/targets/ramips/mt7620/openwrt-18.06.1-ramips-mt7620-miwifi-mini-squashfs-sysupgrade.bin, 官方安装教程https://openwrt.org/toh/xiaomi/mini ,
刷机后默认前指示灯为红色,不是刷机失败。刷机完成后网线插入LAN口,访问192.168.1.1,默认密码为空,登陆后设置密码,然后开启WiFi功能,radio0是5G,radio1是2.4G。默认的LAN地址是192.168.1.1,如果做二级路由可能有冲突,所以我通过SSH改为192.168.31.1,通过Luci图形界面修改是不行的。
ssh [email protected]
uci set network.lan.ipaddr=192.168.31.1
uci commit
reboot
1234
重启后就需要访问192.168.31.1来进入Luci界面和SSH到路由器了。
接下来是安装WireGuard:
ssh [email protected]
opkg update
opkg install luci-proto-wireguard
reboot
1234
重启后进入Network->Interfaces,添加新的网络,Name填WG0,Protocol选择WireGuard VPN,回到Interfaces,配置新添加的接口,General Setup根据TunSafe下载的配置文件填写,如果申请了AzireVPN的WireGuard测试节点,同样可以将下载的配置填入相应的字段。需要注意的是Allowed IPs为0.0.0.0/0时外网流量才走VPN。Firewall Settings里Create / Assign firewall-zone填写wg,即新建一个名为wg的区域。
若配置没有问题,可进入Status->WireGuard Status查看状态,Latest Handshake应该出现,Data Received应该不为零。
接下来配置防火墙,进入Network->Firewall,Zones 编辑lan,Allow forward to destination zones: 选择wan和wg0,保存。回到防火墙,配置wg,Input->reject,outpub->accept,Forward->reject,Masquerading->yes,MSS clamping->yes。
Firewall
执行opkg update测试网络。这时还不能上Google进行测试,因为还没有配置正确的DNS。
在Network->Interfaces->WAN->Edit,Advanced Settings,取消Use DNS servers advertised by peer后的对勾,保存。在Network->DHCP and DNS,DNS forwardings填入8.8.8.8,滚动到最下面点击保存,进入System->Reboot,重新启动。
到现在为止已经可以访问Google了,PS4的联机网络测试NAT类型为NAT2,Ping值根据地理位置和网络情况而定,并不一定有直连好,如果WireGuard服务器在国内的话应该能在实现NAT2的同时保存较好的网络延迟。
最后做的优化就是PS4游戏更新的下载速度。因为PS4在国内有CDN服务器,所以下载游戏还是要走国内网络。断开路由器的连接,电脑直连ISP网络,使用nslookup 查看gs2.ww.prod.dl.playstation.net的IP地址。
nslookup gs2.ww.prod.dl.playstation.net
1
也可以访问ipip.net CDN 查询 选择离自己最近的测试点,填入gs2.ww.prod.dl.playstation.net查询,Ping解析出来的CDN域名,选择延迟最低的IP,填入OpenWRT的/etc/hosts文件里:
222.138.6.98    gs2.ww.prod.dl.playstation.net
223.119.50.222  post.net.playstation.net
12
其中gs2.ww.prod.dl.playstation.net是游戏下载服务器的域名,post.net.playstation.net是上传测试的域名,填入hosts文件后OpenWRT会将DNS解析为指定IP,再添加路由表让指定IP不走VPN。
进入Network->Static Routes,添加IPv4路由表,Interface选择wan,Target为Hosts中的IP, IPv4-Netmask可为空或者填写255.255.255.255,IPv4-Gateway填写上级路由的网关地址,Route type为unicast。
Hosts文件中有几个固定IP就添加几条静态路由。注意网关地址为上级路由器的网关地址,不是192.168.31.1。PS4的DNS要使用DHCP分配的路由器DNS服务器才会生效。
StaticRoutes
测试可以Ping 222.138.6.98看延迟是否增加,或者tracert 222.138.6.98查看是否全部走国内地址,可以使用PS4的网络测试查看下载速度和上传速度,同时观察WireGuard Status的流量是否增加。
最终效果就是获得了NAT2的网络,又不影响游戏下载速度。网络延迟和丢包可以在接入路由器的电脑上测试,接入该路由器的设备都会使用VPN作为网络出口。
参考链接:
AzireVPN
TunSafe
OpenWRT
How to configure WireGuard on OpenWrt/LEDE using LuCi
----------

OpenWRT路由器上,使用chnroute.sh

环境准备,将ftp.apnic.net添加到静态路由,防止通过VPN连接失败。
$nslookup ftp.apnic.net
Name:    ftp.apnic.net
Addresses: 202.12.29.205
123
固定IP地址添加到 /etc/hosts
202.12.29.205   ftp.apnic.net
1
静态路由,直接连接
chnroute-static-route
安装ip-full以支持ip -batch批量导入:
$opkg update
$opkg install ip-full
12
252 chnroute添加到/etc/iproute2/rt_tables
#
# reserved values
#
128     prelocal
255     local
254     main
253     default
252     chnroute
0       unspec
#
# local
#
#1      inr.ruhep
12345678910111213
启动脚本:
/etc/hotplug.d/iface/30-chnroute
#!/bin/sh

[ "$ACTION" = ifup -a "$INTERFACE" = wg0 ] && {
        logger -t chnroute apnic rule downloading.
        sleep 10
        RULES=$(wget -T 60 -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("rule add to %s/%d table chnroute\n", $4, 32-log($5)/log(2)) }')
        if [ ! -z "$RULES" ]; then
                logger -t chnroute download completed. inserting rule.
                echo "$RULES" | gzip - > /root/rules.gz
                echo "$RULES" | ip -batch -
                ip route add default via 192.168.33.1 dev eth0.2 table chnroute proto static
                ip route flush cache
                logger -t chnroute insert completed.
        elif [ -s /root/rules.gz ]; then
                logger -t chnroute download rule failed. inserting backup config.
                zcat /root/rules.gz | ip -batch -
                ip route add default via 192.168.33.1 dev eth0.2 table chnroute proto static
                ip route flush cache
                logger -t chnroute insert backup rule completed.
        else
                logger -t chnroute download rule failed. exit.
        fi
}

[ "$ACTION" = ifdown -a "$INTERFACE" = wg0 ] && {
        logger -t chnroute delete chnroute.
        ip route del default via 192.168.33.1 dev eth0.2 table chnroute proto static
        while :
        do
                RULES=$(ip rule show table chnroute | awk -F ':' '{ printf("rule del prio %d\n", $1) }')
                if [ ! -z "$RULES" ]; then
                        echo "$RULES" | ip -batch -
                else
                        break
                fi
        done
        ip route flush cache
        logger -t chnroute delete completed.
}
123456789101112131415161718192021222324252627282930313233343536373839
重启后测试
$logread -e chnroute
Wed Sep 26 18:25:39 2018 user.notice chnroute: china route rule downloading.
Wed Sep 26 18:25:55 2018 user.notice chnroute: download completed. inserting rule.
Wed Sep 26 18:26:08 2018 user.notice chnroute: insert completed.
$ip rule show table chnroute
$ip route show table chnroute
$ip route get 114.114.114.114
114.114.114.114 via 192.168.33.1 dev eth0.2 table chnroute src 192.168.33.63 uid 0
    cache

$ping 114.114.114.114
PING 114.114.114.114 (114.114.114.114): 56 data bytes
64 bytes from 114.114.114.114: seq=0 ttl=73 time=31.801 ms
64 bytes from 114.114.114.114: seq=1 ttl=89 time=31.620 ms

No comments:

Post a Comment