没错,这曾经是个很简单的问题。在 Debian 7 下只要修改 /etc/network/interfaces
,然后配置hostapd
,就可以了。不过随着 Raspbian 的更新,这种方法已经不太合适了,必须要按照 Debian 8+ 的方式进行设置了,故写篇文章记录一下。
几句话简要说明版:Debian 8 已经不推荐使用/etc/network/interfaces
的方式来配置网络了,相应的功能由 dhcpcd 接管,配置文件位于 /etc/dhcpcd.conf
。当 dhcpcd 检测到有无线设备,会去查找/etc/wpa_supplicant/wpa_supplicant.conf
并调用 wpa_supplicant 来连接 WLAN。
新的网络设备命名方式
详见:https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/
简单来说,就是 wlan0、wlan1 这种方式会由于枚举顺序等原因造成设备名的不可预测,因此使用 wlp3s0 这类由插槽确定的名称,或 wlx74da38cd2fd4 这种由 MAC 地址决定的名称。
然而在当前版本的 Raspbian 中,内置的无线网卡依旧为 wlan0,外置的会被用 MAC 地址命名。这会造成一个问题,就是内置网卡有时会变成 wlan1,不过好在不会造成大的混淆。
阻止 dhcpcd 调用 wpa_supplicant 将外置网卡接入 WLAN
这个问题一开始困扰了我很久。最开始试图在 /etc/dhcpcd.conf
中配置denyinterfaces wlx*
来解决这个问题,确实有效,dhcpcd 忽略了外置网卡,不会再把它连进某个 WLAN 中了,但也无法为外置网卡分配静态地址了。
经过仔细阅读文档,发现是我的处理方法有错。由于 wpa_supplicant.conf
会被所有网卡使用,因此不应该将 WLAN 信息存储在这里,而是存储在 wpa_supplicant-wlan0.conf
中,这样当外置网卡 UP 的时候,dhcpcd 会找不到 wpa_supplicant 的配置文件,也就不会去试图将它连接某个 WLAN 了。
对了,还记得上面提到的枚举顺序的问题吗?还需要做一个 symbol link,否则内置网卡被枚举成 wlan1 的时候就不会上不去网了。(虽然比较少见)
为外置网卡配置静态 IP
# /etc/dhcpcd.conf interface wlx74da38cd2fd4 noipv6 static ip_address=192.168.42.1/24
向 /etc/dhcpcd.conf
加入以上内容。不多解释了,So easy~
配置外置网卡为 AP 模式
备份 /etc/hostapd/hostapd.conf
,修改如下:
# /etc/hostapd/hostapd.conf logger_syslog=-1 logger_syslog_level=2 logger_stdout=-1 logger_stdout_level=2 interface=wlx74da38cd2fd4 driver=nl80211 ssid=pipi hw_mode=g channel=6 wmm_enabled=1 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=12345678 wpa_key_mgmt=WPA-PSK rsn_pairwise=CCMP
这个我也没仔细研究,反正 It works,除了日志。然后还有 /etc/default/hostapd
,将DAEMON_CONF=
设置为DAEMON_CONF="/etc/hostapd/hostapd.conf"
。
最后记得在 systemd 中使能 hostapd.service。
配置 dnsmasq 实现 IP 自动分配
依旧采用最简单的方式,备份之后修改 /etc/dnsmasq.conf
如下:
# /etc/dnsmasq.conf interface=wlx74da38cd2fd4 bind-interfaces dhcp-range=192.168.42.100,192.168.42.200,12h
这里指定了要执行分配的接口和 IP 范围,dnsmasq 会自动为客户机分配这些范围内的 IP,同时网关为自己,DNS 服务器也是自己。同时还会启动 DNS 服务器,为这一网段提供 DNS 服务。
其他问题
OK,现在 AP 就架设好了。不过还有几个问题:
- 信号问题。我用的外置 3dBi 天线的网卡,但信号似乎并不是很强?
- iwconfig / iw 均无法正确设置网卡的属性,目前怀疑是驱动问题?
- 没配置 NAT 转发,因此子网下的设备不能上网。不过我的目的是让它们能访问树梅派就可以了。(可以用 iptables 处理)
- 批量配置时,不同的网卡 MAC 地址不一致会造成脚本的设备名不一致,如何解决?