GNU/Linux >> Linux の 問題 >  >> Linux

CentOS 8 の Docker CE コンテナーとの間のネットワーク接続がない

解決策 1:

関連するコンポーネントのログと構成を数日間調べた後、私はタオルを投げて Fedora 30 に戻ろうとしていました。

ファイアウォールに注目してみると、 firewalld を無効にすると トリックをしているように見えましたが、私はそれをしたくないです。 iptables でネットワーク ルールを検査している間 、 nftables への切り替えに気付きました iptables を意味します nftables のごく一部のみを表示する抽象化レイヤーになりました ルール。つまり、firewalld のすべてではないにしても、大部分を意味します。 構成は iptables の範囲外で適用されます .

私は iptables ですべての真実を見つけることができました ですので、これには慣れが必要です。

簡単に言えば、これを機能させるには、マスカレードを有効にする必要がありました。 dockerd のように見えました すでに iptables までこれを行っています 、しかしどうやらこれは 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 を再起動または再起動します 、およびイングレスとイーグレスの両方が機能するはずです。

解決策 2:

前の回答に欠けているのは、最初に docker インターフェイスを設定したゾーンに追加する必要があるという事実です。 public (または、ここで提案された「信頼できる」ゾーンに追加しますが、セキュリティの観点からは賢明ではないと思います)。デフォルトではゾーンに割り当てられていないためです。また、完了したら 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

解決策 3:

Docker のきめの細かいルールを設定できるようにするために、docker0 をゾーンに設定する必要はありませんでした。

# 1. Stop Docker
systemctl stop docker
# 2. Recreate DOCKER-USER chain in firewalld. 
firewall-cmd --permanent \
             --direct \
             --remove-chain ipv4 filter DOCKER-USER

firewall-cmd --permanent \
             --direct \
             --remove-rules ipv4 filter DOCKER-USER

firewall-cmd --permanent \
             --direct \
             --add-chain ipv4 filter DOCKER-USER

# (Ignore any warnings)

# 3. Docker Container <-> Container communication

firewall-cmd --permanent \
             --direct \
             --add-rule ipv4 filter DOCKER-USER 1 \
             -m conntrack --ctstate RELATED,ESTABLISHED \
             -j ACCEPT \
             -m comment \
             --comment 'Allow docker containers to connect to the outside world'

firewall-cmd --permanent \
             --direct \
             --add-rule ipv4 filter DOCKER-USER 1 \
             -j RETURN \
             -s 172.17.0.0/16 \
             -m comment \
             --comment 'allow internal docker communication'

# Change the Docker Subnet to your actual one (e.g. 172.18.0.0/16)
# 4. Add rules for IPs allowed to access the Docker exposed ports.

firewall-cmd --permanent \
             --direct \
             --add-rule ipv4 filter DOCKER-USER 1 \
             -o docker0 \
             -p tcp \
             -m multiport \
             --dports 80,443 \
             -i eth0 \
             -o docker0 \
             -s 1.2.3.4/32 \
             -j ACCEPT \
             -m comment \
             --comment 'Allow IP 1.2.3.4 to docker ports 80 and 443'
# 5. log docker traffic (if you like)

firewall-cmd --direct \
             --add-rule ipv4 filter DOCKER-USER 0 \
             -j LOG \
             --log-prefix ' DOCKER: '
# 6. Block all other IPs. 
This rule has lowest precedence, so you can add allowed IP rules later.

firewall-cmd --permanent \
             --direct \
             --add-rule ipv4 filter DOCKER-USER 10 \
             -j REJECT \
             -m comment \
             --comment 'reject all other traffic to DOCKER-USER'
# 7. Reload firewalld, Start Docker again
firewall-cmd --reload
systemctl start docker

これは /etc/firewalld/direct.xml で定義されたルールで終わります:

<?xml version="1.0" encoding="utf-8"?>
<direct>
  <chain ipv="ipv4" table="filter" chain="DOCKER-USER"/>
  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="0">-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -m comment --comment 'Allow docker containers to connect to the outside world'</rule>
  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="0">-j RETURN -s 172.17.0.0/16 -m comment --comment 'allow internal docker communication'</rule>
  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="0">-p tcp -m multiport --dports 80,443 -s 1.2.3.4/32 -j ACCEPT -m comment --comment 'Allow IP 1.2.3.4 to docker ports 80 and 443'</rule>
  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="0">-j LOG --log-prefix ' DOCKER TCP: '</rule>
  <rule ipv="ipv4" table="filter" chain="DOCKER-USER" priority="10">-j REJECT -m comment --comment 'reject all other traffic to DOCKER-USER'</rule>
</direct>

欠点は、Saustrup が述べているように、CentOS7 から containerd.io をインストールする必要があることです


Linux
  1. ネットワーク接続をテストするためのポートへのTelnet

  2. CentOS6.3からCentOS6.4にアップグレードします

  3. Do-release-upgradeを使用してDocker内のUbuntuを14.04から16.04にアップグレードしますか?

  1. Dockerの概要

  2. Dockerコンテナからカスタムイメージを作成する方法

  3. ホストから Docker コンテナのネットワーク名前空間にアクセスする方法

  1. CentOS 6.1 /CentOS6.0からCentOS6.2にアップグレードします

  2. Dockerイメージからファイルを抽出しますか?

  3. Ubuntu で docker を実行中:マウントされたホスト ボリュームはコンテナーから書き込み可能ではありません