イーサネットデバイスをAPに接続し、イーサネットクライアントからAPクライアントに接続する方法は?

イーサネットデバイスをAPに接続し、イーサネットクライアントからAPクライアントに接続する方法は?

私はRaspberry Pi Zero 2WをIoTハッカー/開発ブリッジとして構成しています。

主な目標は次のとおりです。

  • ソフトウェアパッケージをダウンロードしたり、デバイスの一時的なワイヤレスネットワークに接続するために管理されているクライアントWLANデバイスを維持します。
  • IoTデバイスへの接続を提供しますが、それを隔離するためにインターネットアクセスを必要としないワイヤレスネットワーク。
  • 単一のUSBケーブルを介したUSBイーサネットガジェットモードによる電源+パイへのネットワーク接続
  • pi/イーサネットガジェットで駆動される開発マシンでIoTデバイスと対話します。

私が今まで持っていること

1-2 回線経由で固定 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 ルールを使用して次のように 2 番目の仮想ワイヤレス インターフェイスを作成します。

#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接続、インターネットアクセスはありませんが、Pyにアクセスできる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

共有モードマスカレーディングを設定するためのファイアウォールバックエンド。iptablesnftablesまたはに設定します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

そのようなトラフィックが許可されていなくても心配しないでください。

関連情報