web-dev-qa-db-ja.com

CentOS 8上のDocker CEコンテナーとの間のネットワーク接続はありません

CentOSにdocker-ceの最新リリースをインストールしましたが、-隣接するサーバーから公開されたポートに到達できないおよび外部に到達できないからコンテナ自体。

NetworkManagerとFirewallDを有効にしてVanilla CentOS 8を実行する。デフォルトのファイアウォールゾーンはpublicです。

バージョン:

  • docker-ce 19.03.3(公式のDocker RPM)
  • containerd.io 1.2.6(CentOS 7の公式Docker RPM-CentOS 8ではまだ使用できません)
  • CentOS 8.0.1905(最小インストール)
10
Saustrup

数日かけて関連コンポーネントのログと構成を確認した後、タオルを投入してFedora 30に戻したところ、箱から出してすぐに機能するようです。

ファイアウォールに重点を置いて、firewalldを無効にすることでうまくいくように思えるが、私はそれを望まないことに気づいた。 iptablesを使用してネットワークルールを検査しているときに、nftablesへの切り替えにより、iptablesが、nftablesルールのごく一部のみを示す抽象化レイヤーになっていることがわかりました。つまり、すべてではないにしても、firewalld構成のほとんどがiptablesのスコープ外で適用されます。

私はiptablesで真実全体を見つけることができたので、慣れるまでに時間がかかります。

要するに、これが機能するためには、マスカレードを有効にする必要がありました。 dockerdiptablesを介してすでにこれを行っているように見えましたが、iptablesマスカレードが機能するには、ファイアウォールゾーンで特に有効にする必要があります。

# Masquerading allows for docker ingress and egress (this is the juicy bit)
firewall-cmd --zone=public --add-masquerade --permanent

# Specifically allow incoming traffic on port 80/443 (nothing new here)
firewall-cmd --zone=public --add-port=80/tcp
firewall-cmd --zone=public --add-port=443/tcp

# Reload firewall to apply permanent rules
firewall-cmd --reload

dockerdを再起動または再起動すると、入力と出力の両方が機能するはずです。

17
Saustrup

以前の回答に欠けているのは、最初に構成するゾーンにdockerインターフェイスを追加する必要があるという事実です。 public(または提案された「信頼された」ゾーンに追加 here ですが、セキュリティの観点からは賢明ではないでしょう)。デフォルトではゾーンに割り当てられていないためです。完了したら、必ずdockerデーモンをリロードしてください。

# Check what interface docker is using, e.g. 'docker0'
ip link show

# Check available firewalld zones, e.g. 'public'
Sudo firewall-cmd --get-active-zones

# Check what zone the docker interface it bound to, most likely 'no zone' yet
Sudo firewall-cmd --get-zone-of-interface=docker0

# So add the 'docker0' interface to the 'public' zone. Changes will be visible only after firewalld reload
Sudo nmcli connection modify docker0 connection.zone public

# Masquerading allows for docker ingress and egress (this is the juicy bit)
Sudo firewall-cmd --zone=public --add-masquerade --permanent
# Optional open required incomming ports (wasn't required in my tests)
# Sudo firewall-cmd --zone=public --add-port=443/tcp
# Reload firewalld
Sudo firewall-cmd --reload
# Reload dockerd
Sudo systemctl restart docker

# Test ping and DNS works:
docker run busybox ping -c 1 172.16.0.1
docker run busybox cat /etc/resolv.conf
docker run busybox ping -c 1 yourhost.local
2
masi

FirewallBackend変数を再びiptablesに変更しました。

このアップデートでは、nftablesフィルタリングサブシステムは、firewalldデーモンのデフォルトのファイアウォールバックエンドです。バックエンドを変更するには、/ etc/firewalld.confファイルのFirewallBackendオプションを使用します。

リンク: Centos8 Deprecated_functionality

この行動の変化に関する情報はあまりありません。 Dockerが使用しようとするiptablesルールの一部は、CentOS8のログによれば機能しません。

警告:COMMAND_FAILED: '/ usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed:iptables:Bad rule(does match a matching rule exists in that chain?).

0
TawHK