ARPプロキシおよびpromiscモードを使用したブリッジング

ARPプロキシおよびpromiscモードを使用したブリッジング

編集する:探してみると重複です。ネットワークアダプタが無差別モードの場合にのみARP応答があるのはなぜですか?


私はRasbian Stretchと一緒にRaspberry Pi 3B +を使用しており、Debianのチュートリアルに従ってプロキシarpを使用して設定しました。プロキシARPを使用したネットワーク接続ブリッジ「ブリッジ」eth0をwlan0に。これによると、プロキシarpを設定するのは簡単です。

rpi3 ~# echo 1 > /proc/sys/net/ipv4/conf/all/proxy_arp
rpi3 ~# echo 1 > /proc/sys/net/ipv4/ip_forward
rpi3 ~# ip route add 192.168.10.60/32 dev eth0

192.168.10.60eth0のクライアントであり、wlan0に「ブリッジ」する必要があります。

しかし、これはうまくいきません。機能するには、wlan0で無差別モードを有効にする必要がありますが、これを行うためのヒントが見つかりません。

rpi3 ~# ip link set wlan0 promisc on

無差別モードが必要ですかStretch?そうでなければどうすれば避けられますか?

修正する:
確認してrp_filter0に設定しました。
hostapdインストールされていません。wlan0クライアントモードで管理されますwpa_supplicant

答え1

明らかに、クライアントモードでは、ワイヤレスとイーサネットの間でイーサネットフレームをブリッジすることは不可能です。たとえば、動作しません。

また、クライアントとして他のソースからのフレームをAPインフラストラクチャに挿入しないように注意してください。

ほとんどのアクセスポイント(AP)は、送信元アドレスがAPで認証されていないフレームを拒否します。

答え2

これはRaspberry PiのWi-Fiでのみ発生する問題のようです。重複した質問があります。ネットワークアダプタが無差別モードの場合にのみARP応答があるのはなぜですか?ラズベリーパイを使用してください。チュートリアルの他の場所では、プロキシarp無差別モードの有効化の説明が見つかりません。無差別モードなしでプロキシarpが動作するノートブックでこれを確認しました。

この問題は、RASPBERRY PI FOUNDATIONおよび/またはそのクローズドソースドライバの製造元によってのみ解決できると思います。それまで、私たちはそれと一緒に生きなければなりません。

答え3

ARPプロキシおよびpromiscモードを使用したブリッジング

すべてのデバイスが配置されている間は、WiFiからLAN(たとえば、microUSB-LANアダプタを搭載したRaspberry Pi Zero W)への接続を「ブリッジ」できます。同じサブネット(IP範囲)を使うARPプロキシそして無差別モード

計画:
[ルータ] <---WiFi---> [RasPi wlan0 <---ブリッジ---> eth0] <---LAN ケーブル---> [コンピュータなどの有線デバイス]

ヒント:提供されるソリューションは、これらの優れたリソースに基づいています。
ソース#1著者:パスカル間欠泉
ソース#2ウィル・ヘイリー

次の例で使用されているハードウェア/OS:

Raspberry Pi Zero W Raspbian Stretch Lite(microUSB-LANアダプタを含む)(2019-04-08)+アップデート




ソリューション#1 - インターフェイスを介したARPプロキシ(手動設定)

注:これは、WiFiルーターが「IPレイヤ3ソリューション」(ネットワークレイヤ)をサポートしているかどうかによって異なります。

1)Raspberry PiのルーターへのWiFi接続が確立され、接続されているとします。

2)インストールパッケージ

$ sudo apt-get install parprouted dhcp-helper

三)次の行を編集して追加します

  • 無線LAN 0ラズベリーファイに内蔵されたWiFiカードのID。
  • イーサネット0有線イーサネットカード(microUSB-LANアダプタ)のID。
$ sudo nano /etc/network/interfaces
# Clone the dhcp-allocated IP to eth0 so dhcp-helper will relay for the correct subnet
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
  wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
  pre-up /sbin/ip link set wlan0 promisc on
  post-down /sbin/ip link set wlan0 promisc off
  post-up /usr/sbin/parprouted eth0 wlan0
  post-down /usr/bin/killall /usr/sbin/parprouted
  post-up /etc/init.d/dhcp-helper restart
  pre-up /sbin/ifup eth0
  post-up /sbin/ip addr add $(/sbin/ip -4 -br addr show wlan0 | /bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0
  pre-down /sbin/ip addr del $(/sbin/ip -4 -br addr show wlan0 | /bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0
  post-down /sbin/ifdown eth0

# Set ethernet interface to "manual" mode
auto eth0
allow-hotplug eth0
iface eth0 inet manual

4)パケット転送を有効にする:

$ sudo nano /etc/sysctl.conf
# Find and uncomment this line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1
# to -->
net.ipv4.ip_forward=1

5)DHCP リレーの設定

DHCP ヘルパーは要求をキャプチャし、「実際の」DHCP サーバーに転送します。

$ sudo nano /etc/default/dhcp-helper
# Change eth0 by the name of your wireless interface (e.g. wlan0)
#DHCPHELPER_OPTS="-b eth0"
# to -->
DHCPHELPER_OPTS="-b wlan0"

6)「リフレクタモード」を有効にするようにAVAHIを設定すると、

クライアントはブリッジに接続されているすべてのサービスを検索できます。

$ sudo nano /etc/avahi/avahi-daemon.conf
# Find and change the following line
#enable-reflector=no
# to -->
enable-reflector=yes

