Ubuntu 18.04 に nginx を入れたら外部からアクセスできなくて iptables を編集した

Oracle Cloud で Ubuntu 18.04 イメージの Compute Instance を立てた。Compute には Public IP が付与されており、Security List などクラウド側のファイアウォール設定は正しく開いていて、80番ポートで Web サーバを立ち上げれば、外部からアクセスできるはずだった。

nginx をインストールし、サービスを起動。localhost ではきちんと nginx の HTML が返ってきていることを確認。

$ sudo apt install -y nginx
$ nginx -v
$ sudo systemctl enable nginx
$ sudo systemctl status nginx
$ curl http://localhost/

しかし、この Compute に付与した Public IP をブラウザで叩いてみても、nginx のページが開かない。

はて、なんでだろう。というのを解決するまでの記事。


はじめ、ファイアウォールを設定する ufw (Uncomplicated FireWall) の設定かな?と思い色々試して、必要なポートはきちんと開放したのに、状況は変わらず。

$ sudo ufw app list
$ sudo ufw enable
# SSH は切れずに済んだ
$ sudo ufw allow 'Nginx Full'
$ sudo ufw status

何してもダメだったので ufw を無効化してみたが、それでもダメ。

$ sudo ufw disable

試しに Compute 自身から Public IP を指定して叩いてみると、面白いエラーが出た。

# 念のため自分の Public IP を確認する
$ curl http://globalip.me/

$ curl http://【自分の Public IP】/

なんだこれー?


色々調べてみると、ufw が隠蔽してくれていた、大本の iptables の内容に問題がありそうだと分かった。

既存の iptables に設定されているルールを見てみる。

$ sudo iptables -L --line-numbers

何やらアレコレ ACCEPT だの REJECT だの DROP だの、大量の設定らしき文言が出てきた。細かいところは読み方が分からないが、おおよそファイアウォール設定があるなー、何かを REJECT、つまり拒否したりしていることは察しがついた。


同じ OCI 上で動いている、Oracle Linux ベースの Compute Instance の内容も見てみると、コチラはほぼ何も制限していないようだった。クラウド側で制御するからインスタンス側は別に制御しなくてもいいかなー、という気分。

じゃあ iptables を初期化して、とりあえず全部許可してみるか、ということで、以下を参考にした。

コチラは必要な設定をキチンと入れているスクリプトなのだが、その冒頭部分をパクって、ひとまず設定のリセットと全許可だけ入れてみることにした。

# 各種初期化・それぞれの意味はよく知らんw
$ sudo iptables -F  # テーブル初期化
$ sudo iptables -X  # チェーンを削除
$ sudo iptables -Z  # パケットカウンタ・バイトカウンタをクリア

# とりあえず全許可
$ sudo iptables -P INPUT   ACCEPT
$ sudo iptables -P OUTPUT  ACCEPT
$ sudo iptables -P FORWARD ACCEPT

ひとまずコレで外部からアクセスできるか試したら、正常にアクセスができた。よかつたよかつた。