第一步:hostapd
安装hostapd
sudo apt install hostapd
sudo systemctl stop hostapd
编辑“/etc/hostapd/hostapd.conf”文件(若无,则创建):
interface=wlan0
driver=nl80211
ssid=raspberry_hotspot
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
启动服务:
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd
过一会,就能在其他移动设备中搜索到该热点了,只是此时能连接该热点,但是还不能上网,因为相关的dns设置没有配好。
如果服务启动失败,比如报错 "systemctl status hostapd.service" and "journalctl -xe" for details 等,可以按如下步骤逐一排查: 1. 重启树莓派,再尝试启动 hostapd 2. 命令行执行 sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf,直接运行 hostapd,观察输出日志,一般都能发现问题。比如常见的: 1. hostapd.conf 配置错误导致启动失败。检查配置文件,修改后,新启动 hostapd 即可。 2. wlan0 端口未开启导致启动失败。执行 sudo ifconfig wlan0 up 开启端口后,重新启动 hostapd 即可。
第二步:配置dhcp
编辑“/etc/dhcpcd.conf”,在文件末尾添加如下代码:
interface wlan0
static ip_address=192.168.4.1/24
nohook wpa_supplicant
意思是将树莓派的地址设置为192.168.4.1:
接着重启dhcpcd服务:
sudo systemctl restart dhcpcd
然后执行“ifconfig”命令,便可以看到wlan0的地址为192.168.4.1:
第三步:dnsmasq
dnsmasq 是一个小型的用于配置 DNS 和 DHCP 的工具,适用于小型网络,它提供了 DNS 和 DHCP 功能。
首先安装dnsmasq服务:
sudo apt install dnsmasq
sudo systemctl stop dnsmasq
编辑“/etc/dnsmasq.conf”文件(若无此文件则新建即可),内容如下:
interface=wlan0
dhcp-range=192.168.4.20,192.168.4.50,255.255.255.0,24h
server=8.8.8.8
server=8.8.4.4
dhcp-range 配置项的意思是,dhcp 服务会给客户端分配 192.168.4.20 到 192.168.4.50 的 IP 空间,24 小时租期。
然后重启 dnsmasq 服务:
sudo systemctl reload dnsmasq
第四步:配置iptables转发
开启 Linux 内核的 ip 转发功能,编辑“/etc/sysctl.conf”系统配置文件,去掉 net.ipv4.ip_forward=1 这个配置项的注释:
添加路由转发规则(注意:eth0为网线口,需要视情况更换成访问网络的端口,如“usb0”):
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"
编辑“/etc/rc.local”,把“iptables-restore < /etc/iptables.ipv4.nat”加到最后一行“exit 0”的前面:
第五步:重启树莓派
sudo reboot
其他
若dnsmasq经常会出现问题,原因可能是wlan0还没热启动完成,而dnsmasq就先启动了,所以出现了启动失败的现象,可以尝试以下操作(未验证):
// 打开管理启动
sudo vim /etc/rc.local
// 添加如下行,在 exit 0 之前
sudo bash /etc/dnsmasq_delayinit.sh
// 然后编辑dnsmasq_delayinit.sh
sudo vim /etc/dnsmasq_delayinit.sh
#!/bin/sh
sleep 10
sudo service dnsmasq restart
// 再设置成可执行
sudo chmod +x /etc/dnsmasq_delayinit.sh