동일한 호스트에 있는 네트워크로 연결된 Docker 컨테이너가 공개 URL을 사용할 수 있도록 허용하는 nftables 규칙

동일한 호스트에 있는 네트워크로 연결된 Docker 컨테이너가 공개 URL을 사용할 수 있도록 허용하는 nftables 규칙

나는 달리고 있다동일한 호스트에 있는 두 개의 Docker 컨테이너동일한 브리지 네트워크인 Docker에 살고 있으며 모든 트래픽을 어느 정도 제한하도록 nftables를 설정했습니다(아래 규칙).

(내가 아는) 내 유일한 문제는한 컨테이너에서 다른 컨테이너로의 트래픽이 차단됩니다., 컨테이너가 사용하는 경우다른 컨테이너가 제공하는 서비스의 공개 URL.

예를 들어 서비스 A는 공용 DNS 항목이 있는 SMTP 서버이고 mail.acme.com서비스 B는 웹 서버에 메일을 보내려는 앱입니다.이 URL을 사용하여. SMTP 서버는 외부에서 액세스할 수 있도록 구성됩니다(즉, 0.0.0.0:25:25docker compose와 같은 포트 전달).

이 특별한 경우 nftables의 입력 인터페이스는 내 외부 인터페이스가 아니라 컨테이너가 있는 Docker 네트워크의 인터페이스입니다. 트래픽은 를 통해 라우팅되지 않으며 FORWARDDocker에서 추가한 규칙은 적용되지 않으며 트래픽은 종료됩니다. INPUT떨어진 곳에 .

Docker 인터페이스에서 허용된 포트로의 트래픽을 허용하는 개별 규칙을 설정하고 싶지 않습니다.

저는 서비스가 해당 URL을 사용할 수 있게 하고 Docker 설정에 사용되는 포트와 인터페이스에 구애받지 않는 솔루션을 찾고 있습니다. nftables만으로도 이것이 가능합니까?

지금까지 제가 생각해낸 유일한 것은 입력 인터페이스가 외부 인터페이스가 아닌 경우로 점프하는 것인데 INPUT그렇게 FORWARD하면 안 될 것 같은 느낌이 듭니다.


INPUT규칙은 다음과 같습니다.

        chain INPUT {
                type filter hook input priority filter; policy drop;
                ct state vmap { invalid : drop, established : accept, related : accept }
                iifname "lo" accept
                iifname "externalif0" icmp type echo-request accept
                iifname "externalif0" icmpv6 type echo-request accept
        }

컨테이너가 다른 컨테이너에 접근하려고 하면 이런 일이 발생합니다.동일한 호스트에서: (별로 관련성이 없어 보이는 추적 출력을 약간 잘라냈습니다.)

trace id 196c1ae6 ip filter trace_chain packet: iif "dockerbr0" ip saddr <containerip> ip daddr <public host ip> tcp sport 33546 tcp dport 443 
trace id 196c1ae6 ip nat PREROUTING packet: iif "dockerbr0" ip saddr <containerip> ip daddr <public host ip> tcp sport 33546 tcp dport 443 

trace id e7c2ca4b ip filter INPUT packet: iif "dockerbr0" ip saddr <containerip> ip daddr <public host ip> tcp sport 33546 tcp dport 443 

그리고 여기는외부 교통동일한 서비스에:

trace id 29f9da6c ip filter trace_chain packet: iif "externalif0" ip saddr <someip> ip daddr <public host ip> sport 36382 tcp dport 443 
trace id 29f9da6c ip nat PREROUTING packet: iif "externalif0" ip saddr <someip> ip daddr <public host ip> sport 36382 tcp dport 443 
trace id 29f9da6c ip nat DOCKER rule iifname != "dockerbr0" dport 443 dnat to <dockerip>:443 (verdict accept)

trace id 29f9da6c ip filter FORWARD packet: iif "externalif0" oif "dockerbr0" ip saddr <someip> daddr <containerip> sport 36382 tcp dport 443 
trace id 29f9da6c ip filter DOCKER rule iifname != "dockerbr0" oifname "dockerbr0" daddr <containerip> tcp dport 443 accept (verdict accept)

trace id 29f9da6c ip nat POSTROUTING packet: iif "externalif0" oif "dockerbr0" ip saddr <someip> ip daddr <containerip> sport 36382 tcp dport 443 

또한 호스트에서:

iptables-legacy -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

관련 정보