Linux - 使用辅助 USB Wi-Fi 适配器创建热点,无需桥接互联网访问

Linux - 使用辅助 USB Wi-Fi 适配器创建热点,无需桥接互联网访问

情况:
Raspberry Pi 3(单板迷你电脑)带有基于 Debian 的发行版(Raspbian),带有 2 个 Wi-Fi 卡,一个内置(wlan0),另一个外置(wlan1),在内部从我的家用路由器接收互联网。

我想要的是:
另一张 Wi-Fi 卡(wlan1 - sb 外部卡)在某些不需要互联网访问的设备(我的情况下是 ESP8266 设备)和 Raspberry Pi 之间建立连接,因此它将创建一个接入点/热点

但是我怎样才能实现这个目标呢?

如何在 wlan1 中配置无需互联网访问的热点?

答案1

解决方案有点冗长。

  1. 使用hostapd创建热点WLAN1。互联网上有很多关于如何做到这一点的指南,你可以找到任何你喜欢的。你可以省略语句桥=br0按照 Daniel B 的建议。

  2. 现在你可以为你的接口指定一个 IP 地址,然后启动它:

     ip addr add 192.168.1.111/24 dev wlan1
     ip link set dev wlan1 up
    

在哪里192.168.1.111是一个地址外部您的路由器 DHCP 池,但在同一个子网内。

  1. 现在我们必须为热点的客户端确定一个 IP 地址范围。这是必要的不是因为 DHCP 原因,而是因为路由(见下一条)。选择主 LAN 的一个小子网,该子网不是主路由器使用的 IP 地址。例如,如果路由器分配以下范围内的 IP 地址192.168.1.2-192.168.1.100,你可以使用类似192.168.1.112/28,其中包括该范围内的所有地址192.168.1.112-192.168.1.127

  2. 现在添加至关重要路线:

     ip route add 192.168.1.112/28 dev wlan1
    

这将指示你的内核通过正确的接口为你的 WiFi 客户端发送数据包,不是通过标准界面wlan0你在哪里已经有规则

    ip route add 192.168.1.0/24 dev wlan0

它来自你的 DHCP。我再重复一遍,因为它很重要:第一个路由优先于第二个路由,因为它更具体,这样你的内核就会知道如何使用WLAN1界面。

  1. 现在你需要设置域名系统处理界面WLAN1分发范围内的地址192.168.1.112/28;使用以下/etc/dnsmasq.conf文件:

     domain-needed
     bogus-priv
     dhcp-authoritative
     interface=wlan1
     server=8.8.8.8
     server=8.8.4.4
     expand-hosts
     domain=YourLanName.lan
     dhcp-range=192.168.1.112,192.168.1.127,12h
     dhcp-option=3,192.168.1.1
     dhcp-host=4C:E6:76:00:11:22,PC_NAME,192.168.1.119,12h
    

这应该是不言自明的。倒数第二行指示域名系统作为门户不是机器的 IP域名系统正在运行,但 IP 地址真的您的 LAN 的路由器/网关。如果您不希望 wifi 客户端能够访问互联网,您可以跳过倒数第二行。启动 dnsmasq,

     systemctl start dnsmasq

我假设你使用的是 systemd,否则上面的内容应该替换为

    service dnsmasq start

最后一行显示了如何分配保留(=静态)地址。如果您希望为某个 wifi 客户端分配一个 IP 地址,192.168.1.112/28范围,你可以做到,只要记住指示内核可以在哪里找到该地址:例如,

    ip route add 192.168.1.200/32 dev wlan1
  1. 记得允许 IPv4 流量通过你的接口,

     echo 1 > /proc/sys/net/ipv4/ip_forward
    

并伪装你的流量,

    iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

最后一条命令确保所有离开wlan0接口似乎源自您的 RPI,这又意味着您的客户端将获得对其查询的答复;不必担心跟踪哪些返回数据包属于 RPI 以及哪些属于其中一个客户端,内核会自动为您完成这些操作。

  1. 最后,我们只允许wlan0WLAN1(这就是 IPv4 转发的含义),它忽略了 ARP 等第 2 层协议。如果你想弥补这一缺陷,你可以使用代理arp

     echo 1 > /proc/sys/net/ipv4/conf/wlan0/proxy_arp
     echo 1 > /proc/sys/net/ipv4/conf/wlan1/proxy_arp
    

相关内容