저는 5.7.16-200.fc32.x86_64
패키지가 포함된 Fedora 32를 사용하고 있습니다 firewalld
. firewalld-0.8.3-1.fc32.noarch
Docker 컨테이너(모든 컨테이너, 모든 이미지)에는 기본적으로 인터넷 액세스가 없으며 ping
. (예: ping
요청으로 DNS 서버에 연결할 수 없기 때문에 IP로는 갈 수 있지만 도메인으로는 갈 수 없습니다.)
특히 이 이전에는 방화벽에 대해 아무것도 모르지만 firewalld
문제를 이해하고 해결책을 찾으려고 방화벽에 대해 읽어 왔습니다.
공식 문서 외에도 firewalld
저는 Docker
와 firewalld
그리고 다른 많은 것들 사이의 비호환성에 대해 읽었습니다. 나는 또한 대안이 존재한다는 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
(그리고 하나만)에 전달하면 규칙이 적용됩니다. 아무것도 없으면 ( , 등)이 거기에 적용됩니다... 존재하는 경우 그 중 하나는 다음과 같습니다. 일치하면 값이 연결에 적용됩니다. 그리고 첫 번째 게임은 항상 승리합니다.interface
source
zone
connection
rich rules
zone
target
zone
ACCEPT
DROP
connection
rich rules
connection
rich rule
ping
다음은 다양한 시도가 포함된 터미널의 일부 출력입니다. 각 시도는 도커 컨테이너에 도메인별로 작동할 수 있는 기능을 제공하기 위해 작동 여부에 대한 플래그가 지정됩니다 .
아래의 모든 시도가 효과를 발휘해야 할 것 같습니다... 그들 중 일부는 target
다음과 같이 변경하려고 시도하는 등 필요하지 않다고 생각하는 작업을 수행하고 있습니다. 오프로드 차량. 그래서 내 질문은 이것이 작동하지 않을 때 왜 작동하지 않는가입니다. 뭐가 문제 야?zone
DROP
default target
container ip
container 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