从零开始:树莓派共享 WiFi 秒变无线热点(树莓派路由器)
从零开始:树莓派共享 WiFi 秒变无线热点(树莓派路由器)
概述
树莓派是一款来源于英国慈善组织“Raspberry Pi 基金会”的基于微处理器的硬件平台。核心是 Broadcom ARM 架构 CPU,可以完整运行 Ubuntu、Windows 10 IoT Core 等操作系统。
最新款的树莓派 4B 还板载了 USB 3.0 接口、千兆以太网卡、2.4/5 GHz 802.11b/g/n/ac 无线网卡等设备,性能强大,价格却足够便宜,能用来 DIY 很多东西。
这篇文章就来教大家,如何从零开始将树莓派打造成一个功能强大的无线热点。
准备
- 宽带
- 以太网线
- micro SD 卡和读卡器
- 树莓派(最好是 4B 版本)
安装 Raspbian 操作系统
安装 Raspbian 是为了给无线热点准备操作系统环境。具体步骤参考:树莓派 4B 安装和启动
最好也要把软件源指向国内,避免后续软件下载速度太慢:教你如何给树莓派更换软件源
安装配置 hostapd 服务
Hostapd 是一个运行在用户态,提供热点访问和鉴权的服务端进程。
首先安装服务:
$ sudo apt install hostapd
$ sudo systemctl stop hostapd
接着,我们需要配置一下热点参数。配置文件地址在
/etc/hostapd/hostapd.conf
,打开并编辑(如果没有这个文件的话,新建一个即可):
$ sudo nano /etc/hostapd/hostapd.conf
写入如下配置项。注意要根据自己的实际情况,替换
???
处的内容:
- ssid: WiFi 名称,8~64 个字符,最好用英文字母,不要出现特殊字符
- hw_mode: WiFi 网络模式,一般填
g
即可,设备支持的话可以填
a
启用 5G 频段: - a = IEEE 802.11a (5 GHz)
- b = IEEE 802.11b (2.4 GHz)
- g = IEEE 802.11g (2.4 GHz)
- channel: 信道编号。如果上面配置了
hw_mode=g
使用 2.4G 频段,则一般填
7
即可。如果配置了 5G 频段,则信道编号有所不同,具体参考:WLAN信道列表 - wpa_passphrase: WiFi 密码,最好用英文加数字,不要出现特殊字符
interface=wlan0
driver=nl80211
ssid=???
hw_mode=???
channel=???
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=???
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
这里给出一个示例配置值:
然后,给 hostapd 指定我们刚刚配置的配置文件。打开
/etc/default/hostapd
这个文件,去掉
DAEMON_CONF
的注释,并配置成
/etc/hostapd/hostapd.conf
,如图所示。意思就是告诉 hostapd 要从
/etc/hostapd/hostapd.conf
读取配置参数。
sudo nano /etc/default/hostapd
最后,启动 hostapd 服务。
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd
过一会儿,就能看到 hardcore-rpi 的 WiFi 信号了。但是这个 WiFi 还没有连接网络,也不能给客户端分配 IP,接下来的小节就解决这些问题。
如果服务启动失败,比如报错
"systemctl status hostapd.service" and "journalctl -xe" for details
等,可以按如下步骤逐一排查:
- 重启树莓派,再尝试启动 hostapd
- 命令行执行
sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf
,直接运行 hostapd,观察输出日志,一般都能发现问题。比如常见的: - hostapd.conf
配置错误导致启动失败。检查配置文件,修改后,新启动 hostapd 即可。 - wlan0 端口未开启导致启动失败。执行
sudo ifconfig wlan0 up
开启端口后,重新启动 hostapd 即可。
这里给一个直接运行 hostapd 成功的截图,只要看到 "ENABLED" 字样就表示启动成功了。
配置 wlan 静态 IP
用于 WiFi 热点的 wlan0 端口需要有固定的 IP 地址。假设树莓派热点的 IP 网段是 192.168.4.x,那么 wlan0 的 IP 就要设置成静态地址 192.168.4.1。
树莓派以及大多数 Linux 发行版都由 dhcpcd 服务通过 DHCP(动态主机配置协议)获取自己的 IP 地址,所以这里我们要改掉 dhcpcd 的配置,让 wlan0 端口有静态 IP。
编辑 dhcpcd 配置文件:
sudo nano /etc/dhcpcd.conf
在文件末尾添加:
interface wlan0
static ip_address=192.168.4.1/24
nohook wpa_supplicant
保存后,重启 dhcpcd 服务:
sudo systemctl restart dhcpcd
执行
ifconfig
可以看到,wlan0 的 IP 地址已经固定成 192.168.4.1 了。
安装配置 dnsmasq 服务
dnsmasq 是一个小型的用于配置 DNS 和 DHCP 的工具,适用于小型网络,它提供了 DNS 和 DHCP 功能。
首先安装 dnsmasq 服务。
$ sudo apt install dnsmasq
$ sudo systemctl stop dnsmasq
接着,配置 dnsmasq 参数。打开
/etc/dnsmasq.conf
配置文件,把里面的其他内容都注释掉,添加新的配置项:
sudo nano /etc/dnsmasq.conf
interface=wlan0
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
dhcp-range 配置项的意思是,dhcp 服务会给客户端分配 192.168.4.2 到 192.168.4.20 的 IP 空间,24 小时租期。更多配置信息可以参考 Man page of DNSMASQ
然后,重启 dnsmasq 服务。
sudo systemctl reload dnsmasq
此时用手机去连接热点,就能看到成功分配了动态 IP。
配置 IP 包转发
上面我们给树莓派安装了 hostapd 热点服务 和 dnsmasq DHCP 服务,已经可以让手机连接 WiFi 热点并分配到动态 IP 了,但仍不能联网,所以现在就剩最后一步:给树莓派配置 IP 包转发,让手机连接 WiFi 后能正常上网。
首先,开启 Linux 内核的 ip 转发功能。打开
/etc/sysctl.conf
系统配置文件,去掉
net.ipv4.ip_forward=1
这个配置项的注释:
出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
要让Linux系统具有路由转发功能,需要配置一个Linux的内核参数net.ipv4.ip_forward。这个参数指定了Linux系统当前对路由转发功能的支持情况;其值为0时表示禁止进行IP转发;如果是1,则说明IP转发功能已经打开。
Linux ip_forward 数据包转发
然后,修改 Linux 防火墙规则,完成报文源地址目标转换。
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
接着,设置开机自动导入防火墙规则。
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
编辑
/etc/rc.local
,把
iptables-restore < /etc/iptables.ipv4.nat
加到最后一行
exit 0
的前面:
然后,重启树莓派:
sudo reboot
测试验证
重启树莓派后,手机连接树莓派热点。一切正常的话,手机就可以 WiFi 上网了。
后话
树莓派热点能做很多事情,比如和手机等其他设备互联通信。插入多个无线网卡,还能实现 WiFi 中继等。
但这篇文章介绍的树莓派路由器只是个简单版本,没有 ADSL 宽带拨号功能,也没有进行性能优化,和商业路由器的差距还是比较大的。后续我会介绍如何用树莓派进行宽带拨号,甚至编译 openwrt 打造真正强大的路由器。
参考资料
- 树莓派 4B 安装和启动
- Setting up a Raspberry Pi as a Wireless Access Point
- hostapd
- WLAN信道列表
- Man page of DNSMASQ
- iptables详解:图文并茂理解iptables