blog

IEEE 802.1Q VLANのLinux実装

VLANは、LANデバイスを論理的にネットワークセグメントに分割し、仮想ワークグループを実現する新しいデータ交換技術です。プロトコルは「プロトコル」とも呼ばれ、主に VLAN の実装方法を規定していま...

Jun 25, 2025 · 11 min. read
シェア

IEEE802.1qプロトコルは「VirtualBridgedLocalAreaNetworks」プロトコルとも呼ばれ、主にVLANの実装方法を規定しています。IEEE802.1qプロトコルは「VirtualBridgedLocalAreaNetworks」とも呼ばれ、VLANの実装方法を規定しています。このブログ記事では、プロトコルを再解釈し、VLAN間通信の原理と設定を示します。

VLANの中核概念

IEEE 802.1qといえば、VLANであることは周知の事実であり、VLANに関しては基本的にネットワーク基盤に死角はありません。しかし、設定となると、基本的には誰もがCiscoやH3Cの機器設定コマンドのようにスムーズに言えるのですが、LinuxのVLAN設定には疑問が多くあります。このような疑問が存在する理由は、2つあると思います:

1.VLANの本質がまだ理解されていません。

いくらCisco/H3Cのコマンドを熟知していても、Linuxのvconfigが読めなければ、コンセプトの理解の浅さを誤魔化すことはできません。

2.Linuxの仮想ネットワークデバイスの実装に不慣れな方

802.1qをよく理解していて、IEEEのドキュメントを読んでいても、ブリッジ、タップ、ボンドなどのLinux仮想デバイスをよく理解していないと、VLANをうまく設定することができません。

VLANのコンセプトを理解する上で、強調すべき点がいくつかあります:

1. VLANはブロードキャストドメインを分離します。

2. 独立した VLAN は通常のスイッチ Ethernet をエミュレートするため、VLAN は物理スイッチを 1 つ以上の論理スイッチに分割します。

3.異なるVLAN間の通信には、レイヤー3の参加が必要です。

4.複数のスイッチがカスケード接続されている場合、VLANはタグと呼ばれる標準イーサネット・フレームに挿入されるVIDによって識別されます。

5.ほとんどのタグはエンド・ツー・エンドではなく、一般にアップリンクのVLANスイッチでタグをヒットさせ、ダウンリンクのVLANスイッチでタグを削除します。

6.タグを付けなければ、データフレームがVLANに属するものとして識別できない場合にのみタグを付け、タグを外すことができる場合は、できるだけ早い時期にタグを外す必要があります。

7.最終的には、IEEE 802.1qがVLANタグの問題を解決します。IEEE 802.1qを除いて、残りは実装に関連するもので、CiscoとH3Cの実装は似ていますが、Linuxはそれらと大きく異なることがあります。

重要なのは、3、4、5 の ***3 ポイントを見ることです。これは VLAN の中で最も理解しにくい部分ですが、一度理解すれば、VLAN には何も残りません。説明や設定を簡単にするために、シスコや他のベンダーはIEEE 802.1q標準では定義されていない多くの詳細を定義しています:

1.各VLANスイッチポートは、VLAN IDにバインドする必要があります。

2.各VLANスイッチポートは、アクセス、トランク、ハイブリッドの3つのカテゴリのいずれかに分類されます。

2.1.アクセスポート:そのポートから受信したデータフレームはタグなし、そのポートから送信したデータフレームはタグなし。

2.2.トランポート:このようなポートから受信したデータフレームにはタグが付けられ、このようなポートから送信するデータフレームには(デフォルトのVLANに関係なく)タグを付ける必要があります。

2.3. ハイブリッドポート:省略

実際、Cisco/H3Cのコマンドを掘り下げて説明する必要はありませんし、結局のところ、3種類のポートタイプの違いは何なのでしょうか。3種類のポートタイプがある理由は、すべてVLANの概念を非常に便利に使うためです。はっきり言って、トランクポートが存在するのは、そうしなければならないからです。なぜなら、複数のVLANに属するデータフレームが1つの物理リンクを通るからで、タグを付けなければ、どのVLANに属するかを区別することができないからです。そこで、イーサネットフレームに挿入するタグを定義したIEEE 802.1q規格があります。タグに関連付けられたリンクはトランクリンクであるとか、そのような一連の概念的なものです。

