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アダプターで推測する)を単純に許可する方法はありますか?
おそらく以前の答えよりも良いでしょう。
firewall-cmd --permanent --zone=trusted --change-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp
firewall-cmd --reload
これらのコマンドはトリックをしました:
firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp
受け入れられているソリューションが機能する人もいれば、機能しない理由の1つは、firewalldの設計上の問題です。 Firewalldは、すべての接続で最初に一致したゾーンのみを処理します。また、インターフェースに基づくゾーンの前に、IPアドレスに基づくゾーンを処理します。いずれかのゾーンにdockerが使用しているIPアドレスが含まれている限り、信頼ゾーンのACCEPTルールは処理されません。
これを確認するには、nbtバックエンドを使用していない限り、生成されたiptablesルールを確認します。
iptables -vnL | less
解決策は、信頼ゾーンの代わりにファイアウォールの直接ルールを使用することです。直接ルールは常に最初に処理されます。たとえば、ポート3306(つまり、ローカルホスト上の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-defined-docker-bridge
短いバージョンは、次のようにdocker-fileでnetworksセクションを指定することです。
version: '3'
.
.
.
networks:
mynetwork:
driver_opts:
com.docker.network.bridge.name: mynetwork_name
これはコマンドラインでも実行できます。
次の許可されたドッカーは、firewalldを使用してCentOS 7のインターネットにアクセスできます
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 4 -i docker0 -j ACCEPT
firewall-cmd --reload
systemctl restart docker