初入树莓派4----无线中继路由

  • 树莓派实现无线中继

  • 资料来源:

    https://beekc.top/2019/08/20/raspberry-wifi-ap/

  • 更新

1
2
19.01.06 初始化
19.01.09 添加后记.

导语

  • 租的房间距离主路由隔了好远,又加上电脑的无线网卡信号极差.上网的体验可想而知,频繁掉线,卡顿.
  • 手头还有吸尘器 3B 和一个 rtl8812au ,rtl8812au 连接主路由科比电脑的无线网卡好多了,寻思中继一下路由.
  • 没想到是个大坑,现在才出来…😂.

方案

  • 路由中继有交换机和桥接两种.

    • 交换机即树莓派连上主路由,再自己开个热点组个子网.
    • 桥接是直接中继主路由的信号 Dhcp 还是交给主路由,形式看树莓派根本不存在.
  • 我还有 NAS ,不太想直接连到主路由,这里选交换机了.虽然桥接的性能可能更好一点.

  • 开热点自然是 hostapd ,负责 dncp 的这里选之前用过的 dnsmasq (虽然很久没用了).

  • 3B 的无线网卡只支持到 802.11g ,信号也不是很好,还好热点需要覆盖的范围也有限,就用 3B 自带的无线网卡开热点了.

  • 没想到 rtl8812au 的驱动却是多磨.gnab/rtl8812au 的驱动编译后运行很好,但是就是不支持开热点(以后还想升级来着).几次更换无果,直接切到了 kali ,网卡驱动都不用编译,热点工作好好的.但是 kali 的iptables 有问题,设置无法生效. 无奈又切换回来了,最后换成了 abperiasamy/rtl8812AU_8821AU_linux 才算是正常了.

  • 这里假设子网 ip 段为 192.168.3.1/8 .把 eth0 的 ip 分配成 192.168.4.1 方便管理.

  • 这样汇总成了 init.sh ap.sh
    两个脚本. init.sh 负责初始化系统, ap.sh 建立 wifi.

  • 涉及 iptables 又复习了一遍.

  • 一定不要直接下载运行,需要按照自己需要自行修改才可以.

rtl8812au驱动

  • 安装必要软件

    1
    sudo apt-get install linux-image-rpi-rpfv linux-headers-rpi-rpfv raspberrypi-kernel-headers dkms build-essential bc
  • 下载驱动源文件

    1
    2
    git clone https://github.com/abperiasamy/rtl8812AU_8821AU_linux.git
    cd rtl8812AU_8821AU_linux
  • 还需要修改一下 Makefile ,设置为树莓派.

    1
    2
    CONFIG_PLATFORM_I386_PC = n
    CONFIG_PLATFORM_ARM_RPI = y
  • 编译 and 安装

    1
    2
    3
    make -j4
    sudo make install
    sudo modprobe -a rtl8812au

init.sh

  • 修改清华源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
    sudo bash -c "cat > /etc/apt/sources.list <<EOF
    deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
    deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
    EOF"

    sudo mv /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak
    sudo bash -c "cat > /etc/apt/sources.list.d/raspi.list <<EOF
    deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
    EOF"
  • 系统更新

    1
    sudo apt-get update
  • 安装必备的软件

    1
    2
    3
    4
    5
    # 安装vim htop
    sudo apt install -y vim htop

    # 安装hostapd dnsmasq
    sudo apt install -y hostapd dnsmasq
  • 假设主路由名称为 A ,密码 12345678.

    1
    2
    3
    4
    5
    6
    7
    8
    # 写入默认wifi(修改)
    sudo bash -c "cat >> /etc/wpa_supplicant/wpa_supplicant.conf <<EOF
    network={
    ssid=\"A\"
    psk=\"12345678\"
    priority=1
    }
    EOF"
  • 写入默认ip配置 eth0 是192.168.4.1 ; wlan0 是 192.168.3.1 ; wlan1 是

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    sudo bash -c "cat >> /etc/network/interfaces <<EOF
    auto lo
    iface lo inet loopback

    auto eth0
    iface eth0 inet static
    address 192.168.4.1
    netmask 255.255.255.0

    auto wlan0
    allow-hotplug wlan0
    #iface wlan0 inet dhcp
    #wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    iface wlan0 inet static
    address 192.168.3.1
    netmask 255.255.255.0

    auto wlan1
    allow-hotplug wlan1
    iface wlan1 inet dhcp
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

    #auto wlan2
    #allow-hotplug wlan2
    #iface wlan2 inet dhcp
    #wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

    EOF"
  • 系统优化,开启bbr等.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    sudo sudo bash -c "cat >> /etc/sysctl.conf <<EOF
    #TCP配置优化(不然你自己根本不知道你在干什么)
    fs.file-max = 51200
    #提高整个系统的文件限制
    net.core.rmem_max = 67108864
    net.core.wmem_max = 67108864
    net.core.netdev_max_backlog = 250000
    net.core.somaxconn = 4096

    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 0
    net.ipv4.tcp_fin_timeout = 30
    net.ipv4.tcp_keepalive_time = 1200
    net.ipv4.ip_local_port_range = 10000 65000
    net.ipv4.tcp_max_syn_backlog = 8192
    net.ipv4.tcp_max_tw_buckets = 5000
    net.ipv4.tcp_fastopen = 3
    net.ipv4.tcp_mem = 25600 51200 102400
    net.ipv4.tcp_rmem = 4096 87380 67108864
    net.ipv4.tcp_wmem = 4096 65536 67108864
    net.ipv4.tcp_mtu_probing = 1
    net.ipv4.tcp_congestion_control = bbr
    net.ipv4.ip_forward = 1
    #END OF LINE
    EOF"

    sudo sysctl -p

