FreeBSD で、kernelコンパイルで有効にするか、moduleを組み込み、利用する2つのパターンがあります。
GENERIC kernelを使っている場合は、わざわざ手でkernelを作り直さないと行けないため、今回は、moduleを組み込む方法でのTipsとなります。
尚、vlanが使えるデバイスは限られており、man - if-vlanやman - vlanを見る限り、ハードウェアで処理可能なNICは、bce, bge, cxgb, em, ixgb, msk, nge, re, stge, ti, txp, vge となっているようです。ソフトウェアエミュレーションにより、多くのデバイスが対応出来るようですが、一部のNICには、制約が有るようですので、manで確認して下さい。
カーネル再構築ではなく、VLAN Kernel Moduleをロードします。
# kldload if_vlan.ko
正常に読み込まれているか、kldstat で見ることが出来ます。
# kldstat Id Refs Address Size Name 1 1 0xc17c7000 4000 if_vlan.ko
正常にload出来ることを確認出来たら、次回から自動起動時に、moduleを読み込むよう、/boot/loader.conf に以下の設定を書いておきましょう。rc.confで自動設定するときに、予めmoduleが読み込まれている必要があります。
# echo 'if_vlan_load="YES"' >> /boot/loader.conf
vlanX は、任意の数字で作成することが出来るため、VIDとデバイス vlanX を同じにしておいても良い。
# ifconfig vlan1 plumb # ifconfig vlan2 plumb # ifconfig vlan3 plumb
機器によっては、MacAddressが同じだと、不都合が出る可能性があるため、任意のMacAddressに変更することが可能。
# ifconfig vlan1 link 00:1c:c4:00:11:01 # ifconfig vlan2 link 00:1c:c4:00:11:02 # ifconfig vlan3 link 00:1c:c4:00:11:03
無事に、ifconfig で変わったのを確認出来れば、そのNICが、vlan及びMacAddress変更(あくまでも名乗っているだけで、HWアドレスは書き換えられていない)が可能となる。
下記のようにして、どの物理デバイスにたいして、vlanを使うか設定をおこなう。
途中から、bge0.2 といった形でも、使えるようになっている(らしい)
# ifconfig vlan1 vlan 1 vlandev bge0 # ifconfig vlan2 vlan 2 vlandev bge0 # ifconfig vlan3 vlan 3 vlandev bge0
vlanの設定が無事に完了したら、下記のようになっているはずです。
# ifconfig vlan2 vlan2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:1c:c4:00:11:02 media: Ethernet autoselect (100baseTX <full-duplex>) status: active vlan: 2 parent interface: bge0
普段通り、ifconfig で、IPアドレスを付ければ問題有りません。
# ifconfig vlan1 inet 192.168.1.10 netmask 255.255.255.0 # ifconfig vlan2 inet 192.168.2.10 netmask 255.255.255.0 # ifconfig vlan3 inet 192.168.3.10 netmask 255.255.255.0
同様に、IPv6も問題なく付けることが出来ます。
# ifconfig vlan1 inet6 add 2001:200:564:4649::1 # ifconfig vlan2 inet6 add 2001:200:564:2525::1 # ifconfig vlan3 inet6 add 2001:200:564:0721::1
ルーティング等は、route add で追加出来ますが、今回は触れません。
疎通確認が出来たら、/etc/rc.conf に記述し、起動時に自動設定されるように設定をおこないます。
Linux等では、eth0.10 とすると、eth0のvlan10とすることが出来出来ます。これは、どのNICにvlanが使われているか非常に明快でわかりやすくなっており、今のFreeBSDでも同じ使い方が出来るようになっています。
# ifconfig bge0.10 plumb plumb ではなく、createでも可
同様に、MacAddressの変更が必要であれば、次のようにして変更します。
# ifconfig bge0.10 link 00:1c:c4:00:11:10
無事に作れたか確認してみましょう。
# ifconfig bge0.10 bge0.10: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 00:1c:c4:00:11:03 media: Ethernet autoselect (1000baseTX <full-duplex>) status: active vlan: 10 parent interface: bge0
こちらの方がスマートで非常に簡単です。
デバイスを破棄する場合(どちらか)
# ifconfig bge0.10 destroy # ifconfig vlan200 destroy
IPv4アドレスを付与(どちらも同じ)
# ifconfig bge0.10 create 192.168.10.1/24 # ifconfig bge0.10 create ; ifconfig bge0.10 inet 192.168.10.1 netmask 255.255.255.0
IPv6アドレスを削除
# ifconfig bge0.10 inet6 2001:200:564:5963::1 delete
Media Type の指定(詳細はMan参照)
vlanデバイスには設定できません。
# ifconfig bge0 media 100baseTX mediaopt full-duplex # ifconfig bge0 192.168.0.10 netmask 255.255.255.0 media 100baseTX mediaopt full-duplex <- IPアドレスと同時設定
/boot/loader/conf に、if_vlanモジュールを自動的に読み込む設定をしていない場合、若しくはkernelに組み込んでいない場合は次のようにして児童にロードさせるように設定します。
# echo 'if_vlan_load="YES"' >> /boot/loader.conf
rc.conf ファイルは、シェルスクリプトで使用される変数となるため、ifconfig_bge0.200 というインターフェース名は使用できません。そこで、rc.conf に書く場合は、'.' を '_' と置き換え、ifconfig_bge0_200 と置き換えます。
ifconfig_bge0="up" cloned_interfaces="bge0.200 bge0.300 bge0.400" ifconfig_bge0_200="inet 192.168.200.1 netmask 255.255.255.0" ifconfig_bge0_300="inet 192.168.201.1 netmask 255.255.255.0" ifconfig_bge0_400="inet 192.168.202.1 netmask 255.255.255.0" ipv6_enable="YES" ipv6_network_interfaces="bge0.200 bge0.300" ipv6_defaultrouter="fe80::4989%bge0.200" ipv6_ifconfig_bge0_200="2001:200:564:4989::1 prefixlen 64" ipv6_ifconfig_bge0_200_alias0="2001:200:564:4989::2 prefixlen 64" ipv6_ifconfig_bge0_300="2001:200:564:5963::1 prefixlen 64" ipv6_ifconfig_bge0_300_alias0="2001:200:564:5963::2 prefixlen 64"
Physical Addressを変更しなければいけない状況に有る場合は次のようにしてrc.confへ記載します。
ifconfig bge0>200 inet ipaddress netmask mask link 00:11:22:33:44:55 という書き方ができないため、次のようにします。
ifconfig_bge0_200="link 00:11:22:33:44:55" ifconfig_bge0_200_alias0="inet 192.168.200.1 netmask 255.255.255.0"
ifconfig へそのままパラメータが渡されるため、ifconfig で使用可能なオプションはそのまま使用可能である。
ifconfig bge0 inet 192.168.200.1 netmask 255.255.255.0 media 100baseTX mediaopt full-duplex
と行いたければ、
ifconfig_bge0="inet 192.168.200.1 netmask 255.255.255.0 media 100baseTX mediaopt full-duplex"
と記述すればよい。