저는 Raspberry Pi Zero 2W를 IoT 해커/개발 브리지로 구성하고 있습니다.
주요 목표는 다음과 같습니다.
- 소프트웨어 패키지를 다운로드하거나 장치의 임시 무선 네트워크에 연결하기 위해 관리되는 클라이언트 WLAN 장치를 유지 관리합니다.
- IoT 장치에 대한 연결을 제공하지만 이를 격리하기 위해 인터넷 액세스가 필요하지 않은 무선 네트워크입니다.
- 단일 USB 케이블을 통한 USB 이더넷 가젯 모드를 통한 전원 + 파이에 대한 네트워크 연결
- pi/이더넷 가젯으로 구동되는 개발 머신에서 IoT 장치와 상호 작용합니다.
내가 지금까지 가지고 있는 것
1- 두 회선을 통해 고정 IP로 구성된 USB 이더넷 장치/etc/rc.local
ip addr add 10.20.20.1/24 dev usb0
ip link set dev usb0 up
2- AP와 관리형 네트워크가 잘 통합되어 있습니다. 이는 를 사용하여 Wi-Fi 네트워크에 연결함으로써 수행됩니다 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- IoT 장치의 스누핑을 방지하는 방화벽
iptables -A FORWARD -i ap0 -o wlan0 -j DROP
나에게 무엇이 들어있나요?
이로 인해 예상대로 작동하는 Wi-Fi 연결, 인터넷 액세스는 없지만 파이에 액세스할 수 있는 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
새로운 옵션으로 방화벽 백엔드를 구성할 수 있습니다.networkmanager.conf. 명시적인 구성이 없으면 존재/usr/sbin/nft
하지 않는 한 기본값은 "nftables"입니다/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를 다시 시작(또는 재부팅)합니다.
나중에 인터넷으로부터의 트래픽이 다시 허용되면 ap0
기본 라우터가 에서 오는 주소를 인식하지 못할 수도 있습니다 ap0
. 이런 경우에는 이를 복원에 사용할 수 있습니다.iptables규칙 교체nftablesNAT 규칙:
iptables -t nat -I POSTROUTING -s 10.20.10.0/24 ! -d 10.20.10.0/24 -j MASQUERADE
그러한 트래픽이 허용되지 않더라도 걱정하지 마십시오.