Docker 컨테이너가 호스트의 네트워크 포트에 자유롭게 액세스할 수 있도록 Centos 7의 방화벽을 구성하는 방법은 무엇입니까?

Docker 컨테이너가 호스트의 네트워크 포트에 자유롭게 액세스할 수 있도록 Centos 7의 방화벽을 구성하는 방법은 무엇입니까?

CentOS 7에 Docker가 설치되어 있고 FirewallD를 실행 중입니다.

내 컨테이너 내부에서 호스트(기본값 172.17.42.1)로 이동합니다.

방화벽이 켜져 있습니다.

container# nc -v  172.17.42.1  4243
nc: connect to 172.17.42.1 port 4243 (tcp) failed: No route to host

방화벽 꺼짐

container# nc -v  172.17.42.1  4243
Connection to 172.17.42.1 4243 port [tcp/*] succeeded!

Firewalld에 대한 문서를 읽었지만 완전히 이해하지 못했습니다. 도커 컨테이너(제 생각에는 docker0 어댑터에 있는 것 같아요)의 모든 항목을 호스트 시스템에 무제한으로 액세스하도록 허용하는 방법이 있나요?

답변1

이전 답변보다 나을 수도 있습니다.

firewall-cmd --permanent --zone=trusted --change-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp
firewall-cmd --reload

답변2

다음 명령이 성공했습니다.

firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --permanent --zone=trusted --add-port=4243/tcp

답변3

승인된 솔루션이 일부 솔루션에서는 작동하지만 다른 솔루션에서는 작동하지 않는 이유 중 하나는 방화벽 설계 문제 때문입니다. Firewalld는 모든 연결에서 첫 번째로 일치하는 영역만 처리합니다. 또한 IP 주소 기반 영역을 먼저 처리한 다음 인터페이스 기반 영역을 처리합니다. 영역에 docker가 사용하는 IP 주소가 포함되어 있는 한 신뢰할 수 있는 영역의 ACCEPT 규칙은 처리되지 않습니다.

이를 확인하려면 nbt 백엔드를 사용하지 않는 한 생성된 iptables 규칙을 보면 됩니다.

iptables -vnL | less

해결책은 신뢰할 수 있는 영역 대신 방화벽 직접 규칙을 사용하는 것입니다. 직접 규칙은 항상 먼저 처리됩니다. 예를 들어 포트 3306(예: localhost의 mysqld)의 경우 다음 규칙이 필요합니다.

/bin/firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 10 -p tcp --dport 3306 -i docker0 -j ACCEPT

--permanent 스위치 없이 동일한 명령을 반복하면 Firewalld가 즉시 변경을 수행하므로 Docker를 다시 시작할 필요가 없습니다.

두 번째 이유는 docker 버전과 구성하는 네트워크에 따라 트래픽이 실제로 docker0 인터페이스를 통해 흐르지 않고 별도의 브리지 인터페이스를 통해 흐를 수 있다는 것입니다. 다음 명령을 사용하여 인터페이스를 볼 수 있습니다.

ip address show

이 브리지 인터페이스를 사용하여 위의 직접 규칙 문을 반복해야 합니다.

Docker에서 자체 네트워크를 지정할 수도 있습니다. 이 문서에서는 프로세스를 설명합니다.https://serverfault.com/questions/885470/how-to-configure-firewall-on-user-define-docker-bridge

즉, 다음과 같이 docker 파일에 네트워크 부분을 지정합니다.

version: '3'
  .
  .
  .
networks:
  mynetwork:
    driver_opts:
      com.docker.network.bridge.name: mynetwork_name

명령줄에서도 이 작업을 수행할 수 있습니다.

답변4

불행하게도 위의 솔루션 중 어느 것도 나에게 도움이 되지 않았습니다. 한 컨테이너는 여전히 다른 컨테이너에 액세스할 수 없습니다.

해결책:방화벽 비활성화

나는 이것을 이해하지만특히 나쁘다iptables, 그것은 작동하며 방화벽 비활성화로 인한 위험을 완화하는 데 필요한 방식으로 구성할 수 있었습니다.

sudo systemctl stop firewalld
sudo systemctl disable firewalld

Docker를 다시 시작할 필요는 없지만 다음과 같은 경우에 해당합니다.sudo systemctl restart docker

관련 정보