-
Notifications
You must be signed in to change notification settings - Fork 463
用openwrt路由器搭建透明代理,加速局域网内所有设备
(本教程不适合不熟悉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热点
#开启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端)
./tinyvpn -c -r 45.66.77.88:30001 --sub-net 10.0.2.0 --tun-dev tun100
(建议自行加入开机自启)
(另外建议把这个tun100设置成持久性tun设备,方法见wiki。可选)
Protocol选unmanaged
。
物理接口选Ethernet Adapter: "tun100"
在Firewall Settings页面建立一个新的zone: wan_vpn_zone
最终效果如下:
本来路由器是默认开启了2个wifi热点的:
wdr4310-2.4ghz
wdr4310-5ghz
现在你需要在network-->wifi里面再建两个:
wdr4310-2.4ghz-2
wdr4310-5ghz-2
最终效果如下:
(忽略图中的wdr4310-2.4ghz-3
和wdr4310-5ghz-3
)
首先确认你的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
把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.3和3.4完成后效果如下:
(忽略图中的ipv6部分)
在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打勾)
最终效果:
加入如下内容:
100 lanvpn
(重启后继续有效)
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的情况下切换代理状态。
在连到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范围区分是否走代理。
在tinyfecVPN前面串个udp2raw,可以应对运营商的udp屏蔽/限速,并可以加密流量。过程很简单,这里就略过了。
你可以把如下内容保存成/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
,连到这2个wifi热点后根据ip所在地和域名规则自动决定是否走代理。 然而配置起来非常麻烦,这里就不讲了。
在本教程基础上可以添加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禁用掉了,请忽略)