web-dev-qa-db-ja.com

Centos 7 FirewallDを構成して、Dockerコンテナーがホストのネットワークポートに自由にアクセスできるようにするにはどうすればよいですか?

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アダプターで推測する)を単純に許可する方法はありますか?

36
adapt-dev

おそらく以前の答えよりも良いでしょう。

firewall-cmd --permanent --zone=trusted --change-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp
firewall-cmd --reload
38
kjetildm

これらのコマンドはトリックをしました:

firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp
12
adapt-dev

受け入れられているソリューションが機能する人もいれば、機能しない理由の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

これはコマンドラインでも実行できます。

2
Kevin Keane

次の許可されたドッカーは、firewalldを使用してCentOS 7のインターネットにアクセスできます

firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 4 -i docker0 -j ACCEPT
firewall-cmd --reload
systemctl restart docker
1
Jared Onnen