(OCI)Ubuntuインスタンスではiptablesに気をつけたい

 2020.11.17  株式会社テリロジー 技術統括部

こんにちは。Tachanです。

みなさま!来年にOCIの構築実践ガイドが出ますね!
各サービスの内容だけでなく、設計や構築方法なども記載されているとのことです。
各通販サイトでは予約が始まっております。

Amazon:www.amazon.co.jp/dp/4297118092
楽天:https://books.rakuten.co.jp/rb/16518966/

また、オラクルの日本の開発者チームによるYouTubeも開設されています!
ここでは開発者向けコミュニティで開催されたセミナーを見ることができます。
動画を拝見させていただきましたが、どれも興味深い内容で、システム構築の勉強になります。

チャンネル:https://www.youtube.com/channel/UCDz9yA6Vp7OG0sPx3RhrtnA/about

さて、今回は自分への戒めの意味も込めて記事を作成しました。

ことの経緯

先日こんなことがありました。

オラクルクラウド上にubuntuのインスタンスを作成し、ソフトウェアをインストールしたところ………………

SSHは繋がるけどWebブラウザアクセスができない…!!!

OCI上のFWやネットワークで止められているのかと思いましたが、
設定に不備は見当たりませんでした。

ネットワーク・セキュリティ・グループ(NSG)で該当のポートを追加したものの、
アクセスはできませんでした…

原因

途方に暮れた私は、チームリーダーである山内さんに相談しました。

そこでわかったことは、iptablesがデフォルトで有効になっていたことでした。
オラクルクラウド上で通信制御の設定していても、
このiptablesで全部拒否されていたのです。

調べてみると、オラクルクラウドのubuntuは、UFWではなくiptablesでFW制御を行うようでした。
詳細はオラクルクラウドの公式ドキュメントに記載されています。

提供イメージ
https://docs.cloud.oracle.com/ja-jp/iaas/Content/Compute/References/images.htm

既知の問題
https://docs.cloud.oracle.com/ja-jp/iaas/Content/knownissues.htm#ufw

対処

UbuntuインスタンスにSSH経由でiptablesコマンドを利用し、該当ポートを許可する設定を行いました。

iptablesの設定確認コマンド

$ sudo iptables -L

該当ポートの許可

$ sudo iptables -I INPUT 5 -p tcp --dport [ポート番号] -j ACCEPT

公式ドキュメントではルート権限で実行していましたが、
ルートの設定をしていなかったため一般ユーザー(ubuntu)を使い、
ドキュメントとは異なるコマンドを使用しました。

これで解決…と言いたいところですが、iptablesについて調べていたところ、
サーバを再起動するとiptablesの設定が初期値に戻ってしまうようです。
OCIが行うメンテナンスによっては、サーバーが再起動になる可能性があります。

それを防ぐために、iptablesの設定を永続化する必要がありました。
「sudo iptables save」で保存できるかなと思ったのですが、うまくいかないみたいですね。
私も実際に試しましたがうまくいきませんでした。

以下のコマンドを実行することで、iptablesの設定を永続化することが可能です。

sudo /etc/init.d/netfilter-persistent save sudo /etc/init.d/netfilter-persistent reload

これで再度Webブラウザアクセスすると、ちゃんとつながりました!よかった!

iptablesについて調べたこと

上記の対処により、OCI上のマシンへの通信は問題なく行えるようになり解決したのですが、
iptables、OCIのiptablesルールについて調べたことを記載します。

iptablesとは

Linuxに実装されたパケットフィルタリングおよびネットワークアドレス変換 (NAT) 機能であるNetfilterの設定を操作するコマンドのことです。
このパケットフィルタリング機能を利用し、対象のコンピュートへの通信をフィルタリングし、ファイアウォール機能を実現しています。

OCI提供のUbuntu iptablesルールの確認

以下は「sudo iptables -L」コマンド実行時に表示される
OCIで提供されるUbuntu 18.04 LTSのデフォルトのiptablesのルールです。

Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT udp -- anywhere anywhere udp spt:ntp ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination InstanceServices all -- anywhere link-local/16 Chain InstanceServices (1 references) target prot opt source destination ACCEPT tcp -- anywhere 169.254.0.2 owner UID match root tcp dpt:iscsi-target /* See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or removing this rule */ ※中略※ REJECT udp -- anywhere link-local/16 udp /* See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or removing this rule */ reject-with icmp-port-unreachable

チェインとは

INPUT、FORWARD、OUTPUT、InstanceServicesの4つのチェインがあります。
チェインとは、どのタイミングでパケットフィルタリングするか指定するためのものです。
用途に応じたルールの入れ物と考えられます。

  • INPUT:外部から対象コンピュート宛のパケットを制御するルールを記載する
  • FORWARD:別のホストへパケットを転送するルールを記載する
  • OUTPUT:対象コンピュートから外部へのパケットを制御するルールを記載する(※InstanceServicesへのジャンプルールを編集しないこと)
  • InstanceServices:インスタンスのブート・ボリュームとブロック・ボリュームのiSCSIネットワークのルール(※編集しないこと)

