OpenStack の新しいユーザーが非常によく経験する問題の一つが、インスタンスを起動するときに適切なセキュリティグループを設定できず、ネットワーク経由でインスタンスにアクセスできないことです。
セキュリティグループは、インスタンスのネットワークに適用される、IP フィルタールールの組です。それらはプロジェクト固有です。プロジェクトメンバーがそれらのグループの標準ルールを編集でき、新しいルールを追加できます。すべてのプロジェクトが「default」セキュリティグループを持ちます。他のセキュリティグループが定義されていないインスタンスには「default」セキュリティグループが適用されます。「default」セキュリティグループは、ルールを変更しない限り、すべての受信トラフィックを拒否します。
nova.conf
のオプション allow_same_net_traffic
(標準で true) は、同じネットワークを共有するホストにルールを適用するかを制御します。このオプションはシステム全体に影響するグローバルオプションです。true に設定したとき、同じサブネットにあるホストはフィルターされず、それらの間ですべての種類の通信が通過できるようになります。フラットなネットワークでは、これにより、全プロジェクトの全インスタンスが通信をフィルターされなくなります。VLAN ネットワークでは、これにより、同じプロジェクト内のインスタンス間でアクセスが許可されます。allow_same_net_traffic
が false に設定されていると、セキュリティグループがすべての通信に対して強制されます。この場合、既定のセキュリティグループをそれらのサブネットからのすべての通信を許可するよう設定することにより、プロジェクトが allow_same_net_traffic
をシミュレートできます。
現在のプロジェクトのセキュリティグループが、Horizon ダッシュボードの「アクセス & セキュリティ」にあります。既存のグループの詳細を表示するには、セキュリティグループの「編集」を選択します。自明ですが、この「編集」インターフェースから既存のグループを変更できます。新しいグループを作成するための「セキュリティグループの作成」ボタンが、メインの「アクセス & セキュリティ」ページにあります。同等のコマンドラインを説明するとき、これらの項目において使用される用語について説明します。
コマンドラインからは、以下の nova コマンドを使って、現在のプロジェクトのセキュリティグループのリストを取得できます。
$ nova secgroup-list
+---------+-------------+ | Name | Description | +---------+-------------+ | default | default | | open | all ports | +---------+-------------+
「open」セキュリティグループの詳細を表示する方法:
$ nova secgroup-list-rules open
+-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | icmp | -1 | 255 | 0.0.0.0/0 | | | tcp | 1 | 65535 | 0.0.0.0/0 | | | udp | 1 | 65535 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+
標準で拒否されるので、これらのルールはすべて「許可」形式のルールです。1 番目の項目は IP プロトコル (icmp, tcp, udp のどれか) です。2 番目と 3 番目の項目は対象となるポート番号の範囲を指定します。4 番目の項目は CIDR 形式の IP アドレスの範囲を指定します。この例では、すべてのプロトコルの全ポート番号について、すべての IP からのトラフィックを許可しています。
前の章で述べたとおり、セキュリティグループごとのルール数は quota_security_group_rules により制御されます。また、プロジェクトごとに許可されるセキュリティグループ数は quota_security_groups クォータにより制御されます。
新しいセキュリティグループを追加するとき、内容を表す簡潔な名前をつけるべきです。この名前はインスタンスの簡単な説明など、より長い説明フィールドが使用されないところで使用されます。インスタンスがセキュリティグループ「http」を使っているのを見れば、「bobs_group」や「secgrp1」よりはずっと理解しやすいことでしょう。
例のとおり、インターネットのどこからでも Web 通信を許可するセキュリティグループを作成しましょう。このグループを「global_http」と呼ぶことにします。許可されるものと許可されるところを要約した、明白で簡潔な名前になっています。コマンドラインから、
+-------------+-------------------------------------+ | Name | Description | +-------------+-------------------------------------+ | global_http | allow web traffic from the internet | +-------------+-------------------------------------+
やりたいことを行うための空のセキュリティグループが作成されます。いくつかのルールを追加する必要があります。
$ nova secgroup-add-rule <secgroup> <ip-proto> <from-port> <to-port> <cidr> $ nova secgroup-add-rule global_http tcp 80 80 0.0.0.0/0 +-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | tcp | 80 | 80 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+
引数の順番が決まっていることに注意してください。そして、「from-port」と「to-port」の引数は許可されるローカルのポート範囲を指定し、接続の送信元ポートと宛先ポートではないことに注意してください。nova secgroup-add-rule を複数回呼び出すことで、より複雑なルールセットを構成できます。たとえば、http と https の通信を通過させたい場合、
$ nova secgroup-add-rule global_http tcp 443 443 0.0.0.0/0
+-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | tcp | 443 | 443 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+
新しく追加されたルールのみが出力されますが、この操作は追加操作です。
$ nova secgroup-list-rules global_http
+-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | tcp | 80 | 80 | 0.0.0.0/0 | | | tcp | 443 | 443 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+
逆の操作が secgroup-delete-rule です。secgroup-delete-rule のコマンドラインは同じ形式です。セキュリティグループ全体を secgroup-delete を用いて削除できます。
インスタンスのクラスター向けにセキュリティグループのルールを作成する方法:
ソースグループは許可するソースの CIDR を動的に定義する特別な方法です。ユーザーがソースグループ (セキュリティグループ名) を指定します。これにより、指定されたソースグループを使用する、ユーザーの他のインスタンスが動的にすべて選択されます。これにより、クラスターのそれぞれの新しいメンバーを許可する、個別のルールが必要なくなります。
使用法: nova secgroup-add-group-rule <secgroup> <source-group> <ip-proto> <from-port> <to-port>
$ nova secgroup-add-group-rule cluster global-http tcp 22 22
「cluster」ルールにより、「global-http」グループを使用する他のすべてのインスタンスから SSH アクセスが許可されます。