보안 · 9 min read · Oct 23, 2025
Debian 12에서 Fail2ban 설치 및 사용

Fail2ban은 로그인 실패에 대한 로그 파일을 모니터링하고 실패가 잦은 소스 IP 주소를 호스트에 접근하지 못하도록 일시적으로 차단합니다. 이는 비밀번호 추측 무차별 공격에 대한 방어 수단입니다. 인터넷에 노출된 호스트에서 fail2ban을 사용하는 것은 매우 유용합니다.
Debian 12에서의 fail2ban 버전은 1.0.2입니다.
root@posti:~# fail2ban-client version
1.0.2fail2ban이 현재 실행 중인지 확인하려면, fail2ban-client와 함께 서버에 ping 명령을 전송합니다. fail2ban 서버가 실행 중이면 “pong”이라고 응답합니다.
root@posti:/etc/fail2ban# fail2ban-client ping
Server replied: pong
root@posti:/etc/fail2ban#작동 방식
Fail2ban은 필터, 액션 및 모니터링 파일을 수감소(jail)로 수집합니다. 여러 개의 수감소가 배포판과 함께 제공됩니다. 이들은 작동을 시작하기 위해 활성화되어야 합니다. 필터는 인증 실패를 감지하는 방법을 지정합니다. 액션은 차단 및 차단 해제 방법을 정의합니다.
침입 시도가 발생하면, findtime 동안 동일한 IP 번호에서 maxretry 로그인 실패가 감지되면 차단이 트리거됩니다. 그런 다음 IP는 bantime 초 동안 차단됩니다. 차단이 bantime 초 동안 유효하면 차단이 해제되고 IP는 다시 호스트에 접근할 수 있습니다. Fail2ban은 IPv4와 IPv6 모두를 처리할 수 있습니다.
자세한 정보는 /usr/share/doc/fail2ban/ 디렉토리의 파일에서 읽을 수 있습니다.
Fail2ban 설정
Debian GNU/Linux 시스템에서는 기본적으로 sshd 수감소가 합리적인 설정으로 활성화된 상태로 fail2ban이 설치됩니다. 이는 /etc/fail2ban/jail.d/defaults-debian.conf 파일에서 수행됩니다. 기본적으로 작동하는 유일한 수감소입니다. 다른 수감소는 시스템 관리자가 활성화해야 합니다.
따라서 ssh 로그인만 모니터링하고 잘못된 행동을 하는 침입자를 차단하려면 추가 구성이 필요하지 않습니다.
불행히도, Debian 12에서는 기본 설정으로 fail2ban이 작동하지 않을 수 있습니다. Debian 12는 rsyslog 패키지를 선택 사항으로 표시했으며, 이는 설치되지 않을 수 있음을 의미하므로 로그는 journald에만 수집됩니다 [wiki.debian.org/Rsyslog].
ISPConfig 시스템에서는 fail2ban이 작동합니다. ISPConfig 자동 설치 프로그램이 rsyslog를 설치하고 ISPConfig 완벽 서버 튜토리얼에서 rsyslog 설치를 지시합니다.
rsyslog가 있으면 로그 파일이 /var/log/ 디렉토리에 나타나므로 fail2ban 기본 구성에서 로그 파일을 찾을 수 있습니다. rsyslog가 설치되지 않은 경우, fail2ban 구성은 systemd 저널에서 로그를 읽도록 수정해야 합니다. jail.local 기본 섹션에 backend = systemd를 추가합니다, 다음과 같이:
[DEFAULT]
backend = systemd수감소 활성화
문서에서는 모든 수정 사항을 .local 파일에 넣는 것을 권장합니다. 이는 배포판에서 제공하는 파일이 업그레이드되거나 유지 관리자가 수정할 때 문제를 피할 수 있습니다 [Read file /usr/share/doc/fail2ban/README.Debian.gz].
예를 들어, pure-ftpd 수감소를 활성화하려면 /etc/fail2ban/jail.local 파일에 (파일이 존재하지 않으면 생성) 다음 줄을 추가합니다:
[pure-ftpd]
enabled = true대괄호 안의 수감소 이름은 해당 수감소의 설정 섹션을 시작합니다.
수정이 완료되면 다음 명령으로 구성 파일을 강제로 다시 읽습니다:
systemctl reload fail2ban이제 수감소가 실행 중이어야 하며, fail2ban-client로 확인할 수 있습니다:
root@posti:/etc/fail2ban# fail2ban-client status pure-ftpd
Status for the jail: pure-ftpd
|- Filter
| |- Currently failed: 0
| |- Total failed: 106
| `- File list: /var/log/syslog
`- Actions
|- Currently banned: 0
|- Total banned: 4
`- Banned IP list:
root@posti:/etc/fail2ban# jail.local에는 해당 수감소에 대한 “enabled” 설정만 있으므로, 다른 모든 설정은 배포판의 기본 설정입니다. 일반적으로 이들은 좋은 값이므로 추가 구성이 필요하지 않습니다. 필요한 경우, 해당 수감소에 대한 jail.local 섹션은 .conf 파일에서 설정된 내용을 재정의하는 설정을 포함할 수 있습니다.
이 예제는 pure-ftpd 수감소에 대한 findtime, maxretry 및 bantime을 변경합니다:
[pure-ftpd]
enabled = true
findtime = 2h
maxretry = 6
bantime = 1dFail2ban-client는 시간을 초 단위로 표시하지만, 구성 파일에는 더 쉬운 형식으로 시간을 입력할 수 있습니다. 예를 들어 36000초 대신 10h로 입력할 수 있습니다. “TIME ABBREVIATION FORMAT” 장에서 man jail.conf는 사용자 친화적인 시간 입력 형식을 설명합니다.
fail2ban-client는 사용자 친화적인 시간 형식을 초로 변환하는 옵션이 있습니다.
# fail2ban-client --str2sec 1d3h7m
97620로그 추적
어떤 수감소를 활성화해야 할지 결정하려면, 호스트에서 실행 중인 서비스가 생성한 로그를 추적합니다. 로그 요약을 생성하는 도구인 logwatch 또는 pflogsumm이 유용합니다. 원시 로그를 읽는 것은 시간 소모적이고 지루합니다.
호스트에서 실행 중인 서비스에 대한 수감소가 있는지 확인하고, jail.conf를 읽어보세요.
로그에 흥미롭거나 걱정스러운 내용이 표시되면, 검토할 시간입니다. 예를 들어, pflogsumm은 다음과 같은 줄이 포함된 이메일 요약을 보냈습니다:
136 unknown[91.224.92.40]: SASL LOGIN authentication failed: UGFzc3...
136 hostname srv-91-224-92-40.serveroffer.net does not resolve to a...
123 unknown[193.32.162.23]: SASL LOGIN authentication failed: UGFzc...
123 hostname mail.whatami.co does not resolve to address 193.32.162.23이는 IP 91.224.92.40이 이메일 로그인 시 136번 실패했음을 보여주며, 또 다른 유사한 사례입니다. Fail2ban은 이렇게 많은 시도를 방지해야 했습니다. 왜 그렇게 되지 않았는지 확인하려면 fail2ban 로그를 검토하세요.
root@posti:/etc/apt/apt.conf.d# grep 91.224.92.40 /var/log/fail2ban.log | head
2024-02-18 00:01:38,718 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:01:38
2024-02-18 00:11:50,261 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:11:50
2024-02-18 00:21:54,337 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:21:54
2024-02-18 00:32:14,232 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:32:14
2024-02-18 00:42:37,921 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:42:37
2024-02-18 00:53:06,796 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:53:06
2024-02-18 01:03:35,293 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:03:35
2024-02-18 01:14:03,765 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:14:03
2024-02-18 01:24:24,628 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:24:24
2024-02-18 01:34:43,876 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:34:43
root@posti:/etc/apt/apt.conf.d#해당 IP는 약 10분 간격으로 연결을 시도하며, fail2ban 수감소 postfix-sasl이 이를 감지합니다.
해당 IP가 호스트의 합법적인 사용자에게 속할 수 있는지 확인하는 것이 좋습니다. 그 사용자가 스마트폰이나 다른 장치에서 잘못된 비밀번호로 정기적으로 연결을 시도하고 있을 수 있습니다. geoiplookup을 사용하여 IP가 어느 나라에서 왔는지 확인할 수 있습니다. 내 사용자는 내 나라에서 오므로 외국 사용자는 나쁜 행위자일 가능성이 높습니다. geoiplookup은 Debian 패키지 geoip-database 및 geoip-bin에서 제공됩니다.
$ geoiplookup 91.224.92.40
GeoIP Country Edition: LT, LithuaniaIP가 차단되지 않은 이유를 확인하려면 해당 수감소의 findtime을 확인하세요:
root@posti:/etc/apt/apt.conf.d# fail2ban-client get postfix-sasl findtime
600
root@posti:/etc/apt/apt.conf.d#최근에 이러한 느린 공격을 보았으며, 범인은 findtime이 10분인 것을 알고 있으므로 차단을 피하기 위해 더 긴 간격으로 로그인 시도를 합니다. 이 경우에는 성공했습니다. 실패한 로그인이 차단을 유발하도록 하려면, 해당 수감소의 findtime을 10시간으로 늘리세요. jail.local의 [postfix-sasl] 섹션에 다음을 추가합니다:
findtime = 10h그런 다음 systemctl reload fail2ban을 실행하면 수감소의 findtime이 길어집니다:
root@posti:/etc/fail2ban# fail2ban-client get postfix-sasl findtime
36000
root@posti:/etc/fail2ban#침입자가 침입하려고 하는 또 다른 방법은 지속적으로 시도하는 것입니다. 침입자가 차단되더라도 차단이 끝날 때까지 기다렸다가 비밀번호를 계속 추측합니다. bantime을 더 길게 설정할 수 있지만, 이는 합법적인 사용자에게 문제를 일으킬 수 있습니다. 합법적인 사용자가 비밀번호를 잘못 입력하면 bantime이 끝날 때까지 계정에 접근할 수 없게 됩니다. 반복 범죄자를 위한 수감소인 recidive가 있습니다. 이는 fail2ban 로그에서 IP에 대한 반복적인 차단을 찾아 긴 시간 동안 차단합니다. 예를 들어 일주일 동안 차단합니다.
다음 목록은 logwatch 보고서에서 가져온 것입니다:
--------------------- pam_unix Begin ------------------------
sshd:
Authentication Failures:
unknown (212.70.149.150): 59 Time(s)해당 IP를 로그 파일에서 검색하면:
2024-02-21 03:42:39,121 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:42:38
2024-02-21 03:42:39,508 fail2ban.actions [895]: NOTICE [sshd] Ban 212.70.149.150
2024-02-21 03:52:38,386 fail2ban.actions [895]: NOTICE [sshd] Unban 212.70.149.150
2024-02-21 03:54:33,560 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:54:33
2024-02-21 03:54:35,364 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:54:35
2024-02-21 04:00:37,017 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:00:36
2024-02-21 04:00:39,021 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:00:38
2024-02-21 04:06:43,036 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:06:42
2024-02-21 04:06:45,039 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:06:44
2024-02-21 04:06:45,426 fail2ban.actions [895]: NOTICE [sshd] Ban 212.70.149.150
2024-02-21 04:16:44,302 fail2ban.actions [895]: NOTICE [sshd] Unban 212.70.149.150
2024-02-21 04:19:04,868 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:19:04Fail2ban은 의도한 대로 작동하여 잘못된 로그인을 찾아내고 10분 동안 차단합니다. 이 차단 동안 범인은 이 호스트에 접근할 수 없지만, 차단이 해제된 후에는 계속 시도합니다. 이는 심각한 침입 시도의 경우입니다. 해결책은 낮은 maxretry와 긴 bantime으로 recidive 수감소를 활성화하는 것입니다.
저는 초기 차단을 10분으로 설정하는 것을 좋아합니다. 실제 사용자가 차단되면 그 시간 동안 기다리면서 올바른 비밀번호를 찾고 다시 시도하기를 바랍니다. 같은 날 다시 차단된 경우, 일주일 동안 차단됩니다. recidive 수감소의 기본 값은 jail.conf 파일에서 찾을 수 있으며, bantime은 1주일, findtime은 1일로 설정되어 있습니다. 이는 저에게 괜찮아 보입니다. 하지만 maxretry를 2로 설정하여 범죄자가 더 빨리 차단되도록 했습니다. jail.local 파일에 다음을 추가했습니다:
[recidive]
enabled = true
maxretry = 21주일 이상의 차단은 가치가 없다고 생각합니다. 결국, 오래된 IP 주소는 차단되거나 블랙리스트에 올라가므로 범죄자는 새로운 IP를 받게 됩니다. 오래된 IP는 무고한 새로운 인터넷 사용자에게 할당되며, 이전 IP 소유자가 저지른 나쁜 일로 인해 처벌받아서는 안 됩니다.
문제 해결
운영 체제를 부팅하거나 fail2ban을 재시작한 후 상태가 복원되므로 차단은 bantime이 만료될 때까지 계속됩니다. 따라서 테스트 및 문제 해결에는 재시작이 포함될 수 있습니다.
구성을 테스트하려면 테스트 옵션이 있습니다:
fail2ban-server --testIP가 차단되었는지 확인하려면, 최근 버전의 fail2ban은 다음을 수행할 수 있습니다:
# fail2ban-client banned 43.131.9.186
[['recidive']]이 명령은 주어진 IP가 현재 차단된 수감소 목록을 보여줍니다.
이전 버전의 fail2ban은 해당 명령이 없습니다. 각 수감소를 하나씩 테스트하려면 다음과 같이 할 수 있습니다:
# fail2ban-client status recidive | tr " " "\n" | grep 43.163.219.232
43.163.219.232출력이 IP를 보여주면, 해당 IP가 차단된 IP 목록에 있었던 것입니다. tr 명령은 차단된 IP 번호 목록(하나의 긴 줄)을 한 줄에 하나의 IP로 나누기 위해 사용됩니다.
주어진 IP에 대해 어떤 일이 있었는지 보려면 fail2ban.log에서 검색하세요:
root@posti:/etc/mysql# grep 43.131.9.186 /var/log/fail2ban.log | cut --characters=-80
2024-03-06 09:00:40,295 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:02:53,954 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:02:55,958 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:34,193 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:36,195 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:36,388 fail2ban.actions [3574846]: NOTICE [sshd] Ban 43
2024-03-06 09:04:36,626 fail2ban.filter [3574846]: INFO [recidive] Fo
2024-03-06 09:14:35,180 fail2ban.actions [3574846]: NOTICE [sshd] Unban
2024-03-06 09:15:10,073 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:16:55,919 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:16:58,522 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:18:44,972 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:20:30,018 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:20:30,499 fail2ban.actions [3574846]: NOTICE [sshd] Ban 43
2024-03-06 09:20:30,620 fail2ban.filter [3574846]: INFO [recidive] Fo
2024-03-06 09:20:30,899 fail2ban.actions [3574846]: NOTICE [recidive] Ba
2024-03-06 09:20:32,021 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:30:29,289 fail2ban.actions [3574846]: NOTICE [sshd] Unbanfail2ban은 잘못된 로그인을 찾아내고 10분 동안 차단하여 의도한 대로 작동합니다. 이 차단 동안 범인은 이 호스트에 접근할 수 없지만, 차단이 해제된 후에는 계속 시도합니다. 이는 심각한 침입 시도의 경우입니다. 해결책은 낮은 maxretry와 긴 bantime으로 recidive 수감소를 활성화하는 것입니다.
자신의 IP 주소가 차단되거나 외국의 일부 호스트가 나쁜 행동을 하더라도 결코 차단되지 않도록 하려면, 해당 IP 번호를 화이트리스트에 추가할 수 있습니다. 기본적으로 화이트리스트에는 아무것도 없습니다. 다음과 같이 확인할 수 있습니다:
root@posti:~# fail2ban-client get sshd ignoreip
No IP address/network is ignored
root@posti:~ignoreip 설정은 각 수감소 섹션에 설정할 수 있지만, 이 설정은 모든 수감소에 영향을 미쳐야 하므로 DEFAULT 섹션에 설정하는 것이 좋습니다. 내부 서브넷을 설정하여 모든 호스트가 차단을 피하도록 하는 것이 가장 좋습니다. 이는 jail.local의 시작 부분에서 다음과 같이 설정할 수 있습니다:
[DEFAULT]
ignoreip = 92.237.123.96/27기본 섹션은 모든 수감소에 영향을 미치는 다른 설정을 가질 수 있습니다. 예를 들어, findtime = 10h를 추가할 수 있습니다.
수동으로 차단하기
차단이 발생할 때 어떤 일이 일어나는지 테스트하려면, 수동으로 차단을 설정하세요. 먼저 bantime이 짧은 수감소로 테스트하여 실수로 자신을 차단하더라도 결국 돌아올 수 있도록 합니다. 예를 들어:
# fail2ban-client set sshd banip 8.8.4.4어떤 IP가 나쁜 행동을 하지만 fail2ban이 이를 감지하고 차단하지 못하는 경우, recidive 수감소에서 수동으로 차단을 설정하여 해당 IP를 일주일 동안 제거할 수 있습니다.
# fail2ban-client set recidive banip 8.8.4.4서브넷을 차단하려면 CIDR 표기법을 사용합니다:
fail2ban-client set recidive banip 5.188.87.0/24수동으로 차단 해제하기
차단을 해제하는 것은 가능하지만, 나쁜 행동이 계속되면 IP가 다시 차단될 수 있습니다. 따라서 무슨 일이 일어나고 있는지 확인하고(예: 로그를 읽어보는 것) 나쁜 행동을 수정해야 합니다.
# fail2ban-client set recidive unbanip 8.8.4.4IP는 여러 수감소에서 차단될 수 있습니다. 모든 수감소에서 IP를 차단 해제하려면 다음을 사용합니다:
# fail2ban-client unban 8.8.4.4하지만 저는 그렇게 할 일이 거의 없습니다. 저는 bantime을 10분으로 설정하고, recidive 수감소는 1주일로 설정하므로, recidive 수감소에서만 unbanip을 수행하고 다른 수감소는 이미 만료되었습니다. recidive 수감소를 사용하지 않는 경우, IP가 여러 수감소에서 동시에 차단될 수 있으므로 이는 유용합니다.
모든 수감소에서 모든 IP 주소의 차단을 해제하려면 다음을 수행합니다:
fail2ban-client unban --all결론
Fail2ban은 비밀번호 추측을 더 어렵게 만들지만, 해커가 호스트에 접근하려는 시도를 완전히 방지하지는 않습니다. SSH의 경우, SSH 키 사용을 강제하면 비밀번호로 로그인하는 것을 방지하여 더 많은 보호를 제공합니다. 다른 서비스의 경우, 다단계 인증은 비밀번호만 알고 있을 경우 로그인을 방지합니다.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.