
編集:これは重複していることがわかりましたネットワーク アダプタがプロミスキャス モードの場合にのみ 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.60
wlan0 に「ブリッジ」される eth0 上のクライアントです。
しかし、動作しません。動作させるには wlan0 でプロミスキャス モードを有効にする必要がありますが、これを行うためのヒントは見つかりませんでした。
rpi3 ~# ip link set wlan0 promisc on
にはプロミスキャス モードが必要ですかStretch
? そうでない場合、どうすれば回避できますか?
アップデート:rp_filter
が0 に設定されている ことを確認しました
hostapd
。 はインストールされていません。wlan0
はクライアント モードであり、 によって管理されていますwpa_supplicant
。
答え1
どうやら、クライアント モードのワイヤレスとイーサネットの間でイーサネット フレームをブリッジすることはできないようです。つまり、動作しません。
また、クライアントとして他のソースからのフレームを AP インフラストラクチャに挿入することにも注意してください。
ほとんどのアクセス ポイント (AP) は、AP で認証されていない送信元アドレスを持つフレームを拒否します。
答え2
Raspberry PiのWi-Fiにのみ問題があるようです。また、重複した質問ですネットワーク アダプタがプロミスキャス モードの場合にのみ ARP 応答が返されるのはなぜですか?Raspberry Pi を使用します。他のチュートリアルでは、プロキシ ARP の無差別モードを有効にするという注意書きは見つかりません。私はラップトップでこれを検証しましたが、プロキシ ARP は無差別モードなしで動作します。
この問題は、RASPBERRY PI FOUNDATION および/またはそのクローズド ソース ドライバーの製造元によってのみ修正できると思います。それまでは、この問題を我慢するしかありません。
答え3
プロミスクモードのARPプロキシを使用したブリッジ
WiFiからLANへの接続を「ブリッジ」することが可能です(例:Raspberry Pi Zero WとmicroUSB-LANアダプタを使用)。同じサブネット(IP範囲) 使用ARPプロキシとプロミスモード。
•スキーム:
[ルーター] <---WiFi---> [RasPi wlan0 <---ブリッジ---> eth0] <---LANケーブル---> [有線デバイス、例:コンピューター]
•ヒント:提供されるソリューションは、これらの優れた情報源に基づいています
ソース #1パスカル・ガイザー
ソース #2ウィル・ヘイリー
•これらの例で使用されているハードウェア/OS:
Raspberry Pi Zero W と microUSB-LAN アダプタ
Raspbian Stretch Lite (2019-04-08) + アップデート
ソリューション 1 - インターフェイス経由の ARP プロキシ (手動設定)
注: これは、WiFiルーターが「IPレイヤー3ソリューション」(ネットワーク層)をサポートしているかどうかによって異なります。
1)Raspberry PiのルーターへのWiFi接続がすでに設定され接続されていると仮定します
2)パッケージをインストールする
$ sudo apt-get install parprouted dhcp-helper
3)次の行を編集して追加します
。
- 無線LAN0Raspberry内蔵WiFiカードのIDです
- eth0有線イーサネットカード(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
3)RasPiを再起動します。
再起動後、eth0 / LAN接続デバイスはWiFiルーターの同じネットワークにアクセスできるはずです。注: これは、WiFiルーターが「IPレイヤー3ソリューション」をサポートしているかどうかによって異なります。
$ sudo reboot
一般的な注意事項:
- ARPプロキシサポートが必要WiFi ルーターの「IP レイヤー 3 / ネットワーク レイヤー」機能によって決まります (試して確認するしかないと思います)。
- 同じサブネット上でブリッジソリューションを提供するためのWDS経由の推奨ソリューション(このトピックはここでは取り上げていません)には、WiFiチップのWDSサポートが必要です。そしてWiFiルーター。Raspberry PiのWiFiチップがWDSに対応しているか確認するには、
$ iw list
セクションサポートされているインターフェースモード
Wiphy phy0
...
Supported interface modes:
* IBSS
* managed
* AP
* AP/VLAN
* WDS
* monitor
* mesh point
...
もしWDSは明確に記載されていないここで、WDSはサポートされていませんWiFi チップによって (Raspberry Pi Zero W は WDS をサポートしていません)。