나는 eth1.10과 같은 vconfig를 사용하여 Linux에서 태그가 지정된 패킷을 수신하고 보낼 수 있는 태그가 지정된 인터페이스를 만드는 방법을 알고 있습니다. 태그가 지정되지 않은 VLAN 10 패킷을 수신하고 전송하는 인터페이스를 생성할 수 있습니까?
답변1
태그가 지정되지 않은 인터페이스가 이미 존재합니다. eth1
이 경우 상위 인터페이스입니다.
패킷을 보내면 eth1.10
태그가 지정되고, VLAN 태그 10이 포함된 패킷을 수신하면 이 인터페이스를 통해 들어옵니다.
패킷을 전송하면 eth1
이러한 패킷에는 태그가 지정되지 않지만 VLAN 태그 없이 수신된 패킷은 인터페이스를 통해 들어옵니다.
"Vlan 10에 대해 태그가 지정되지 않은 패킷 보내기"와 같은 것은 없습니다. 정의에 따르면 태그가 지정되지 않은 패킷에는 VLAN 태그가 없습니다.
답변2
나는 다음과 같은 방법으로 작동한다는 것을 알았습니다.
- TC를 사용하여 Ingres에서 802.1q가 없는 패킷을 일치시키고 ID가 0인 VLAN 헤더를 푸시합니다.
- 송신에서는 TC를 사용하여 VLAN 0의 패킷을 일치시키고 VLAN 헤더가 나타납니다.
- vlan 유형 및 id=0의 태그가 지정되지 않은 논리적 인터페이스를 생성합니다.
예는 다음과 같습니다.
$ tc qdisc del dev eth0 root
$ tc qdisc add dev eth0 handle 1: root prio
$ tc filter add dev eth0 parent 1: protocol 802.1q basic match 'meta(vlan eq 0)' action vlan pop
$ tc qdisc del dev eth0 ingress
$ tc qdisc add dev eth0 handle ffff: ingress
$ tc filter add dev eth0 parent ffff: protocol all basic match 'not meta(protocol eq 0x8100)' action vlan push id 0
$ ip link add eth0-vlan0 type vlan id 0
$ ip link set eth0-vlan0 up
$ ip addr add 192.168.10.253/24 dev eth0-vlan0
peer$ ping 192.168.10.253
PING 192.168.10.253 (192.168.10.253) 56(84) bytes of data.
64 bytes from 192.168.10.253: icmp_seq=1 ttl=64 time=0.209 ms
64 bytes from 192.168.10.253: icmp_seq=2 ttl=64 time=0.188 ms
^C
송신(위에서 "루트"라고 함)에 prio qdisc를 추가하면 기본 mq 규칙이 비활성화됩니다. 이 규칙은 NIC의 전송 대기열 수에 따라 패킷을 나누어 여러 CPU 스레드가 패킷을 다른 TX 대기열로 푸시할 수 있도록 합니다. 기본 동작을 복원하려면 다음과 같이 mqprio를 사용하십시오.
$ tx_q_count=$(ls -d /sys/class/net/eth0/queues/tx-* | wc -l)
$ tc qdisc del dev eth0 root
$ tc qdisc add dev eth0 handle 1: root prio bands $tx_q_count multiqueue
$ tc filter add dev eth0 parent 1: protocol 802.1q basic match 'meta(vlan eq 0)' action vlan pop
$ for i in $(seq 1 $tx_q_count); do tc qdisc add dev eth0 parent 1:$i pfifo_fast; done
$ tc qdisc del dev eth0 ingress
$ tc qdisc add dev eth0 handle ffff: ingress
$ tc filter add dev eth0 parent ffff: protocol all basic match 'not meta(protocol eq 0x8100)' action vlan push id 0
$ ip link add eth0-vlan0 type vlan id 0
$ ip link set eth0-vlan0 up
$ ip addr add 192.168.10.253/24 dev eth0-vlan0
peer$ ping 192.168.10.253
PING 192.168.10.253 (192.168.10.253) 56(84) bytes of data.
64 bytes from 192.168.10.253: icmp_seq=1 ttl=64 time=0.230 ms
64 bytes from 192.168.10.253: icmp_seq=2 ttl=64 time=0.198 ms
^C
또 다른 가능한 해결 방법은 물리적 인터페이스의 VLAN 논리적 인터페이스 옆에 소프트웨어 브리지를 추가하는 것입니다. 소프트웨어 브리지에는 제한된 VLAN 재매핑(수신 시 pvid->vid, 송신 시 vid->pvid, 전체 재매핑은 불가능)을 허용하는 VLAN 필터링 기능이 있습니다. 예는 다음과 같습니다.
$ ip link add eth0-vlan0 type bridge
$ echo 0 > /sys/class/net/eth0-vlan0/bridge/default_pvid
$ echo 1 > /sys/class/net/eth0-vlan0/bridge/vlan_filtering
$ ip link set dev eth0 master eth0-vlan0
$ bridge vlan add vid 4094 dev eth0 pvid untagged
$ bridge vlan add vid 4094 dev eth0-vlan0 untagged pvid self
$ ip link add eth0-vlan4094 link eth0 type vlan id 4094
# ... BEGIN: only if you intend to use vlan 4094 ...
$ ip link set eth0-vlan4094 up
$ ip addr add 10.10.40.253/24 dev eth0-vlan4094
# ... END ...
$ ip link set eth0-vlan0 up
$ ip addr add 192.168.10.253/24 dev eth0-vlan0
peer$ ping 192.168.10.253
PING 192.168.10.253 (192.168.10.253) 56(84) bytes of data.
64 bytes from 192.168.10.253: icmp_seq=1 ttl=64 time=0.238 ms
64 bytes from 192.168.10.253: icmp_seq=2 ttl=64 time=0.215 ms
^C
VLAN 필터링 기능이 약간 그렇기 때문에 브리지에서 내부적으로 사용하는 VID 번호와 일치하는 VLAN 인터페이스가 필요합니다. pvid->vid 매핑을 사용하여 태그가 지정되지 않은 프레임을 허용하지만 다시 매핑된 vid와 일치하는 VLAN 태그가 있는 라인의 프레임도 허용합니다. 대신 VLAN 인터페이스는 이러한 프레임을 먹습니다. 특정 VLAN이 필요하지 않으면 해제해 두십시오.
소프트웨어 브리지는 최근 "default_pvid" 기능을 추가하여 값싼 하드웨어 스위치처럼 작동합니다. VLAN을 지원하지만 기본적으로 vid 1에 대한 pvid->vid 매핑을 수행하고 모든 포트에서 vid 1을 허용합니다. 스위치에서 단일 구성 지시문 없이 태그가 지정되지 않은 트래픽에 대한 포트를 사용하기 시작합니다.
마지막으로 보다 현대적인 솔루션은 tc_clsact를 사용하고 PVID의 태그를 푸시/팝하는 작은 BPF 프로그램을 작성하는 것입니다. 일부 NIC가 BPF 프로그램의 하드웨어 오프로드를 허용하므로 성능이 더 높아질 수 있다는 점을 제외하면 위의 TC 예와 유사하게 작동합니다.
답변3
의견과 다른 답변에서 언급했듯이 태그가 지정되지 않은 패킷은 태그 부족으로 인해 자신이 속한 VLAN을 설명할 수 없기 때문에 특정 VLAN에 속하는 태그가 지정되지 않은 패킷을 보내는 전용 방법이 없습니다. 또한 언급했듯이 상위 인터페이스(여기에서는 eth1)는 태그가 지정되지 않은 패킷을 보냅니다.
그러나 이는 Linux 상자에서 전송된 태그가 지정되지 않은 패킷이 네트워크의 특정 VLAN에 속할 수 없다는 의미는 아닙니다. 특정 포트에 도착하는 태그가 지정되지 않은 패킷은 스위치에 의해 특정 VLAN에 할당됩니다. 일반적으로 VLAN을 지원하는 스위치는 기본적으로 태그가 지정되지 않은 패킷을 "기본 VLAN (1)"에 할당합니다. 그러나 스위치의 구성을 변경하면 태그가 지정되지 않은 수신된 패킷을 VLAN 10에 넣고 VLAN 10이 할당된 다른 곳으로 라우팅하도록 지시할 수 있습니다.
VLAN 10이 다른 포트에 태그가 지정되도록 설정된 경우 동일한 패킷이 해당 포트에 태그가 지정되고(이것이 패킷의 대상인 경우) VLAN 10에 대해 태그가 지정되지 않은 것으로 설정된 다른 포트에서 태그가 지정 해제됩니다.
답변4
물리적 인터페이스(eth0)와 VLAN 인터페이스(eth1:10) 사이에 브리지를 생성할 수 있습니다. 그런 다음 브리지는 물리적 인터페이스(eth0)의 태그가 지정되지 않은 패킷이 VLAN 인터페이스(eth1:10)의 태그가 지정된 네트워크와 통신하도록 허용합니다.
제가 사용하는 별자리는 바로 이 별자리입니다. 브리지가 상위 인터페이스(eth0)와 하위 VLAN 인터페이스(eth0:10)에서 생성된 경우 이것이 작동하는지 여부는 말할 수 없습니다...