对于一般家用的路由器,一直苦于路由OS的功能限制,DD-WRT系的软件陈旧。想用PC直接当路由,但价钱上显然是狮子抓耗子。
我的目标是将树莓派做成VPN路由网关,即本身是一个VPN的Client,同时可以转发网络请求。这样只要连上家里的WIFI就可以无缝访问公司网络和其它网络。
实际情况我用的是PPTP协议,当然你可以用其它各种协议来实现。
组网
拓扑如下,也可以再买USB2RJ11和WIFI天线将树莓派变成一个完整的WIFI路由,我这个拓扑是考虑到TP-Link路由可以做备用的网关。
Raspberry Pi安装基本环境
默认只有vi和nano,可以装个vim或emacs。
装PPTP Client: sudo apt-get install pptp-linux
为系统配置静态IP,实际情况里我使用192.168.1.69做网关静态IP,详细见 Debian Wiki
配置PPTP连接
配置以太网口可用时自动连接PPTP服务器:sudo vi /etc/network/if-up.d/vpn,键入以下内容(< >里的内容按实际情况填写) #! /bin/bash /usr/sbin/pptpsetup –create <名字(随便起)> –server <服务器地址> –username <用户名> –password <密码> –encrypt –start
配置PPTP链接断开后自动重连,执行以下命令 sudo cp /etc/network/if-up.d/vpn /etc/ppp/if-down.d/vpn
修改路由表,将PPTP服务器作为下一跳的网关,即默认使用PPTP连接发送所有流量(如果你有这个需求)。在PPTP连接成功后进行修改:sudo vi /etc/ppp/ip-up.d/vpn,键入以下内容 #! /bin/sh /sbin/route add default dev $PPP_IFACE
由于家里使用的PPPoE上网,加上PPTP协议封装,链路实际可用的MTU减小。我的PPTP服务器使用的MTU是1300,当内网中其它终端以树莓派为网关时并不知道网关的下一跳链路的MTU小于1500,终端也不会在DHCP过程中主动配置MTU值,1500大小的包转发到PPTP链路中会被丢弃,造成无法上网的现象。解决方法是配置TCP MSS值,使系统遇到大于MSS值的包时先拆包再转发: sudo iptables -A FORWARD -p tcp –tcp-flags SYN,RST SYN -j TCPMSS –set-mss 1268
配置网关相关功能
修改/etc/sysctl.conf,使树莓派可以转发ipv4的流量 net.ipv4.ip_forward=1
使sysctl.conf的修改马上生效 sudo sysctl -p
配置iptables,使系统强制转发所有流量 sudo iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
其它配置
保存iptables的信息,用于之后快速恢复当前配置 sudo iptables-save > /etc/iptables.rules
当以太网端口可用时,恢复iptables配置,sudo vi /etc/network/if-up.d/iptables,键入以下内容: #! /bin/sh iptables-restore < /etc/iptables.rules 如果你使用了PPTP服务器作为网关转发所有流量,你很可能需要配置路由表,使某些ip是例外,不走PPTP链路的。这种脚本网上很多,一般分ip-pre-up和ip-down两个脚本分别用于添加、删除路由表记录。将ip-pre-up放到/etc/network/if-up.d/下;ip-down放到/etc/network/if-down.d/下 确保上面的所有钩子脚本都有执行权限: sudo chmod +x /etc/network/if-up.d/* /etc/network/if-down.d/* /etc/ppp/ip-up.d/* /etc/ppp/ip-down.d/* 配置DHCP 配置DHCP服务器信息,网关填上树莓派的静态ip,我是在TP-Link上配置DHCP信息的 结束语 以上就是VPN路由的所有配置,现在你可以iPhone、iPad、 Android、电脑、PSVita、3DS、PS3、XBOX360等等连上你的TP-Link,即可无缝使用VPN链路,树莓派也会像一般的路由器一样稳定工作。 所有终端因为DHCP的配置将流量发向树莓派,树莓派按路由表的配置选择使用PPTP链路。 要配置的地方比较多,中间有一步出了问题都可能使树莓派无法稳定工作,需要你熟悉计算机网络,Linux网络配置。