几天前曾经想把手头的树莓派2B改造为无线路由器,实现寝室内多设备无线上网。由于奇葩的玉泉寝室网络,我踩了无数的坑,最终差在最后一步NAT上。由于这方面知识薄弱,今天把成功部分记载下来,期望以后有机会能实现。

在玉泉寝室有线上网主要分为两种:闪讯和VPN。闪讯帐号部分可以pppoe拨号,多数不可以。我的帐号属于不可以的类型,所以打算让树莓派先使用VPN连接上有线网络,再通过一个无线网卡将信号发射出来。

本文所述适合于浙江大学玉泉校区寝室网络,树莓派系统为Raspbian。

第一阶段:让树莓派连接内网

由于寝室内使用静态ip绑定,每个人的静态ip都绑定了网卡MAC地址,所以先设置静态ip和mac地址。(如果你直接使用树莓派网卡MAC进行申请就无需修改)。

  1. 设置mac地址
    1
    2
    sudo ifconfig eth0 down hw ether xx:xx:xx:xx:xx:xx
    sudo ifconfig eth0 up

运行后使用ifconfig可以看到修改结果。

2.设置静态ip、网关等。此时需要修改/etc/network/interfaces,修改前先进行备份:

1
pi@raspberry:sudo cp /etc/network/interfaces /etc/network/interfaces.sav

打开文件:

1
pi@raspberry:sudo nano /etc/network/interfaces

关闭DHCP,将此行注释掉:

1
iface eth0 inet dhcp

修改为:

1
#iface eth0 inet dhcp

接下来进行更详细的修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
# The loopback interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
#your static IP
address 192.168.1.118 //修改为你的静态ip
#your gateway IP
gateway 192.168.1.1 //修改为你的网关
netmask 255.255.255.0
#your network address "family"
network 192.168.1.0 //修改到同一域下
broadcast 192.168.1.255

修改后重启网络:

1
pi@raspberry:sudo /etc/init.d/networking restart

设置DNS,在/etc/resolv.conf中添加一行nameserver 10.10.0.21保存退出。

此时用ifconfig可以查看修改成没成功,正常的话可以ping通10.10.0.21、www.cc98.org,已经可以上内网了。并且至少在校园范围内已经可以使用ssh进行连接了。

第二阶段:让树莓派使用VPN方式连接外网

如果你的闪讯帐号支持pppoe,那么你可以自行下载pppoe有关包进行连接,本文以下讲述的是l2tp方式连接外网。

1.下载libpcap0.8, ppp, xl2tpd, zjuvpn四个软件包,使用scp命令或者U盘复制到树莓派内。

2.按照顺序安装四个软件包:

1
2
3
4
sudo dpkg –i libpcap0.8_1.3.0-1_armhf.deb
sudo dpkg –i ppp_2.4.5-5.1_armhf.deb
sudo dpkg –i xl2tpd_1.3.1+dfsg-1_armhf.deb
tar –zxvf zjuvpn-8.2.tar.gz –C /

执行:

1
sudo zjuvpn –c

按照提示输入vpn的用户名和密码就可以连接上外网了。

第三阶段:让树莓派通过无线网卡共享网络

此阶段主要参考将树莓派Raspberry Pi设置为无线路由器(WiFi热点AP,RTL8188CUS芯片)这篇文章,我的无线网卡也是RTL8188CUS芯片的。要多走一步兼容性措施。

  1. 安装hotspot(hostapd)
    1
    sudo apt-get install bridge-utils hostapd

需要注意的是官方提供的程序不兼容RTL8188CUS芯片的无线网卡,不过Edimax团队为我们专门编译了兼容的版本,下面的操作需要替换hostapd为兼容版本。
如果你的网卡芯片为RTL8188CUS,需要执行下述指令:

