情况:
Raspberry Pi 3(单板迷你电脑)带有基于 Debian 的发行版(Raspbian),带有 2 个 Wi-Fi 卡,一个内置(wlan0),另一个外置(wlan1),在内部从我的家用路由器接收互联网。
我想要的是:
另一张 Wi-Fi 卡(wlan1 - sb 外部卡)在某些不需要互联网访问的设备(我的情况下是 ESP8266 设备)和 Raspberry Pi 之间建立连接,因此它将创建一个接入点/热点
但是我怎样才能实现这个目标呢?
如何在 wlan1 中配置无需互联网访问的热点?
答案1
解决方案有点冗长。
使用hostapd创建热点WLAN1。互联网上有很多关于如何做到这一点的指南,你可以找到任何你喜欢的。你可以省略语句桥=br0按照 Daniel B 的建议。
现在你可以为你的接口指定一个 IP 地址,然后启动它:
ip addr add 192.168.1.111/24 dev wlan1 ip link set dev wlan1 up
在哪里192.168.1.111是一个地址外部您的路由器 DHCP 池,但在同一个子网内。
现在我们必须为热点的客户端确定一个 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。
现在添加至关重要路线:
ip route add 192.168.1.112/28 dev wlan1
这将指示你的内核通过正确的接口为你的 WiFi 客户端发送数据包,不是通过标准界面wlan0你在哪里已经有规则
ip route add 192.168.1.0/24 dev wlan0
它来自你的 DHCP。我再重复一遍,因为它很重要:第一个路由优先于第二个路由,因为它更具体,这样你的内核就会知道如何使用WLAN1界面。
现在你需要设置域名系统处理界面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
记得允许 IPv4 流量通过你的接口,
echo 1 > /proc/sys/net/ipv4/ip_forward
并伪装你的流量,
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
最后一条命令确保所有离开wlan0接口似乎源自您的 RPI,这又意味着您的客户端将获得对其查询的答复;不必担心跟踪哪些返回数据包属于 RPI 以及哪些属于其中一个客户端,内核会自动为您完成这些操作。
最后,我们只允许wlan0和WLAN1(这就是 IPv4 转发的含义),它忽略了 ARP 等第 2 层协议。如果你想弥补这一缺陷,你可以使用代理arp:
echo 1 > /proc/sys/net/ipv4/conf/wlan0/proxy_arp echo 1 > /proc/sys/net/ipv4/conf/wlan1/proxy_arp