Linuxでタグ付けされていないインターフェイス?

Linuxでタグ付けされていないインターフェイス?

私は、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

送信(上記では「root」と呼ばれる)に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)で作成された場合、これが機能するかどうかはわかりません。

関連情報