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】/
No route to host
ホストへの経路がありません
なんだこれー?
色々調べてみると、ufw
が隠蔽してくれていた、大本の iptables
の内容に問題がありそうだと分かった。
- 参考 : curl: (7) Failed to connect to x.x.x.x port xxxx: ホストへの経路がありません - Qiita
- 参考 : hidekiy blog: linux ping は通るのに No route to host と言われる
- 参考 : curl: (7) Failed to connectではまった話 - Qiita
既存の 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
ひとまずコレで外部からアクセスできるか試したら、正常にアクセスができた。よかつたよかつた。