태그가 지정되지 않은 수신 패킷과 태그가 지정된 송신 패킷을 사용하여 Linux VLAN 인식 브리지를 생성하는 방법

태그가 지정되지 않은 수신 패킷과 태그가 지정된 송신 패킷을 사용하여 Linux VLAN 인식 브리지를 생성하는 방법

실제 사례 시나리오에서 관찰한 스위치 구성 오류와 관련된 특정 문제에 대한 모호한 해결 방법을 구현하려고 합니다.

다음을 가정해 보세요.

  • 내 시스템은 Cisco 스위치를 통해 백본 링크에 연결되어 있습니다.
  • 특정 VLAN(기본 VLAN 아님)에서 태그가 지정된 패킷을 보낼 수 있으며 해당 패킷은 올바른 VLAN으로 올바르게 라우팅됩니다.
  • 트렁크에 있고 기본이 아닌 VLAN에서 오는 경우에도 태그가 지정되지 않은 트래픽으로 응답을 받습니다.
  • 스위치 구성을 수정할 수 없습니다.

내가 하려는 것은 데비안에서 단일 네트워크 인터페이스를 사용하여 트래픽을 올바르게 보내고 받을 수 있는 방법으로, 패킷에 태그를 지정하고 대신 캡처해야 하지만 원하는 VLAN에 트래픽을 삽입할 수 있습니다. .

예를 들어 ICMP 에코 요청을 사용하여 원격 시스템에 ping을 보낼 수 있습니다. 간단한 eth0 인터페이스를 사용해도 효과가 없으며 ICMP 에코 응답이 표시되지 않습니다. 그러나 VLAN 10에서 ICMP 에코 요청에 태그를 지정하면 태그가 지정되지 않은 ICMP 에코 응답을 받게 됩니다! 예를 들어 DHCP와 함께 사용할 수도 있습니다(원격 네트워크에는 DHCP 서버가 있음). 태그가 지정된 DHCP 검색 패킷을 보내면 해당 트랜잭션 ID와 함께 태그가 지정되지 않은 DHCP 제안을 받게 됩니다.

나는 이것이 정상적인 동작이 아니며 궁극적으로 패킷이 잘못 라우팅되거나 VLAN에 있는 것으로 잘못 가정될 수 있다는 것을 알고 있습니다. 이는 스위치 구성이 잘못되었기 때문입니다(어딘가의 로컬 VLAN 불일치와 관련이 있는 것 같습니다).

VLAN 하위 인터페이스(ip 링크 추가 링크 유형 vlan...)를 사용하는 경우 태그가 지정된 트래픽을 보내지만 트래픽이 다시 태그될 것으로 예상하므로 응답이 기본 인터페이스에서 하위 인터페이스로 다시 라우팅되지 않습니다.

그런 다음 VLAN 인식 브리지를 발견했고 내 문제에 대한 올바른 솔루션처럼 보였습니다. 비록 브리지 vlan add 명령(pvid, vid, 태그 없음, vlan 하위 인터페이스를 사용해야 하는지 여부)을 사용하여 성공하지 못했지만 성공적으로 수행하려면 이 작전? ).

한 번에 하나의 VLAN에 대해서만 이 작업을 수행하면 됩니다. 태그가 손실되었기 때문에 패킷이 어느 VLAN으로 전송되었는지 확인할 수 없습니다. 그러나 IP 주소, STP 및 CDP 트래픽을 기반으로 이 VLAN 태그를 추론할 수 있습니다. 나는 자동화된 작업을 수행하고 싶지 않고 VLAN을 추측하고 싶지 않으며 태그가 지정되지 않은 트래픽이 한 번에 하나씩 선택된 VLAN에 있는 것으로 간주되도록 강제할 수 있기를 원합니다.

감사해요!

답변1

소개/초기 설정

이 답변은 아래에 사용된 명령을 네트워크 구성 도구에 통합하려고 시도하지 않습니다. 최소한 다음 도구는 추가 명령 없이도 이 목적을 위해 작동할 것으로 예상됩니다.

VLAN 인식 브리지 인터페이스는 포트 VLAN ID(PVID)를 사용하여 이와 같이 잘못 구성된 개별 VLAN을 수정할 수 있습니다. 단일 브리지 포트를 사용하더라도 외부 구성 오류를 취소하는 레이어 역할만 합니다.

구축을 위한 초기 구성이 제공되지 않기 때문에 VLAN 10의 예와 이 VLAN에서 사용되는 IP 주소 192.0.2.2/24를 사용하고 인터페이스는이더넷 0. 다음 초기 구성을 고려하십시오.

ip link set dev eth0 up
ip link add link eth0 name eth0.10 up type vlan id 10
ip addr add dev eth0.10 192.0.2.2/24 # or use DHCP
ip route add default via 192.0.2.1 dev eth0.10

OP의 현재 상황으로 인해 네트워크 스택으로 인해 작동하지 않습니다(예:이더넷 0예상할 때 무시됩니다.eth0.10) 또는 기타 구성요소(비청취 인터페이스에서 응답을 수신하기 위해 원시 소켓을 사용하는 DHCP 클라이언트)는 (외부 오류로 인해) 동일한 인터페이스(태그 없음)가 아니기 때문에 반환 트래픽을 무시합니다.이더넷 0, 표시된 것보다이더넷 0<=> 표시되지 않음eth0.10).

