注意:由于比尔盖子实现早已配置好树莓派,并没有对文中的方法进行逐步确认,因此比尔盖子不对文章内容的正确性负责! 树莓派恐怕是 2010 年的年度电子产品了,它完整的 ARM 架构、足够底的价格和足够小的体积,使它的功能迅速变得无限可能。对于家庭用户来说,把它变成一个可以运行很多守护服务的路由器是个不错的主意。
本文将讲述在没有显示器的情况下仅仅通过网络,将运行 Arch Linux 的树莓派变为路由器。
事前准备
注:新版 Arch 已经使用 netcli
替代了 netcfg
,但是可以使用 yaourt
,并修改开启自启动服务来重新使用 netcfg
,本文不做说明。此为大坑!
比尔盖子假设你拥有一款B型树莓派,已经把 Arch Linux 安装到你的树莓派上,并已经成功引导进入系统,且拥有一个路由器和有线电缆,通过网络(DHCP)连接上树莓派,且可以访问互联网。本文不会对常规的系统安装配置给予任何帮助,因为它与台式机上的 Arch Linux 别无两样。
并且,你应当拥有一款对 Linux 友好的无线网卡,以便进行无线网络的搭建。我推荐使用 ath9k
和 ath9k_htc
内核模块的设备,它们都很新,稳定程度也比较高。
在进行下一步操作之前,运行 pacman -Syu
总是一个好主意。
搭建无线连接
我们面临的第一个问题,就是鸡与蛋的问题 —— 树莓派本身将成为一个路由器,以便我们连接它并上网;然而,在它没有配置好之前,这是一件矛盾的事情。
况且,本文的前提条件是“仅有网络,没有任何手段直接操作树莓派”。因此,我们要做的第一件事情,就是搭建一个“脚手架”,以便我们能够建立对树莓派的控制。
目前,既然我们可以通过有线网络连接树莓派,那么就登录到 SSH 上进行操作吧!
安装无线网卡
如果不出问题,树莓派可以直接识别出你当前使用的无线网卡。使用 lsusb
和 iwconfig -a
加以确认。
[root@alarmpi /]# lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. LAN9500 Ethernet 10/100 Adapter
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0cf3:9271 Atheros Communications, Inc. AR9271 802.11n
[root@alarmpi /]# iwconfig
wlan0 IEEE 802.11bgn Mode:Master Tx-Power=20 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Power Management:off
很好,看来我们的无线网卡能被正常识别。
配置无线热点
hostapd
既然无线网卡可以被连接,接下来就是让它发挥作用的时候了。我们在搭建 PPPOE,替换掉路由器之前,首先需要将无线网卡配置到位。 首先安装 hostapd
包,来实现无线软路由功能(值得一提的是,Android 的移动热点使用的程序也是它)。
pacman -S hostapd
在安装好之后,就可以对 hostapd
进行一些简单的配置了。编辑 /etc/hostapd/hostapd.conf
。当然,这还需要根据你的实际情况对配置文件进行一些修改。
# 服务配置
# 网卡设备名
interface=wlan0
# 进程 PID 路径
ctrl_interface=/var/run/hostapd
# 无线网络的 SSID
ssid=RespPi
# 无线网络的信道
channel=6
# 使用 WPA2 进行加密
wpa=2
# 无线网络密码
wpa_passphrase=12345678
# 无线配置
# nl80211 是新一代 Linux 网卡驱动框架
driver=nl80211
beacon_int=100
# 802.11G 模式
hw_mode=g
# 禁用 802.11N
ieee80211n=0
# 使用 WPA-PSK 加密
wpa_key_mgmt=WPA-PSK
# 使用 CCMP 加密算法
wpa_pairwise=CCMP
max_num_sta=8
wpa_group_rekey=86400
dnsmasq
接下来,我们还需要安装一个 DHCP 服务器,来为无线网络中的客户端自动分配 IP 地址。dhcpd
是标准的 DHCP 实现,不过,比尔盖子和其它的路由器固件都偏爱 dnsmasq
,一个轻快灵活的 DHCP 服务器。
使用 pacman -S dnsmasq
进行安装。安装后,编辑 /etc/dnsmasq.conf
来进行配置。别看它默认给出的示例又长又复杂,如果只是想让它简单的工作起来,那么只需要四行配置。
listen-address=192.168.0.1 # 监听地址,同你想设置的网关地址
interface=wlan0 # 无线网卡的设备名,同 hostapd.conf 保持一致
bind-interfaces
dhcp-range=192.168.0.100,192.168.0.200,12h # DHCP 分配 IP 的起止段和租约时间,这里是 12 小时
dhcp-option=6,8.8.8.8,8.8.4.4 # 推送给客户端的 DNS 服务器
iptables
配制不当的防火墙是导致网络问题的罪魁祸首之一。然而,我们在这里使用 iptables
并不是为了安全,而是为了让无线网卡得以转发到有线网卡 eth0 上。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
如果你的网卡不是 eth0,那么则需要修改一下。这样,无线网卡的数据便可自由传输在有线网络中了。 不过,我们需要使用 iptables-save > /etc/iptables/iptables.rules
保存 iptables
的规则,避免重启后小时。
启动无线
现在各大服务都已经配置好了,只要使用 systemctl
启动它们就行了。 不过,先别着急启用服务。我们必须先为无线网卡设置好网关和子网掩码,这样 hostapd
启用后,无线网络才能正确的运行。
ifconfig wlan0 192.168.0.1 netmask 255.255.255.0
其中的网关和子网掩码均可根据需要进行替换。每次运行 hostapd
之前,都必须运行此命令来初始化网卡,很麻烦。如果我们要开机就激活无线网络,这会成为一个非常严重的绊脚石。因此,我们不妨让 netcfg
来接管这项任务。
在 /etc/network.d
下创建一个名为 hostapd-wlan0
的文件。同样根据自己的需要,可以修改 IP 地址和子网掩码。
CONNECTION='ethernet'
DESCRIPTION='Hostapd Software Access Point'
INTERFACE='wlan0'
IP='static'
ADDR='192.168.0.1'
NETMASK='255.255.255.0'
SKIPNOCARRIER='yes'
允许转发
我们需要启用内核的 IPv4 包转发功能,才能正常访问互联网。编辑 /etc/sysctl.conf
, 添加一行 net.ipv4.ip_forward = 1
,然后 sysctl -p
应用设置。
接下来,就相继启动各种服务。
netcfg hostapd-wlan0
systemctl start iptables
systemctl start hostapd
systemctl start dnsmasq
最后,拿出手机进行测试,如果手机可以正常连接到树莓派,并可以访问互联网,那么说明无线网络配置已经初步成功!
开机自启动
我们已经配置好了第一阶段的无线网络,我们需要让无线网络开机自动启动,便于进行下一步的配置。
自启动无线网卡
比尔盖子之前反复强调过,无线网卡在启用前必须分配到了 IP 地址,否则 hostapd
将无法正常工作。因此,首先要处理的便是无线网卡的激活问题了。
编辑文件 /etc/conf.d/netcfg
,将 NETWORKS
后面加上自己的网络设备。注意,若 NETWORKS 中存在有线网络连接,不要将其删除。
NETWORKS=(xxxx hostapd-wlan0)
接下来让网络开机自启动:systemctl enable netcfg
。 然后再让之前我们见到的服务都自启动。
systemctl enable iptables
systemctl enable hostapd
systemctl enable dnsmasq
之后重启树莓派,重启后再次测试网络连接是否正常。若正常,那么说明第一阶段圆满结束,进入下一阶段!
配置 PPPOE
PPPOE 的后端服务是 pppd
,使用 pacman -S ppp
进行安装。 我们依然用 Arch Linux 中方便的 netcfg
进行配置。创建文件 /etc/network.d/pppoe-eth0
进行 PPPOE 的拨号。
CONNECTION='pppoe'
DESCRIPTION='My PPPoE connection'
INTERFACE='eth0' # 有线网卡设备名
USER='user' # PPPOE 用户名
PASSWORD='pass' # PPPOE 密码
CONNECTION_MODE='persist'
USEPEERDNS=0
然后再次编辑 /etc/conf.d/netcfg
文件,这次 NETWORKS
中就只剩下两个连接了。
NETWORKS(hostapd-wlan0 pppoe-eth0)
接下来,我们还要进一步配置 pppd
,以便让网络更稳定些。
创建 /etc/ppp/ip-up.d/01-router.sh
文件,这使得 PPPOE 拨号连接断开重新后自动重启整个网络服务。
netcfg -d hostapd-wlan0
netcfg hostapd-wlan0
systemctl restart hostapd
systemctl restart dnsmasq
然后赋予其可执行权限 chmod +x /etc/ppp/ip-up.d/01-router.sh
。
创建 /etc/resolv.conf.head
,填写自己用着顺手的 DNS 服务器。
nameserver 8.8.8.8
nameserver 8.8.4.4
然后 cp /etc/resolv.conf.head /etc/resolv.conf
进行文件覆盖,以防止自动生成不起作用。
配置 iptables
我们需要再次配置 iptables
,让网络流量得以穿透 PPPOE 隧道。
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
之后保存设置:iptables-save > /etc/iptables/iptables.rules
最后将调制解调器(猫)的 LAN 线接入树莓派有线网卡,重启树莓派,看看你是否能上网了?如果可以,恭喜你,树莓派路由器配置圆满成功!
不过,一个常见的问题是,第一次死活无法连接到网络。这时候只能断开树莓派的电源,重启树莓派,并等待 3 分钟,再次连接,应该就可以工作正常。
2017年09月16日 — 03:34
简便的方法有
pacman -S create-ap
create_ap --daemon wlan0 eth0 yourssid yourpasswd
2013年08月18日 — 14:29
请问
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
这一步有无必要,还是只要转到ppp0就好?
2013年08月18日 — 16:45
我说过了,整个配置过程都是在没有屏幕的情况下进行的,所以这一步算 Bootstrap,不做的话就是自找麻烦。
2013年08月12日 — 09:55
文章写得不错,学习了!!