opencontrailで仮想ネットワーク間のルーティング、セキュリティポリシーを構成するには

概要

前回の続きとなる。
http://aaabbb-200904.hatenablog.jp/entry/2017/10/15/034243

前回作成した k8s+contrail の環境を使用して、web/db/mgmt等のセグメントを作成し、疎通確認を行ってみる。
作成するセグメントとセキュリティポリシーは以下とする。

(セグメント)
dc-web-network 10.0.11.0/24
dc-db-network 10.0.12.0/24
office-network 10.0.13.0/24
mgmt-network 10.0.14.0/24

(セキュリティポリシー)
dc-web-sg:
 mgmt: tcp/22
dc-db-sg:
 web: tcp/22 (tcp/5432の代わり)
 mgmt: tcp/22
office-sg:
 all: all
mgmt-sg:
 172.31.9.34/32: all (稼働確認用ノードのIP, 後述)

セグメントの使い分けとしては、以下を想定している。

  • web/dbのセグメントには、mgmtセグメントからだけssh可能
  • dbのpostgresqlには、webからのみアクセス可能
  • mgmt には稼働確認用ノードからだけssh可能

また、セグメント間は、互いにルーティングが出来るようにし、かつmgmtについては、稼働確認用のノード(contrail外)からも疎通が出来るようにしたい。

上記を実現するために、contrail 内では、'router'と、'security group'が使用できるので、以下にまとめていく。

router

contrail内のrouterは、定義した仮想ネットワーク(以下、vn)間に疎通を許可するための設定となる。
※ 内部的にはroute-targetの払い出しと、接続されたvnへの該当route-targetのインポート/エクスポート定義の追加、を実施している
上記の4つのvn間でルーティングを設定するためには、configure>networks>routersからルーターを作成(dc-routerとして作成)し、上記4つのネットワークを'connected networks'に追加すればよい。
f:id:aaabbb_200904:20171024231359p:plain

また、次回、vMXにも該当経路を配布するため、routerのroute-target を明示的に指定している(64512:201として指定)

仮想ネットワーク内へのコンテナ作成

なお、contrail内にvnを作る場合、configure>networks>network から作成可能となる。
また、該当vn内にk8sのコンテナを作る場合、以下のようにannotationを設定することで、該当vn内にコンテナを作ることができる。
※ contrail動作の説明用の使い方で、k8s の使い方としてはあまり一般的ではないので注意

https://github.com/tnaganawa/contrail-k8s-tutorial/blob/master/yml/2_dc/cirros-dc-web.yaml#L7

今回は、各vn内に1つずつ、containerを作っておく。

security group

security groupは、openstack等で使用できるものとほぼ同じで、各vmに疎通できる通信を設定するものとなる。
contrailでは、vmに接続されている'port'を提供しているため、こちらに対してsecurity groupを設定することになる。

security group(以下、sg)では、通信の許可、しか設定できないため、基本的には、デフォルトではsgには何も設定せず、許可する通信のみsg内に追加していくことになる。
今回は、各vnごとに1つずつsgを作成し、sg名単位で許可していくことにした。

設定例は以下となる。(例では、dc-web用のsgに mgmtからの疎通を許可している)
f:id:aaabbb_200904:20171024231640p:plain

※ ポートごとの定義は以下のように、該当ネットワーク内の各ポートに、セキュリティグループを設定していくことになる
f:id:aaabbb_200904:20171024232150p:plain

疎通確認

作成したそれぞれのコンテナにログインするには、以下のようなコマンドが使用できる

# kubectl exec -it cirros-mgmt sh

ログイン後、ping, ssh 等で、ルーティング、セキュリティポリシーが正しく設定されていることを確認していく。

# ping 10.0.11.4
# ssh cirros@10.0.11.4

ルーティングテーブルの確認

contrailの各vnのルーティングテーブルは、以下から確認できる。
monitor>control nodes>(コントロールノード名)>routes
f:id:aaabbb_200904:20171024231740p:plain

また、next-hop は、以下から確認できる。
monitor>virtual routers>(スレーブノード名)>interfaces
f:id:aaabbb_200904:20171024231817p:plain

※ 上記の例では、dc-web-networkのルーティングテーブルで 10.0.12.4の行き先が40のMPLSラベルであり、該当のラベルが cirros-dc-dbに対応することがわかる。


上記のように、contrail内ではルーティング、およびL4までのファイアウォールが設定できる。
上記の定義は、スレーブノードを追加すれば、そちらのvrouterにもそのまま適用される。
各スイッチやファイアウォール、ハイパーバイザ等で、順に作業していく必要がないので、だいぶ構築が楽になるのではなかろうか。