【入門編】 仮想スイッチ(Open vSwitch: OVS)のOpenFlowプロトコルによるフローテーブル制御とパケットフォワード – クラウドインフラと仮想化ネットワーク実践ガイド

こんにちは!SRE兼クラウドアーキテクトの私です。普段はAWSやGCPといった巨大なメガクラウドの海に飛び込み、Kubernetesの複雑なネットワークやコンテナの世界を泥臭く駆け回っています。

さて、クラウドインフラを支える裏側では、目に見えないところで数え切れないほどのパケットが猛烈なスピードで飛び交っていますよね。その中でも、今日のテーマである「Open vSwitch(OVS)」と「OpenFlow(オープンフロー)」は、現代の仮想化ネットワークを語る上で絶対に外せない主役です。

「名前だけは聞いたことがあるけれど、中身の動きがイマイチ想像できない……」
「パケットの転送って、結局中で何が行われているの?」

そんな疑問をお持ちのあなたへ向けて、今回は小難しいビット数や英語のヘッダー名を極力そぎ落とし、身近な例えを交えながら、一歩ずつ優しく紐解いていきたいと思います。それでは、仮想世界の郵便配達の旅に出発しましょう!

—

1. 仮想世界の「超優秀な仕分け人」:Open vSwitchとは?

まずは、私たちが普段使っているクラウドや仮想化環境のなかで、OVSがどんな役割を担っているのかイメージしてみましょう。

現実世界で考えてみてください。あなたがたくさんの手紙を出したいとき、宛先や内容を見て「これは北海道行き」「これは海外行き」と仕分けて、適切なルートで送り出す場所といえば……そう、郵便局の巨大な仕分けセンターですよね。

仮想化の世界におけるOpen vSwitch(OVS)は、まさにこの「超優秀な仮想の郵便局の仕分けセンター」です。

1台の物理サーバー(ホスト)の上では、たくさんの仮想マシン(VM)やコンテナが動いていますよね。彼らが外の世界や別のサーバーと通信するとき、パケットという名の「お手紙」を次々と発信します。そのお手紙を受け取り、「おっ、この手紙はあっちの仮想マシン宛てだな」「こっちのパケットはセキュリティのルールに引っかかるから捨てちゃおう」と、ダイナミックに交通整理をしてくれるのがOVSなんです。

従来のスイッチと何が違うの?

従来の物理的なネットワークスイッチは、いわば「頑固なベテラン駅員さん」でした。スイッチ自体の頭脳(コントロールプレーン)と、実際にケーブルを流れるデータを処理する体(データプレーン)がひとつの筐体にガッチリ固定されていました。

そのため、「ちょっと通信のルールを変えたい!」と思っても、一台一台のスイッチにログインして設定を書き直す必要があり、クラウドのようなスピード感にはとてもついていけなかったのです。

そこで登場したのが、頭脳と体を完全に切り離すSDN(Software-Defined Networking)という考え方です。頭脳は一箇所にまとめて賢い「司令官(OpenFlowコントローラ)」に任せ、現場のOVSは司令官の命令通りにテキパキとパケットを動かす「忠実な実行部隊」に徹する。この仕組みの現場監督として動くのが、OVSの最大の魅力というわけです。

—

2. 司令官の指示書:「フローテーブル」と「マッチング」の仕組み

OVSという優秀な仕分け係が現場にいても、頭脳である司令官からの指示がなければ、ただの箱になってしまいます。ここで登場するのが、OpenFlowプロトコルと、OVSの頭の中にある「フローテーブル」です。

司令官(OpenFlowコントローラ)は、ネットワーク全体を見渡し、「こういう手紙(パケット)が来たら、こうしなさい」という具体的な指示書を、OVSのフローテーブルに次々と書き込みます。

この指示書を見ながら、OVSがパケットを処理する流れを、郵便配達の窓口に例えてみましょう。

郵便局の窓口で起きていること

1. パケット(お手紙)の到着
仮想マシンから「宛先はあそこ、差出人はここですよ」と書かれたパケットがOVSに届きます。
2. マッチング(条件照合)
OVSは、手包みされた封筒の宛先を見て、手元にある「フローテーブル(指示書)」のリストと照らし合わせます。

  • 「宛先IPアドレスが 192.168.1.10 かつ ポート番号が 80 の手紙はあるか?」

3. アクションの実行(パケットフォワード)
リストの中から条件にピタリと一致する(マッチする)項目を見つけたら、そこに書かれている「アクション(指示)」を実行します。

  • 「ポート番号 2 から外の世界へ送り出せ!」
  • 「怪しいからこの手紙はゴミ箱行き(破棄)にしろ!」
  • 「宛先のIPアドレスをこっそり書き換えてから転送しろ!(NAT処理)」

もし、フローテーブルのどこをどう探しても「該当する指示書がない!」というパケットが届いた場合はどうなるでしょうか? 慌てたOVSは、無線で司令官(コントローラ)にこう連絡します。
「司令官!こんな見たことのない宛先の手紙が届いたんですが、どう処理したらいいですか!?」
司令官が新しい指示書をパッと発行してOVSに教え、OVSがそれをテーブルに書き込んでから初めて、その手紙は無事に送り出されるのです。一度指示をもらえば、次回からはOVS単体で高速に処理できるようになります。賢い仕組みですよね!

