Docker 포트를 차단하고 몇 개의 IP 주소를 통해 액세스하십시오.

Docker 포트를 차단하고 몇 개의 IP 주소를 통해 액세스하십시오.

Ubuntu 서버 16.04의 포트 8090으로 들어오는 모든 트래픽을 차단해야 합니다. iptables를 사용했지만 작동하지 않습니다. 내가 사용한 명령은 다음과 같습니다.

iptables -A INPUT -p tcp --dport 8090 -j DROP iptables -A INPUT -p tcp --dport 8090 -s <IP> -j ACCEPT

NAT에는 다음이 있습니다. Chain DOCKER (2 references) target prot opt source destination DNAT tcp -- anywhere <VM local IP> tcp dpt:8090 to:172.21.0.2:8080

공용 인터페이스 이름 지정 eth0및 Docker 인터페이스 이름 지정docker0

답변1

DNAT 때문에 당신은 지금라우팅. INPUT 체인은 더 ​​이상 이 DNATed 트래픽에 사용되지 않으며 대신 FORWARD 체인이 통과됩니다. 새로운 목적은 172.21.0.2:8080이것이 더 이상 규칙이 아닌 지금의 규칙이 되어야 한다는 것입니다 <VM local IP>:8090.

따라서 DNAT를 사용한 후에는 다음 방법을 사용하여 트래픽을 차단해야 합니다(올바른 순서: 예외를 허용한 다음 다른 모든 것을 허용하지 않음).

iptables -A FORWARD -s <IP> -d 172.21.0.2 -p tcp --dport 8080 -j ACCEPT
iptables -A FORWARD -d 172.21.0.2 -p tcp --dport 8080 -j DROP

시스템 규칙 이전에 실제로 완료되었는지 확인하려면 다음을 수행할 수 있습니다.

iptables -I FORWARD 1 -s <IP> -d 172.21.0.2 -p tcp --dport 8080 -j ACCEPT
iptables -I FORWARD 2 -d 172.21.0.2 -p tcp --dport 8080 -j DROP

구성에 따라 이러한 규칙은 다른 컨테이너가 이 컨테이너에 액세스하는 것을 방지할 수 있으므로 이를 조정해야 할 수도 있습니다(예: 외부 입력 인터페이스 선언). 그럼에도 불구하고 이를 시스템의 방화벽 접근 방식과 잘 통합할 수 있는 방법을 찾아야 합니다.

답변2

이 라인에 대해:

iptables -A INPUT -p tcp --dport 8090 -j DROP
iptables -A INPUT -p tcp --dport 8090 -s <IP> -j ACCEPT

순서를 변경해야 합니다.IP 테이블규칙은 충돌하는 상태에서 서로 덮어씁니다. 이것이 올바른 접근 방식이므로 먼저 이러한 규칙을 수정하고 다른 모든 역할을 확인하여 재정의를 방지하세요.

~에 대한네트워크 주소 변환아직 명확하지 않은 질문 중 하나는 docker에서 컨테이너를 시작할 때 포트를 할당해야 한다는 것입니다.

docker run ... -p 8090:8080 ... 

관련 정보