折腾树莓派也是个非常麻烦的事情,想把它做成一个能够自动连接自己VPN的路由器,也费了一番功夫

之前使用静态IP的方式勉强算能够管理rpi,但每次登录都得插网线还是挺繁琐的,最自然的想法当然是把它做成一台无线路由器了。

系统升级

在这之前可以对系统进行一次固件和软件的升级,当然不升级也可以

1
2
3
sudo rpi-update
sudo apt-get update
sudo apt-get upgrade

网卡驱动

树莓派自身是不带无线网卡的,所以需要自己购买一块USB无线网卡。当初没有注意驱动问题随便购买了TP-LINK的TL-WN725N v2.0,这恰好是RPI 2B原生不支持的型号(原生支持v1.0)。在这里可以先check一下树莓派对自己无线适配器的支持情况 RPi USB Wifi Adapters.

在这之后肯定是要先安装一下8188eu这种芯片的驱动模块,首先需要使用uname -r查看自己linux的版本号,然后去这个页面寻找对应的驱动包 Drivers for TL-WN725N V2 - 3.6.11+ -> 4.1.xx+,注意这里RPi和RPi 2的驱动是不同的包,如果下错版本的话很可能安装失败。找到对应的文件名到这个地址去下载对应的文件

1
https://dl.dropboxusercontent.com/u/80256631/8188eu-201xyyzz.tar.gz

xyyzz替换成自己对应的版本即可,下好后解压,然后安装

1
2
3
4
tar -zxvf 8188eu-201xyyzz.tar.gz                                         <--set data code for driver version above
sudo install -p -m 644 8188eu.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless
sudo insmod /lib/modules/$(uname -r)/kernel/drivers/net/wireless/8188eu.ko
sudo depmod -a

也可以用这段script自动进行,我下载的文件里已经自带了install.sh的文件,直接运行就可以了。

最后如果modprobe 8188eu没有问题的话,使用ifconfig能够看到wlan0,这就代表驱动已经安装好了。

Hostapd

接下来安装无线热点,很多blog说hostapd也不支持WN725N v2.0的网卡需要下载另一个第三方的版本,不过我编译官方版本好像也没有什么问题……

具体来说需要修改一下设置,首先从官网hostapd下载最新的版本源码,然后解压。

1
2
3
wget https://w1.fi/releases/hostapd-2.5.tar.gz
cd hostapd-2.5/hostapd
cp defconfig .config

打开.config配置文件找到下面一行

1
CONFIG_DRIVER_NL80211=y

确认这一行没有被注释,也就是打开的状态,这样makefile会自动编译nl80211的接口。

然后保存文件退出,在当前文件夹下执行make,如果报netlink.c文件中找不到genl.h的错误,则需要安装libnl

1
sudo apt-get install libnl-dev

继续执行make,这下应该没有问题了,最后执行sudo make install,hostapd就安装完毕了。

来到/etc/hostapd目录,这里有一个hostapd.conf.example配置文件,是一个配置文件的样例,不过大部分的选项我们都用不到,自己新建一个hostapd.conf,我的配置是这样的

1
2
3
4
5
6
7
8
9
10
11
12
interface=wlan0                         #无线的接口
driver=nl80211 #刚才装的驱动接口
ssid=test #热点的ssid
hw_mode=g #硬件的工作模式
channel=11 #所处频道,可以自己设置

wpa=3 #认证方式,1为WPA,2为WPA2,3为两者都可
wpa_passphrase=12345678 #密码
wpa_key_mgmt=WPA-PSK
wpa_group_rekey=0 #指定rekey间隔为0即不去rekey,这一行可以去掉,默认为60s

max_num_sta=10 #最大的station数量,可以用来控制连接的设备数

然后启动hostapd服务

1
sudo service hostapd start

如果没有报错的话应该可以搜到热点了(但还没有IP),如果出错了需要到/var/log/syslog中去检查一下日志

DHCP

虽然这时候设备可以接上热点,但还没有IP,需要安装一个DHCP服务器分发IP。

使用isc-dhcp-server

1
sudo apt-get install isc-dhcp-server

编辑/etc/dhcp/dhcpd.conf,在最后添加

1
2
3
4
5
6
7
8
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.10 192.168.0.20;
option routers 192.168.0.1;
option broad-cast 192.168.0.255;
option domain-name-servers 8.8.8.8,8.8.4.4;
default-lease-time 600;
max-lease-time 7200
}

其中lease time指的是租借时间,即1个IP保留给客户端使用的时间,过了时间之后会重新分配,可以自己修改。

给自己的网卡添加静态地址

1
sudo ifconfig wlan0 192.168.0.1 netmask 255.255.255.0

注意这里的地址要是上面配置中routers的地址,这样客户端会将树莓派作为默认路由

将这个配置写到网卡配置,打开/etc/network/interfaces,编辑auto wlan0这一块,先将其全部注释,然后自己写上

1
2
3
4
auto wlan0
iface wlan0 inet static
address 192.168.0.1
netmask 255.255.255.0

启动dhcp服务

1
sudo service isc-dhcp-server start

这时设备接上wifi应该能够得到IP了,不过还不能上网。

开启转发

如果想让内网中的设备访问外网,需要配置一下linux的转发规则。

首先打开内核转发开关,打开/etc/sysctl.conf,取消注释下面这行

1
net.ipv4.ip_forward=1

保存退出,刷新规则

1
sudo sysctl -p

配置iptables的地址转换

1
2
3
sudo iptables -A FORWARD -i wlan0 -j ACCEPT
sudo iptables -A FORWARD -o wlan0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING ! -o wlan0 -j MASQUERADE

最后这行跟大部分blog不同,这是为了openvpn准备的,因为启动openvpn后路由不再从eth0这个接口走,如果-o eth0的话就不行了。

保存规则

1
sudo iptables-save > /etc/iptables.rules.v4

/etc/network/interfaces的尾部添加

1
up /sbin/iptables-restore < /etc/iptables.rules.v4

也可以通过在/etc/network/if-preup.d中添加脚本文件来实现

Extra: OpenVPN

到此一台无线路由器就配置完成了,而且所有服务都已经就绪了,如果重启sudo reboot之后应该不会受到影响。
如果发现某个服务没有work,可以在/var/log/syslog中check,默认它们的日志都在这个文件中。

在此基础上,我希望它能自动接openvpn,也非常容易,直接安装openvpn客户端,配置好文件就可以了。

重点还是在iptables转发的时候不要把过滤规则写成-o eth0

参考资料

树莓派实验室 - hostapd
用树莓派做无线路由器