1
2
3
4
5
6
7
wget http://www.daveconroy.com/wp3/wp-content/uploads/2013/07/hostapd.zip
unzip hostapd.zip
sudo mv /usr/sbin/hostapd /usr/sbin/hostapd.bak
sudo mv hostapd /usr/sbin/hostapd.edimax
sudo ln -sf /usr/sbin/hostapd.edimax /usr/sbin/hostapd
sudo chown root.root /usr/sbin/hostapd
sudo chmod 755 /usr/sbin/hostapd

  1. 以路由方案设置WiFi热点

安装必备程序udhcpd,udhcpd主要为连接到WiFi的设备自动分配IP地址。

1
sudo apt-get install udhcpd

配置udhcpd,编辑/etc/udhcpd.conf:

1
2
3
4
5
6
7
8
start 192.168.42.2 # This is the range of IPs that the hostspot will give to client devices.
end 192.168.42.20
interface wlan0 # The device uDHCP listens on.
remaining yes
opt dns 8.8.8.8 4.2.2.2 # The DNS servers client devices will use.
opt subnet 255.255.255.0
opt router 192.168.42.1 # The Pi's IP address on wlan0 which we will set up shortly.
opt lease 864000 # 10 day DHCP lease time in seconds

编辑/etc/default/udhcpd并且将下面这行注释掉,以使DHCP Server正常工作:

1
#DHCPD_ENABLED="no"

配置无线网卡,给无线网卡设置一个IP地址:

1
sudo ifconfig wlan0 192.168.42.1

为了下次启动仍然有效,配置/etc/network/interfaces文件:

1
sudo nano /etc/network/interfaces

注释掉所有的关于无线网卡的部分,最后应该变成下面所示:

1
2
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp

注意保留allow-hotplug wlan0,英文原文是不保留的,但是我操作下来发现如果不保留这段的话,无线网卡有时无法正常配置IP,最后无线网卡IP的配置信息如下:

1
2
3
4
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0

编辑hostapd配置:

1
sudo nano /etc/hostapd/hostapd.conf

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
interface=wlan0
driver=rtl871xdrv
ssid=My_SSID_Name//改为自定义ssid
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=MYPASSWORD//设置密码
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

启动IP转向功能以便于开通NAT:

1
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

配置iptables防火墙

1
2
3
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

到这里路由的NAT功能已经被启用,保存iptables以便于下次使用

1
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

编辑/etc/network/interfaces然后在最后加上下面这行以使每次启动都自动加载iptables配置:

1
up iptables-restore < /etc/iptables.ipv4.nat

重启并测试hostapd

1
sudo reboot

重启完成后,使用下面的命令测试是否正确:

1
sudo hostapd -dd /etc/hostapd/hostapd.conf

果没有错误的话,你这时应该能搜索到你所配置的无线信号。然后Ctrl+C退出这个测试。

如果一切正常的话,我们可以设置hostapd的配置文件路径了。

1
sudo nano /etc/default/hostapd

去掉注释符号并改动下面这行为我们的配置文件路径:

1
DAEMON_CONF="/etc/hostapd/hostapd.conf"

启动相应软件

1
2
sudo service hostapd start
sudo service udhcpd start

当我执行到这一步的时候,其他设备可以搜索到树莓派的无线信号,也可以连接上,但是不能上网。此时查看hostapd的日志,wpa的四次握手已经通过,设备与树莓派的连接是没有问题的。

自我感觉问题应该是出在L2TP上,原文作者没有用l2tp,直接在eth0和wlan0间做NAT。实际上在使用l2tp拨号之后,又新生成了ppp0,应该对ppp0再进行一些设置,这方面我懂得知识很少,没能解决。:(

操作的时候足足花了一个晚上加一个上午,出现各种各样奇怪的问题,有的地方是自己马虎,有的地方是奇怪的错误……

比如按照原文设置加入的那些启动项,有的重启后并没有生效,还需要自己手动再敲一遍。随后sudo /etc/init.d/networking restart的时候会出错,连续输入两遍才能成功……

参考资料: