Firewalld는 풍부한 규칙을 따르지 않고 핑 이외의 도커 컨테이너에 대한 외부 연결을 제공하지 않는 것 같습니다.

Firewalld는 풍부한 규칙을 따르지 않고 핑 이외의 도커 컨테이너에 대한 외부 연결을 제공하지 않는 것 같습니다.

저는 5.7.16-200.fc32.x86_64패키지가 포함된 Fedora 32를 사용하고 있습니다 firewalld. firewalld-0.8.3-1.fc32.noarchDocker 컨테이너(모든 컨테이너, 모든 이미지)에는 기본적으로 인터넷 액세스가 없으며 ping. (예: ping요청으로 DNS 서버에 연결할 수 없기 때문에 IP로는 갈 수 있지만 도메인으로는 갈 수 없습니다.)

특히 이 이전에는 방화벽에 대해 아무것도 모르지만 firewalld 문제를 이해하고 해결책을 찾으려고 방화벽에 대해 읽어 왔습니다.

공식 문서 외에도 firewalld저는 Dockerfirewalld그리고 다른 많은 것들 사이의 비호환성에 대해 읽었습니다. 나는 또한 대안이 존재한다는 podman것을 알고 있습니다 Docker.

하지만 나에게 있어 그것은 "일하게 놔두라, 끝내라"가 아니라 "일하게 하라, 끝내라"이다. WHY작동할 때와 WHY작동하지 않을 때 를 최선을 다해 이해하는 것입니다 .

이것을 이해한 후에는 firewalld기본적으로 상황이 위에서 설명한 것과 같다고 생각합니다.

이제 이것을 변경하고 싶습니다. 예를 들어 도메인을 통해 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 를 connection하나 zone (그리고 하나만)에 전달하면 규칙이 적용됩니다. 아무것도 없으면 ( , 등)이 거기에 적용됩니다... 존재하는 경우 그 중 하나는 다음과 같습니다. 일치하면 값이 연결에 적용됩니다. 그리고 첫 번째 게임은 항상 승리합니다.interfacesourcezoneconnectionrich ruleszonetargetzoneACCEPTDROPconnectionrich rulesconnectionrich rule

ping다음은 다양한 시도가 포함된 터미널의 일부 출력입니다. 각 시도는 도커 컨테이너에 도메인별로 작동할 수 있는 기능을 제공하기 위해 작동 여부에 대한 플래그가 지정됩니다 .

아래의 모든 시도가 효과를 발휘해야 할 것 같습니다... 그들 중 일부는 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

관련 정보