如何将以太网设备与AP连接并从以太网客户端到达AP客户端?

如何将以太网设备与AP连接并从以太网客户端到达AP客户端?

我正在配置 Raspberry Pi Zero 2 W 作为 IOT 黑客/开发桥梁。

其主要目标是:

  • 维护托管客户端 WLAN 设备以下载软件包或连接到设备的自组织无线网络。
  • 为 IOT 设备提供连接的无线网络,但无需互联网访问来隔离它。
  • 通过 USB 以太网小工具模式通过单条 USB 线与 pi 进行电源 + 网络连接
  • 从为 pi/以太网小工具供电的开发机器与 IOT 设备进行交互。

到目前为止我所拥有的

1- USB 以太网设备通过两条线路配置了静态 IP/etc/rc.local

ip addr add 10.20.20.1/24 dev usb0
ip link set dev usb0 up

2- AP 和托管网络很好地融合在一起。这是通过使用 .连接到 wifi 网络来完成的nmcli device wifi connect <myhomenetwork> password <homenetworkpw>。连接后,使用 udev 规则通过以下方式创建第二个虚拟无线接口:

#70-persistent-net.rule
#note phy0 mac *:87 and the new virtual dev mac *:89
SUBSYSTEM=="ieee80211", ACTION=="add|change", ATTR{macaddress}=="d8:3a:dd:ba:6d:87", KERNEL=="phy0", \
  RUN+="/sbin/iw phy phy0 interface add ap0 type __ap", \
  RUN+="/bin/ip link set ap0 address d8:3a:dd:ba:6d:89"

这为我提供了接口,然后使用以下 nmcli 命令对其进行配置

#!/bin/bash
nmcli con delete dev_ap
nmcli con add type wifi ifname ap0 mode ap con-name dev_ap ssid Special_ssid autoconnect true
nmcli con modify dev_ap 802-11-wireless.band bg
nmcli con modify dev_ap 802-11-wireless.channel 3
nmcli con modify dev_ap 802-11-wireless.cloned-mac-address d8:3a:dd:ba:6d:89
nmcli con modify dev_ap ipv4.method shared ipv4.address 10.20.10.1/24
nmcli con modify dev_ap ipv4.never-default yes
nmcli con modify dev_ap ipv6.method disabled
nmcli con modify dev_ap wifi-sec.key-mgmt wpa-psk
nmcli con modify dev_ap wifi-sec.psk "awesomepassword"
nmcli con up dev_ap

3-防止物联网设备偷窥的防火墙

iptables -A FORWARD -i ap0 -o wlan0 -j DROP

这对我有什么好处?

这给我留下了一个按你期望的方式工作的 wifi 连接、一个无法访问互联网但可以访问 pi 的 dhcp 接入点,以及我的开发机器上的一个新的 USB 以太网接口。我可以将该接口上的开发机器的静态 IP 设置为子网中的地址,然后通过 SSH 连接到 pi。

ip a 报告:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 62:f4:4e:bf:3c:56 brd ff:ff:ff:ff:ff:ff
    inet 10.20.20.1/24 scope global usb0
       valid_lft forever preferred_lft forever
    inet6 fe80::60f4:4eff:febf:3c56/64 scope link 
       valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether d8:3a:dd:ba:6d:87 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.145/24 brd 192.168.0.255 scope global dynamic noprefixroute wlan0
       valid_lft 5761sec preferred_lft 5761sec
    inet6 fe80::1e9f:328e:dbe0:abda/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
4: ap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether d8:3a:dd:ba:6d:89 brd ff:ff:ff:ff:ff:ff permaddr d8:3a:dd:ba:6d:87
    inet 10.20.10.1/24 brd 10.20.10.255 scope global noprefixroute ap0
       valid_lft forever preferred_lft forever

我缺少什么?

目前, 的客户端ap0可以 ping 通连接到 的开发机usb0,但开发机无法 ping 通 的客户端ap0

额外信息

这是输出ip route

