Total Pageviews

Monday, 3 June 2019

把树莓派改造成无线路由器

这篇教程教你如何把树莓派改造成一个无线路由器,适用Arch Linux、Arch Linux ARM系统。

目标

树莓派B型自带一个以太网口,作为WAN;USB无线网卡,作为WLAN。
  • IPv4 无线局域网配置为10.11.11.0/24,通过NAT连接互联网
  • IPv6 配置IPv6-only网桥,通过桥接连接互联网

需求

用ssh连入树莓派,下面的操作均在树莓派上执行。

安装相关软件

安装软件
sudo pacman -S hostapd dnsmasq bridge-utils ebtables iptables iproute2 dhcpcd
注意: 官方的hostapd不支持RTL8188CUS芯片的无线网卡,需要编译安装Realtek提供的hostapd才行,可安装AUR中的hostapd-8192cu
yaourt -S hostapd-8192cu
树莓派编译比较慢,耐心等待即可。

配置网卡接口名称

很多发行版将以太网接口命名为ethX,无线网接口命名为wlanX。这样做有个明显的问题:当系统存在多个同类型的接口时,接口的名字可能是不固定的(如有时是eth0,有时是eth1)。为避免这样,下面给每个接口配置固定的名字。
编辑/etc/udev/rules.d/10-network.rules
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="net0"
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="ff:ee:dd:cc:bb:aa", NAME="ap0"
其中aa:bb:cc:dd:ee:ff替换为以太网卡的MAC地址,ff:ee:dd:cc:bb:aa替换为无线网卡的MAC地址。
注意: 重启树莓派之前必须修改网络配置,否则可能无法再连入树莓派。

配置IP地址

net0使用dhcp动态获取IP地址

sudo systemctl enable dhcpcd@net0.service
或者
sudo systemctl enable ifplugd@net0.service

配置hostapd

编辑/etc/hostapd/hostapd.conf,根据需要修改SSIDPASSWORD
interface=ap0
ctrl_interface=/var/run/hostapd
driver=rtl871xdrv
hw_mode=g
ieee80211n=1
wmm_enabled=1
ht_capab=[DSSS_CCK-40][MAX-AMSDU-7935][SMPS-STATIC][SHORT-GI-20][SHORT-GI-40][HT40-]
channel=6
supported_rates=480 540 720
basic_rates=480 540 720
ssid=SSID
wpa=2
wpa_passphrase=PASSWORD
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

配置dnsmasq

编辑/etc/dnsmasq.conf
interface=ap0
bind-interfaces
dhcp-range=10.11.11.1,10.11.11.254,1h
dhcp-option=option:router,10.11.11.1

配置网络共享

启用内核转发,编辑/etc/sysctl.d/10-net.conf
net.ipv4.ip_forward = 1
编辑/usr/lib/systemd/system/ap.service
[Unit]
Description=Access Poing
After=network.target
Wants=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/usr/bin/sleep 2
ExecStart=/usr/bin/ip link set up dev ap0
ExecStart=/usr/bin/ip addr add 10.11.11.1/24 broadcast 10.11.11.255 dev ap0
ExecStart=/usr/bin/brctl addbr br0
ExecStart=/usr/bin/ip link set up dev br0
ExecStart=/usr/bin/ebtables -t broute -A BROUTING -p ! ipv6 -j DROP
ExecStart=/usr/bin/brctl addif br0 net0
ExecStart=/usr/bin/brctl addif br0 ap0
ExecStart=/usr/bin/systemctl start hostapd.service
ExecStart=/usr/bin/systemctl start dnsmasq.service
ExecStop=/usr/bin/systemctl stop dnsmasq.service
ExecStop=/usr/bin/systemctl stop hostapd.service
ExecStop=/usr/bin/ip link set down dev br0
ExecStop=/usr/bin/brctl delbr br0
ExecStop=/usr/bin/ebtables -t broute -D BROUTING -p ! ipv6 -j DROP
ExecStop=/usr/bin/ip addr flush dev ap0
ExecStop=/usr/bin/ip link set down dev ap0

[Install]
WantedBy=multi-user.target
开机启动
sudo systemctl enable ap.service
开启 NAT,可以把下面的指令加入到自启动里
sudo iptables -t nat -A POSTROUTING -s 10.11.11.0/24 -j MASQUERADE

绑定MAC地址

绑定MAC地址可以有效的防止蹭网。在/etc/hostapd/hostapd.conf中添加
macaddr_acl=1
accept_mac_file=/etc/hostapd/hostapd.accept
然后在 /etc/hostapd/hostapd.accept 中添加允许连接的设备,例如
01:23:45:67:89:01
ab:cd:ef:ab:cd:ef

联网设备管理

查看已连接的设备

cat /var/lib/misc/dnsmasq.leases
或者
sudo hostapd_cli all_sta

断开某个设备

首先查看设备的 MAC 地址,然后
sudo hostapd_cli disassociate <MAC addr>

参考资料

  1. Software Access Point
---------------------

在树莓派上,安装 Arch Linux ARM系统


这是我在树莓派上安装 Arch Linux ARM 和简单配置的过程,仅供参考。

所需配件

  1. 树莓派B型
  2. Micro-USB 连接线
  3. SD 卡
  4. 5V 电源
  5. 网线

下载最新的系统

SD 卡分区

把 SD 卡插在电脑上,分区表设为 MBR,创建三个分区
分区大小文件系统
sdb1100MiBFAT32
sdb27GiBext4
sdb31GiBswap

复制相关文件

