나는 달리고 있다동일한 호스트에 있는 두 개의 Docker 컨테이너동일한 브리지 네트워크인 Docker에 살고 있으며 모든 트래픽을 어느 정도 제한하도록 nftables를 설정했습니다(아래 규칙).
(내가 아는) 내 유일한 문제는한 컨테이너에서 다른 컨테이너로의 트래픽이 차단됩니다., 컨테이너가 사용하는 경우다른 컨테이너가 제공하는 서비스의 공개 URL.
예를 들어 서비스 A는 공용 DNS 항목이 있는 SMTP 서버이고 mail.acme.com
서비스 B는 웹 서버에 메일을 보내려는 앱입니다.이 URL을 사용하여. SMTP 서버는 외부에서 액세스할 수 있도록 구성됩니다(즉, 0.0.0.0:25:25
docker compose와 같은 포트 전달).
이 특별한 경우 nftables의 입력 인터페이스는 내 외부 인터페이스가 아니라 컨테이너가 있는 Docker 네트워크의 인터페이스입니다. 트래픽은 를 통해 라우팅되지 않으며 FORWARD
Docker에서 추가한 규칙은 적용되지 않으며 트래픽은 종료됩니다. 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