비밀번호 무차별 대입에 대한 Fail2ban
Fail2ban을 설치하고 설정하는 방법이에요. SSH와 웹 폼 무차별 대입 차단, 자신의 주소 화이트리스트 등록, 작동 확인, 그리고 자신을 차단 해제하는 방법을 알아봐요.
업데이트 2026년 8월 23일
Fail2ban은 로그를 읽고 한 주소에서 발생한 로그인 실패 횟수를 세어 방화벽 규칙으로 일시 차단해요. 키 기반 로그인을 대체하지는 않지만, 대부분의 백그라운드 무차별 대입 트래픽을 걸러내고 로그 부하를 줄여줘요.
설치와 기본 구성
apt install -y fail2ban
jail.conf는 업데이트할 때 덮어써지니, 직접 만든 /etc/fail2ban/jail.local 파일을 사용하세요:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 203.0.113.5
banaction = ufw
[sshd]
enabled = true
port = 22
maxretry = 3
bantime = 24h
systemctl enable --now fail2ban
fail2ban-client status
fail2ban-client status sshd
ignoreip에 집이나 사무실 주소를 넣으세요. 자기 자신을 차단하지 않기 위한 보험입니다. 주소가 바뀌더라도 /hosting/vds/m/<id> 패널의 콘솔이 안전망이 되어줘요. 이 콘솔은 네트워크와 규칙에 관계없이 작동해요.
banaction은 사용하는 방화벽과 일치해야 해요. ufw는 ufw, nftables는 nftables-multiport를 사용하세요.
결과를 확인하는 곳
fail2ban-client status sshd
tail -f /var/log/fail2ban.log
journalctl -u fail2ban -n 50
상태에는 실패 시도 횟수와 차단된 주소 목록이 표시돼요. 공인 주소에서 하루 수백 건은 정상이며, 표적 공격의 징후가 아니에요.
주소 차단 해제(자기 주소 포함):
fail2ban-client set sshd unbanip 203.0.113.5
SSH 외의 보호
Fail2ban은 실패 시도를 기록하는 모든 로그와 함께 작동할 수 있어요.
[nginx-http-auth]
enabled = true
[nginx-limit-req]
enabled = true
logpath = /var/log/nginx/error.log
[postfix-sasl]
enabled = true
직접 만든 애플리케이션에는 필터가 필요해요. /etc/fail2ban/filter.d/에 있는 파일로, 주소를 <HOST>로 표시한 정규 표현식을 담아요:
[Definition]
failregex = ^.*login failed.*ip=<HOST>.*$
ignoreregex =
실제 로그로 표현식을 테스트하세요:
fail2ban-regex /var/log/myapp.log /etc/fail2ban/filter.d/myapp.conf
이 명령은 일치한 줄 수를 보여줘요. 일치가 0이면 규칙이 잘못된 것이고, 조용히 실패하는 보호는 아무것도 없는 것보다 나빠요.
흔한 실수
| 실수 | 결과 | 해결 |
|---|---|---|
jail.conf 수정 | 업데이트 시 사라짐 | jail.local에 작성 |
ignoreip에 자기 주소 없음 | 언젠가 자신을 차단하게 됨 | 주소를 추가하거나 패널 콘솔로 접속 |
banaction이 방화벽과 불일치 | 차단이 적용되지 않음 | ufw 또는 nftables에 맞추기 |
| 필터가 로그 형식과 불일치 | 보호 대신 침묵 | fail2ban-regex로 확인 |
| 서비스가 systemd 로그를 읽지 못함 | 상태가 비어 있음 | backend = systemd 설정 |
실제로 테스트하세요. 외부 주소에서 일부러 필요한 횟수만큼 잘못된 비밀번호를 입력하고, 해당 주소가 차단 목록에 들어가는지 확인하세요. 구성하지 않은 fail2ban은 잘못된 안도감을 만들어요.
방화벽 자체의 연결 속도 제한으로 마무리하세요 — ufw limit 22/tcp.