みなさま、寒くなってきましたがいかがお過ごしでしょうか。GMOクラウドのユーキです。急に寒くなりコーヒー好きな私としては、ホットのシーズン到来で実はウキウキしています。
自販機にもそろそろホットの商品が入り始めて、いよいよ寒さを見た目で実感してきましたね。さて、今回はサーバーだけどネットワークに関するお話です。
Ⅰ. はじめに
企業システムを構築する際に、無くてはならない事前検証環境。少ないリソース、短期間、小規模で構築するものなど、さまざまな構成が考えられます。場合によっては短命に終わる場合もあり、本番環境で見たい性能・機能を見ることだけに特化する構成だってあり得ます。
そんな中、ルータやスイッチなどネットワーク機器を介さず、どうしても直接サーバーでVLANを扱いたい場合ってありませんか?
VLANを利用したネットワークセグメントの分割は、セキュリティを向上させる運用の一つとしてクラウド上では簡単に利用することができます。ただし物理サーバーだけではどうでしょうか?
物理的には1本のケーブルですが、あたかも何本かのケーブルを通しているかのごとく別々のセグメントを通信させることも可能となります。Linuxでは少し前からサーバー自身が通信を処理する際に、カーネルでVLANタグを扱う(付けたり外したり)事ができるようになりました。
今回はそんな便利機能であるVLANタグをLinuxのCentOS6.4で設定してみましょう。
VLANというのはIEEE802.1Qと呼ばれる規格で定義されています。CentOS上ではVLANを利用する際にはカーネルモジュール(ドライバみたいなもの)を使えるように読み込ませてやる必要があります。
そのモジュール名は、その名も8021q(ハチマルニーイチキュー)、そのままですね。
このモジュールを利用すると、物理NIC(※1)に対して仮想的なNICを作ることにより、アプリケーションやユーザーはVLANのタグ付け・タグ外しを意識することなく扱うことが可能となります。
そのためifconfigなどのコマンドを実行すると、NICが増えたような感じになります。
実際にはカーネルがネットワークパケットを処理する際に、VLANタグの付いているパケットだけを特別扱いするフィルタを使います。それによりVLANタグのついているパケットだけを取り扱うことができます。
※1 eth1 などと表現されるインターフェイス名称です。ifconfigコマンドを使えば名称を確認できます。
今回はクラウド上の仮想マシンで試すため、グローバルIPアドレスが設定されていないNICを使用します。万が一設定を間違ってしまうと、仮想マシンにログインできなくなり、コンソールから再度ネットワークを修正することになると大変です。
最初は安全のため、影響の無い別のネットワークに属しているNICで検証することをお勧めします。また設定を変更する前の物理NICの設定ファイルは、別名でバックアップもしておくほうが良いでしょう。
Ⅱ. VLAN利用の下準備
VLANモジュールの読み込みを確認する
# lsmod | grep 8021q
そこで8021qモジュールが見つかると、既に読み込まれています。その場合はモジュールの読み込みをあらためて実行する必要は無いです。
8021q 20106 0
モジュール読み込みの実行
# modprobe 8021q
再度読み込みを確認してみると、モジュールが読み込まれています。
# lsmod | grep 8021q
8021q 20106 0
Ⅲ. VLANの設定
Ⅲ-Ⅰ. VLANの有効化
/etc/sysconfig/network のファイルへ下記を追加します。
VLAN=yes
VLAN_NAME_TYPE=DEV_PLUS_VID_NO_PAD
VLANを有効化し、その論理NIC名称の付与方式(※2)を決めます。
今回はvlan値を510、物理NIC(※3)はeth1とします。
なお、付与方式については現状で4つのパターンがあります。
利用シーンやアプリケーションなどを確認し、あった方式を利用しましょう。
本稿では、[DEV_PLUS_VID_NO_PAD]を使います。
※2 論理NICの付与方式とできあがる論理NIC名称の例
VLAN_PLUS_VID → vlan0510
VLAN_PLUS_VID_NO_PAD → vlan510
DEV_PLUS_VID → eth1.0510
DEV_PLUS_VID_NO_PAD → eth1.510
※3 /etc/sysconfig/network-scripts/ifcfg-*** で定義される名称です。
Ⅲ-Ⅱ. 物理NIC設定
/etc/sysconfig/network-scripts/ifcfg-eth1の物理NIC設定を下記の設定に変更。
ただし、ここでは必要最低限の記載だけなので利用環境に応じて設定値は見直してください。
ポイントとしてはIPアドレスやネットワーク情報の記載を無くしています。
また専用サーバーを利用しているなど、逆に物理層の設定はこちらに記載します。
記載例
DEVICE=eth1
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
IP層の設定は記載しない
#IPADDR=
#NETMASK=
#GATEWAY=
#NETWORK=
NICのデバイスを固定する(していた)場合は、同様に記載しておきます。
HWADDR=macアドレス
Ⅲ-Ⅲ. 論理NIC作成
/etc/sysconfig/network-scriptsのディレクトリに、付与方式通りのファイル名を作成します。
今回はeth1.510というファイル名になります。ポイントはDEVICEが論理NIC名称であることと、VLANの有効化です。それ以外は割りと通常見かける設定かと思います。
記載例
DEVICE=eth1.510
BOOTPROTO=static
ONBOOT=yes
IPADDR=10.1.1.50
NETMASK=255.255.255.0
USERCTL=no
NETWORK=10.1.1.0
GATEWAY=10.1.1.254
VLAN=yes
Ⅲ-Ⅳ. 設定の適用
設定した内容を適用するため、networkの再起動を行います。
ifconfigのコマンドでeth1.510のインターフェイスが確認できます。
# service network restart
Ⅳ. 実際に論理NICを作成し、アプリケーションで使ってみた
実際に設定を入れたサーバーで作成した論理NICを使ってみました。
論理NICを使うアプリケーションはLinuxでも利用可能な簡易パケット送出器[ostinato]を使っています。
作成した論理NICは3つあり、vlan値はそれぞれ510,520,530です。
赤枠の一番上が物理NIC(eth1)で、それ以外が論理NICです。
アプリケーション上では、どちらも同じように扱われるのがわかります。
こうなれば論理NICから別々の宛先に通信をすることができるようになっています。
だからといってインターフェイスとしては増えて見えますが、これはあくまで論理的なインターフェイスであり、実際の転送性能が3倍になるわけではなく、
物理NICの転送性能 ≒ 各論理NIC転送性能の総和
が限界でした。
ちなみに、論理NICを作成しても物理NICを直接利用することはもちろん可能です。その場合はVLANタグが付いているパケットと付いていないパケットの両方が流れてきます。
各NICとvlan有無の関係性を整理するとこんな感じでしょうか。
eth1 → vlan無し、vlan510、vlan520、vlan530
eth1.510 → vlan510のみ
eth1.520 → vlan520のみ
eth1.530 → vlan530のみ
Ⅴ. 終わりに
みなさま、いかがでしたでしょうか?
このように論理NICにIPアドレスを割り当てできるため、複数の論理NICを作成&別セグメントのIPアドレスを割り当てるなど使い方はいろいろあるかと思います。
vlanは0~4095まで存在しますが、0と4095は規格で予約済みのため、論理NICは1~4094までの4094個まで作れることになります。
いや、さすがにそこまではやれませんでした・・・
クラウドでは簡単にvlanを利用したセグメント分割が可能ですが、サーバーとネットワーク装置だけでも、同様にセグメント分割ができることがお分かりいただけたかと思います。
セキュリティはたくさんの要素があるので、こういった機能も利用して高度なセキュリティでの運用を検討してみてはいかがでしょうか?