Open vSwitchのconntrack連携を試してみた(その1)

# うわっ・・私のnf_conntrack力、低すぎ・・？

と思うくらい、これまでiptablesとか使わずにOpen vSwitchのみで[弊社クラウドサービス](http://cloud.sakura.ad.jp/)の仮想スイッチを実装をしてきたわけですが、、

最近、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が併用されていたりします。

連携のイメージは下図のような感じだそうです。

![SnapCrab_NoName_2016-1-12_17-44-24_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/108990/c0f5b236-bd9d-7e57-e3d3-07ae90034f0f.png)

引用元: 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のインストールから起動までの手順を紹介しました。

次回、実際にフローエントリを書いて通信できることを確認します。

[→ Open vSwitchのconntrack連携を試してみた(その2)](
http://qiita.com/jh1vxw/items/bfc3bb3d18a923990190)