だから、コンフィギュレーションコマンドを完全に捨て、ベンダー定義のものを捨て、IEEE 802.1q標準と要件に従ってVLANを正確に理解することができます。要件とその要件を満たすネットワーク・トポロジーを定義することから始めて、それがどのように配線されているかを批判的に見てください。

1.シナリオI。同一VLAN内での通信

1.1.同じスイッチ上の同じVLAN内の異なるポートが通信します。

1.2.異なるスイッチの異なるポートが通信

2.シナリオ II.異なるVLAN間の通信

2.1. 同一スイッチ上の異なるVLAN間の通信

2.2. 異なるスイッチの異なるVLANが通信する場合

上記1.2から、ケーブルを節約しループを避けるために、2つのVLANスイッチの2つのポート間の同じリンクで、異なるVLANのデータフレームを伝送する必要があり、それぞれのデータフレームがどのVLANに属するかを互いに識別できるようにするためには、データフレームにタグを付けることが当然の方法であることがわかります。したがって、上記1.2のポートJとKの間のリンク上のデータフレームにはタグを付ける必要があります。言い換えれば、あるポートが複数の VLAN に属するデータフレームを送受信する必要がある場合は常に、そのポートから送信されるデータフレームにはタグを付ける必要があり、そのポートから受信されるデータフレームは、Cisco/H3C などのベンダーの用語では、タグによってどの VLAN に属するかを識別できます。Cisco/H3Cなどのベンダーの用語では、トランクポートであり、2つのトランクポート間のリンクはトランクリンクに属します。

しかし、VLANの目的は、あるPCをあるVLANに、他のPCを別のVLANに分離し、棲み分けを実現することです。VLANの目的は、あるPCを1つのVLANに、あるPCを別のVLANに分離することです。 PCを1つのVLANに分離する明らかな方法は、VLAN対応スイッチの一部のポートを1つのVLANに、一部のポートを別のVLANに配置することで、VLAN内のすべてのポートが論理的なレイヤ2レギュラースイッチを形成します。VLANを拡張するためには、1台のスイッチのポート数の制限を考えると、カスケード・スイッチが必要になります。そうすると、カスケード・リンクは異なるVLANのトラフィックを同時に伝送するので、カスケード・リンクはトランク・リンクになり、カスケード・リンク以外のリンクはすべてダイレクト・リンク、つまりベンダー用語でいうアクセス・リンクになり、当然、アクセス・リンクの両端のポートは当然、アクセスリンクの両端のポートはタグ非依存であり、「タグパススルーはせず、タグを外すことができる」だけでよいので、トランクポート以外のVLANスイッチだけでなく、PCや通常のスイッチにも接続できます。

VLANは基本的に上記のものと同じで、3つの部分に分かれています:

1.設計目的

ブロードキャストドメインの分離、物理デバイスの保存、セキュリティポリシードメインの分離

2. IEEE 802.1q

VLANを拡張するカスケード方式の標準プロトコルを提供

3.VLANの使い方

MACアドレスなどに基づいて、特定のポートをVLANとして分類します。

実際には、VLANを分割する方法については、規格は、任意のハードとファストのルールを与えていない限り、同じVLANに属するポートが完全にそれ以外のIEEE 802規格のシリーズは、言い換えれば、すべてのポートの同じVLANのすべてのスイッチの同じVLANに属していることを確認することができます完全にイーサネットは、イーサネットフレームを送信することができます。

この時点では、基本的にトランクを設定することを忘れている、アクセス、ポートの区切りVLANコマンドに基づいて、左の内部だけでVLANのコア概念を脳は、これらのコア概念を使用すると、Linux上で完全なVLANスキームを設定することができます、あなたはシスコの設定のハードセットに行けば、結果は悲しいだけです。例えば、Linuxでポートをアクセスに設定する方法、Linuxで特定のNICをVLANに割り当てる方法などです。

Linux Bridgeを理解している人は、Linux Bridgeはソフトなので、Linux自体が複数のBridgeデバイスを実装できることを知っています。Linux Boxは複数のEthernetネットワークをエミュレートすることもでき、異なるBridgeデバイスは異なるVLANを表すことができます。

#p#

LinuxでのVLAN

