iptables에서 PREROUTING을 사용하여 패킷 삭제

iptables에서 PREROUTING을 사용하여 패킷 삭제

필터 테이블이 패킷을 삭제하기에 가장 좋은 장소라는 데 동의했습니다.

그러나 기본적으로 Docker는 PREROUTING을 통해 자체 FORWARD 규칙으로 INPUT 필터링 규칙을 우회하여 Docker 컨테이너를 전 세계적으로 액세스할 수 있도록 합니다. 끼워 넣다도커명명된 필터 INPUT/FORWARD 규칙은 Docker가 다시 시작될 때 제거된 다음 삽입(추가되지 않음)되기 때문에 실패합니다.

나의 최선의 시도는 Docker 앞에 또 다른 PREROUTING 체인을 삽입하고 eth0(WAN)에서 블랙홀로 원치 않는 패킷을 보내는 것이었습니다.0.0.0.1- 더 이상 nat 테이블에서 DROP/REJECT를 수행할 수 없기 때문입니다.

# Route anything but TCP 80,443 and ICMP to an IPv4 black hole
iptables -t nat -N BLACKHOLE
iptables -t nat -A BLACKHOLE ! -i eth0 -j RETURN
iptables -t nat -A BLACKHOLE -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN
iptables -t nat -A BLACKHOLE -p tcp --dport 80 -j RETURN
iptables -t nat -A BLACKHOLE -p tcp --dport 443 -j RETURN
iptables -t nat -A BLACKHOLE -p icmp -j RETURN
iptables -t nat -A BLACKHOLE -p all -j DNAT --to 0.0.0.1
iptables -t nat -I PREROUTING -m addrtype --dst-type LOCAL -j BLACKHOLE

Docker 및 실행 중인 컨테이너가 포함된 NAT 체인의 모습은 다음과 같습니다.

Nat 테이블 규칙

이것은 잘 작동하는 것 같습니다. 그러나 다른 사전 라우팅 규칙에 도달하기 전에 패킷을 명시적으로 거부할 수 있는 방법이 있습니까?

(알파인 리눅스 3.6.2, Docker v17.05.0-ce)

답변1

누군가 애플리케이션을 임의의 주소에 바인딩하는 컨테이너를 배포하더라도 네트워크 트래픽을 "강화"해야 하는 비슷한 문제에 직면했습니다 0.0.0.0:port.

Docker는 필터 체인을 제공 DOCKER-USER하지만 모든 마법 DOCKERPREROUTING.

nat그러니 이 문제를 해결할 방법은 없습니다앞으로필터링, 도커 규칙에 대해 너무 많이 다루고 싶지 않습니다.

패킷을 다시 바꾸는 아이디어가 마음에 들지 않아서 기본적으로 모든 것을 반환하고 다른 체인으로 점프하는 방식을 생각해 냈습니다.PREROUTING 앞으로 DOCKER불렀다.

DOCKER그런 다음 교통 상황이 좋다고 생각되면 선택적으로 다시 뛰어듭니다.

코드는 다음과 같습니다.

iptables -t nat -N DOCKER-BLOCK
iptables -t nat -I PREROUTING -m addrtype --dst-type LOCAL -j RETURN
iptables -t nat -I PREROUTING -m addrtype --dst-type LOCAL -j DOCKER-BLOCK

그게 다야!

패킷은 DOCKER-BLOCK체인으로 점프하게 되며, 체인이 비어 있으면 체인 밖으로 점프하여 계속 PREROUTING점프 RETURN하여 차단됩니다.

포트를 활성화하는 경우:

iptables -t nat -I DOCKER-BLOCK -p tcp -m tcp --dport 1234 -j DOCKER

그러면 패킷이 DOCKER관리되는 체인으로 다시 점프하게 됩니다 docker. Docker는 패킷을 처리해야 하며 RETURN소스에 도달해서는 안 됩니다 .PREROUTING

무엇보다도, PREROUTING다시는 테이블을 만질 필요가 없으며, 물을 내리려면 물을 내리기만 하면 됩니다 DOCKER-BLOCK.

답변2

DOCKER-BLOCK 접근 방식의 문제점은 호스트와 컨테이너의 트래픽을 차단하려는 경우(예: tcp 포트 50 차단) 이를 DOCKER-BLOCK 체인에 추가하고(도커 규칙을 우회하기 위해) INPUT 체인(실제 드롭을 수행하기 위해).

관련 정보