-
Notifications
You must be signed in to change notification settings - Fork 832
用树莓派做路由器,搭建透明代理,加速游戏主机的网络
游戏主机本身不能运行VPN和加速器,所以为了加速主机上的游戏,要把加速环境搭建在路由器上。树莓派3b自带一个一台网口和一个wifi网卡,CPU性能又很好,非常适合这个场景。这里讲解搭建过程。这里讲的是基于VPN和路由的方案,跟s***-redir的方案有本质区别,redir的经验不能在这里套用。
有一定难度,不过一旦配置好了以后非常稳定。仅推荐给有一定动手能力和自己有一定的问题追查能力的人使用,小白请不要尝试也不要提问。
如果你更喜欢用openwrt路由器而不是树莓派,可以参考《 用openwrt路由器搭建透明代理,加速局域网内所有设备》这篇文章。
先描述一下我自己的环境:我自己用的路由器是一台tp-link wdr4310,用PPPOE拨号上网,这台tp-link是我的根路由。树莓派3b的以太网口和tplink用网线相连,树莓派3b已经能从tp-link正常获取IP和上网。树莓派的以太网接口叫eth0,从tp-link获取到的ip是192.168.99.105。
树莓派3b被用来做下级的路由器,树莓派3b上安装了hostapd、dnsmasq等,其他机器可以连上pi的wifi热点并获取ip,wifi的接口名是wlan0。dnsmasq自动分配的ip范围在192.168.100.1~192.168.100.127。
在树莓和VPS上安装了OpenVPN和UDPspeeder,已经能成功连接并ping通。OpenVPN server的ip是 10.222.2.1,OpenVPN client的 ip 是 10.222.2.x,接口名是tun100。 不论是OpenVPN client还是server,都没有使用redirect-gateway
和dhcp-option
参数,因为要用后面讲的方法配透明代理,所以不使用OpenVPN自动配置的路由规则。
以上这些网上都能找到很多教程,不要问我细节。 下文要讲的内容完全是基于此环境的,如果和你的环境有出入,请自行做相应改变。(比如你可以把网线插在树莓派上直接拨号,这样你就需要把下文中的eth0
改成pppXXXX
。)
UDPspeeder和OpenVPN这2个软件可以换成tinyfecVPN这一个软件(需要自己编译去除限制的server端)。
如果你的运营商对UDP有限速,推荐在UDPspeeder前面串联一个udp2raw把udp伪装成tcp。串联udp2raw的方法可以参考 这篇文章。
需要的命令只有2条:
#开启ip forward:
echo 1 >/proc/sys/net/ipv4/ip_forward
#配置SNAT:
iptables -t nat -A POSTROUTING -s 10.222.0.0/16 ! -d 10.222.0.0/16 -j MASQUERADE
ip tuntap add tun100 mode tun
ifconfig tun100 up
echo 1 >/proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o tun100 -j MASQUERADE
改好后的效果:
root@raspberrypi:/home/pi# cat /etc/iproute2/rt_tables
#
# reserved values
#
100 lanvpn
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
ip rule add from 192.168.100.128/25 lookup lanvpn priority 30001
ip route replace table lanvpn throw 192.168.0.0/16
ip route replace table lanvpn throw 10.222.0.0/16
ip route replace table lanvpn unreachable 0.0.0.0/0 metric 2
ip route replace table lanvpn default via xxx.xxx.xxx.xxx dev tun100
里面的xxx.xxx.xxx.xxx需要根据你自己的ifconfig tun100
输出来填,比如我的输出是:
root@raspberrypi:/home/pi# ifconfig tun100
tun100 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.222.2.10 P-t-P:10.222.2.9 Mask:255.255.255.255
inet6 addr: fe80::241f:b8fe:2543:7185/64 Scope:Link
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:5946 errors:0 dropped:0 overruns:0 frame:0
TX packets:3259 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:4000
RX bytes:6641298 (6.3 MiB) TX bytes:230130 (224.7 KiB)
所以在xxx.xxx.xxx.xxx那里我要填的是10.222.2.9。
如果是用tinyfecVPN,网关地址是固定的,只需要填10.222.2.1。
以上就是client端需要做的全部设置。
局域网内ip为192.168.100.1~192.168.100.127的机器的流量会走本地的网络。ip为192.168.100.128~192.168.100.255的机器的流量都会自动被加速并且走VPS通道出去。
前面说过dnsmasq自动分配的ip范围被配置在了192.168.100.1~192.168.100.127。
所以最终效果就是,通过dhcp自动获取ip的设备都是不走代理的;如果你想让某台设备走代理,只要把它的ip修改为192.168.100.128~192.168.100.255范围内的一个值就可以了;可以自由在加速和非加速之间切换。 因为所有设备都支持手动设置ip,不用担心这个方法的兼容问题,兼容性是100%的。
另外,走加速通道时,dns最好改成8.8.8.8。
当然你可以把dhcp分配的ip范围改成192.168.100.128~192.168.100.255,默认dns改成8.8.8.8。这样所有设备都会默认走代理,让不想走代理的设备改IP/或者直接去连上级路由的wifi热点。
这几条直接加到/etc/rc.local里就可以了,一般不会丢失。
echo 1 >/proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o tun100 -j MASQUERADE
以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
添加的路由表在VPN重启/重连后可能会丢失/失效。比如ip route replace table lanvpn default via xxx.xxx.xxx.xxx dev tun100
这条命令,如果你没把tun100设置成持久型tun设备,那么vpn在重启后这条会直接丢失;如果你用的是openvpn,openvpn重连后因为网关变了,这条也会失效
你可以把如下内容保存成/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
if_wan_vpn=tun100
gw_wan_vpn=`ip addr show dev ${if_wan_vpn} |egrep -o 10.222[.][0-9]+[.][0-9]+/32|sed 's/[/]32//g' `
#如果是用openvpn等vpn,因为网关会变,网关地址需要动态获取。
#gw_wan_vpn="10.222.2.1"
#如果是用tinyfecVPN,就可以省去前面获取网关地址的命令,直接写10.222.2.1
echo gw_wan_vpn=$gw_wan_vpn
echo if_wan_vpn=$if_wan_vpn
ip rule|grep "192.168.100.128[/]25" #ip rule没有replace命令,所以只能grep判断一下了,如果规则没了就重加。
res=$?
if [ $res -ne 0 ];
then
echo ne1
ip rule add from 192.168.100.128/25 lookup lanvpn priority 30001
fi
echo ip ro replace table lanvpn default via $gw_wan_vpn dev $if_wan_vpn
ip ro replace table lanvpn default via $gw_wan_vpn dev $if_wan_vpn
sleep 10
echo end
done
仅供参考,仅能保证在我自己的pi上正常运行,如果在你自己的机器上出了问题请自己调试。
另外,附上我的树莓派3b上的所有网络信息。我的实际网络比上面讲的要复杂一些,除了lanvpn还有个lanvpn2(lanvpn2来实现根据ip所在地决定是否走VPN),请忽略lanvpn2。以下信息仅供参考。
pi@raspberrypi:~ $ ip route
default via 192.168.200.1 dev eth0 metric 202
10.222.2.0/24 via 10.222.2.5 dev tun100
10.222.2.5 dev tun100 proto kernel scope link src 10.222.2.6
192.168.100.0/24 dev wlan0 proto kernel scope link src 192.168.100.1
192.168.200.0/24 dev eth0 proto kernel scope link src 192.168.200.205 metric 202
root@raspberrypi:/home/pi# ip route show table lanvpn
default via 10.222.2.5 dev tun100
unreachable default metric 2
throw 10.222.0.0/16
throw 192.168.0.0/16
root@raspberrypi:/home/pi# ip rule
0: from all lookup local
30001: from 192.168.100.128/26 lookup lanvpn
30002: from 192.168.100.192/26 lookup lanvpn2
32766: from all lookup main
32767: from all lookup default
pi@raspberrypi:~ $ ifconfig
eth0 Link encap:Ethernet HWaddr b8:27:eb:1f:05:85
inet addr:192.168.200.205 Bcast:192.168.200.255 Mask:255.255.255.0
inet6 addr: fe80::9a5d:1529:f914:79de/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:295470621 errors:0 dropped:55 overruns:0 frame:0
TX packets:211176564 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1142843583 (1.0 GiB) TX bytes:4026763285 (3.7 GiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:501618665 errors:0 dropped:0 overruns:0 frame:0
TX packets:501618665 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:287062310452 (267.3 GiB) TX bytes:287062310452 (267.3 GiB)
tun100 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.222.2.6 P-t-P:10.222.2.5 Mask:255.255.255.255
inet6 addr: fe80::3dac:c1e5:3e26:1ade/64 Scope:Link
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:100833075 errors:0 dropped:0 overruns:0 frame:0
TX packets:50452376 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:4000
RX bytes:87634640893 (81.6 GiB) TX bytes:5435328076 (5.0 GiB)
wlan0 Link encap:Ethernet HWaddr b8:27:eb:4a:50:d0
inet addr:192.168.100.1 Bcast:192.168.100.255 Mask:255.255.255.0
inet6 addr: fe80::ba27:ebff:fe4a:50d0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:132173579 errors:0 dropped:141 overruns:0 frame:0
TX packets:169907366 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2890675634 (2.6 GiB) TX bytes:3856708752 (3.5 GiB)
root@raspberrypi:/home/pi# iptables-save
# Generated by iptables-save v1.4.21 on Mon Oct 23 14:21:00 2017
*filter
:INPUT ACCEPT [88468421:59803882244]
:FORWARD ACCEPT [26064453:20635973257]
:OUTPUT ACCEPT [88460854:59729887541]
:udp2rawDwrW_f6ddb804_C0 - [0:0]
-A INPUT -s 44.55.66.77/32 -p tcp -m tcp --sport 9966 -j udp2rawDwrW_f6ddb804_C0
-A udp2rawDwrW_f6ddb804_C0 -j DROP
COMMIT
# Completed on Mon Oct 23 14:21:00 2017
# Generated by iptables-save v1.4.21 on Mon Oct 23 14:21:00 2017
*nat
:PREROUTING ACCEPT [226067295:189482051229]
:INPUT ACCEPT [48065:4571743]
:OUTPUT ACCEPT [55141:4063178]
:POSTROUTING ACCEPT [55141:4063178]
-A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.100.0/24 -o tun100 -j MASQUERADE
COMMIT
# Completed on Mon Oct 23 14:21:00 2017
tinyfecVPN的repo:
https://github.com/wangyu-/tinyfecVPN
UDPspeeder的repo: