Linuxで802.1qタグつきVLAN
802.1qとは
普通のパケットに、VLANタグをつけてカプセル化するための規格。当然受け側も対応が必要。1つのインタフェースで複数のVLANのパケットを流せるのが美味しい。
構成
<<Network_A>>───[賢いスイッチ]───<<Network_B>> ┃ <<Network_A,B両方の足を持ったホスト>>
縦の太い線の部分が、802.1qでカプセル化したパケットが通るところ。当然1本。Cat5eEtherケーブル。
スイッチ側の設定
賢いスイッチにはCatalyst 2924を使うことに。
! interface FastEthernet0/1 switchport access vlan 3 ! interface FastEthernet0/2 switchport trunk encapsulation dot1q switchport trunk allowed vlan 1-3,1002-1005 switchport mode trunk ! interface FastEthernet0/3 switchport access vlan 2 !
- Fa0/1: VLAN 3
- Fa0/2: VLAN 2, 3
- Fa0/3: VLAN 2
こういう設定で、Fa0/2は802.1qでカプセル化されたタグVLAN専用インタフェースになる。Cisco用語ではトランキングインタフェースというのかな。Fa0/2で、トランキングするVLANリストからデフォルトVLANの1が削れないのは気にしないことにした。
ホストの設定
最初ホスト側にSolarisを使いたくて始まった話なんだけど、SUNのハードウェア(というかNIC)はタグVLANに対応したのがつい最近なのか何なのか、対応NICはほぼGigabitEther製品のみ。手持ちのSUNではできない事が発覚。やりかたは 'Solaris ifconfig plumb 802.1q vlan' でGoogle神様に聞いておくれ。NetBSDでやらせている箱をSUNに置き換えたかったのだけれど、Linuxでやることに。
BSD系もSolarisと同じく ifconfig コマンドから操作できるんだけれど、やろうとした Linux は調べたらあんまドキュメントないのね。どうやら Kernel 2.2 の頃から技術としてはあったみたいで、やってみましたよ。
使ったのは、WhiteBox 3.0 Kernel 2.4.21-4.EL です。
まずは vconfig コマンドをインストール。これがないと始まらない。
# rpm -ivh vconfig-1.6-2.i386.rpm
無事入ったら、とりあえず設定。
# vconfig eth1 2 # vconfig eth1 3
これで eth1 をタグVLAN対応インタフェースとして、eth1.2, eth1.3 というインタフェースが作成される。
# ls -l /proc/net/vlan/ 合計 0 -rw------- 1 root root 0 7月 21 13:02 config -rw------- 1 root root 0 7月 21 13:02 eth1.2 -rw------- 1 root root 0 7月 21 13:02 eth1.3
こいつらを cat すると状態が見える。
ネットワークインタフェースの起動スクリプト、/etc/init.d/network を見てたら下のようになっていて(一部改行関連で改変)
# Even if VLAN is configured, without the utility we can't do much [ ! -x /sbin/vconfig ] && VLAN= (中略) # See how we were called. case "$1" in start) (中略) case "$VLAN" in yes) if [ -d /proc/net/vlan ] || modprobe 8021q >/dev/null 2>&1 ; then action $"Setting 802.1Q VLAN parameters: " \ /sbin/vconfig set_name_type DEV_PLUS_VID_NO_PAD else echo $"No 802.1Q VLAN support available in kernel." fi ;; esac
/etc/init.d/network に、VLAN=yes を食わせてやると勝手にモジュールをロードしてくれることがわかった。DEV_PLUS_VID_NO_PAD の話は man vconfig に書いてある。このスクリプトでは、最初に /etc/sysconfig/network を読み込むようになっているので、そこに VLAN=yes を追記。あとは、/etc/sysconfig/network-scripts 以下の ifcfg* をインタフェース一覧として処理してくれるので、以下ファイルを準備。
$ ls -al ifcfg-eth1* -rw-r--r-- 1 root root 214 7月 20 21:32 ifcfg-eth1.2 -rw-r--r-- 1 root root 214 7月 21 12:12 ifcfg-eth1.3 $ cat ifcfg-eth1.2 DEVICE=eth1.2 BOOTPROTO=static BROADCAST=192.168.2.255 HWADDR=00:B0:D0:35:02:6F IPADDR=192.168.2.155 NETMASK=255.255.255.0 NETWORK=192.168.2.0 ONBOOT=yes $ cat ifcfg-eth1.3 DEVICE=eth1.3 BOOTPROTO=static BROADCAST=192.168.0.255 HWADDR=00:B0:D0:35:02:6F IPADDR=192.168.0.155 NETMASK=255.255.255.0 NETWORK=192.168.0.0 ONBOOT=yes
これで再起動してもVLANインタフェースが使えるようになった。便利。