環境
- OS:
- Ubuntu 20.04.3 LTS (Focal Fossa)
- docker 20.10.24
事象
WEBサーバーを立ち上げるべく、以下のコマンドを実行しました。
$docker run --name hogehoge -d -p 8080:80 nginx
しかし外部からWEBへのアクセスができません。
タイムアウトになります。
外部からnmapコマンドでポートを見ると、filteredになっている
外部サーバーなどからnmapコマンドでポートを見ると、Web公開に使ってるポートがfilteredになっています。
$ nmap Dockerを構築してるサーバーのIPアドレス
80/tcp filtered http
だが、Dockerホストやコンテナでnmapをたたくと、
open
になってるんだよなぁ~。
ポートを変えて純粋なnginxを起動しても事象変わらず。
$ docker run --name nginxtest -d -p 8080:80 nginx
でnginxコンテナを起動させて、
http://アドレス:8080
でブラウザアクセスしても、タイムアウトになります。
nmapの結果も変わらず、
8080が
filtered
の状態です。
原因
結論をいうと、
iptablesが原因でした。
詳細原因は、分からずじまいです。
ネットワーク環境の確認
- どっかのルータとかファイアウォール専用機とかVMでポートフィルタリングしてるか
同じLAN内にある他のVMマシンで、Dockerを搭載していないApacheサーバーを立ち上げてみた。
このサーバーでは同じ事象は起きていなかった。
- ブラウザでアクセスできる
- 外部環境からnmapたたくと、80番がopen である
Dockerホストでの確認3箇所
以下を確認する。
- Dockerコンテナ立ち上がってるか(Dockerホストから見れる時点で生きてるってわかるけど)
- ポートのマッピングを確認(本当に8080なんだろうね?)
- iptablesの確認(一番怪しい)
1つ1つ見ていきます。
まず、
- Dockerコンテナ立ち上がってるか(Dockerホストから見れる時点で生きてるってわかるけど)
$ docker ps
生きてました。
↓
次、
- ポートのマッピングを確認(本当に8080なんだろうね?)
$ docker port nginxtest
80/tcp -> 0.0.0.0:8080
80/tcp -> :::8080
このコマンド初めて知った。
ちゃんと80番が8080にマッピングされてます。
↓
次。
- iptablesの確認(一番怪しい)
以下のコマンドで、対象ポートがブロックされていないか、確認できる。
sudo iptables --list
怪しそうな部分がなさげだった。
ためしに
iptablesを殺してみる。
sudo ufw disable
↓
事象が解消された。
つまり以下の状態になった。
- ブラウザでアクセスできる
- 外部環境からnmapたたくと、Webサーバー用のポート8080番がopen である
iptablesの設定のどこがいけなかったのか?掘る
以下のコマンドでiptablesの設定を確認できる。
sudo iptables -L
じ、時間の関係で、追えませんでした。
。。。
Dockerのルールが追加されてなかったのかなー?
クラウドのAWSだとセキュリティグループで設定すれば良いのですがオンプレ環境などでDockerを利用する時にホスト側でファイアウォール設定します。
今まで使えてたんだけどなー。
↓
とりあえず、パッケージを最新化してみる。
$ sudo apt update
$ sudo apt upgrade
$ sudo reboot
※※↑OSが再起動されるから気をつけてね!※※
↓
ふたたびnginx起動
$ docker run -d -p 8080:80 nginx
↓
事象解消した。
つまり以下の状態になった。
- ブラウザでアクセスできる
- 外部環境からnmapたたくと、Webサーバー用のポート8080番がopen である
うーむ、詳細原因分からんまんまだが、まいっかー。
対処まとめ
暫定対処
iptablesの無効化
sudo ufw disable
恒久対処
パッケージの最新化
sudo apt update
sudo apt upgrade
sudo reboot
※※↑OSが再起動されるから気をつけてね!※※
コメント