LinuxのVLAN設定の詳しい説明

小云云
リリース: 2017-12-14 11:01:48
オリジナル
6939 人が閲覧しました

この記事では、主に Linux 仮想ネットワーク機器の VLAN 構成に関する関連情報をサンプル コードを通じて詳しく紹介します。この記事は、皆さんの学習や仕事に役立つことを願っています。

はじめに

VLAN はネットワーク スタックの追加機能であり、下位 2 つの層に位置します。まず、Linux におけるネットワーク スタックの下位 2 層の実装を学び、次に VLAN 機能を追加する方法を見てみましょう。次の 2 つの層には特定のハードウェア デバイスが関係しており、次の図に示すように、ますます完璧になっている Linux カーネルは適切なコード分離を達成しています。 Linux ネットワーク デバイス net_dev は、必ずしも実際のハードウェア デバイスに対応するわけではありません。 struct net_device{} 構造体 (netdevice.h) がカーネルに登録されている限り、ネットワーク デバイスは存在します。この構造は非常に大きく、デバイスのプロトコル アドレス (IP の場合は IP アドレス) が含まれているため、デバイスはネットワーク層によって認識され、ルーティング システム (最も有名なものはループバック デバイス) に参加できます。デバイス (ハードウェアと非ハードウェアを含む) が異なれば、ops 操作メソッドも異なり、ドライバー自体によって実装されます。一部の一般的なデバイスに依存しない操作手順 (デバイスのロックなど) は Linux によって抽出され、ドライバー フレームワークと呼ばれます。

Linux 仮想ネットワーク デバイスの Vlan 構成

ブリッジと 2 つのデバイス ペアを介して 2 つのネットワーク名前空間を接続し、各名前空間に 2 つの VLAN を作成します

vconfig を使用して VLAN を構成します:

#创建网桥
brctl addbr br-test-vlan 
#创建veth对儿
ip link add veth01 type veth peer name veth10
ip link add veth02 type veth peer name veth20 
#将veth对儿的一段添加到网桥
brctl addif br-test-vlan veth01
brctl addif br-test-vlan veth02 
#启动设备
ip link set dev br-test-vlan up
ip link set dev veth01 up
ip link set dev veth02 up
ip link set dev veth10 up
ip link set dev veth20 up 
#创建网络名字空间
ip netns add test-vlan-vm01
ip netns add test-vlan-vm02 
#将设备对儿的另一端添加到另个名字空间(其实在一个名字空间也能玩,只是两个名字空间更加形象)
ip link set veth10 netns test-vlan-vm01
ip link set veth20 netns test-vlan-vm02 
#分别进入两个名字空间创建vlan和配置ip
#配置名字空间test-vlan-vm01
ip netns exec test-vlan-vm01 bash
#配置vlan 3001 和 vlan 3002
vconfig add veth10 3001
vconfig add veth10 3002
#启动两个vlan的设备
ip link set veth10.3001 up
ip link set veth10.3002 up 
#分别在两个vlan上配置ip (这里简单起见,使用了同一个网段了IP,缺点是,需要了解一点儿路由的知识)
ip a add 172.16.30.1/24 dev veth10.3001
ip a add 172.16.30.2/24 dev veth10.3002 
#添加路由
route add 172.16.30.21 dev veth10.3001
route add 172.16.30.22 dev veth10.3002 
#配置名字空间test-vlan-vm02
ip netns exec test-vlan-vm02 bash
#配置vlan 3001 和 vlan 3002
vconfig add veth20 3001
vconfig add veth20 3002
#启动两个vlan的设备
ip link set veth20.3001 up
ip link set veth20.3002 up
#分别在两个vlan上配置ip (这里简单起见,使用了同一个网段了IP,缺点是,需要了解一点儿路由的知识)
ip a add 172.16.30.21/24 dev veth20.3001
ip a add 172.16.30.22/24 dev veth20.3002 
#添加路由
route add 172.16.30.1 dev veth20.3001
route add 172.16.30.2 dev veth20.3002
ログイン後にコピー

