うわっ・・私のnf_conntrack力、低すぎ・・?
と思うくらい、これまでiptablesとか使わずにOpen vSwitchのみで弊社クラウドサービスの仮想スイッチを実装をしてきたわけですが、、
最近、Open vSwitchにてNetfilter conntrack(以下nf_conntrack)とのインテグレーションが開発されているそうです。
nf_conntrackは、Linux上で動作するモジュールで、パケットフィルタにステート管理を実装するための機能です。iptablesで使われている方も多いと思いますが、以下のようなことが実現できます。
-
ステートフルインスペクション
自身から発した通信の戻りパケットを自動的に許可する -
NAPT(Network Address Port Translation)
-
ALG(アプリケーションゲートウェイ)
NAPTに加えFTPなどペイロード内の書き換えが必要なアプリケーションを通す -
その他
素のOpen vSwitchだけではこのような通信のセッション管理ができず、ステートレスなパケットフィルタしか実装できませんでした。
今回、このnf_conntrack連携機能により、Open vSwitchだけでステートフルなファイアウォール機能をシンプルに実装できるようになるというわけです(たぶん)。
※ 補足:例えば、OpenStackでOVS Pluginを使用する場合、ステートフルを実装するためにiptablesやLinux Bridgeが併用されていたりします。
連携のイメージは下図のような感じだそうです。
引用元: http://openvswitch.org/support/ovscon2014/17/1030-conntrack_nat.pdf
ということで、結構期待できそうな機能なので試してみました。
テスト環境
当方では以下の環境で試してみました。
-
CPU: Intel Xeon L5630 2.13GHz 16 Threads
-
MEM: 72GB
-
OS: Scientific Linux 6.7
RHELやCentOSでも同様にいけるはずです。 -
Kernel: Linux 4.3.3
-
Open vSwitchバージョン: branch-2.5
Step1. カーネルのバージョンアップ
まずカーネルを新しめのものに上げる必要がありました(標準の2.6.32-573では動きませんでした)。
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel
vi /boot/grub/grub.conf
reboot
手元の環境では以下のようになりました。
# uname -a
Linux sl67-r4 4.3.3-1.el6.elrepo.x86_64 #1 SMP Tue Dec 15 13:13:15 EST 2015 x86_64 x86_64 x86_64 GNU/Linux
Step2. Open vSwitchのソースコード取得
まだ正式リリースではないようですが、githubのレポジトリを調べたところ、branch-2.5にこの機能がマージされているようです。レポジトリをクローンし、branch-2.5をチェックアウトします。
git clone https://github.com/openvswitch/ovs.git
cd ovs
git branch -a
git checkout branch-2.5
Step3. Open vSwitchのコンパイル、インストール
いつも通りコンパイルしてインストールします。
./boot.sh
./configure --prefix=/usr --localstatedir=/var --with-linux=/lib/modules/`uname -r`/build
make
make install
make modules_install
Step4. Open vSwitchの起動
インストールできたら、普通にOpen vSwitchを起動します。
mkdir -p /var/run/openvswitch/
modprobe openvswitch
rm -f /var/run/openvswitch/ovs-vswitchd.conf.db
ovsdb-tool create /var/run/openvswitch/ovs-vswitchd.conf.db /usr/share/openvswitch/vswitch.ovsschema
ovsdb-server /var/run/openvswitch/ovs-vswitchd.conf.db --remote=punix:/var/run/openvswitch/db.sock --pidfile --detach
ovs-vsctl --no-wait init
ovs-vswitchd unix:/var/run/openvswitch/db.sock --pidfile --detach
ovs-vsctl add-br br0
ip link set br0 up
ovs-vsctl add-port br0 eth2
ip link set eth2 up
modprobe nf_conntrack_ipv4
nf_conntrack_ipv4モジュールが必要なのですが、自動でロードされないので、最後に手動でロードしています。以下のようにログ出力されればOKです。
Jan 7 12:57:10 sl67-r4 ovs-vswitchd: ovs|00010|ofproto_dpif|INFO|system@ovs-system: Datapath supports ct_state
Jan 7 12:57:10 sl67-r4 ovs-vswitchd: ovs|00011|ofproto_dpif|INFO|system@ovs-system: Datapath supports ct_zone
Jan 7 12:57:10 sl67-r4 kernel: device ovs-system entered promiscuous mode
Jan 7 12:57:10 sl67-r4 ovs-vswitchd: ovs|00012|ofproto_dpif|INFO|system@ovs-system: Datapath supports ct_mark
Jan 7 12:57:10 sl67-r4 ovs-vswitchd: ovs|00013|ofproto_dpif|INFO|system@ovs-system: Datapath supports ct_label
次回へ続く
ちょっと長くなったので、今回はnf_conntrackインテグレーションに対応したOpen vSwitchのインストールから起動までの手順を紹介しました。
次回、実際にフローエントリを書いて通信できることを確認します。