2012年1月18日水曜日

VLANとLinux

VLANスイッチに関連してLinuxのVLANの扱いについても書いておくことにします。
その前にWindowsはどうかというと、
ネットワークデバイス自身のプロパティで[詳細設定]タブを開いて、
もしVLANに関係した設定項目があるなら対応しているというぐらいです。
Linuxに話を戻しますが、といあえずUbuntu 10.04(x64)を前提とします。
最初に以下で必要なツールをインストールします。

# apt-get install vlan

またカーネルモジュールが必要なので毎起動時に以下を実行します。

# modprobe -a ebt_vlan

いちいち実行するのが面倒なら
ファイル"/etc/modules"の最後に"ebt_vlan"を加えておけばいいでしょう。

では実際にVLANを構成します。
Linuxではeth0というインターフェイスに
VLAN IDが1のVLANタグつきのパケットが入ってきたときに、
デバイスeth0.1でVLANタグの外れた状態のパケットを受け取ることができます。
逆も同様でデバイスeth0.1から普通にパケットを送ると、
VLAN IDを1に設定したVLANタグを付加して
eth0の実デバイスから送信することができます。
つまり実デバイスeth0に対して、
VLAN IDが2、3、4のパケットを扱う仮想デバイスeth0.2、eth0.3、eth0.4を
作成することができます。
これを実現するためには以下のコマンドを実行するだけです。

# vconfig add eth0 2
# ifconfig eth0.2 192.168.2.1 netmask 255.255.255.0
# vconfig add eth0 3
# ifconfig eth0.3 192.168.3.1 netmask 255.255.255.0
# vconfig add eth0 4
# ifconfig eth0.4 192.168.4.1 netmask 255.255.255.0

解説しておくと

vconfig add <デバイス名> <VLAN ID>

でVLAN用の仮想デバイスを作成し、

ifconfig <仮想デバイス名> <IPアドレス> netmask <サブネットマスク>

で仮想デバイスにIPアドレスを割り当てます。
ここで各仮想デバイスを別々のサブネットにしていて
なにもしなくてもルーティングテーブルは正常に動作するよう構成されていますが、
その他のIPアドレスをどうするかが確定されていないので
少なくともデフォルトゲートウェイを設定しておく必要があります。
例えば別にデバイスeth1がありそこにつながった"192.168.1.1"を
デフォルトゲートウェイにするなら以下を実行することになります。

# ifconfig eth1 192.168.1.2 netmask 255.255.255.0
# route add default gw 192.168.1.1 dev eth1

ただし、"192.168.1.1"のマシンが
"192.168.2.*"、"192.168.3.*"、"192.168.4.*"宛てのパケットを
"192.168.1.2"にルーティングするよう正しく設定されている必要があることは
言うまでもありません。
また、これらサブネット間をこのマシンでルーティングしたいなら

# echo 1 > /proc/sys/net/ipv4/ip_forward

を実行すればよいだけです。
ファイアウォールにしたいのならiptablesで適当に設定しましょう。
ちなみに複数の仮想デバイスに同一のサブネットに属する
異なるIPアドレスをふったとしても特に問題なく動くとは思いますが、
実運用上VLANの意義があるようには見えません。

ルータではなくVLAN間の中継(スイッチングハブ)したいのであれば、
複数の仮想デバイスをブリッジにまとめて、
その仮想インターフェイスに1つのIPアドレスを割り当てればいいでしょう。
多分以下を実行すればいいと思います。
実際に試していないので結果は保証しませんが。

# apt-get install bridge-utils
# modprobe -a bridge
# brctl addbr br0
# brctl addif br0 eth0.2
# brctl addif br0 eth0.3
# brctl addif br0 eth0.4
# ifconfig br0 192.168.1.100 netmask 255.255.255.0 up
# ifconfig eth0.2 up
# ifconfig eth0.3 up
# ifconfig eth0.4 up
# route add default gw 192.168.1.1 br0


最後にひとつ、

ifconfig eth0 mtu 1496

の実行を忘れないようにしてください。
環境を構築後、動くサービス動かないサービスいろいろあって調べていくうちに
大きなパケットが通っていないことに気付いて思い当たりました。
VLANタグの付加により4バイトパケットが大きくなって
途中通らない場所が出てくるんですね。
というわけでMTUをデフォルトの1500から4引いて1496にしておきます。
これで半日ぐらいはまってしまいました。

0 件のコメント:

コメントを投稿