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
  • 가상 장치를 WLAN에 연결하는 브리지를 생성하고 필요에 따라 가상 장치 0 또는 VLAN을 연결합니다. 애플리케이션은 여전히 ​​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가 제안한 대안(기술적인 이유로 탐색되지 않음)은 애플리케이션이 대부분의 동일한 조직을 허용하는 탭 장치를 게시하는 것입니다.

관련 정보