Firewalldは豊富なルールに従わず、ping以外のドッカーコンテナへの外部接続を提供しないようです。

Firewalldは豊富なルールに従わず、ping以外のドッカーコンテナへの外部接続を提供しないようです。

私は5.7.16-200.fc32.x86_64パッケージを含むFedora 32を使用していますfirewalldfirewalld-0.8.3-1.fc32.noarchDockerコンテナ(すべてのコンテナ、すべての画像)にはデフォルトでインターネットアクセスはありませんping。 (たとえば、pingリクエストでDNSサーバーに接続できないため、IPにはアクセスできますが、ドメインにはアクセスできません。)

特に、これまではファイアウォールについて何も知りませんでしたが、firewalld 問題を理解し、解決策を見つけるためにファイアウォールについて読んできました。

公式文書に加えて、firewalldDockerfirewalld他の多くのものの間の非互換性について読んでいます。私も選択肢があるpodmanことを知っていますDocker

しかし、私にとって、それは「働くようにしなさい、終わらせる」ではなく、「働かせなさい、終わらせる」である。WHY動作時と WHY動作しない時を最善を尽くして理解することです。

これを理解した後は、基本的にfirewalld状況は上記のようなものだと思います。

今これを変更したいと思います。たとえば、ドメインを介してpingを実行できるようにしたいとします。ブロックすると、ドメインのpingログに次のように表示されます。

FINAL_REJECT: IN="$CONTAINER_INTERFACE" OUT=wlp3s0 PHYSIN=vethb53e882 MAC=XX:....:XX SRC="$CONTAINER_IP" DST=1.1.1.1 LEN=56 TOS=0x00 PREC=0x00 TTL=63 ID=37255 DF PROTO=UDP SPT=57463 DPT=53 LEN=36

私はさまざまな方法を試しましたが、一部は動作し、一部は動作しません。しかし、私はこれがうまくいかなくても、いくつかはうまくいくはずだと思います。

firewalld満たされていないようですrich rules。私が理解しているように、a orをconnection1つzone (そして1つだけ)に渡すと、ルールが適用されます。何もない場合(、など)がそこに適用されます...存在する場合、その1つは次のとおりです。一致すると、値が接続に適用されます。そして最初のゲームは常に勝利します。interfacesourcezoneconnectionrich ruleszonetargetzoneACCEPTDROPconnectionrich rulesconnectionrich rule

ping以下は、さまざまな試みを含む端末のいくつかの出力です。各試行は、Dockerコンテナにドメインごとに機能する機能を提供するために機能するかどうかについてフラグが付けられます。

以下のすべての試みが効果を発揮しなければならないようです...それらのいくつかは、target次のように変更しようとするなど、必要ではないと考える作業を行っています。オフロード車。だから私の質問は、これがうまくいかないときになぜ動作しないのですか?何が問題なの?zoneDROPdefault target

container ipcontainer interfaceこれから簡単に参照できるように、およびの変数を定義します。

CONTAINER_IP="172.18.0.2"
CONTAINER_INTERFACE="br-71fe7cc090b3"

confをデフォルト値に簡単に復元する機能を定義しますfirewalld。これにより、すべての試行が同じ初期confで機能することがわかり、各試行の前にファイアウォールconfを完全に復元できます。

_restore_firewalld() {
    sudo cp -Ta /usr/lib/firewalld/ /etc/firewalld/ && \
    sudo restorecon -r /etc/firewalld/ && \
    sudo firewall-cmd --complete-reload && \
    sudo firewall-cmd --set-log-denied=unicast ##to log rejects
}

独立して作業でき、既定のfirewalld構成から復元されます。

$ _restore_firewalld && /
$ sudo firewall-cmd --permanent --zone=docker --add-source="$CONTAINER_IP" && \
$ sudo firewall-cmd --reload && \
success
Warning: ALREADY_SET: unicast
success
success
success