대신 VLAN 인식 브리지를 사용하세요.

수행할 수 있는 작업은 VLAN 인터페이스 사용을 단일 브리지 포트가 있는 VLAN 인식 브리지로 바꾸는 것입니다(이더넷 0). 이제 VLAN 인터페이스를 생성/삭제하지 않고도 브리지에서 VLAN 태그 및 포트 VLAN ID를 동적으로 구성할 수 있습니다. 올바른 구성은 원격 구성 오류를 제거합니다.

  • 이전 상태 정리(경고: 연결 끊김)

    ip link del dev eth0.10
    
  • VLAN 인식 브리지 생성

    ip link add name br0 type bridge vlan_filtering 1 vlan_default_pvid 0
    

    위의 방법은 vlan_filtering 1VLAN 인식 브리지를 생성하고 vlan_default_pvid 0기본적으로 VLAN을 사용하지 않도록 하기 때문에 어디에서나 사용하지 않는 VLAN을 먼저 삭제할 필요가 없습니다. 실제 브리지 통신을 시작하려면 VLAN을 명시적으로 추가해야 합니다.

  • 선택사항: (동일한 주소를 유지하기 위해 MAC 기반 DHCP 서버 구성에 주로 사용됨)이더넷 0MAC 주소는 다음과 같습니다.br0

    ... 왜냐하면이 주소는 최근 어떤 주소에서도 찾을 수 없습니다.체계환경. 의 도움으로jq복사할 수 있는 명령이더넷 0MAC 주소는 다음과 같습니다.br0. 설정하기 전에 이 작업을 수행해야 합니다.이더넷 0브리지 포트로.

    ip link set dev br0 address "$(ip -json link show dev eth0 | jq -r '.[].address')"
    
  • eth0을 브리지 포트로 설정하고 브리지를 설정합니다.

    ip link set dev eth0 master br0
    ip link set br0 up
    
  • 라우팅 스택에 연결된 브리지의 유일한 부분인 브리지 인터페이스 자체를 태그가 지정되지 않고 PVID 10으로 구성합니다. 라우팅 스택은 VLAN 프레임을 처리하지 않고 IP(및 ARP) 프레임만 처리하므로 태그가 지정된 프레임이 방출되지 않는지 확인하세요. 또는 예상됩니다.

    사용되지 않는 brctl명령은 VLAN 인식 브리지를 처리할 수 없습니다. 이것이 필요하다bridge vlan ...주문하다이미IP 경로 2모음곡. 브릿지 포트가 아닌 브릿지 인터페이스 자체와 관련된 경우 추가 키워드가 필요합니다 self.

    bridge vlan add vid 10 dev br0 pvid untagged self
    
  • 브리지 포트 추가이더넷 0(태그가 지정된) VLAN 10으로 사용되지만 PVID로도 사용됩니다. 따라서 태그가 지정된 프레임을 보내고 두 개의 태그가 지정된 프레임(VLAN 10만 해당)을 허용하며 태그가 지정되지 않은 프레임을 VLAN 10 프레임으로 처리합니다. 스위치가 잘못 구성되었는지 여부에 관계없이 작동합니다.

    bridge vlan add vid 10 dev eth0 pvid
    

    또는 브리지에서 태그가 지정된 모든 VLAN을 먼저 수락한 다음 VLAN 10의 구성만 변경하도록 합니다. 이는 현재 구성에서는 유용하지 않지만 다른 곳의 브리지 트래픽에 추가 브리지 포트를 추가하는 경우 유용할 수 있습니다. 그것은 다음과 같습니다:

    bridge vlan add vid 2-4094 dev eth0
    bridge vlan add vid 10 dev eth0 pvid
    

    이것은 다음을 얻게 됩니다:

    # bridge -compressvlans vlan show
    port              vlan-id  
    eth0              2-9
                      10 PVID
                      11-4094
    br0               10 PVID Egress Untagged
    

이제 잘못된 구성이 해결되고 정상적인 사용이 가능해집니다.br0기본 인터페이스로서 고정 주소를 구성하여 통신이 허용될 것으로 예상됩니다.

ip addr add 192.0.2.2/24 dev br0
ip route add default via 192.0.2.1

또는 DHCP 클라이언트를 실행하여br0그것을 구성합니다.

수신할 VLAN을 변경하려면(예: VLAN 10에서 VLAN 11로):

  • 브리지 인터페이스 재구성br0

    bridge vlan del vid 10 dev br0 self
    bridge vlan add vid 11 dev br0 pvid untagged self
    
  • 브리지 포트 재구성이더넷 0

    bridge vlan del vid 10 dev eth0
    bridge vlan add vid 11 dev eth0 pvid
    

    대신 포트당 하나의 PVID만 있으므로 모든 VLAN을 수신해야 하는 경우 VLAN 10을 제거하지 않고 VLAN 11로 전환합니다.

    bridge vlan add vid 11 dev eth0 pvid
    

노트

  • 이 답변은 Linux VLAN 인식 브리지(VLAN 10의 시스템 측 브리지 포트)를 사용하여 잘못 구성된 스위치를 시뮬레이션하여 테스트되었습니다.하지만 표시되지 않은.
  • 이제 브릿지가 새로 생겨서 모듈에 문제가 있으면 문제가 예상됩니다br_netfilter로드됨: 이 시스템에서 Docker를 실행하려면 추가 해결 방법이 필요할 수 있습니다.

관련 정보