Skip to content

用树莓派做路由器,搭建透明代理,加速游戏主机的网络

wangyu- edited this page Aug 23, 2018 · 63 revisions

背景

游戏主机本身不能运行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-gatewaydhcp-option参数,因为要用后面讲的方法配透明代理,所以不使用OpenVPN自动配置的路由规则。

以上这些网上都能找到很多教程,不要问我细节。 下文要讲的内容完全是基于此环境的,如果和你的环境有出入,请自行做相应改变。(比如你可以把网线插在树莓派上直接拨号,这样你就需要把下文中的eth0改成pppXXXX。)

NOTE:

UDPspeeder和OpenVPN这2个软件可以换成tinyfecVPN这一个软件(需要自己编译去除限制的server端)。

如果你的运营商对UDP有限速,推荐在UDPspeeder前面串联一个udp2raw把udp伪装成tcp。串联udp2raw的方法可以参考 这篇文章

配置过程

Server 端

需要的命令只有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

Client 端

1.把tun100设置成持久型的tun设备(可选)

ip tuntap add tun100 mode tun
ifconfig tun100 up

2.开启ip forward:

echo 1 >/proc/sys/net/ipv4/ip_forward

3.配置SNAT(MASQUERADE方式):

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

4.编辑文件/etc/iproute2/rt_tables,加入100 lanvpn

改好后的效果:

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

5.添加策略路由规则:

 ip rule add from 192.168.100.128/25 lookup lanvpn priority 30001

6.向路由表的lanvpn表里加入如下路由信息:

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
6.1 OpenVPN等VPN

里面的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。

6.2 tinyfecVPN

如果是用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热点。

其他信息(非必需)

教程改进:开机自启

ip forward和iptables部分

这几条直接加到/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
VPN部分

以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

相关repo

tinyfecVPN的repo:

https://github.com/wangyu-/tinyfecVPN

UDPspeeder的repo:

https://github.com/wangyu-/UDPspeeder

Clone this wiki locally