default via 192.168.0.1 dev wlan0 proto dhcp src 192.168.0.145 metric 601 
10.20.10.0/24 dev ap0 proto kernel scope link src 10.20.10.1 metric 600 
10.20.20.0/24 dev usb0 proto kernel scope link src 10.20.20.1 
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.145 metric 601 

的结果nft list ruleset

table ip nm-shared-ap0 {
        chain nat_postrouting {
                type nat hook postrouting priority srcnat; policy accept;
                ip saddr 10.20.10.0/24 ip daddr != 10.20.10.0/24 masquerade
        }

        chain filter_forward {
                type filter hook forward priority filter; policy accept;
                ip daddr 10.20.10.0/24 oifname "ap0" ct state { established, related } accept
                ip saddr 10.20.10.0/24 iifname "ap0" accept
                iifname "ap0" oifname "ap0" accept
                iifname "ap0" reject
                oifname "ap0" reject
        }
}
table ip filter {
        chain FORWARD {
                type filter hook forward priority filter; policy accept;
                iifname "ap0" oifname "wlan0" counter packets 11692 bytes 763264 drop
        }
}

iftables-save -c

# Generated by iptables-save v1.8.9 (nf_tables) on Wed Jan 31 03:33:00 2024
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
[11794:770312] -A FORWARD -i ap0 -o wlan0 -j DROP
COMMIT
# Completed on Wed Jan 31 03:33:00 2024

答案1

确实有nftables规则只允许来自自身或外部的正确来源ap0(然后被附加的删除)iptables-nft使用时的规则wlan0)。

特别是这条规则filter_forward

oifname "ap0" reject

阻止最初从其他地方发起的路由流量到达ap0

nm-shared由于模式的原因,以 开头的表名是由 NetworkManager 设置自动创建的ipv4.method shared

nmcli con modify dev_ap ipv4.method shared ipv4.address 10.20.10.1/24

一旦到位,如果允许篡改(将来有规定防止nftables表被控制它的守护进程之外的其他东西更改),然后此命令运行为用户将立即允许从usb0至发起的流量ap0

nft insert rule ip nm-shared-ap0 filter_forward index 3 iifname usb0 oifname ap0 accept

一旦 NetworkManager 出于任何原因重写规则,这将被恢复(但已经建立的连接,例如已建立的 SSH 连接应该仍然能够继续工作)。


任何更持久的操作都需要更改 NetworkManager 设置。来自NetworkManager 博客记录了此功能:

防火墙模式和 nftables

激活“共享”配置文件时,NetworkManager 将为 IPv4 启用 NAT。到目前为止,它只能调用iptables配置伪装。在这个新版本中,它还可以配置 nftables 来达到相同的目的。防火墙后端可以通过新[main].firewall-backend选项进行配置网络管理器.conf。在没有显式配置的情况下,默认值为“nftables”,除非/usr/sbin/nft不存在且 /usr/sbin/iptables存在。

NetworkManager.conf链接告诉:

firewall-backend

用于配置共享模式伪装的防火墙后端。设置为iptablesnftablesnone。分别 是要求iptables和应用。nftablesiptablesnftnone意味着如果用户希望自己管理防火墙,则跳过防火墙配置。如果未指定,它将被自动检测。

对于这种情况,最简单的方法是禁用防火墙后端的使用,然后如果需要的话手动实施规则,就像OP已经在这里使用的那样iptables,或者使用nftables。要禁用 NetworkManager 的防火墙,请编辑该文件/etc/NetworkManager/NetworkManager.conf并在该块下添加一个条目[main](保留该块和任何其他块中已存在的任何其他条目),以便它至少会像以下一样启动:

[main]
firewall-backend=none

并重新启动 NetworkManager(或重新启动)。


如果稍后再次允许来自 Internet 的流量ap0,则主路由器可能无法识别来自 的地址ap0。在这种情况下,可以用这个来恢复iptables规则替换nftablesNAT规则:

iptables -t nat -I POSTROUTING -s 10.20.10.0/24 ! -d 10.20.10.0/24 -j MASQUERADE

如果不允许此类流量,请不要打扰。

相关内容