Linux 더미 인터페이스에서 VLAN 사용

Linux 더미 인터페이스에서 VLAN 사용

원시 소켓을 사용하여 무선을 포함한 여러 Linux(커널 4.14) 인터페이스의 모든 패킷을 소비하는 응용 프로그램이 있습니다. 관련 없는 스크립팅을 최소한으로 유지하기 위해 나는 Hostapd를 사용하여 내 응용 프로그램이 수신하는 인터페이스가 있는 브리지에 무선 및 BSS 인터페이스를 바인딩하려고 합니다. 또한 특정 VLAN의 무선 트래픽을 수신하기 위해 애플리케이션이 필요한 사용 사례도 있습니다(네이티브 VLAN 재매핑과 같은 종류). 현재 내 설정은 다음과 같습니다.

  • 내 애플리케이션이 바인딩할 더미 인터페이스가 생성됩니다.
ip link add dummy0 type dummy
ip link set dummy0 up 
  • 필요에 따라 VLAN 인터페이스가 더미 인터페이스에 생성됩니다.
ip link add link dummy0 name dummy0.100 type vlan id 100
ip link set dummy0.100 up
  • 필요에 따라 dummy0 또는 VLAN을 연결하여 더미를 wlan에 연결하기 위한 브리지가 생성됩니다. 애플리케이션은 여전히 ​​dummy0에서만 수신 대기합니다.
brctl addbr br0
brctl addif br0 dummy0.100
ip link set br0 up
  • Hostapd는 wlan 또는 bss 인터페이스를 Hostapd.conf에 정의된 브리지에 연결합니다.

VLAN이 관련되지 않은 경우에는 잘 작동합니다. VLAN 인터페이스의 경우 트래픽을 한 방향으로만 보낼 수 있습니다. dummy0의 tcpdump는 예상대로 모든 트래픽을 표시합니다. dummy0.100 및 br0의 tcpdump는 무선 인터페이스의 트래픽만 표시하고 반환 트래픽은 표시하지 않습니다.

문제는 내 응용 프로그램이 vlan 태그가 있는 원시 프레임을 dummy0.100 대신 dummy0에 작성하고 있다고 가정하고 있지만 문제는 더미 인터페이스 자체를 사용하는 것과 관련이 있을 수도 있다고 가정합니다. dummy0에서 원시 소켓을 사용하고 vlan 태그가 있는 프레임을 작성하여 dummy0.100에 올바르게 표시되도록 할 수 있는 방법이 있습니까? 더 나은 솔루션도 열려 있지만 이를 위해서는 최소한의 설정 및 모니터링 인프라가 필요합니다.

답변1

@dirkt로 식별되는 것처럼 RAW 소켓은 루트 장치에 바인딩될 때 패킷을 VLAN 하위 인터페이스로 전달할 수 없습니다. @dirkt가 제안한 합리적인 해결책은 veth 쌍을 사용하는 것입니다.

ip link add veth0-wifi type veth peer name veth0-app
ip link set veth0-wifi up
ip link set veth0-app up
ip link add link veth0-wifi name veth0-wifi.100 type vlan id 100
brctl addbr br0
brctl addif br0 veth0-wifi.100
ip link set br0 up

Hostapd.conf에서 bridge=br0을 설정하고 애플리케이션을 veth0-app에 바인딩합니다.

기술적인 이유로 탐색되지 않은 @AB가 제안한 대안은 애플리케이션이 거의 동일한 구성을 허용하는 탭 장치를 게시하도록 하는 것입니다.

관련 정보