树莓派3B+ 无线路由(hostapd)
该教程只是将Wi-Fi设置成热点模式,非安装OpenWrt教程。
1.显示无线模块设备
在新的raspian版本(Stretch基于Debian9),接口配置会自动启动wlan0设备,而且会默认处理dhcpcd。我们需要停止它自动开启,并配置一个静态IP地址。
参考:https://github.com/harryallerston/RPI-Wireless-Hotspot
对于旧版系统(Jessie基于Debian8),请转至这里:https://elinux.org/RPI-Wireless-Hotspot
// 现在打开接口配置文件
sudo vim /etc/network/interfaces
// 添加如下内容
# 允许热插拔
allow-hotplug wlan0
# 手动管理 wlan0
iface wlan0 inet manual
// 现在编辑dhcpcd
sudo vim /etc/dhcpcd.conf
// 添加如下行
interface wlan0
static ip_address=192.168.0.1/24
2.安装并配置hostapd
hostapd 是 Host Access Point 守护进程,提供对基于 Linux 的无线接入点的强 WPA2 加密和身份验证。配置 hostapd 非常简单,它支持 WPA2-Personal 和 Enterprise,提供了对 WPA2-Personal 的独特修改,可让管理它变得更复杂或更简单。
// 安装hostapd
sudo apt-get install -y hostapd
// 配置hostapd
sudo vim /etc/hostapd/hostapd.conf
// 基本信息
# 无线网卡的名称
interface=wlan0
# 网卡对应的驱动名
driver=nl80211
# 无线网络的名称是Pi-wifi
ssid=Pi-wifi
# 无线路由器工作模式为802.11g(2.4G)
hw_mode=g
# 无线网卡使用的信道
channel=10
# 支持 802.11n
ieee80211n=1
# 采用WPA2配置
wpa=2
# 无线网络密码是123456789
wpa_passphrase=123456789
# 认证方式为WPA-PSK
wpa_key_mgmt=WPA-PSK
# 开启 WMM
wmm_enabled=1
# 开启 40MHz channels 和 20ns guard interval
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
# 接受所有 MAC 地址
macaddr_acl=0
# 使用 WPA 认证
auth_algs=1
# 需连接者知道ssid
ignore_broadcast_ssid=0
# 使用 WPA2
wpa=2
# 使用预先共享的 key
wpa_key_mgmt=WPA-PSK
# 使用 AES, 而非 TKIP
rsn_pairwise=CCMP
// 配置hostapd为自启动模式
sudo vim /etc/default/hostapd
// 找到“#DAEMON_CONF=”,去掉#注释,补全为
DAEMON_CONF="/etc/hostapd/hostapd.conf"
// 完成配置,检查是否配置成功
sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf
// 如果最后两行出现了如下,则为正常
wlan0: interface state UNINITIALIZED->ENABLE
wlan0: AP-ENABLED
// 重启hostapd
sudo service hostapd restart
3.安装并配置dnsmasq
dnsmasq是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能。主用适用于NAT的家庭网络,用modem,cable modem,ADSL设备连接到因特网。
// 配置
sudo vim /etc/dnsmasq.conf
// 添加如下内容
interface=wlan0
bind-interfaces
server=218.2.2.2
server=114.114.114.114
server=8.8.8.8
domain-needed
bogus-priv
dhcp-range=192.168.0.2,192.168.0.254,12h
4.设置IPv4转发
完成以上操作后,你会发现即使你连接上了Wi-Fi,可无法上网,因为我们连接到无线网卡wlan0上,设备传输进来的数据并没有转发到 eth0 上。因此,我们需要配置相应的IPv4的转发规则,来打通数据的传输。
// 打开sysctl.conf文件
sudo vim /etc/sysctl.conf
// 去掉“#net.ipv4.ip_forward=1”前的#注释
// 立即生效
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
// 在WiFi的配置接口eth0接口wlan0之间建立NAT,分享有线网到无线上
#sudo iptables -A INPUT -p tcp --dport 139 -j ACCEPT
#sudo iptables -A OUTPUT -p tcp --sport 139 -j ACCEPT
#sudo iptables -A INPUT -p tcp --dport 445 -j ACCEPT
#sudo iptables -A OUTPUT -p tcp --sport 445 -j ACCEPT
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
// 将这些规应用于我们的每一次启动PI
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
sudo vim /etc/rc.local
// 添加如下行,在 exit 0 之前
iptables-restore < /etc/iptables.ipv4.nat
5.重启服务
sudo service dhcpcd restart
sudo service hostapd start
sudo service dnsmasq start
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
现在就可以愉快的上网了。只是在树莓派开机后要稍微等一下。