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インタフェースが使えるようになった。便利。