· 

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

こんにちは。Tachanです。

 

みなさま!来年にOCIの構築実践ガイドが出ますね!

各サービスの内容だけでなく、設計や構築方法なども記載されているとのことです。

各通販サイトでは予約が始まっております。

 

Amazon:www.amazon.co.jp/dp/4297118092

楽天:https://books.rakuten.co.jp/rb/16518966/

 

また、オラクルの日本の開発者チームによるYouTubeも開設されています!

ここでは開発者向けコミュニティで開催されたセミナーを見ることができます。

動画を拝見させていただきましたが、どれも興味深い内容で、システム構築の勉強になります。

 

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

 

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

1.ことの経緯

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

 

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

 

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

 

OCI上のFWやネットワークで止められているのかと思いましたが、

設定に不備は見当たりませんでした。

 

ネットワーク・セキュリティ・グループ(NSG)で該当のポートを追加したものの、

アクセスはできませんでした…

2.原因

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

 

そこでわかったことは、iptablesがデフォルトで有効になっていたことでした。

オラクルクラウド上で通信制御の設定していても、

このiptablesで全部拒否されていたのです。

 

調べてみると、オラクルクラウドのubuntuは、UFWではなくiptablesFW制御を行うようでした。

詳細はオラクルクラウドの公式ドキュメントに記載されています。

 

提供イメージ

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

3.対処

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ブラウザアクセスすると、ちゃんとつながりました!よかった!

4.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の存在を忘れないようにするぞ、という強い気持ちを持って今回は終わります。

 

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