관리 메뉴

백엔드 개발자 블로그

Docker trouble with iptable 본문

트러블 슈팅

Docker trouble with iptable

backend-dev 2025. 5. 23. 18:20

문제 상황

DB log를 보니 아래와 같은 외부 공격이 이뤄지고 있었다.

우리 redis를 slave로 사용해서 요금 폭탄을 나눠주려고 공격을 시도하고 있다.

1:S 21 May 2025 04:35:09.626 * MASTER <-> REPLICA sync started
1:S 21 May 2025 04:35:09.626 * REPLICAOF 8.219.136.159:60121 enabled (user request from 'id=199 addr=60.172.131.15:44468 laddr=172.17.0.3:6379 fd=23 name= age=1 idle=0 flags=N db=0 sub=0 psub=0 ssub=0 multi=-1 watch=0 qbuf=29 qbuf-free=20445 argv-mem=25 multi-mem=0 rbs=1024 rbp=155 obl=0 oll=0 omem=0 tot-mem=22449 events=r cmd=slaveof user=default redir=-1 resp=2 lib-name= lib-ver= io-thread=0')
1:M 22 May 2025 06:44:03.402 # Possible SECURITY ATTACK detected. It looks like somebody is sending POST or Host: commands to Redis. This is likely due to an attacker attempting to use Cross Protocol Scripting to compromise your Redis instance. Connection from 3.143.33.63:44202 aborted.
1:M 22 May 2025 07:12:23.504 * DB saved on disk

 

 

ufw 설정을 했는데, 어떻게 redis에 직접 접근할 수 있는걸까?

To                         Action      From
--                         ------      ----
80                         ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
80 (v6)                    ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

 

먼저 실제 포트 접근 제어 담당하는 iptables를 확인했다.

예상대로 ufw와 chain을 형성하고, 이를 통해 접근을 제어하고 있었다.

-A ufw-user-input  -p tcp --dport 22   -j ACCEPT   # SSH 허용
-A ufw-user-input  -p tcp --dport 80   -j ACCEPT   # HTTP 허용
-A ufw-user-input  -p tcp --dport 443  -j ACCEPT   # HTTPS 허용

 

그런데 이상한게 보인다. 

Docker도 iptables를 제어하고 있다.

-A DOCKER-USER -j RETURN
-A DOCKER ! -i docker0 -o docker0 -j DROP
-A DOCKER ! -i br-089c8c278103 -o br-089c8c278103 -j DROP
-A DOCKER ! -i br-f572d12d6428 -o br-f572d12d6428 -j DROP

-A DOCKER-BRIDGE -o docker0      -j DOCKER
-A DOCKER-BRIDGE -o br-089c8c278103 -j DOCKER
-A DOCKER-BRIDGE -o br-f572d12d6428 -j DOCKER

-A DOCKER-CT     -o docker0       -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-CT     -o br-089c8c278103 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A DOCKER-CT     -o br-f572d12d6428 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-A DOCKER-FORWARD -j DOCKER-CT
-A DOCKER-FORWARD -j DOCKER-ISOLATION-STAGE-1
-A DOCKER-FORWARD -j DOCKER-BRIDGE
-A DOCKER-FORWARD -i docker0   -j ACCEPT
-A DOCKER-FORWARD -i br-089c8c278103 -j ACCEPT
-A DOCKER-FORWARD -i br-f572d12d6428 -j ACCEPT

-A DOCKER-ISOLATION-STAGE-1 -i docker0      ! -o docker0      -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-089c8c278103 ! -o br-089c8c278103 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-f572d12d6428 ! -o br-f572d12d6428 -j DOCKER-ISOLATION-STAGE-2

-A DOCKER-ISOLATION-STAGE-2 -o br-f572d12d6428 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-089c8c278103 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o docker0      -j DROP

 

 

조사해보니 docker를 사용하게 되면 iptables과 자동으로 체인되고, 외부에서 바로 docker container에 접근할 수 있다고 한다.


 

문제 해결 과정

자, 해당 문제를 해결해 보겠다.

 

1. Docker가 iptables의 조작을 금지하게 설정 - 비권장

/etc/docker/daemon.js에서 아래와 같이 작성하면 되긴 한데, 도커간 네트워크 통신에 영향을 끼치기에 권장하지 않는다.

iptables = false

 

2. 외부 방화벽을 사용 - 비권장

외부 방화벽 따로 구성해야 되니 패스

 

3. docker 컨테이너 생성시 포트맵핑을 로컬에만 바인드

아래와 같이 port 설정을 로컬에만 바인드해주자. 

 

외부 통신을 하고 싶다면 local port 설정 + nginx proxy 설정을 해주고,

-p 127.0.0.1:6379:6379
location /chat/v3/api-docs {
        proxy_pass http://localhost:6379/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
}

 

내부통신만 필요한 경우 port 설정 대신 expose 설정만 해주자

expose:
	"6379"

 

'트러블 슈팅' 카테고리의 다른 글

OOM  (4) 2025.08.04
S3 업로드 속도 개선, Pre-signed url과 Thumbnail Lambda  (3) 2025.07.31
Stored Procedure  (0) 2025.05.08
로그와 메트릭  (0) 2025.05.08
외부 api 장애 최소화  (0) 2025.05.08