$ sudo firewall-cmd --info-zone=docker 
docker (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: docker0
  sources: 172.18.0.2
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

独立して作業でき、既定のfirewalld構成から復元されます。

$ _restore_firewalld && /
$ sudo firewall-cmd --permanent --zone=trusted --add-source="$CONTAINER_IP" && \
$ sudo firewall-cmd --reload && \
success
Warning: ALREADY_SET: unicast
success
success
success

$ sudo firewall-cmd --info-zone=trusted 
trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: 
  sources: 172.18.0.2
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

独立して作業でき、既定のfirewalld構成から復元されます。

$ _restore_firewalld && /
$ sudo firewall-cmd --permanent --zone=docker --add-interface="$CONTAINER_INTERFACE" && \
$ sudo firewall-cmd --reload && \
success
Warning: ALREADY_SET: unicast
success
success
success

$ sudo firewall-cmd --info-zone=docker 
docker (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: br-71fe7cc090b3 docker0
  sources: 
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

独立して作業でき、既定のfirewalld構成から復元されます。

$ _restore_firewalld && /
$ sudo firewall-cmd --permanent --zone=trusted --add-interface="$CONTAINER_INTERFACE" && \
$ sudo firewall-cmd --reload && \
success
Warning: ALREADY_SET: unicast
success
success
success

$ sudo firewall-cmd --info-zone=trusted 
trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: br-71fe7cc090b3
  sources: 
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

独立して作業でき、既定のfirewalld構成から復元されます。

$ _restore_firewalld && /
$ sudo firewall-cmd --permanent --zone=public --set-target=ACCEPT && \
$ sudo firewall-cmd --permanent --zone=public --add-source="$CONTAINER_IP" && \
$ sudo firewall-cmd --reload && \
success
Warning: ALREADY_SET: unicast
success
success
success

$ sudo firewall-cmd --info-zone=public 
success
public (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: 
  sources: 172.18.0.2
  services: dhcpv6-client mdns ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

デフォルトの復元設定ではそれ自体は機能しませんfirewalld

$ _restore_firewalld && /
$ sudo firewall-cmd --permanent --zone=docker --add-rich-rule="rule family=ipv4 source address="$CONTAINER_IP" accept" && \
$ sudo firewall-cmd --reload
success
Warning: ALREADY_SET: unicast
success
success
success

$ sudo firewall-cmd --info-zone=docker 
docker (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: docker0
  sources: 
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
    rule family="ipv4" source address="172.18.0.2" accept

デフォルトの復元設定ではそれ自体は機能しませんfirewalld

$ _restore_firewalld && /
$ sudo firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address="$CONTAINER_IP" accept" && \
$ sudo firewall-cmd --reload
success
Warning: ALREADY_SET: unicast
success
success
success

$ sudo firewall-cmd --info-zone=public 
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client mdns ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
    rule family="ipv4" source address="172.18.0.2" accept

デフォルトの復元設定ではそれ自体は機能しませんfirewalld

$ _restore_firewalld && /
$ sudo firewall-cmd --permanent --zone=public --add-source="$CONTAINER_IP" && \
$ sudo firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address="$CONTAINER_IP" accept" && \
$ sudo firewall-cmd --reload
success
Warning: ALREADY_SET: unicast
success
success
success
success

$ sudo firewall-cmd --info-zone=public 
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 172.18.0.2
  services: dhcpv6-client mdns ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
    rule family="ipv4" source address="172.18.0.2" accept

デフォルトの復元設定ではそれ自体は機能しませんfirewalld

$ _restore_firewalld && /
$ sudo firewall-cmd --permanent --zone=public --set-target=DROP && \
$ sudo firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address="$CONTAINER_IP" accept" && \
$ sudo firewall-cmd --reload
success
Warning: ALREADY_SET: unicast
success
success
success
success

$ sudo firewall-cmd --info-zone=public 
public
  target: DROP
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client mdns ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
    rule family="ipv4" source address="172.18.0.2" accept

デフォルトの復元設定ではそれ自体は機能しませんfirewalld

$ _restore_firewalld && /
$ sudo firewall-cmd --permanent --zone=public --set-target=DROP && \
$ sudo firewall-cmd --permanent --zone=public --add-source="$CONTAINER_IP" && \
$ sudo firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address="$CONTAINER_IP" accept" && \
$ sudo firewall-cmd --reload
success
Warning: ALREADY_SET: unicast
success
success
success
success
success

$ sudo firewall-cmd --info-zone=public 
public (active)
  target: DROP
  icmp-block-inversion: no
  interfaces: 
  sources: 172.18.0.2
  services: dhcpv6-client mdns ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
    rule family="ipv4" source address="172.18.0.2" accept

デフォルトの復元設定ではそれ自体は機能しませんfirewalld

$ _restore_firewalld && /
$ sudo firewall-cmd --permanent --zone=public --add-interface="$CONTAINER_INTERFACE" && \
$ sudo firewall-cmd --permanent --zone=public --add-source="$CONTAINER_IP" && \
$ sudo firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address="$CONTAINER_IP" accept" && \
$ sudo firewall-cmd --reload
success
Warning: ALREADY_SET: unicast
success
success
success
success
success

$ sudo firewall-cmd --info-zone=public 
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: br-71fe7cc090b3
  sources: 172.18.0.2
  services: dhcpv6-client mdns ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
    rule family="ipv4" source address="172.18.0.2" accept

関連情報