我正在配置 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
用于配置共享模式伪装的防火墙后端。设置为
iptables
、nftables
或none
。分别 是要求iptables
和应用。nftables
iptables
nft
none
意味着如果用户希望自己管理防火墙,则跳过防火墙配置。如果未指定,它将被自动检测。
对于这种情况,最简单的方法是禁用防火墙后端的使用,然后如果需要的话手动实施规则,就像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
如果不允许此类流量,请不要打扰。