用树莓派做VPN路由网关

对于一般家用的路由器,一直苦于路由OS的功能限制,DD-WRT系的软件陈旧。想用PC直接当路由,但价钱上显然是狮子抓耗子。

我的目标是将树莓派做成VPN路由网关,即本身是一个VPN的Client,同时可以转发网络请求。这样只要连上家里的WIFI就可以无缝访问公司网络和其它网络。

实际情况我用的是PPTP协议,当然你可以用其它各种协议来实现。

组网

拓扑如下,也可以再买USB2RJ11和WIFI天线将树莓派变成一个完整的WIFI路由,我这个拓扑是考虑到TP-Link路由可以做备用的网关。20131026225257959

Raspberry Pi安装基本环境
  • 先装Debian,安装方法可以参考这里
  • 默认只有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网络配置。

这是一篇发布于 11年 前的文章,其中的信息可能已经有所发展或是发生改变,请了解。