CentOS 7にDockerがインストールされており、FirewallDを実行しています。
コンテナ内でホスト(デフォルトは172.17.42.1)に移動します。
ファイアウォールがオンになっています。
container# nc -v 172.17.42.1 4243
nc: connect to 172.17.42.1 port 4243 (tcp) failed: No route to host
ファイアウォールオフ
container# nc -v 172.17.42.1 4243
Connection to 172.17.42.1 4243 port [tcp/*] succeeded!
Firewalldに関するドキュメントを読んだが、完全に理解していない。 Dockerコンテナ(私の意見ではdocker0アダプタにあると思います)のすべてのエントリをホストシステムに無制限にアクセスできるようにする方法はありますか?
答え1
以前の回答よりも良いかもしれません。
firewall-cmd --permanent --zone=trusted --change-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp
firewall-cmd --reload
答え2
次のコマンドが成功しました。
firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp
答え3
承認されたソリューションが一部のソリューションでは機能しますが、他のソリューションでは機能しない理由の1つは、ファイアウォールの設計上の問題です。 Firewalldは、すべての接続で最初に一致する領域のみを処理します。また、IPアドレスベースのゾーンを最初に処理してから、インターフェイスベースのゾーンを処理します。ゾーンにdockerが使用するIPアドレスが含まれている限り、信頼できるゾーンのACCEPTルールは処理されません。
これを確認するには、nbtバックエンドを使用しない限り、生成されたiptablesルールを表示します。
iptables -vnL | less
解決策は、信頼できる領域の代わりにファイアウォール直接ルールを使用することです。直接ルールは常に最初に処理されます。たとえば、ポート3306(localhostのmysqldなど)の場合は、次の規則が必要です。
/bin/firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 10 -p tcp --dport 3306 -i docker0 -j ACCEPT
--permanentスイッチなしで同じコマンドを繰り返すと、Firewalldはすぐに変更を実行するため、Dockerを再起動する必要はありません。
2番目の理由は、dockerのバージョンと設定するネットワークによっては、トラフィックが実際にdocker0インターフェイスを通過するのではなく、別々のブリッジインターフェイスを通過する可能性があることです。次のコマンドを使用してインターフェイスを表示できます。
ip address show
このブリッジインターフェイスを使用して上記の直接ルールステートメントを繰り返す必要があります。
Dockerで独自のネットワークを指定することもできます。この資料では、プロセスについて説明します。https://serverfault.com/questions/885470/how-to-configure-firewall-on-user-define-docker-bridge
つまり、次のようにdockerファイルにネットワーク部分を割り当てます。
version: '3'
.
.
.
networks:
mynetwork:
driver_opts:
com.docker.network.bridge.name: mynetwork_name
コマンドラインでもこれを行うことができます。
答え4
残念ながら、上記の解決策のどれも私には役に立ちませんでした。あるコンテナはまだ別のコンテナにアクセスできません。
解決策:ファイアウォールの無効化
私はこれを理解していますが、特に悪いiptables
、それは機能し、ファイアウォールの無効化によるリスクを軽減するために必要な方法で設定できました。
sudo systemctl stop firewalld
sudo systemctl disable firewalld
Dockerを再起動する必要はありませんが、次の場合に該当します。sudo systemctl restart docker