이더넷 장치를 AP에 연결하고 이더넷 클라이언트에서 AP 클라이언트에 연결하는 방법은 무엇입니까?

이더넷 장치를 AP에 연결하고 이더넷 클라이언트에서 AP 클라이언트에 연결하는 방법은 무엇입니까?

저는 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과 응용 프로그램 입니다.nftablesiptablesnftnone즉, 사용자가 방화벽을 직접 관리하려는 경우 방화벽 구성을 건너뜁니다.지정하지 않으면 자동으로 감지됩니다.

이 경우 가장 쉬운 방법은 방화벽 백엔드 사용을 비활성화한 다음 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

그러한 트래픽이 허용되지 않더라도 걱정하지 마십시오.

관련 정보