首先挂载相应的分区
sudo mount /dev/sdb2 -o noatime,discard /mnt
sudo mkdir /mnt/boot
sudo mount /dev/sdb1 -o noatime /mnt/boot
解压文件到指定位置
sudo bsdtar -xpf /path/to/root.tar.xz -C /mnt
sudo bsdtar -xpf /path/to/boot.tar.xz -C /mnt/boot
做一些必要的修改:
  1. 编辑 /mnt/etc/fstab
     # /etc/fstab: static file system information
     #
     #                
     /dev/mmcblk0p2  /       ext4    noatime,discard  0       1
     /dev/mmcblk0p1  /boot   vfat    noatime          0       0
     /dev/mmcblk0p3  none    swap    defaults,discard 0       0
    
  2. 编辑 /mnt/boot/cmdline.txt
     avoid_safe_mode=1 selinux=0 plymouth.enable=0 smsc95xx.turbo_mode=Y dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
    
最后卸载分区
sync
sudo umount /mnt/boot
sudo umount /mnt
sync
此时,SD卡中就安装好了 Arch Linux ARM 最小启动环境了。

通过 ssh 连接树莓派

树莓派的以太网接口默认配置成 DHCP 自动获取 IP 地址,开启 sshd 服务,root 密码为 root
  1. 将电脑的以太网接口配置为局域网网关(假设接口名称为 enp7s0)
    1. 安装 dnsmasq
       sudo pacman -S dnsmasq
      
    2. 编辑 /etc/dnsmasq,写入以下内容
       interface=enp7s0
       bind-interfaces
       dhcp-range=192.168.1.1,192.168.1.254,255.255.255.0,24h
       dhcp-option=option:router,192.168.1.1
      
    3. 执行下面的命令
       sudo ip link set up dev enp7s0
       sudo ip addr add 192.168.1.1/24 broadcast 192.168.1.255 dev enp7s0
       sudo systemctl start dnsmasq.service
      
  2. 将树莓派和电脑用网线连接起来,接通树莓派电源。此时,树莓派应该自动配置好 IP,和电脑处于同一个局域网了。用下面的命令查看树莓派的 IP 地址
     ip neigh show dev enp7s0
    
  3. 假设树莓派地址为 192.168.1.3,用 ssh 登陆到树莓派
     ssh root@192.168.1.3
    

配置树莓派

上面只是做了一些最基本的配置,还有许多工作要做。

配置 pacman

编辑 /etc/pacman.d/mirrorlist,改为以下内容
Server = http://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo
编辑 /etc/pacman.conf
CacheDir = /tmp/pacman/pkg
更新系统
pacman -Syyu
安装 basebase-devel
pacman -S --needed base base-devel

配置 makepkg

编辑 /etc/makepkg.conf
CFLAGS="-mcpu=arm1176jzf-s -march=armv6zk -mtls-dialect=gnu2 -mfloat-abi=hard -mfpu=vfp -O2 -pipe"
CXXFLAGS="-mcpu=arm1176jzf-s -march=armv6zk -mtls-dialect=gnu2 -mfloat-abi=hard -mfpu=vfp -O2 -pipe"
BUILDDIR=/tmp/makepkg

更新 linux内核

树莓派的 Arch Linux ARM 默认使用的不是最新的内核,可以更新成最新的
pacman -S linux-raspberrypi-latest

用户管理

新建用户组 sudo
groupadd sudo
新建一个用户 pi
useradd -m -g users -s /bin/bash pi
passwd pi
gpasswd -a pi sudo
编辑 /etc/sudoers 以便新用户可以执行 sudo,将下面的行取消注释
%sudo ALL=(ALL:ALL) ALL
禁用 root
sudo passwd -l root
注销 root 并以用户 pi 登陆
exit
ssh pi@192.168.1.3

Locale

编辑/etc/locale.gen,将下面的行取消注释
en_US.UTF-8 UTF-8
zh_CN.GB18030 GB18030
zh_CN.GBK GBK
zh_CN.UTF-8 UTF-8
zh_CN GB2312
然后执行
sudo locale-gen
设置系统语言为 zh_CN.UTF-8,编辑 /etc/locale.conf,写入以下内容
LANG=zh_CN.UTF-8

时区

设置时区为 Shanghai
sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

时间

树莓派没有硬件时钟,每次关机时间都会丢失,因此需要设置自动联网对时。安装 ntp,并启用自动对时
sudo pacman -S ntp
sudo systemctl enable ntpd.service

随机数生成器

安装 rng-tools
sudo pacman -S rng-tools
编辑 /etc/conf.d/rng
RNGD_OPTS="-o /dev/random -r /dev/hwrng"
启动服务
sudo systemctl enable rngd.service

超频

编辑 /boot/config.txt,将下面的行取消注释
arm_freq=900
core_freq=333
sdram_freq=400
over_voltage=2

启用硬件看门狗

编辑 /etc/modules-load.d/watchdog.conf
bcm2708_wdog
安装 watchdog
sudo pacman -S watchdog
编辑 /etc/watchdog.conf
watchdog-device = /dev/watchdog
temperature-device = /sys/class/thermal/thermal_zone0/temp
max-temperature = 75000
开机启动watchdog daemon
sudo systemctl enable watchdog.service

安装无线网卡驱动

买来的无线网卡用的芯片是 RTL8188CUS,需要自行安装驱动
sudo pacman -S dkms-8192cu
安装过程中需要编译内核模块,比较耗时,耐心等待即可。

安装常用的软件

sudo pacman -S bash-completion vim yaourt goagent \
               youtube-dl transmission-cli bc tree \
      axel pkgfile git
yaourt -S tengine-dev

关机/重启

关机
sudo shutdown -h now
重启
sudo reboot

No comments:

Post a Comment