7)RasPi

の再起動再起動後、eth0 / LANを介して接続されたデバイスは、WiFiルーターと同じネットワークにアクセスできる必要があります。
注:機能するソリューションは、WiFiルーターが「IPレイヤ3ソリューション」(ネットワークレイヤ)をサポートしているかどうかによって異なります。

$ sudo reboot



ソリューション#2 - サービスを介したARPプロキシ(自動スクリプトソリューション)

注:これは、WiFiルーターが「IPレイヤ3ソリューション」(ネットワークレイヤ)をサポートしているかどうかによって異なります。

1)次の内容でbashスクリプトを作成します。

$ sudo nano bridge.sh
#!/usr/bin/env bash

set -e

[ $EUID -ne 0 ] && echo "run as root" >&2 && exit 1

##########################################################
# You should not need to update anything below this line #
##########################################################

# Credits to Will Haley
# Mainly based on source: https://willhaley.com/blog/raspberry-pi-wifi-ethernet-bridge/#option-1---same-subnet
# Edited on line #52 by Tomtom: path to systemd for parprouted.service

# parprouted  - Proxy ARP IP bridging daemon
# dhcp-helper - DHCP/BOOTP relay agent

apt update && apt install -y parprouted dhcp-helper

systemctl stop dhcp-helper
systemctl enable dhcp-helper

# Enable ipv4 forwarding.
sed -i'' s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/ /etc/sysctl.conf

# Service configuration for standard WiFi connection. Connectivity will
# be lost if the username and password are incorrect.
systemctl restart wpa_supplicant.service

# Enable IP forwarding for wlan0 if it's not already enabled.
grep '^option ip-forwarding 1$' /etc/dhcpcd.conf || printf "option ip-forwarding 1\n" >> /etc/dhcpcd.conf

# Disable dhcpcd control of eth0.
grep '^denyinterfaces eth0$' /etc/dhcpcd.conf || printf "denyinterfaces eth0\n" >> /etc/dhcpcd.conf

# Configure dhcp-helper.
cat > /etc/default/dhcp-helper <<EOF
DHCPHELPER_OPTS="-b wlan0"
EOF

# Enable avahi reflector if it's not already enabled.
sed -i'' 's/#enable-reflector=no/enable-reflector=yes/' /etc/avahi/avahi-daemon.conf
grep '^enable-reflector=yes$' /etc/avahi/avahi-daemon.conf || {
  printf "something went wrong...\n\n"
  printf "Manually set 'enable-reflector=yes in /etc/avahi/avahi-daemon.conf'\n"
}

# I have to admit, I do not understand ARP and IP forwarding enough to explain
# exactly what is happening here. I am building off the work of others. In short
# this is a service to forward traffic from WiFi to Ethernet.
#cat <<'EOF' >/usr/lib/systemd/system/parprouted.service
cat <<'EOF' >/etc/systemd/system/parprouted.service
[Unit]
Description=proxy arp routing service
Documentation=https://raspberrypi.stackexchange.com/q/88954/79866
Requires=sys-subsystem-net-devices-wlan0.device dhcpcd.service
After=sys-subsystem-net-devices-wlan0.device dhcpcd.service

[Service]
Type=forking
# Restart until wlan0 gained carrier
Restart=on-failure
RestartSec=5
TimeoutStartSec=30
# clone the dhcp-allocated IP to eth0 so dhcp-helper will relay for the correct subnet
ExecStartPre=/bin/bash -c '/sbin/ip addr add $(/sbin/ip -4 -br addr show wlan0 | /bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0'
ExecStartPre=/sbin/ip link set dev eth0 up
ExecStartPre=/sbin/ip link set wlan0 promisc on
ExecStart=-/usr/sbin/parprouted eth0 wlan0
ExecStopPost=/sbin/ip link set wlan0 promisc off
ExecStopPost=/sbin/ip link set dev eth0 down
ExecStopPost=/bin/bash -c '/sbin/ip addr del $(/sbin/ip -4 -br addr show wlan0 | /bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0'

[Install]
WantedBy=wpa_supplicant.service
EOF

systemctl daemon-reload
systemctl enable parprouted
systemctl start parprouted dhcp-helper

2)bashスクリプトを実行します(出力でエラーを確認)。

$ sudo bash bridge.sh

三)eth0 / LANを介して接続されたRasPi

デバイスは、再起動後にWiFiルーターと同じネットワークにアクセスできる必要があります。注:これは、WiFiルーターが「IPレイヤ3ソリューション」をサポートしているかどうかによって異なります。

$ sudo reboot



一般:

  • ARPプロキシサポートが必要ですWiFiルーターを介して「IP Layer 3 / Network Layer」機能を有効にします。
  • 同じサブネット上でブリッジングソリューションを提供するために、WDSを介した基本的なソリューション(このトピックはここでは説明されていません)には、WDSをサポートするWiFiチップが必要です。そしてWiFiルーター。 Raspberry PiのWiFiチップがWDSをサポートしていることを確認できます。
$ iw list

一部サポートされるインターフェイスモード

Wiphy phy0
...
    Supported interface modes:
         * IBSS
         * managed
         * AP
         * AP/VLAN
         * WDS
         * monitor
         * mesh point
...

もし無線データ伝送システムはい明示的にリストされていないここでWDSはサポートしていないWiFiチップ経由(Raspberry Pi Zero WはWDSをサポートしていません)。

関連情報