구글 AI가 외곡 된 개요를 보여줄 때도 있지만 종종 도움되는 설명을 해주는 경우도 자주 있다. 몇시간동안 삽질하다가 “docker container reject ip”로 구글링하여 표시된 AI 개요를 바탕으로 ChatGPT에 “fail2ban에서 sudo iptables -I DOCKER-USER -s 1.2.3.4 -j DROP 명령으로 ip를 차단하도록 하려면?”을 입력하여 출력 된 결과를 옮겨적는다.
설정파일 추가 (/etc/fail2ban/action.d/iptables-docker.conf)
[Definition]
actionstart = true
actionstop = true
actioncheck = true
actionban = iptables -I DOCKER-USER -s <ip> -j DROP
actionunban = iptables -D DOCKER-USER -s <ip> -j DROP
[Init]
name = default
gitlab의 ssh 로그 규칙 추가 (젠투 리눅스 기준 /etc/fail2ban/jail.conf)
[gitlab-sshd]
enabled = true
port = 1022
filter = sshd
logpath = /opt/docker/gitlab/logs/sshd/current
maxretry = 5
findtime = 60
bantime = 7d
mode = extra
action = iptables-docker[name=gitlab-sshed]
gitlab 컨테이너는 1022 -> 22로 포워딩 설정 되어 있으며 /var/log/gitlab를 호스트의 /opt/docker/gitlab/logs로 마운트 시킨 상태. 위 규칙은 sshd 필터를 사용(잰투 기준으로 gitlab 컨테이터의 sshd 로그가 필터링 되었다), mode는 extra로 복잡한 규칙까지 사용, 1022로 외부에서 연결되며 60초동안 5회 로그인 실패하면 7일간 차단한다.
iptable 액션으로 차단 안되던 아이피가 iptables-docker 액션을 추가하여 추가한 gitlab-sshd 규칙에 해당 action을 설정 후 fail2ban을 재시작하면 아래와같이 바로 차단되는것을 확인할 수 있다.

이번 삽질에서 또한번 겪게 된 문제지만, ChatGPT는 명확한 답을 가지고 있음에도 해결법을 찾아서 질의를 보내지 않으면 절대로 알려주지 않는 경우나 잘못 된 정보를 알려주는 경우가 의외로 자주 발생한다.
처음 질의는 ‘docker로 구동중인 gitlab의 ssh 서비스에 지속적인 접근 시도를 차단하는 방법은?’이였고 세가지 방법을 나열해주며 fail2ban을 추천한다고 알려주었다. 그 후 ‘fail2ban으로 차단하는 방법을 알려줘’, ‘연결이 차단되지 않아’ 등 많은 질의를 몇시간 주고 받다보니 체인을 생성하고 명시적으로 fail2ban에 생성 된 체인으로 등록되도록하면 된다고 알려주어 적용해보고, 인터페이스를 지정하면 된다고 알려주어 적용해보고, tcpdump로 1022로 들어가는것과 22에서 나가는것 캡쳐해서 알려주라는 등등 알려주는대로 해보니 점점더 미궁으로 빠졌다. 그 중엔 docker로 패킷이 전달 안되고 있지만 호스트에선 패킷이 수신되는것으로 보일 수 있다고 까지…
하지만 구글링으로 얻은 AI 개요의 내용 “fail2ban에서 sudo iptables -I DOCKER-USER -s 1.2.3.4 -j DROP 명령으로 ip를 차단하도록 하려면?”으로 질의를 보냈더니 ChatGPT는 아래와같은 설명을 해주었다.
기본적으로 fail2ban은 iptables의 기본 체인 (INPUT, FORWARD, 등)을 사용해 차단합니다. 하지만 Docker는 자체적으로 DOCKER, DOCKER-USER 등의 체인을 구성하며, 컨테이너로 들어오는 트래픽은 DOCKER-USER 체인을 통해 필터링할 수 있습니다.
따라서, IP 차단을 Docker 컨테이너에도 적용하려면 DOCKER-USER 체인을 사용하는 방식으로 fail2ban을 설정해야 합니다.
여기에서 열받는 포인트가 발생. “IP 차단을 Docker 컨테이너에도 적용하려면 DOCKER-USER 체인을 사용하는 방식으로 fail2ban을 설정해야 합니다.”라고 명확하게 차단 방법을 가지고 있었다는 것이다. 하지만 DOCKER-USER 체인은 단 한번도 언급하지 않고 다른 방법으로 삽질만 시킨것이다. 심지어 질의를 주고받는 중간중간 iptables -L -n명령으로 아래와같이 출력되는 결과를 여러번 알려주었었다.
tun ~ # iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0
DOCKER-FORWARD all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (5 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.16.5.2 tcp dpt:433
ACCEPT tcp -- 0.0.0.0/0 172.16.5.2 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 172.16.5.2 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 172.20.0.4 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 172.18.0.2 tcp dpt:8123
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:9001
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:1883
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:9443
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:9000
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:8000
DROP all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
(생략)
도커의 컨테이너 iptables -L -n으로 출력 된 결과에 DOCKER-USER라는 체인이 상단에 있는데도 단 한번도 DOCKER-USER로 등록해야한다는 내용을 알려주지 않았다. 모델 5정도는 나와야 이런일이 줄어드려나? 싶다.