ホームページ >運用・保守 >Linuxの運用と保守 >LinuxのVLAN設定の詳しい説明
この記事では、主に 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 64veth10.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 8231msvconfig の解決策は適用されません:
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
以上がLinuxのVLAN設定の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。