VLAN 構成を確認します:

# cat /proc/net/vlan/config 
VLAN Dev name | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
veth10.3001 | 3001 | veth10
veth10.3002 | 3002 | veth10
ログイン後にコピー
これで、2 つの名前空間内の他の名前空間の 2 つの IP にそれぞれ ping を実行できますが、使用される送信元 IP は異なります。どちらの VLAN でもパケットをキャプチャできます。 veth01/veth10/veth02/veth20/br-test-vlan を確認すると、VLAN 情報が表示されます:

# tcpdump -i veth10 -nn -e
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth10, link-type EN10MB (Ethernet), capture size 262144 bytes
15:38:18.381010 82:f7:0e:2d:3f:62 > 9e:58:72:fa:11:15, ethertype 802.1Q (0x8100), length 102: vlan <span style="color: #ff0000;">3001</span>, p 0, ethertype IPv4, <strong><span style="color: #ff0000;">172.16.30.1 > 172.16.30.21</span></strong>: ICMP echo request, id 19466, seq 1, length 64
15:38:18.381183 9e:58:72:fa:11:15 > 82:f7:0e:2d:3f:62, ethertype 802.1Q (0x8100), length 102: vlan <span style="color: #ff0000;"><strong>3001</strong></span>, p 0, ethertype IPv4, 172.16.30.21 > 172.16.30.1: ICMP echo reply, id 19466, seq 1, length 64
15:38:19.396796 82:f7:0e:2d:3f:62 > 9e:58:72:fa:11:15, ethertype 802.1Q (0x8100), length 102: vlan 3001, p 0, ethertype IPv4, 172.16.30.1 > 172.16.30.21: ICMP echo request, id 19466, seq 2, length 64
15:38:19.396859 9e:58:72:fa:11:15 > 82:f7:0e:2d:3f:62, ethertype 802.1Q (0x8100), length 102: vlan 3001, p 0, ethertype IPv4, 172.16.30.21 > 172.16.30.1: ICMP echo reply, id 19466, seq 2, length 64
15:38:23.162052 82:f7:0e:2d:3f:62 > 9e:58:72:fa:11:15, ethertype 802.1Q (0x8100), length 102: vlan 3002, p 0, ethertype IPv4, 172.16.30.2 > <strong><span style="color: #ff0000;">172.16.30.22</span></strong>: ICMP echo request, id 19473, seq 1, length 64
15:38:23.162107 9e:58:72:fa:11:15 > 82:f7:0e:2d:3f:62, ethertype 802.1Q (0x8100), length 102: vlan 3002, p 0, ethertype IPv4, <strong><span style="color: #ff0000;">172.16.30.22 > 172.16.30.2</span></strong>: ICMP echo reply, id 19473, seq 1, length 64
ログイン後にコピー
veth10.3001 から 172.16.30.22 に ping を実行しても、機能しません。別の VLAN:

# ping -I veth10.3001 172.16.30.22
PING 172.16.30.22 (172.16.30.22) from 172.16.30.1 veth10.3001: 56(84) bytes of data.
^C
--- 172.16.30.22 ping statistics ---
9 packets transmitted, 0 received, 100% packet loss, time 8231ms
ログイン後にコピー
vconfig の解決策は適用されません:

ip link add link veth10 name veth10.3001 type vlan id 3001
ログイン後にコピー
別: vlan は通常、デバイス名 .vlanid に基づいて名前が付けられますが、必須ではありません。次のように vlan3003 という名前を付けても問題ありません

# ip link add link veth10 name vlan3003 type vlan id 3003
ログイン後にコピー
注:メインデバイス上で同じ VLAN を持つサブデバイスは最大でも 1 つだけです

# ip link add link veth10 name vlan3001 type vlan id 3001
 RTNETLINK answers: File exists
ログイン後にコピー
つまり、通常は次のようになります:

関連する推奨事項:

ハンズオン Linux VLAN

VLAN 学習の概要

VLAN 構成の切り替え

以上がLinuxのVLAN設定の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート