Skip to content

用openwrt路由器搭建透明代理,加速局域网内所有设备

wangyu- edited this page Aug 28, 2018 · 56 revisions

(本教程不适合不熟悉openwrt的新手,只推荐给有经验的人参考)

(这个环境在我的路由器上稳定运行了半年以上,但是不排除整理成教程时有疏漏,所以仅供参考)

简介

本文介绍把tinyfecVPN运行在路由器上,由路由器透明加速局域网内的所有设备的所有流量(tcp/udp/icmp)。本文跟《用树莓派做路由器,搭建透明代理,加速游戏主机的网络》类似,只不过环境运行在openwrt路由器上,另外做了一些易用性方面的改进。(tinyfecVPN可以换成UDPspeeder+其他VPN,需要做适当改动)

搭建透明代理的方案一般来说有两种:1.VPN方案 2.$$-redir方案。 本文只涵盖VPN方案。

本文基于官方原版的OpenWrt Chaos Calmer 15.05.1,假设你用的是双频路由器(自带2.4ghz+5ghz 2个wifi热点),假设你的路由器已经能成功上网了(比如通过插网线PPPOE拨号/通过wifi连到了有网的上级路由器/通过网线连到了有网的上级路由器)。

本教程教你在默认的2个wifi热点基础上,额外添加2个带透明代理的wifi热点。教程里用的路由器是tplink wdr4310,配置成功以后路由器会有4个wifi热点:

wdr4310-2.4ghz    #正常wifi热点
wdr4310-2.4ghz-2  #默认走透明代理的wifi热点
wdr4310-5ghz      #正常wifi热点
wdr4310-5ghz-2    #默认走透明代理的wifi热点

步骤

1.配置VPS

#开启ip forward:
echo 1 >/proc/sys/net/ipv4/ip_forward
#配置SNAT:
iptables -t nat -A POSTROUTING -s 10.0.0.0/16 ! -d 10.0.0.0/16 -j MASQUERADE

启动tinyfecVPN server:

./tinyvpn -s -l 0.0.0.0:30001 --sub-net 10.0.2.0 --tun-dev tun100

(需要nolimit版的server端)

2.在路由器上运行tinyfecVPN client

./tinyvpn -c -r 45.66.77.88:30001 --sub-net 10.0.2.0 --tun-dev tun100

(建议自行加入开机自启)

(另外建议把这个tun100设置成持久性tun设备,方法见wiki。可选)

3.在路由器web界面上进行各种配置

3.1建立interface:WAN_VPN

Protocol选unmanaged。 物理接口选Ethernet Adapter: "tun100"

在Firewall Settings页面建立一个新的zone: wan_vpn_zone

最终效果如下:

3.2开启额外的wifi热点

本来路由器是默认开启了2个wifi热点的:

wdr4310-2.4ghz
wdr4310-5ghz

现在你需要在network-->wifi里面再建两个:

wdr4310-2.4ghz-2
wdr4310-5ghz-2

最终效果如下:

(忽略图中的wdr4310-2.4ghz-3wdr4310-5ghz-3)

3.3给新的wifi热点建立interface:LAN_VPN

首先确认你的interface里有个叫LAN的interface桥接了你的wdr4310-2.4ghz``wdr4310-5ghz这两个热点(可能同时也桥接了有线网口),并且同时应该有一个叫LAN的zone(这些是路由器自带的,所以不用自己操作)

现在,新建一个叫LAN_VPN的interface,桥接wdr4310-2.4ghz-2``wdr4310-5ghz-2这两个interface。在Firewall Settings页面建立一个新的zone: wan_vpn_zone

3.4配置LAN和LAN_VPN这2个interface

把LAN的protocol选为static address,IP设置为192.168.200.1;设置dhcpserver,DHCP范围:192.168.200.128~255。

对LAN_VPN做同样设置,IP设置为192.168.202.1,DHCP范围:192.168.202.128~255。

把LAN_VPN的DNS设置为8.8.8.8。

3.33.4完成后效果如下:

(忽略图中的ipv6部分)

3.5设置防火墙规则

在network->firwall页面设置:

lan==>wan_vpn_zone  wan_zone (所有方框都不打勾)
wan_zone==>reject  (Masquerading和MSS clamping打勾)
lan_vpn_zone==>wan_vpn_zone  wan_zone (所有方框都不打勾)
wan_vpn_zone==>reject   (Masquerading和MSS clamping打勾)

最终效果:

4 ssh进路由器,在命令行下操作:

4.1修改"/etc/iproute2/rt_tables"

加入如下内容:

100     lanvpn

(重启后继续有效)

4.2 修改路由表(ip route),和策略路由规则(ip rule)

ip ro replace table lanvpn throw 192.168.0.0/16
ip ro replace table lanvpn throw 10.0.0.0/16
ip ro replace table lanvpn unreachable 0.0.0.0/0  metric 2

ip rule add from 192.168.202.128/25 lookup lanvpn priority 30001
ip rule add from 192.168.200.0/25 lookup lanvpn priority 30001
ip ro replace table lanvpn default via 10.0.2.1 dev tun100