チェインとは

Chain ○○〇〇の後に記載されている(policy ACCEPT)の意味は、すべてのルールにマッチしなかった場合の動作です。

また、各チェイン内のルールは以下の内容で構成されています。

  • ターゲット:ACCEPT/REJECT/DROPなどパケットがルール該当した場合の処理を指定
  • プロトコル:TCP/UDP/ICMPなどのプロトコルを指定
  • パケット送信元:パケットの送信元IPアドレスやネットワークを指定
  • パケット宛先:パケットの宛先IPアドレスやネットワークを指定
  • オプション:ポート番号やパケットに対する詳細条件を指定

INPUTチェインルール

次にOCIのコンピュートに指定されているINPUTチェインルールを1行ずつ見てみましょう。

ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED

1行目に記載されているこのルールは、RELATED、ESTABLISHEDが指定されていますので、 確立済みの通信(ESTABLISHED)と関連パケット(RELATED)は、全てのプロトコルで、全ての送信元から、全ての宛先に通信を許可するというものです。

ACCEPT icmp -- anywhere anywhere

2行目のルールはプロトコルICMPの場合、全ての送信元から全ての宛先への通信を許可するというものです。

ACCEPT all -- anywhere anywhere

3行目のルールは一見、全てのプロトコルは全ての送信元から全ての宛先へ通信を許可すると見えてしまいますが、 実は指定されている受信インタフェースがLoopbackインタフェースのみとなっています。

「sudo iptables -L -v」コマンド実行することで適用インタフェースの確認が可能です。
以下は、出力結果の抜粋ですが、inの項目がloとなっており、
対象のルールの受信インタフェースがLoopbackインタフェースのみ指定されていることが分かります。

$ sudo iptables -L -v Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 109 9900 ACCEPT all -- lo any anywhere anywhere

次は4行目のルールです。

ACCEPT udp -- anywhere anywhere udp spt:ntp

このルールは、プロトコルUDPで送信元ポートがNTPの場合、全ての送信元から全ての宛先に通信を許可するというものです。 UDPで行うNTP同期では、対象コンピュートから時刻同期を行った際にNTPサーバからの戻りのパケットを許可してあげるためのルールになります。

ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh

5行目のルールは、プロトコルTCPで宛先ポートSSHの新規セッションについては、全ての送信元から全ての宛先に許可するものです。

REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

最後の6行目のルールは、全てのプロトコルで全ての送信元から全ての宛先への通信は、host-prohibitedメッセージを返して接続を拒否するというものです。

OCIのFORWARDチェインルール

OCIデフォルトのFORWARDチェインのルールは単純です。
先ほどのINPUTチェイン6行目のルールと同じで全ての通信はhost-prohibitedメッセージを返してFORWARDを拒否するというものです。

Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

OCIのOUTPUTチェインルール

最後のOUTPUTチェインのルールは、全ての送信元から169.254.0.0/16宛のパケットはInstanceServicesというチェインにジャンプして、InstanceServicesチェインでチェックされ評価するというものです。

Chain OUTPUT (policy ACCEPT) target prot opt source destination InstanceServices all -- anywhere link-local/16

尚、InstanceServicesチェインにはインスタンスのブート・ボリュームとブロック・ボリュームで使用されるiSCSIネットワーク・エンドポイント(169.254.0.2:3260、169.254.2.0/24:3260)に対する送信接続の確立を許可するルールが含まれています。

Chain InstanceServices (1 references) target prot opt source destination ACCEPT tcp -- anywhere 169.254.0.2 owner UID match root tcp dpt:iscsi-target /* See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or removing this rule */ ※中略※ REJECT udp -- anywhere link-local/16 udp /* See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or removing this rule */ reject-with icmp-port-unreachable

OUTPUT/InstanceServicesチェインでは、Link-Local宛の通信のみ対象となっておりますが、「Chain OUTPUT (policy ACCEPT)」が指定されており、OUTPUT/InstanceServicesチェインのルールにマッチしない場合、全ての通信が許可されます。
これにより、OCI上のコンピュートは外部への通信については任意の通信が可能になっています。

まとめ

今回はOCIのUbuntuサーバを利用する際の注意点として、iptablesがデフォルト有効となっている点をご紹介しました。
また、OCIのコンピュートのiptablesについて調べたことをまとめてみました。

次回以降はiptablesの存在を忘れないようにするぞ、という強い気持ちを持って今回は終わります。

最後までお読みいただきありがとうございました。

今回の記事は以上になりますが、
弊社では、他にも検証記事やクラウド移行に関する記事を作成しています。

・OCIと社内ネットワークをVPN接続してみた
https://cloudsolution.terilogy.com/blog/oci-vpn-20201225

・OCI上でWindows DHCPサーバを動かしてみた
https://cloudsolution.terilogy.com/blog/oci-windows-dhcp-server


RECENT POST「OCIでの設計上の注意」の最新記事


(OCI)Ubuntuインスタンスではiptablesに気をつけたい