Docker: iptables를 사용하여 인바운드 및 아웃바운드 트래픽 제한

Docker: iptables를 사용하여 인바운드 및 아웃바운드 트래픽 제한

Docker를 사용하여 Linux 서버에서 실행되는 많은 애플리케이션이 있습니다.

예를 들어 내 애플리케이션이 다음에서 실행된다고 가정해 보겠습니다.서버 A컨테이너(Docker)로.

CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS                     NAMES

df68695a00f1        app/myapp:latest   "/run.sh"           2 weeks ago         Up 2 days           0.0.0.0:50423->3000/tcp   reallymyapp

애플리케이션은 호스트 시스템의 포트 50423(컨테이너의 포트 3000에 매핑됨)에서 수신 대기 중입니다.

애플리케이션에 액세스하는 데 사용되는 DNS(엔드포인트)는 HAProxy 호스트를 가리킵니다(예:서버 B), 트래픽을 다음으로 라우팅서버 A: 50423.

지금까지 모든 것이 잘 작동하고 있습니다.

우리 조직의 보안 팀은 모든 외부 소스 IP가 그러한 Docker 호스트(예:서버 A) 그들은 특정 IP만 허용하도록 트래픽을 제한하기를 원합니다(서버 B이는 로드 밸런서) 컨테이너에 액세스하고 그 반대의 경우도 마찬가지입니다(서버 A도착하다서버 B). 그런 다음 사용자 컴퓨터에서 다음으로의 연결을 허용합니다.서버 B/로드 밸런서에만 해당됩니다.

이제 나는 Docker를 따르고 있습니다.문서그리고 iptables를 사용하여 DOCKER-USER 체인에 다음 규칙을 삽입해 보세요.

iptables -I DOCKER-USER -i ekf192 -s 10.1.2.10, 10.1.2.11, 10.1.2.12 -j ACCEPT
iptables -I DOCKER-USER -i ekf192 -j DROP


ACCEPT     all  --  10.1.2.10  anywhere
ACCEPT     all  --  10.1.2.11  anywhere
ACCEPT     all  --  10.1.2.12  anywhere
LOG        all  --  anywhere             anywhere             LOG level info prefix "IPTables Dropped: "
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

이러한 호스트(10.1.2.10, 10.1.2.11, 10.1.2.12)에서 들어오고 나가는 트래픽이 필요합니다.

이제 iptables에 대한 나의 (제한된) 이해에 따르면 이러한 규칙은 언급된 IP 주소에서 발생하지 않는 한 모든 들어오는 요청을 삭제해야 하며 그 반대의 경우도 마찬가지입니다. 즉, 언급된 IP로 나가는 트래픽을 허용해야 합니다.

들어오는 트래픽은 예상대로 작동하지만 이러한 호스트로 나가는 트래픽은 감소하고 있습니다.

나는 이것에 대해 머리를 긁적이며 무엇이 잘못되었는지 전혀 모릅니다. 말할 것도 없이 iptables 규칙이 어떻게 작동하는지 전혀 모릅니다.

Jan 12 16:24:43 sms100394 kernel: IPTables Dropped: IN=docker0 OUT=ekf192 MAC=02:42:09:37:a0:14:02:42:ac:11:00:02:08:00 SRC=172.17.0.2 DST=10.1.2.10 LEN=40 TOS=0x00 PREC=0x00 TTL=63 ID=40235 DF PROTO=TCP SPT=3000 DPT=42579 WINDOW=242 RES=0x00 ACK FIN URGP=0
Jan 12 16:24:44 sms100394 kernel: IPTables Dropped: IN=docker0 OUT=ekf192 MAC=02:42:09:37:a0:14:02:42:ac:11:00:02:08:00 SRC=172.17.0.2 DST=10.1.2.11 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=3000 DPT=45182 WINDOW=29200 RES=0x00 ACK SYN URGP=0
Jan 12 16:24:45 sms100394 kernel: IPTables Dropped: IN=docker0 OUT=ekf192 MAC=02:42:09:37:a0:14:02:42:ac:11:00:02:08:00 SRC=172.17.0.2 DST=10.1.2.12 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=3000 DPT=45182 WINDOW=29200 RES=0x00 ACK SYN URGP=0

답변1

기본적으로 iptables는 "스트림"을 이해하지 못하고 개별 패킷만 이해합니다. 따라서 나가는 패킷의 경우 별도의 규칙을 추가해야 합니다. 예:

iptables -I DOCKER-USER -i ekf192 -d 10.1.2.10, 10.1.2.11, 10.1.2.12

관련 정보