—

3. 実践!OVSのフロー制御を体験してみる

「理屈は分かったけれど、実際にどうやって動かすの?」
ここからは、インフラエンジニアとして現場ですぐに使える、OVSの基本的な操作とフロー設定の雰囲気をコード例を交えて見ていきましょう。

まずは、Linux環境でOVSをインストールし、仮想的なスイッチ(今回は br-int という名前をつけましょう)を作成して、手動でフローを追加する手順を追っていきます。

ステップ1: 仮想スイッチの作成と確認

まずは、Linuxのターミナルを開いて、OVSのブリッジ(スイッチ)を作成します。

# 1. 仮想スイッチ(ブリッジ)「br-int」を作成する
sudo ovs-vsctl add-br br-int

# 2. 作成されたブリッジがちゃんと存在するか確認する
sudo ovs-vsctl show

ステップ2: フローテーブルを覗いてみる

作成したばかりのまっさらなスイッチには、まだ何も指示書がありません。現在のフローテーブルを確認してみましょう。

# br-intの現在のフローテーブルを表示する
sudo ovs-ofctl dump-flows br-int

このコマンドを叩くと、初期状態では「とりあえず何も考えず、困ったらコントローラに聞きなさい(あるいは全部捨てなさい)」というデフォルトのルール(Table Miss)だけがぽツンと表示されるはずです。

ステップ3: 手動でルール(フロー)を追加してみる

本来はOpenFlowコントローラが自動で書き込みますが、テストやデバッグのために ovs-ofctl コマンドを使って、手動でルールをねじ込むこともできます。

例えば、「宛先のIPアドレスが 10.0.0.99 であるパケットが来たら、ポート番号 1 から外へ出しなさい」という指示書を追加してみましょう。

# フローテーブルに「IPアドレスが 10.0.0.99 ならポート1へ転送する」ルールを追加する
sudo ovs-ofctl add-flow br-int "priority=100,ip,nw_dst=10.0.0.99,action=output:1"
  • priority=100: 複数のルールがあるときに、どれを優先して見るかの優先度です(数字が大きいほど偉い)。
  • ip,nw_dst=10.0.0.99: 「IPパケットであって、宛先IPが 10.0.0.99 のもの」というマッチング条件です。
  • action=output:1: 条件に一致したときに行うアクション(ポート1へ送り出す)です。

これで、条件に合うパケットが来たら、OVSは迷わずポート1へシュートしてくれます。

—

4. 現場のSREが語る、OVSとOpenFlowのリアルな活用シーン

「ふむふむ、パケットの仕分けとルール設定の仕組みは分かった。でも、実際のクラウドやKubernetesの現場で、これがどう役立っているの?」

そう思われた方も多いはずです。最後に、私たちが日々のインフラ運用でこの技術の恩恵をどう受けているのか、少しだけ裏話をさせてください。

例えば、Kubernetesのネットワークプラグイン(CNI)の一部では、ポッド(コンテナ)同士の通信制御や、外部とのルーティングの裏側でOVSがバリバリに働いています。

  • マルチテナントの隔離: 「テナントAのコンテナからテナントBのコンテナへは、絶対にパケットを通さない」というセキュリティポリシーを、OVSのフローテーブルでガチガチに制御します。
  • ロードバランシング: アクセスが集中したときに、OVS側でパケットの宛先を上手に分散させて、バックエンドのサーバーへ振り分けることも可能です。

もちろん、大規模な環境で数千・数万のフローを扱うようになると、「フローテーブルのメモリが足りない!」「マッチングの処理でCPUが跳ね上がった!」といった、SRE泣かせのトラブルに直面することもあります。だからこそ、パケットがどこを通り、どのテーブルのどの条件に引っかかっているのかを ovs-appctl などのツールで泥臭くデバッグするスキルが、現場では非常に重宝されるのです。

—

まとめ

今回は、仮想スイッチ「Open vSwitch」と「OpenFlowプロトコル」が織りなすパケットフォワードの世界を、郵便配達の例えを交えてお話ししました。

  • OVSは、仮想化世界の超優秀な郵便仕分けセンター。
  • OpenFlowコントローラは、全体を見渡す頭脳明晰な司令官。
  • フローテーブルは、司令官から渡された「宛先とアクションの指示書」。
  • パケットが来ると、OVSは指示書と見比べて(マッチング)、華麗に宛先へ送り出す(パケットフォワード)。

最初は難しく見える仮想化ネットワークも、一つひとつの部品と役割を紐解いていくと、意外と人間社会の仕組みとよく似ていて面白いものです。

「インフラの裏側でパケットがどう走っているのか、少しイメージが湧いてきたぞ!」と思っていただけたなら、これほど嬉しいことはありません。ぜひ、ご自身のローカル環境やクラウドの検証環境でも、OVSに触れて遊んでみてくださいね。

それでは、また次回のインフラ探訪でお会いしましょう。良きSREライフを!

コメント

タイトルとURLをコピーしました