首先,你的raspberry 3 要装上raspbian OS,具体参看官方的手册。另外像笔者这种在高校的学生,不能只装上hostpad和udhpc这样的软件就OK,因为给eth0,也就是有线网上网还得需要锐捷认证。Basic concept就是用锐捷登陆上校园网,然后再把通过无线网卡把网络共享出来。
源码下载地址在这里,笔者在写这篇博客的时候是2016年10月,关于mentohus的维护还有。 [ mentohust]。这个是是mentohust目前维护的个人网站,读者可以去他的github上下载最新的代码。
编译前需要一些依赖库,依次敲入下面的指令:
sudo apt-get install update
sudo apt-get install autopoint
sudo apt-get install automake
sudo apt-get install autoconf
sudo apt-get install gettext-base gettext liblocale-gettext-perl
sudo apt-get install libpcap-dev
sudo apt-get install libnotify-dev
有一个需要注意的事情,raspian默认的是官方的镜像,官方的镜像好像速度不高,而且有的时候会转到浙大的镜像。建议把source.list还是改为清华的镜像比较快。
cd ~
mkdir Program
cd Program
git clone "https://github.com/HustLion/mentohust"
cd mentohust
./autogen.sh
编译前的configure
./configure --prefix=/usr
注意不要看github上的一些configure的配置,那里的配置我在raspberry上尝试过,没成功。最后再make和install:
sudo make
sudo make install
改一下权限,这样普通用户也可以进行认证
sudo chmod u+s /usr/bin/mentohust
将raspberry的网口连上网线,在mentohust之前要配置一下用户名的认证类型:
sudo leafpad /etc/mentohust.conf
这个是mentohust的配置文件,当然你要是不闲麻烦也可以自己敲指令,敲完了后,指令会将相应的配置写入这个文件。需要配置的项有:用户名,密码,认证类型(配置为0或2都行),注意DHCP一定配置为认证后启用,不然上不了网。
接着就可以
mentohust
这里完成了让有线网上网的步骤。
raspberry pi 3是有BCM的无线网卡的,也有bluetooth。BCM的这个无线网卡是支持AP模式的,是否支持可以利用
iw list
看是否存在AP模式。这种方式对先前的老板子,pi 2有效,由于pi 2没有wifi模块,大多数geek都会买一个USB wifi dongle,最常见的是RTL8188,这个网卡在硬件上是支持AP模式的,但是软件在一段时间没有跟上,在我写这篇博客的时候driver已经支持了,所以使用Pi 2的读者最好是去官方下载最新的driver。
sudo apt-get install udhcpd
sudo apt-get install hostapd
好像进行过 sudo apt-get update 后hostapd已经有了,为了保险,上面的两行代码还是都敲一下吧。
hostapd是热点启用程序,udhcpd则是wifi设备连接后自动获取ip的工具。其实mentohust那一步就用到过DHCP了,可能这里后面出现冲突的原因吧,这个后面再说。
sudo leafpad /etc/udhcpd.conf
(1)将里面的interface eth0改为interface wlan0
(2)去掉remaining前的#
(3)修改AP模式下的wlan0的IP地址需要配置的东西如下:
opt dns 202.114.0.242 202.114.0.242
option subnet 255.255.255.0
opt router 192.168.0.1
就这几项就OK了,其它的全部注释掉。注意上面的dns要根据地名来配置,我在的地方是华中科技大学的校园网,所以dns配置为202.114.0.242,其它学校的dns也可以在网上查到的。
另外还有一个网络接口需要修改,非常重要。
sudo leafpad /etc/dhcpcd.conf
在最后一行加上
denyinterfaces wlan0
配置 /etc/default/udhcpd
sudo leafpad /etc/default/udhcpd
注释掉
DHCPD_ENABLED="no"
这一行
在控制台输入静态ip控制指令
sudo ifconfig wlan0 192.168.0.1
配置文件 /etc/network/interfaces,注意这里wlan0的地址参数要和/etc/udhcpd.conf相关参数要一致。
输入:
sudo leafpad /etc/network/interfaces
将关于wlan0的全部注释掉:
#allow-hotplug wlan0
#iface wlan0 intet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp
增加
iface wlan0 inet static
address 192.168.0.1
netmask 255.255.255.0
创建文件hostapd.conf文件,配置raspberry pi的热点名称和热点密码。
sudo leafpad /etc/hostapd/hostapd.conf
在新打开的文件中输入下面的内容
# This is the name of the WiFi interface we configured above
interface=wlan0
# Use the nl80211 driver with the brcmfmac driver
driver=nl80211
# 这是你要设置的wifi热点的名称
ssid=Raspberry_AP
# Use the 2.4GHz band
hw_mode=g
# Enable 802.11n
ieee80211n=1
# Use channel 6
channel=6
macaddr_acl=0
# Enable WMM
wmm_enabled=1
# Enable 40MHz channels with 20ns guard interval
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
# Use WPA authentication
auth_algs=1
# Require clients to know the network name
ignore_broadcast_ssid=0
# Use WPA2
wpa=2
#这是你要配置的wifi热点的密码
wpa_passphrase=12345678
# Use a pre-shared key
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
# Use AES, instead of TKIP
rsn_pairwise=CCMP
接下来指定配置文件的位置
sudo leafpad /etc/default/hostapd
将#DAEMON_CONF=”“改为
DAEMON_CONF="/etc/hostapd/hostapd.conf"
测试AP是否能成功启动
sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf
这个时候应该能看到你设置的wifi热点的名称了,如果你手机或者其它移动设备连上了,控制台里面是可以看到输出的,当然,这个时候仍然不能上网。按Ctrl+C退出。
(1)在内核中启动IP转发
sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
修改 /etc/sysctl.conf文件
sudo leafpad /etc/sysctl.conf
在文件的最后一行加上
net.ipv4.ip_forward=1
(2)定义IP转发规则
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
保存参数
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
(3)再次修改 /etc/network/interfaces文件
sudo leafpad /etc/network/interfaces
在最后一行加上
up iptables-restore < /etc/iptables.ipv4.nat
到此为止,基本的配置已经全部完成了。上面的过程跟网上的其它人的教程其实区别不大。网上的教程到这里一般会是设置开机启动了,但是现在还没到时候。
增加一个shell脚本start.sh
cd ~/Programs
leafpad start.sh
在里面输入以下内容
#! /bin/sh
# fisrt give eth0 access to internet, the delay is a must
mentohust &
sleep 30
# start hostapd & udhcpd service
# the two services need time to start, so you need delay
sudo service hostapd start
sudo service udhcpd start
sleep 100
# give wlan0 a static ip
sudo ifconfig wlan0 192.168.0.1
更改一下文件的权限
chmod 777 start.sh
把上面的文件加入到启动项,
sudo leafpad /etc/rc.local
确保一定要在exit 0 前面加上文件的绝对地址
/home/pi/Programs/start.sh
OK,现在一切都over了,只要上电,过二分钟后就可以直接上网了。我尝试过,在线放蓝光都不卡。
这里说明一下为什么自己加了一个启动项,因为如果把前面说到的mentohust, hostapd,udhcpd全部一起添加到启动项后,wifi热点刚开始的几秒钟可以上网,但是过了一会发现wlan0的static ip没有了,如果此时你manually set a static ip,奇怪的是连上的client又可以上网了。上面一个脚本解决了这个问题,注意延时是有必要的,而且时间还真得这么长,更短的读者可以自己去尝试了。
参考文献
http://wangye.org/blog/archives/845/
http://blog.csdn.net/xukai871105/article/details/42497097
https://frillip.com/using-your-raspberry-pi-3-as-a-wifi-access-point-with-hostapd/