OCIのネットワーク保護
OCI(Oracle Cloud Infrastructure)では、「ネットワークを保護する方法」が2重に実施されています。そこで、外部からのアクセスを許可したい場合には、双方で許可されていなければなりません。
・セキュリティ・ルール
・ファイアウォール・ルール
例えば、Ubuntuイメージの場合、ファイアウォールとしてiptablesが使用されているのですが、SSH用の22/tcpが事前に許可される状態となっています。
Raspberry PiのRaspberry Pi OSの場合には、SSHは既定値で禁止されているために使用する場合には、事前にSSHを有効化しておく必要があります。
セキュリティ・リスト
OCIのコンパートメント内のVCN(仮装クラウドネットワーク)に対して、既定値のセキュリティ・リストが設定されています。このセキュリティ・リストでは、イングレス・ルールとしてインバウンドのアクセス制御、エグレス・ルールとしてアウトバウンドのアクセス制御を設定することができます。
・ステートフル・イングレス:ソース0.0.0.0/0および任意のソース・ポートからの宛先ポート22(SSH)に対するTCPトラフィックを許可します。
・ステートフル・エグレス:すべてのトラフィックを許可します。これによって、インスタンスは任意の宛先に対して任意の種類のトラフィックを開始できます。
pingの有効化デフォルト・セキュリティ・リストには、pingリクエストを許可するルールは含まれていません。
セキュリティ・リストの概要
セキュリティ・リストにアクセス許可を追加する場合には、OCIにログインしてから「 コンピュート」>「インスタンス」>「インスタンスの詳細」画面に表示されている、「プライマリVNIC」の「サブネット」を選択してから「セキュリティ・リスト」を表示します。
ここで、すでに登録されているイングレス・ルールとエグレス・ルールが表示されますから、外部からのアクセス許可を追加する場合には、「イングレス・ルール」の画面で「イングレス・ルールの追加」をクリックして追加します。
ちなみに、pingを有効化したい場合にはイングレス・ルールとしてICMPのタイプ8(iptablesであれば、–icmp-type echo-requestに相当する)の許可を追加します。
ファイアウォール・ルール
Ubuntuイメージの場合には、OSレベルでiptablesが実行されています。そこで、外部からのアクセスを許可する場合には、iptablesのルールを追加する必要があります。既定値では、22/tcpとしてSSHが許可されていますから、このルールの次に追加する場合には次のようにコマンドを実行します。
$ sudo iptables -L
まず、既存のルールを確認しておきます。例えば、INPUTの6行目の前にhttpのルールを追加する場合には、次のコマンドを実行します。
$ sudo iptables -I INPUT 6 -p tcp --dpoort 80 -j ACCEPT
ここで、例えば -s オプションを使ってソースIPアドレスを指定することもできます。
$ sudo iptables -I INPUT 6 -p tcp -s 192.168.1.1 --dport 80 -j ACCEPT
もちろん、上記で例に書いたIPアドレスはプライベート・アドレスですから実際に使用する値と置き換えます。
これで、例の場合であれば外部からhttpポートのアクセスができるようになっているはずです。ところが、このままではシステムを再起動すると追加した設定が消えてしまいますので、追加した内容を保存しておきます。
$ sudo /etc/init.d/netfilter-persistent save
$ sudo /etc/init.d/netfilter-persistent reload
この例では、続けてreloadで再読み込みして保存された設定内容を確認しています。
特定のルールを削除する場合には、ルール番号で指定することができます。
$ sudo iptables -D INPUT 6
随分と久しぶりにiptablesを使ったような気もするのですが、最初はOCIのアクセス許可ってどうやって設定するんだろうと思いました。