![设置 802.11s 网状网络,以便移动设备与有线服务器进行通信](https://linux22.com/image/58421/%E8%AE%BE%E7%BD%AE%20802.11s%20%E7%BD%91%E7%8A%B6%E7%BD%91%E7%BB%9C%EF%BC%8C%E4%BB%A5%E4%BE%BF%E7%A7%BB%E5%8A%A8%E8%AE%BE%E5%A4%87%E4%B8%8E%E6%9C%89%E7%BA%BF%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%9B%E8%A1%8C%E9%80%9A%E4%BF%A1.png)
我正在开发一个 Android 应用程序,该应用程序可维护设备与基于 Linux 的 WiFi 网状网络的连接,并定期向网状网络上某处的已知服务器发送状态信息(GPS、电池寿命等)。总的来说,我对 *nix 还很陌生,所以这个项目是一个巨大的学习曲线,我认为当谈到网络时,我远远超出了我的能力范围。我在获取更新数据包流量以始终找到返回服务器的方式时遇到了一些问题,并希望有人能够为我指明正确的方向。
每个网格节点都是一台小型 Linux 计算机,具有三个网络接口:
ap0
WiFi 接入点接口由 管理hostapd
。 IP 地址设置为192.168.0.1
,连接的手机通过 自动分配同一子网的 IP dhcpd
。
mesh0
WiFi 802.11s 网状接口将网状节点连接在一起。每个人都是网络的成员10.0.0.0
。
eth0
标准以太网端口,分配IP 192.168.1.101
。只有一个网格节点将使用此接口,它将连接到包含服务器计算机 ( ) 的网络192.168.1.1
。
为了清楚起见,下面是网络结构的模型:
到目前为止,我所能实现的就是让节点互相 ping 通。无线设备无法看到自己网络(接入点子网)之外的情况,除了以太网连接的节点之外,其他任何设备也无法对服务器执行 ping 操作。设置所有这些的脚本如下所示(主要是通过谷歌搜索拼凑而成):
ifconfig wlan0 down
iw dev wlan0 del
iw phy phy0 interface add ap0 type managed
ip link set dev ap0 address 60:60:60:60:60:01 #this is different for each unit
ifconfig mesh0 up
ifconfig mesh0 10.0.0.1
ifconfig ap0 192.168.0.1 up
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o mesh0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i mesh0 -o eth0 -j ACCEPT
答案1
802.11s 允许“网格”上的所有设备在“第 2 层”级别相互查看……在有线网络中,就像它们全部物理插入同一网络交换机一样。它们都可以互相“ping”,只要它们都使用相同的 IP 地址范围等。
此时您拥有的是两个不相关且未连接的网络,一个使用10.x.x.x
,第二个使用192.168.x.x
。
在尝试连接这些设备时,您需要10.x
告诉所有设备它们的“网关”地址是什么(即它们发送数据包的位置,但它们自己不知道实际目的地)...在这种情况下,它们希望它们的网关是10.0.0.1
。并且您需要“网关”盒上的静态路由,使其知道这些数据包应该“出去”哪个网络接口。您可能还会发现另一个子网也需要一个静态路由“传出”另一个接口。由于您已同时启用 MASQ 和 RELATED,因此一旦传出流量正常工作,您就不应该在“返回流量”方面遇到太多麻烦。