Linux上のVLANLinux上のVLANはCisco/H3C上のVLANとは異なります。VLANは既存のLANであり、その後Vs、つまり、最初に大きなLANがあり、それが異なるVLANに分割されますが、Linuxではその逆で、Bridgeデバイスが論理デバイスとして作成されます。Linuxでは、まずVLANを作成し、そのVLANに関連付けるブリッジを作成する必要があります:

ifconfig eth0 0.0.0.0 up

vconfig eth0 10

ifconfig eth0.10 up

vconfigを使用してeth0.10を作成する場合、それはbr0、tap0、bond0などと同様に、仮想ネットワークカードデバイスの "本当の意味 "であり、バインディングの下に、この仮想ネットワークカードでは、実際のネットワークカードeth0であり、つまり、eth0からのデータは、実際のネットワークカードのこの部分をeth0.10 ".10 "は、それがVLAN 10のデータフレームを運ぶことができることを意味し、タグ付けに送信するためにeth0を介してインチ。eth0.10の".10 "は、VLAN 10のデータフレームを運ぶことができることを意味し、それがeth0を介して送信されるときにタグ付けする必要があります。xmitで対応するタグを入力し、eth0のhard_xmitを呼び出してデータを送信します:

したがって、複数の VLAN のデータフレームを伝送できる ethx のような実際の物理 NIC は、以下のようにトランクポートになります:

LinuxのVLANツールvconfigは、ethx.yを使用して、ethxをトランクポートとして使用して、VLAN IDがyのVLANに参加します。vconfigを使ってethx.y仮想デバイスを作成すると、トランクが作成されます。ethxはトランクポートで、yはそのトランクポートに接続されたトランクリンクで伝送できるVLANデータフレームのIDを表します。.b、ethx.c、ethx.d を作成すると、ethx は VLAN a、VLAN b、VLAN c、VLAN d データフレームを伝送できることになります。

次に、アクセスポートの作成方法を見てみましょう。まず最初に、Linux Bridge は仮想的で論理的なので、「各ポートに VLAN ID を設定する」のではなく、VLAN を作成し、その VLAN に基づいて動的に Bridge を作成できることに注意してください:

VLANを作成します:

ifconfig eth0 0.0.0.0 up

vconfig eth0 10

ifconfig eth0.10 up

この VLAN のブリッジを作成します:

brctl addbr brvlan10

brctl addif brvlan10 eth0.10

この VLAN に NIC を追加します:

ifconfig eth1 0.0.0.0 up

brctl addif brvlan10 eth1

ifconfig eth2 0.0.0.0 up

brctl addif brvlan10 eth2

...

以上です。今後、eth1とeth2はVLAN 10のアクセスポートで、eth0はVLANをカスケードするときに使うトランクポートになります。 VLANをカスケードする必要がなく、VLAN 10を拡張するだけなら、eth1をレイヤー2の普通のスイッチやハブに接続すればいいのですが...。同様に、別のVLANを作成し、eth0を介して上流のVLANスイッチをカスケードすることもできます:

ifconfig eth0 0.0.0.0 up

vconfig eth0 20

ifconfig eth0.20 up

brctl addbr brvlan20

brctl addif brvlan20 eth0.20

ifconfig eth5 0.0.0.0 up

brctl addif brvlan20 eth5

下図のように:

これで基本的にLinuxでのVLANの設定は完了ですが、次にもう1つ、VLAN間の通信があります。これを学ぶ最も簡単な方法はルーティングを使用することで、このため多くの人はVLAN対応のレイヤ3スイッチをルータと同一視しています。ルーティングを使うにはゲートウェイとなるIPアドレスが必要なので、このIPアドレスをどうするかは当然避けて通れない問題で、このIPをどこに設定するか?現在のVLANのどこかに設定しなければならないことは確かなので、このIPを設定できる場所は複数あります:

1. 同じVLANに属し、宛先VLANへのルートを持つルーターのインターフェイス上。

2. 同じVLANに属するethx.yのような仮想インターフェイスで、Linux Boxが指定されたVLAN aへのルートを持っていること。

3. 同じ VLAN に属し、Linux Box が指定された VLAN へのルートを持っているブリッジデバイス a.

