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

삼)다음 줄을 편집하고 추가합니다:

가정

  • 무선랜 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 레이어 3/네트워크 레이어" 기능을 활성화합니다(알아보려면 직접 시도해 봐야 할 것 같습니다).
  • 동일한 서브넷에서 브리징 솔루션을 제공하기 위해 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를 지원하지 않습니다).

관련 정보