(重启后需要重新添加)

完成

这样就完成了,效果图(win10搜到了4个wifi热点):

连接到wdr4310-2.4ghz-2 wdr4310-5ghz-2的所有设备会默认走代理加速。连到wdr4310-2.4ghz wdr4310-5ghz的设备像原来一样,走直连。

高级用法:免更换wifi切换代理

另外,此环境还支持在不重连wifi的情况下切换代理状态。

在连到wdr4310-2.4ghz wdr4310-5ghz的情况下,本来是默认不走代理的,但是如果你手动把ip改为192.168.200.2~127,这个设备就会变为走代理的状态。(同时你最好把dns改成8.8.8.8)

同理,在连到wdr4310-2.4ghz-2 wdr4310-5ghz-2的情况下,本来是默认走代理的,如果你手动把ip改为192.168.202.2~127,这个设备就会变成不走代理的状态。(同时最好把dns改成192.168.202.1)

上面的方法在用桥接模式的虚拟机时非常方便,可以实现虚拟机和宿主机共用同一个无线网卡,用IP范围区分是否走代理。

教程改进:增加udp2raw

在tinyfecVPN前面串个udp2raw,可以应对运营商的udp屏蔽/限速,并可以加密流量。过程很简单,这里就略过了。

教程改进:开机自启

tinyfecVPN部分

你可以把如下内容保存成/root/tinyvpn.sh,然后在/etc/rc.local里运行 /root/tinyvpn.sh &。 这样如果tinyfecvpn启动失败(比如网卡还没初始化好),会自动等10秒后重试。如果tinyfecvpn挂掉了(虽然不太可能发生),也会在10秒后复活。

#! /bin/sh
while true
   do
   /root/tinyvpn -c -r 45.66.77.88:30001 --sub-net 10.0.2.0 --tun-dev tun100
   sleep 10
done
路由表和策略路由部分

跟前面的类似,你可以把如下内容保存成/root/route.sh,然后在/etc/rc.local里运行 /root/route.sh &。 这样脚本可以自动定期重新添加需要的路由表和策略路由规则,防止添加的策略丢失。

#! /bin/sh
while true
   do
        echo begin
        ip ro replace table lanvpn throw 192.168.0.0/16
        ip ro replace table lanvpn throw 10.0.0.0/16
        ip ro replace table lanvpn unreachable 0.0.0.0/0  metric 2

        ip rule|grep 192.168.202.128  ###ip rule命令不支持replace,所以先检查是否存在,避免重复添加
        res=$?
        if [ $res -ne 0 ];
        then
                echo ne1
                ip rule add from 192.168.202.128/25 lookup lanvpn priority 30001
        fi

        ip rule|grep 192.168.200.0
        res=$?
        if [ $res -ne 0 ];
        then
                echo ne1_2
                ip rule add from 192.168.200.0/25 lookup lanvpn priority 30001
        fi

        ip ro replace table lanvpn default via 10.0.2.1 dev tun100
        echo end
        sleep 10
   done

教程改进:增加wdr4310-2.4ghz-3和wdr4310-5ghz-3

另外可以在此教程基础上增加wdr4310-2.4ghz-3wdr4310-5ghz-3,连到这2个wifi热点后根据ip所在地和域名规则自动决定是否走代理。 然而配置起来非常麻烦,这里就不讲了。

教程改进:ipv6

在本教程基础上可以添加ipv6支持。只要理解了前面的内容,再对ipv6有一定了解,配置起来不难。篇幅原因,具体内容不讲了。tinyfecVPN的ipv6设置可以参考下面2个文章:

https://github.com/wangyu-/tinyfecVPN/wiki/ipv6-VPN

https://github.com/wangyu-/tinyfecVPN/wiki/ipv6-VPN-advanced

教程改进:把计算搬到树莓派上

因为tplink wdr4310这个路由器CPU性能不是很好(580mhz mips),实际上我用的是tinyfecVPN(关掉fec当普通VPN用)+UDPspeeder+udp2raw的组合,把计算繁重的UDPspeeder+udp2raw运行在了局域网内的树莓派上(用网线和wdr4310)相连,wdr4310上面只运行tinyfecVPN。

其中tinyfecVPN使用--disable-fec关掉fec,并添加参数--disable-obscure --disable-checksum --mssfix 0最大程度节省性能。

至于为啥不把所有东西都搬到树莓派上、只用树莓派: 1.树莓派的无线网卡不好。2.openwrt的web界面比较方便。3.只用树莓派其实也可以,见:这篇文章。(openwrt路由器和树莓派的优缺点对比,参考: 这篇issue )

如果你的路由器网卡还不错,但是CPU较弱,可以尝试此方法。

其他

另外附上我的路由器的network->interfaces界面的完整截图,供参考:

(我的路由器的是通过5ghz无线连到上级路由的方式上网,所以额外有一个WWAN interface,在默认的环境上应该是没有WWAN的。WWAN6是ipv6用的)

(LAN_VPN2是wdr4310-2.4ghz-3和wdr4310-5ghz-3用的,前面简单提到过。我在截图时已经把这个interface禁用掉了,请忽略)