Centos7のfirewall-cmdでDockerコンテナに80番ポートからフォワーディングすると、コンテナから外へCurlが通らなくなる

 ながーいタイトルですがそのままです。Dockerコンテナを外部公開する時、標準ではiptablesを利用してポートフォワーディングするんです。しかしCentOS7でそんなことをすると、firewalledを無視してDockerコンテナのポートが外から見えるようになってしまいます。例えば以下の記事

glorificatio.org

ですので、firewalledの方でポートフォワーディングしてやる必要があります。これは firewall-cmd --zone=public --add-forward-port ... とかやってやればいいわけです。 以下参考。

zokibayashi.hatenablog.com

 問題はここからで、ポートフォワーディングのゾーンをpublicとして、Host側の80番ポートからフォワードすると、コンテナから外へCurl出来なくなるんですね。おそらくHTTP全般ダメになるので、Yumもできなくなります。これにだいぶハマっていました。

私はあまりiptablesとかそこらへんに強くないのでわからないのですが、どうもdockerの標準として、iptablesのfirewalledでいうPublicゾーンに相当する設定をゴリゴリと弄っているらしく、そこでポートフォワーディングするとダメみたいですね。

なので、インターネット側のNicのゾーンをExternalなんかに変更してやり、そのゾーンに対してポートフォワーディングの設定をしてやると、コンテナから外へCurlが飛ぶようになりました(Publicに設定したポートフォワーディングの設定は消しましょう。)。とりあえず対処療法的な解決で。

iptablesについてはある程度知っておいた方がよさそうなので、こんどチラっとお勉強しようと思いました。なおZoneの変更はnmcliコマンドで実施します。firewall-cmdでも変更できるんですが、再起動すると設定が消えてしまいます。以下参照。

blog.cles.jp

なお、Curl以外のコマンドやHTTPは試していないのであしからず。Pingは最初っから通りました。やれやれ。。。