RaspVPN: Raspberry Pi + SoftAP + OpenVPN

为什么选择这样的组合

Raspberry Pi很有让人DIY的冲动,尤其是摆脱了24小时开server不低碳的罪恶感。作为标准的linux on ARMv6,相对于Openwrt或者dd-wrt,有更好的可配置性。

PPTP与L2TP在国内已经部分不能使用;相对地,OpenVPN可以选择TCP链接、内容加密,能够更好地规避流量过滤的限制。并且,可以设置http代理,避免Remote IP被封的尴尬。更为重要的,OpenVPN对IPv6的支持相对较好。

但OpenVPN由于是私有协议,需要专有的客户端,因此在Android(CM9对OpenVPN提供有支持)、iOS、WP8上的使用比较困难。把Raspberry Pi和OpenVPN结合起来搭建软AP可以较方便的解决这些问题。

需要准备的

pi@raspberrypi ~ $ lsusb Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. Bus 001 Device 004: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter pi@raspberrypi ~ $ iw list Supported interface modes: * IBSS * managed * AP * AP/VLAN * WDS * monitor * mesh point

关于IPv6的说明

OpenVPN在2.3版本以后开始原生支持IPv6,但Debian/Raspbian还没有release相应的deb。

如果Raspberry Pi使用Arch Linux ARM,已经有OpenVPN 2.3的pkg;

如果选择Raspbian(Debian)可能需要从源编译OpenVPN,没有亲自试过。

后面的例子使用Raspbian(我的环境暂时没有IPv6),相信使用Arch的同学必须毫无压力。

Arch可能遇到的问题:发现如果hostapd起来,会自动把eth0 down掉,开始一直检查配置,后来发现是USB供电不足。。

开始配置

Raspberry Pi上需要用到的deb:

pi@raspberrypi ~ $ sudo apt-get install hostapd dnsmasq openvpn

如果使用ssh连接,可能会遇到网络down掉的情况,可能需要备用一个键盘+HDMI显示器。

首先配置hostapd,

pi@raspberrypi ~ $ sudo vi /etc/hostapd/hostapd.conf interface=wlan0 driver=nl80211 ssid=RaspberryPi hw_mode=g channel=11 wpa=1 wpa_passphrase=YOUR_PASS wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP CCMP wpa_ptk_rekey=600 macaddr_acl=0

这时可以test一下hostapd:

sudo hostapd /etc/hostapd/hostapd.conf

用Wifi应该可以扫描到AP,并且输入密码应该可以连接,但获取不到IP。

配置无误,添加hostapd的默认启动:

pi@raspberrypi ~ $ sudo vi /etc/default/hostapd DAEMON_CONF=”/etc/hostapd/hostapd.conf”

更改wlan0的连接和IP:

pi@raspberrypi ~ $ sudo vi /etc/network/interfaces auto wlan0 iface wlan0 inet static address 192.168.200.1 netmask 255.255.255.0

之后配置dnsmasq,提供dhcp和dns(如果静态配置地址,不需要)。

pi@raspberrypi ~ $ sudo vi /etc/dnsmasq.conf interface=wlan0 dhcp-range=192.168.200.100,192.168.200.200,255.255.255.0,12h pi@raspberrypi ~ $ sudo ifconfig wlan0 192.168.200.1 pi@raspberrypi ~ $ sudo service dnsmasq restart

此时,客户端应该可以连接并获取IP,ping 192.168.200.1应该可以ping通。

配置OpenVPN

需要提供与服务器端匹配的config,可以直接参考其他linux的配置文件,例如我的是:

pi@raspberrypi ~ $ sudo vi /etc/openvpn/client.conf client remote SERVER_ADDR PORT proto tcp dev tun resolv-retry infinite ca /etc/openvpn/ca.crt cert /etc/openvpn/client.crt key /etc/openvpn/client.key # This file should be kept secret persist-key persist-tun comp-lzo pull dhcp-options nobind verb 3 cipher none

可以设置上电自启动该client:

pi@raspberrypi ~ $ sudo vi /etc/default/openvpn AUTOSTART=”client”

这时,可以测试下OpenVPN:

pi@raspberrypi ~ $ sudo service openvpn restart

数秒之后,在 ifconfig 中应该可以看到tun0出现。

配置路由

这里用的NAT方式(bridge方式略过),因此使用iptables设置路由。

iptables -t nat -A POSTROUTING -o tun0 -s 192.168.200.0/16 -j MASQUERADE echo 1 > /proc/sys/net/ipv4/ip_forward

当然,可以根据需要灵活配置路由,这也是Raspberry Pi最大的优势,利用iptables分拣包。例如,把国内的包自动转向 eth0 直接处理,国外的包 tun0 发送。

可以放在 /etc/networ/if-up.d/ 的 up.sh ,也可以放在 /etc/rc.local

这时可以重启Raspberry Pi,应该已经是一个完整的自VPN的Router。

可能的问题