† 前回のあらすじというか動機
家庭内LANのラズパイ上で三年弱稼働したとある実行環境を、docker noob が docker-compose を用いてリプレイスした。内容的には python から node.js、apache から nginx なカンジ。
一通り完了したので docker のログを見ながらいろいろ粗探ししてたら家庭内LANのWindows機からウザい接触が頻発していることに気づいた。そういえば旧環境には iptables を施していたなぁ新環境にも適用しようかぁとか思ったら rules.v4 ファイルが存在していて中を見てみたら、設定した覚えのないルールがぎっしり書き込まれていてビックリ!
ホスト側の設定どうすればいいの? これ消しちゃまずいよね!?
† 環境
$ uname -a
Linux raspberrypi02 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.8 (stretch)
Release: 9.8
Codename: stretch
$ docker -v
Docker version 18.09.5, build e8ff056
$ docker-compose -v
docker-compose version 1.24.0, build 0aa5906
$ iptables --version
iptables v1.6.0
† やったこと
rules.v4 の書き換え
/etc/iptables/rules.v4 に docker が自作したっぽいルールを全消去して、ホスト側のルールだけ書く。
更新したルールの適用
$ sudo /usr/sbin/iptables-apply /etc/iptables/rules.v4
docker サービスの再起動
$ sudo systemctl restart docker
docker-compose で再ビルド
$ docker-compose up --build
以上。
ホスト側には自分で書いたルールが適用されて、docker network は自動作成されたルールで動く。
† この記事を記した理由
iptables が理由で docker 環境に問題が発生したというような記事は日本語・非日本語で散見されるが、docker 環境と干渉しないようにホスト側に設定を施す具体的な方法について明記された記事に出くわせなかった。Linuxに親しんだ層にはきっと当たり前すぎて記すほどではないのだろう。
いろいろ調べて深い沼に沈んでは容易ではなさそうだと感じて――DOCKER-USERに書けとか記されているのだが具体例がなかったり――放棄すること数度、dockerの公式ドキュメントを見たらそんなに難しくないんじゃね?と思えたので、やってみたら簡単だった。
ニッチっぽいので記録してみた。
† 留意点
- iptables を再起動すると docker が作成した iptables が効かなくなる。docker サービスの再起動が必要。
- 動作していた期間にもよると思うが、docker-compose up --build 時に既存の docker ログがターミナルを埋め尽くすイキオイで出力されるかもしれない。ctrl + c で停止、再度 docker-compose up --build で。当環境において二度目は発生していない。
† 参考
Dockerコンテナがiptablesのエラーで立ち上がらなくなった
ラズパイ2TypeBのファイアーウォール設定メモ
Raspberry Piを攻撃から守るための手順
† 追記
raspbian buster にしてみたらまた違う問題が発生したので、タグを変更。
2019/10/12時点で buster での完璧な対処はこちら。
Debian 10(buster) + ufw + Docker: Dockerコンテナが外部と通信できない問題の対処