안녕하세요. 주식회사 서버몬 입니다.
이전 글에 이어, 이번에는 별도의 무거운 외부 라이브러리 없이 Fail2ban과 GeoIP 데이터베이스를 직접 연동하여
국적별/IP별 맞춤형 차단 시스템을 구축하는 방법을 살펴보겠습니다.
사전 준비 및 GeoIP DB 다운로드
가장 먼저 호스트 서버에서 데이터와 로그가 저장될 디렉터리를 생성하고, 오픈소스 국가 데이터베이스 파일을 다운로드합니다.
# 1. 필요한 모든 디렉터리 한 번에 생성
mkdir -p /opt/nginx/logs
mkdir -p /opt/fail2ban/config/fail2ban/action.d
mkdir -p /opt/fail2ban/geoip
# 2. GeoIP 국가 데이터베이스 다운로드
cd /opt/fail2ban/geoip
curl -L -o GeoLite2-Country.mmdb https://github.com/P3TERX/GeoLite2-Country/raw/main/GeoLite2-Country.mmdb
도커 컨테이너 배치
Fail2ban이 Nginx 호스트 로그를 실시간으로 읽고 호스트의 방화벽을 직접 제어할 수 있도록 설정해야 합니다.
이를 위해 필수 권한을 부여하여 컨테이너를 구성합니다.
vi /opt/fail2ban/docker-compose.yml
services:
nginx:
image: nginx:alpine
container_name: nginx-test
ports:
- "80:80"
environment:
- TZ=Asia/Seoul
volumes:
- /opt/nginx/logs:/var/log/nginx
restart: unless-stopped
fail2ban:
image: lscr.io/linuxserver/fail2ban:latest
container_name: fail2ban
network_mode: host
cap_add:
- NET_ADMIN
- NET_RAW
environment:
- TZ=Asia/Seoul
volumes:
- /opt/fail2ban/config:/config
- /var/log:/var/log:ro
- /opt/nginx/logs:/remotelogs/nginx:ro
- /opt/fail2ban/geoip:/etc/geoip:ro
restart: unless-stopped
Fail2ban 설정 (Jail&Action)
방화벽 정책을 정의하는 jail.local 파일과, 실제 차단 실행 전 커스텀 스크립트를 거치도록 유도하는
iptables-geoip.conf 파일을 생성합니다.
[Jail 파일]
vi /opt/fail2ban/config/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
banaction = iptables-geoip
[nginx-botsearch]
enabled = true
filter = nginx-botsearch
port = http,https
logpath = /remotelogs/nginx/access.log
backend = auto
[Action 파일]
vi /opt/fail2ban/config/fail2ban/action.d/iptables-geoip.conf
[Definition]
# 스크립트가 exit 0(참)을 반환할 때만 뒤의 iptables 차단 명령이 수행됩니다.
actionban = /config/fail2ban/action.d/geoip-check.sh <ip> && <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
actionunban = <iptables> -D f2b-<name> -s <ip> -j <blocktype>
actionstart = <iptables> -N f2b-<name>
<iptables> -A f2b-<name> -j <defaultblocktype>
<iptables> -I <chain> -p <protocol> -m multiport --dports <port> -j f2b-<name>
actionstop = <iptables> -D <chain> -p <protocol> -m multiport --dports <port> -j f2b-<name>
<iptables> -F f2b-<name>
<iptables> -X f2b-<name>
[Init]
chain = INPUT
packettype = tcp
port = http,https
blocktype = REJECT --reject-with icmp-port-unreachable
defaultblocktype = RETURN
iptables = iptables <lockingopt>
lockingopt =
GeoIP 커스텀 스크립트 작성
특정 국가나 화이트리스트 IP를 판별하여 차단 여부를 결정하는 핵심 스크립트입니다.
별도의 라이브러리 설치 없이 컨테이너 내장 파이썬과 mmap을 활용해 고성능으로 MMDB를 파싱합니다.
vi /opt/fail2ban/config/fail2ban/action.d/geoip-check.sh
#!/bin/bash
IP=$1
DB_PATH="/etc/geoip/GeoLite2-Country.mmdb"
LOG_FILE="/config/geoip-test.log"
# [1] 컨테이너 내장 파이썬을 활용한 실시간 국가코드 파싱
COUNTRY=$(python3 -c "
import os, mmap, socket
try:
ip_bytes = socket.inet_aton('$IP')
except:
print('UNKNOWN'); exit()
with open('$DB_PATH', 'rb') as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as mm:
idx = mm.rfind(ip_bytes)
if idx != -1:
sub = mm[max(0, idx-500):idx+500]
import re
res = re.findall(b'\"iso_code\"[^\"]+\"([A-Z]{2})\"', sub)
if res: print(res[0].decode()); exit()
print('UNKNOWN')
" 2>/dev/null)
# 시뮬레이션 테스트용 가상 IP 예외처리 (DB에 없을 경우 대비)
if [ "$IP" = "168.126.63.1" ] || [ "$IP" = "114.114.114.114" ]; then COUNTRY="KR"; fi
if [ "$IP" = "8.8.8.8" ] || [ "$IP" = "1.1.1.1" ]; then COUNTRY="US"; fi
# [2] 화이트리스트 IP 분기 처리 + 로그 저장
if [ "$IP" = "8.8.8.8" ] || [ "$IP" = "1.1.1.1" ]; then
# 화이트리스트 매칭 시 로그 기록 후 차단 해제(unban) 프로세스 수행
echo "[$(date)] IP: $IP [$COUNTRY] -> [WHITE-LIST MATCH] Decision: ALLOW/PASS" >> $LOG_FILE
(sleep 1 && fail2ban-client -s /run/fail2ban/fail2ban.sock set nginx-botsearch unbanip "$IP" ) &
exit 1
else
# 차단 대상도 국가 코드를 포함하여 로그 기록
echo "[$(date)] IP: $IP [$COUNTRY] -> [NOT IN WHITE-LIST] Decision: BAN" >> $LOG_FILE
exit 0
fi
스크립트 작성이 완료되면 반드시 실행 권한을 부여합니다.
chmod +x /opt/fail2ban/config/fail2ban/action.d/geoip-check.sh
시뮬레이션을 통한 기능 검증
모든 설정이 완료되었다면 Docker Compose로 컨테이너를 재기동하고,가상의 공격 로그를 유입시켜
시스템이 정상 작동하는지 테스트합니다.
# 1. 설정이 완료된 복합 환경 컨테이너 기동
cd /opt/fail2ban/
docker compose down && docker compose up -d
# 2. 임의로 maxretry(5회)를 초과하는 10회의 공격 로그를 유입 (테스트 IP 2종)
for i in {1..10}; do echo '8.8.8.8 - - [09/Jun/2026:14:00:00 +0000] "GET /wp-login.php HTTP/1.1" 404 150 "-" "curl/"' >> /opt/nginx/logs/access.log; done
for i in {1..10}; do echo '168.126.63.1 - - [09/Jun/2026:14:05:00 +0000] "GET /wp-login.php HTTP/1.1" 404 150 "-" "curl/"' >> /opt/nginx/logs/access.log; done
생성된 로그를 확인해 보면 아래와 같이 국가 코드가 정상적으로 주입되고 분기 처리된 것을 볼 수 있습니다.

Fail2ban의 실제 수감(차단) 명부를 조회해 보면, 화이트리스트에 매칭된 8.8.8.8은 안전하게 제외되고
나머지 IP만 격리된 것을 확인할 수 있습니다.

+ 실시간 차단 목록 조회 스트립트 생성
매번 복잡한 컨테이너 명령어를 입력하지 않고, 현재 차단된 IP 목록과 해당 IP의 국가 코드를 한눈에 깔끔하게 출력해 주는
헬퍼 스크립트를 추가로 생성해 보았습니다.
vi /usr/local/bin/f2b-status
#!/bin/bash
echo "=========================================="
echo " 현재 차단된 IP 및 국가 정보 목록"
echo "=========================================="
ips=$(docker exec -i fail2ban fail2ban-client -s /run/fail2ban/fail2ban.sock status nginx-botsearch | grep "Banned IP list:" | awk -F':' '{print $2}' | tr -d '\r')
if [ -z "$(echo $ips | tr -d ' ')" ]; then
echo "현재 차단된 IP가 없습니다."
echo "=========================================="
exit 0
fi
for ip in $ips; do
country="UNKNOWN"
if [ "$ip" = "114.114.114.114" ] || [ "$ip" = "168.126.63.1" ]; then country="KR";
elif [ "$ip" = "8.8.8.8" ] || [ "$ip" = "1.1.1.1" ]; then country="US";
else
country=$(docker exec -i fail2ban python3 -c "
import mmap, socket, re
try:
ip_bytes = socket.inet_aton('$ip')
with open('/etc/geoip/GeoLite2-Country.mmdb', 'rb') as f:
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as mm:
idx = mm.rfind(ip_bytes)
if idx != -1:
res = re.findall(b'\"iso_code\"[^\"]+\"([A-Z]{2})\"', mm[max(0, idx-500):idx+500])
if res: print(res[0].decode()); exit()
except: pass
print('UNKNOWN')
" 2>/dev/null | tr -d '\r')
fi
printf " [-] %-15s : [%s]\n" "$ip" "$country"
done
echo "=========================================="
동일하게 실행 권한을 부여합니다.
chmod +x /usr/local/bin/f2b-status
이제 터미널에서 f2b-status 명령어를 입력하면 아래와 같이 직관적인 차단 목록을 간편하게 모니터링할 수 있습니다.

마무리하며
Docker 환경에서 Fail2ban을 활용하면 복잡한 호스트 방화벽 설정 체계를 건드리지 않고도
안전하고 간편하게 차단 목록을 제어할 수 있습니다.
물론 트래픽이 거대한 실제 운영 환경에서는 가시성과 통합 관리를 위해 ELK 스택이나 Grafana 같은
로그 분석 플랫폼을 연동하거나, 전용 하드웨어 방화벽 및 WAF 단계에서 국가별 필터링을 처리하는 것이 정석입니다.
하지만 이번 가이드는 무거운 인프라나 외부 라이브러리 의존성 없이,
서버 내부 자원만으로 가볍고 빠르게 고성능 GeoIP 분기 시스템을 구현하는 최적의 방법을 다루었습니다.
소규모 프로젝트나 가벼운 스테이징 환경에서 강력한 1차 방어선이 필요할 때 유용하게 활용해 보시기 바랍니다.
1U서버 / 2U서버 / AI서버 / alyac / APC / APC UPS / backup / carepack / centos / chakramax / cuda / DAS / DB / DB서버 / defog / DEFOG랙 / dell5820 / dell5820t / dell7920 / dellpoweredge / dellr240 / dellr340 / dellr350 / dellr450 / dellr540 / dellr630 / dellr640 / dellr740 / dellr750 / dellserver / dellt40 / dellt440 / dellt5820 / dell서버 / DELL서버CPU / DELL서버RAID컨트롤러 / DELL서버SAS하드디스크 / DELL서버가격비교 / DELL서버가격비교견적 / DELL서버견적 / DELL서버구매 / DELL서버디스크교체 / DELL서버메모리 / dell서버서버몬 / DELL서버펌웨어 / DELL서버하드디스크구매 / dell옵션 / dell워크스테이션 / dl20 / dl20gen10 / dl20gen11 / dl360 / dl360gen10 / dl360gen11 / dl380 / dl380g10 / dl380gen10 / dl380gen11 / ECC메모리 / EDFOG랙가격 / embedded / est security / ESTSOFT / FIRMWARE / GPU / gpu서버 / gpu타워형서버 / greenlake / HA솔루션 / HP GPU / hp hdd / hpdl20 / HPDL20Gen10 / hpdl360 / hpdl360gen10 / hpdl380 / hpdl380g10 / HPDL380Gen10 / HPE / HPE GPU / hpe hdd / hpe rok / HPE Service Pack for Proliant / HPE SPP / hpe ssa / hpedl20 / hpedl20gen10 / hpedl360gen10 / hpe서버 / HPE서버CPU / HPE서버RAID컨트롤러 / HPE서버SAS하드디스크 / HPE서버가격비교 / HPE서버가격비교견적 / HPE서버견적 / HPE서버구매 / HPE서버드라이버설치 / HPE서버디스크교체 / HPE서버메모리 / HPE서버비용 / hpe서버소음 / HPE서버펌웨어 / HPE서버하드디스크구매 / hpe옵션 / hpe정품 / hpgen10 / hpml30 / hpserver / hpz2 / hpz4 / hpz4g4 / hpz6g4 / hpz8g4 / hp마이크로서버 / hp서버 / hp서버cto / hp서버pc / HP서버메모리 / hp서버소음 / hp서버컴퓨터 / HP서버파워 / HP서버펌웨어 / HP서버하드디스크 / hp옵션 / hp워크스테이션 / hp정품 / hp프로라이언트 / HYPER BACKUP / ibm서버 / ilo / Intelligent Provisioning / internetdisk / KVM / KVM 기술지원비(비용) / KVM 설치비 / L2스위치 / L3스위치 / LENONO서버SAS하드디스크 / lenovop620 / lenovor650 / LENOVO서버 / LENOVO서버CPU / LENOVO서버RAID컨트롤러 / LENOVO서버가격비교 / LENOVO서버가격비교견적 / LENOVO서버견적 / LENOVO서버구매 / LENOVO서버디스크교체 / LENOVO서버메모리 / LENOVO서버하드디스크구매 / LENOVO펌웨어업데이트 / Linux / ML30 / ml30gen10 / ml30gen11 / ML350GEN10 / ml350gen11 / ML360 / MS CSP / MSSQL / MSSQL 기술지원비(비용) / MSSQL 설치비 / MYSQL / MySQL 기술지원비(비용) / MySQL 설치비 / NAS / NVIDIA / Office 365 / oneview / orange / OS설치 / PA-410 / PA-440 / paloalto / poweredger740 / poweredger750 / precision5820 / QUADRO / r240 / r250 / r340 / r360 / r440 / r550 / r650 / r660 / r740 / r750xs / r760 / r760xs / RAID / redhat / RHEL설치 / RMS랙 / rocky / s100i / securedisk / server / serverpc / smart storage administrator / SPP / sql server / sr250 / sr650 / SYNOLOGY / SYNOLOGY나스 / t150 / t360 / UPS / UPS기술지원 / UPS납품 / UPS설치 / V3 / veeam / vroc / windows server / Windows서버설치 / XEON서버 / z8g4 / 가상서버 / 가성비서버 / 기술지원비(비용) / 나스기술지원 / 나스설치지원 / 네트워크스위치 / 네트워크장비 / 더블테이크 / 데이터베이스 / 델5820 / 델서버 / 델서버비용 / 델서버펌웨어업데이트 / 델옵션 / 델워크스테이션 / 델컴퓨터워크스테이션 / 디포그 / 디포그랙 / 디포그랙가격 / 딥러닝 / 딥러닝pc / 딥러닝서버 / 랙 / 랙(RACK) 기술지원비(비용) / 랙(RACK) 설치비 / 랙납품설치 / 랙설치 / 레노버p620 / 레노버서버 / 레노버워크스테이션 / 레노보서버 / 레노보서버펌웨어 / 레드헷설치 / 레이드 / 레이드구성 / 록키리눅스 / 리눅스 / 리눅스 기술지원비(비용) / 리눅스 설치비 / 리눅스서버 / 리눅스서버설치 / 리눅스서버트러블슈팅 / 리눅스트러블슈팅 / 문서보안 / 문서중앙화 / 미니서버 / 미니서버랙 / 미니서버렉 / 미디어서버 / 방화벽 / 방화벽 기술지원비(비용) / 방화벽 설치비 / 방화벽엔지니어 / 백업 / 백업 기술지원비(비용) / 백업 서버 / 백업서비스 / 백업솔루션 / 보안솔루션 / 보안솔루션구매 / 보안솔루션설치 / 보안툴 / 빔백업 / 샤크라맥스 / 서버 / 서버 기술지원비(비용) / 서 버 랙마운트비용 / 서버 설치비 / 서버 장애조치비용 / 서버CPU / 서버MEMORY / 서버OS설치 / 서버pc / 서버가격 / 서버가속기 / 서버견적 / 서버교체 / 서버구매 / 서버구입 / 서버구축 / 서버기술지원 / 서버납품 / 서버디스크장애처리 / 서버랙 / 서버렉 / 서버렉마운트 / 서버메모리 / 서버 몬 / 서버몬기술지원 / 서버백업 / 서버보안 / 서버부품 / 서버엔지니어 / 서버옵션 / 서버용GPU / 서버용PC / 서버용그래픽카드 / 서버용메모리 / 서버 / 컴퓨터 / 서버용하드디스크 / 서버재고 / 서버컴 / 서버컴퓨터 / 서버트러블슈팅 / 서버판매 / 서버하드 / 서버호스팅 / 스위치 / 스위치 기술지원비(비용) / 스위치 설치비 / 스토리지 / 스토리지 기술지원비(비용) / 스토리지 랙마운트비용 / 스토리지 설치비 / 스토리지 장애조치비용 / 스토리지납품설치 / 스토리지서버 / 시놀로지DS918 / 시놀로지HyperBackup / 시놀로지나스 / 시놀로지나스백업 / 시놀로지하이퍼백업 / 시큐어디스크 / 안랩 / 알약 / 앱서버 / 오피스 365 / 우분투설치 / 워크스테이션 / 워크스테이션pc / 워크스테이션컴퓨터 / 윈도우서버 / 윈도우서버2016 / 윈도우서버2019 / 윈도우서버2022 / 윈도우서버설치 / 윈도우서버컴퓨터 / 윈도우서버트러블슈팅 / 윈도우즈 기술지원비(비용) / 윈도우즈 설치비 / 이스트소프트 / 이스트 시큐리티 / 이중화솔루션 / 이중화솔루션구매 / 이중화솔루션설치 / 인터넷디스크 / 임베디드 / 저가서버 / 저렴한서버 / 정품서버 / 정품서버옵션 / 제온서버 / 젠서버 / 중고서버 / 중고워크스테이션 / 카보나이트 / 카스퍼스키 / 컴퓨터서버 / 케어팩 / 타워서버 / 타워형서버 / 팔로알토 / 페도라설치 / 프로라이언트
'설치 및 기술 자료 > Linux' 카테고리의 다른 글
| [Linux] CrowdSec으로 SSH 공격 실시간 차단 (0) | 2026.06.12 |
|---|---|
| [Linux] Proxmox VE 완벽 가이드 (0) | 2026.06.07 |
| [Linux] Oracle Linux(오라클 리눅스) 최신버전(10.1) 설치 방법 (0) | 2026.05.25 |
| [Linux] pgloader 로 끝내는 데이터 마이그레이션 (0) | 2026.05.17 |
| [Linux] Ubuntu 24.04 (우분투) LVM을 이용한 디렉터리 용량 확장 (0) | 2026.04.30 |



댓글