このうち、1と2に違いはなく、基本的にはIPアドレスを設定できる場所を探すことになります。ほとんどの場合、2が使われますが、同じLinux Boxの2つのトランクポートで同じVLANが設定されている状況がある場合は、以下の設定のようにブリッジのアドレスを使う必要があります:

brctl addbr brvlan10

brctl addif brvlan10 eth0.10

brctl addif brvlan10 eth1.10

ifconfig brvlan10 up

この時、ethx.yタイプの仮想インターフェイスが2つありますが、ルーティングの競合を起こさないために、IPは1つしか設定できません。MACアドレスがローカルインターフェースのいずれかを指している限り、netif_receive_skbコールのhandle_bridgeは、処理されるローカルIPルートにデータフレームを指示します。ソフトウェアとしてのLinuxはハードウェア・キャッシュ・フォワーディングをネイティブに実装していないので、Linuxにとって、いわゆるレイヤ3スイッチングは実際にはルーティングです。

タグ付きデータフレームがいつタグ解除されるかを見ると、定義上はアクセスポートから送信されるときにタグ解除されますが、意味的には、アクセスポートから送信されるデータフレームがタグ付きでないことが保証されている限り、いつタグ解除されるかについて厳密な要件はありません。VLAN の Linux 実装では、packet_type の func は、802.1q データフレームを別々に扱うレイヤ 3 ハンドラとして使用されます。802.1q は、現在 IP プロトコルと対等な立場にあり、VLAN の func 関数である vlan_skb_recv は、IP ハンドラである ip_rcv と同じです。LinuxのVLANの実装では、ポートがデータフレームを受信し、データフレームがローカルに送信された時だけ、それはpacket_type func処理の3層目に到達します。認識すらできません。データフレームの送受信、IEEE 802.1qフレーム処理、VLAN間通信を行うトランクポート全体を以下に示します:

ここまで、基本的にLinuxのVLANのポイントを述べてきましたが、この理解があれば、シングルアームのLinux Boxを設計することは難しくないと思います、シングルアームデバイス****の利点は、物理デバイスを節約するだけでなく、分離を達成することです。この構成は複雑ではありません、あなたはVLANでそれを実装したくない場合は、また、ip addr add devを使用することができます...しかし、利点のVLANの実装では、方法を達成するために仮想IPを追加し、既存のレイヤ3スイッチをリンクすることができますが、また、直接標準のIEEE 802.1qをサポートしているデバイスのトランクポートに差し込むことができます。

メカニズムはステージを設定し、戦略は歌います。VLANのメカニズムの実装が明確になっているので、それはあなたが欠点を見ていると推定され、どのようにそれを克服するために、PVLANは正直VLANの代替手段です。VLAN間のIPセグメントの分離の問題を解決するには、どのようにLinux上でそれを実装するには?VLANがVLANのハード実装であれば、PVLANはVLANの純粋なソフト実装であり、VLANを分割する必要もありません。VLANを分割する必要さえありません。私たちはすべてIPネットワークセグメントに属しており、アクセス制御ポリシーを設定するだけで、同じIPサブネットのホストはデフォルトゲートウェイとしか通信できません。つまり、「VLANの分離」「グループVLAN」などの用語を知らなくても、実際にPVLANを導入したことになります。

いくつかのポイントを要約すると

1.LinuxでVLANがどのように設定され、どのように実装されるかを最初に調べるのではなく、最初にネットワークのトポロジーを計画する必要があります。

2. VLANがそもそも何のために設計されたのかを深く理解する必要があります。

3. どの概念がコアで、どれが VLAN には必要ないかを知る必要があります。

4.どのプラットフォームでVLANを設定する場合でも、必要なことは次の2つだけです。

5.それ以外は暗記する必要はありません。

Read next

アニメーション・リソースのAndroidアプリケーション・リソース(Animation Resources)

アニメーション・リソースには2種類あります:\n属性アニメーション\nアニメーションは、Animator クラスに関連付けられたオブジェクトのプロパティの値を、設定された期間変更することで作成されます。\nビュー・アニメーション\nビューアニメーションフレームワークには、次の2種類があります。\nインターバル・アニメーション: Animatiクラスに関連付けられたオブジェクトの一連の実行によってアニメーションを作成します。

Jun 25, 2025 · 8 min read