目标
最近树梅派4B发布,相比树梅派3B在CPU、内存、网卡、USB等各方面大幅升级,又唤起了我对树梅派的兴趣。淘宝上很快就可以买到了,不过在准备下单的时候,我问了自己一个问题:我要买来干什么?是要把玩两天之后就让它变成“吃灰派”吗?
最终,我觉得用树梅派做一个wifi中继是一个比较好的用途。不过,做一个wifi中继,3B的性能足矣,于是我找出了正在吃灰的树梅派3B,最终也就有了这篇文章。
2020-2-1备注:此文同样适用于树莓派4B
下面记录一下如何将一个双WiFi的树莓派变为一个软AP,从而可以将WiFi的信号进行距离延展,同时实现将无线转有线。原理简单点说就是树梅派通过一个USB网卡接收一个wifi信号,然后通过NAT转发到自带的无线网卡上建立的wifi和自带的有线网卡上。
准备工作
准备一个usb无线网卡,我用的是迅捷的FW150US,形如一个无线鼠标接收器,很便宜。
给树梅派3B刷写系统,具体过程不赘述,我用的是目前最新的官方系统,镜像名称为2019-06-20-raspbian-buster.iso。第一次进系统时请正确选择语言、国家、时区等等。记得原来的版本需要手动去设置wifi国别,新版似乎不必了。
固定WLAN接口名称
因为使用了两个WIFI适配器,为了防止系统开机时随机分配哪个是wlan0,哪个是wlan1,因为两个适配器不一样,可能会导致运行在上面的配置没办法生效。因此,我们必须让系统记住WIFI适配器使用的接口名称。本例中,wlan0为树梅派自带的无线网卡,wlan1为usb无线网卡。
编辑新增文件/etc/udev/rules.d/10-network.rules,其中的内容如下:
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="wlan0"
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="wlan1"
注意其中的mac地址,设置为你的设备的mac地址。获得mac地址,可以使用命令ip link
重启系统后,再插入设备,就会绑定接口名称
用wlan1连网
本例中,是用usb无线网卡即wlan1来联网,先设置好wlan1要连接的wifi,方便下面安装软件包和测试。
固定eth0、wlan0的IP
编辑文件/etc/dhcpcd.conf, 添加如下配置
interface eth0
static ip_address=192.168.3.1/24
interface wlan0
static ip_address=192.168.4.1/24
nohook wpa_supplicant
现在重启dhcpcd
守护进程:
sudo systemctl restart dhcpcd
安装dnsmasq来设置DHCP服务
先来说明一下我的网段设置,有线网络使用192.168.3.*这个网段,而无线AP端,使用192.168.4.*网段
使用命令sudo apt-get install dnsmasq安装dnsmasq,编辑/etc/dnsmasq.conf,添加如下配置:
listen-address=127.0.0.1,192.168.3.1,192.168.4.1
interface=eth0
dhcp-range=192.168.3.50,192.168.3.150,12h
interface=wlan0
dhcp-range=192.168.4.50,192.168.4.150,12h
运行命令sudo systemctl reload dnsmasq来启用
开启包转发、NAT
Linux系统默认关闭了IP包转发,因此不能做路由器。所以需要先打开包转发
编辑/etc/sysctl.conf,去掉以下属性前的注释:
net.ipv4.ip_forward=1
运行sudo sysctl -p来启用
之后运行
sudo iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE
来启用wlan1端口的NAT
配置防火墙
上一步中,我们启用了一条防火墙规则,但是防火墙规则重启后就丢失了,为了能够规则开机自动加载,我们可以使用iptables-persistent。用命令sudo apt-get install iptables-persistent来安装该组件,根据其提示进行初次设置(一路确认)。该组件默认会将防火墙规则保存到/etc/iptables/rules.v4中。你可以使用如下命令保存和读入规则:
#保存现有规则
sudo service netfilter-persistent save
#读取并应用先有规则
sudo service netfilter-persistent reload
确认WIFI适配器支持AP模式
上面说过,我用的usb无线网卡是迅捷的FW150US,第一次配置时,我试图用这个usb无线网卡来开启AP,失败之后发现,这个网卡用内核自带的驱动时不支持AP mode。好在树梅派3B自带的无线网卡是支持的。可以使用命令iw list查看网卡是否支持ap mode,在命令输出里Supported interface modes下查看是否有AP。
安装并开启hostapd
Linux启用WIFI热点,使用的是hostapd。首先,用命令sudo apt-get install hostapd安装它,然后增加配置文件/etc/hostapd/hostapd.conf如下:
interface=wlan0
driver=nl80211
ssid=ssid
hw_mode=g
channel=13
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=passwd
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
请需要更改其中的ssid和wpa_passphrase属性,分别为无线AP的名称和密码。
之后运行命令sudo hostapd -d /etc/hostapd/hostapd.conf来观察测试,没有错误可以连接,就OK了。 CTRL+C后,编辑/etc/default/hostapd,改变DAEMON_CONF的配置如下
DAEMON_CONF="/etc/hostapd/hostapd.conf"
正式启动AP
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd
关机重启一下,看看AP是否能够启动起来。如果正常就OK了。
为什么我的连不上 /xiaoku
局域网也行: 可以创建网桥lan, 把eth0端口 和 自带网卡wlan0加入网桥lan ,再安装dnsmasq提供dhcp服务和DNS解析服务。