원시 소켓을 사용하여 무선 인터페이스를 포함한 여러 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가 제안한 대안(기술적인 이유로 탐색되지 않음)은 애플리케이션이 대부분의 동일한 조직을 허용하는 탭 장치를 게시하는 것입니다.