ap.sh

  • hostapd 的默认配置在 /etc/hostapd/hostapd.conf.这里默认名称为 PI 密码 12345678

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    sudo bash -c "cat >/etc/hostapd/hostapd.conf <<EOF
    interface=wlan0
    driver=nl80211
    hw_mode=g
    channel=3
    ieee80211n=1
    wmm_enabled=1
    ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
    macaddr_acl=0
    auth_algs=1
    ignore_broadcast_ssid=0
    wpa=2
    wpa_key_mgmt=WPA-PSK
    rsn_pairwise=CCMP
    ssid=PI
    wpa_passphrase=12345678
    EOF"
  • dnsmasq 的配置文件在 /etc/dnsmasq.conf,这里要和 wlan1 的静态ip地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    sudo bash -c "cat >>/etc/dnsmasq.conf <<EOF
    # Use interface wlan0
    interface=wlan0

    # Explicitly specify the address to listen on
    listen-address=192.168.3.1

    # Bind to the interface to make sure we aren't sending things elsewhere
    bind-interfaces

    # Forward DNS requests to AliDNS
    server=223.5.5.5

    # Don't forward short names
    domain-needed

    # Never forward addresses in the non-routed address spaces
    bogus-priv

    # Assign IP addresses between 192.168.3.50 and 192.168.3.150 with a 12 hour lease time
    dhcp-range=192.168.3.50,192.168.3.150,12h
    EOF"
  • 开机启动

    1
    2
    3
    4
    sudo systemctl enable dnsmasq
    #直接enable可能有错误
    sudo systemctl unmask hostapd
    sudo systemctl enable hostapd
  • iptables

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # wlan1 出口动态nat
    sudo iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE
    # 允许回来的链接 入口wlan1 入口 wlan0 .
    sudo iptables -A FORWARD -i wlan1 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    # 允许出去的链接 出口wlan1 入口wlan0
    sudo iptables -A FORWARD -i wlan0 -o wlan1 -j ACCEPT

    # 保存 iptables 开机恢复
    sudo apt-get install -y iptables-persistent
    sudo service netfilter-persistent save

    sudo bash -c "cat >>/etc/rc.local <<EOF
    iptables-restore < /etc/iptables/rules.v4
    EOF"
  • 如果你没有设置 eht0 静态ip,那么 raspberry 默认路由是 eth0 这样还是 wlan0 下面连不上网.需要变动一下路由表.假设主路由网关在 192.168.1.1.

    1
    2
    3
    4
    # 删除默认出口 eth0
    sudo route del default gw 192.168.1.1 eth0
    # 增加为 wlan1
    sudo route add default gw 192.168.1.1 wlan1

后记

  • 效果真是不太好,主要是受制于吸尘器 3B 垃圾的自带 AP .带宽显示是72M,实测只有不到30M.如果是 rtl8812u 开 5G频段,瓶颈反而是 3B 的 USB 口了.手头另一个 usb 网卡是垃圾的随身 wifi ,效果和 3B 自带的差不太多.就此中继信号的梦想中断了…