1인 창업 일지 #3 fail2ban 로그 관리자 대시보드 만들기

Hyunjun By Hyunjun 2025년 08월 05일

fail2ban 로그 보는 게 너무 불편합니다..

지난 포스팅에서 fail2ban으로 서버 공격을 막는 이야기를 했었죠. 근데 문제가 하나 있었어요. 제가 운영하는 서버들이 늘어나면서 매일 체크해야 할 것도 많아졌어요. 매번 서버에 SSH로 접속해서 sudo fail2ban-client status 치고, 로그 파일 열어보고… 이게 여간 귀찮은 게 아니더라고요.

# 이런 명령어들을 계속 쳐야 했어요
sudo fail2ban-client status sshd
sudo tail -f /var/log/fail2ban.log
sudo fail2ban-client get sshd banip --with-time
Plaintext

특히 새벽에 침대에 누워있다가 “서버 괜찮나?” 하고 핸드폰으로 확인하려면… 불가능하죠. 그리고 지난번 포스팅에서 봤듯이 하루에도 수백 개의 공격이 들어오는데, 이걸 터미널로만 보려니 패턴 분석도 어렵고… 그래서 결심했습니다. 내 서버를 지키기 위한 관리자 페이지를 직접 만들자!

필요한 기능들을 정리해보니

제가 서버를 운영하면서 정말 필요했던 기능들입니다.

  • 지금 당장 어떤 IP가 차단되어 있는지
  • 오늘 하루 얼마나 많은 공격이 있었는지
  • 주로 어느 나라에서 공격이 오는지
  • 어느 시간대에 공격이 집중되는지
  • 각 jail별로 얼마나 효과적으로 작동하고 있는지

이런 정보들을 한눈에 보고 관리하고 싶었어요.

직접 만들기 시작!

처음엔 정말 간단하게 시작했어요. 그냥 로그 파일 읽어서 웹에 보여주면 되겠지? 근데 만들다 보니 “아, 이것도 있으면 좋겠다” “저것도 보고 싶다” 하면서 기능이 점점 늘어났어요.

1. 실시간 모니터링

서버에서 뭔가 일어나고 있을 때 바로 알고 싶었어요. WebSocket을 사용해서 fail2ban 로그를 실시간으로 감시하도록 만들었습니다.

// fail2ban 로그를 실시간으로 읽어서 파싱
const tail = spawn('tail', ['-F', '-n', '0', '/var/log/fail2ban.log']);
tail.stdout.on('data', (data) => {
    // 로그 파싱해서 WebSocket으로 전송
    // 새로운 차단이 발생하면 바로 화면에 표시!
});
Plaintext

이제 공격이 들어오면 실시간으로 아래 화면처럼 로그를 볼 수 있어요.

2. 공격 지역 시각화

도대체 어디서 이렇게 공격을 많이 하는지 궁금했어요. IP 주소를 기반으로 세계 지도에 표시하도록 만들었습니다. 아래처럼 지도를 만들어서 한눈에 볼 수 있도록 구현했습니다.

3. 통계 대시보드

숫자로 보는 게 제일 명확하잖아요. 그래서 이런 통계들을 만들었어요.

  • 현재 차단된 IP 수 (지금 이 순간 몇 개가 막혀있나)
  • 24시간 동안 차단된 총 횟수 (오늘 하루 얼마나 바빴나)
  • 시간대별 공격 분포 차트 (언제 조심해야 하나)
  • 국가별 공격 순위 (어느 나라를 주의해야 하나)
현재 차단된 IP 수, 24시간 동안 차단된 총 횟수
시간대별 공격 분포 차트
국가별 공격 순위

4. Jail별 상세 정보

fail2ban은 여러 개의 jail을 운영할 수 있는데, 각각이 얼마나 일을 잘하고 있는지 알고 싶었어요. SSH jail은 하루에 100번 작동하는데, nginx jail은 10번만 작동한다면 뭔가 설정을 조정해야겠죠?

5. Unban 기능

여기서 제일 중요한 기능 중 하나가 바로 unban 기능이에요. 개발하다 보면 실수로 내 IP가 차단되는 경우가 있거든요. 예를 들어

  • 비밀번호 틀려서 SSH 접속 실패
  • API 테스트하다가 rate limit에 걸림
  • 개발 중인 앱에서 너무 많은 요청을 보냄

이럴 때마다 서버에 SSH로 접속해서 sudo fail2ban-client unban <IP> 명령어를 쳐야 했는데… 근데 웃긴 게, 내 IP가 차단되면 SSH 접속도 안 되잖아요? 그럼 다른 IP로 우회해서 들어가야 하고… 정말 번거로웠어요.

그래서 웹 대시보드에 unban 버튼을 만들었어요. 차단된 IP 목록에서 버튼 하나만 누르면 바로 해제! 특히 개발 환경에서 테스트할 때는 이 기능이 정말 생명줄이에요.

만들면서 배운 것들

1. Docker의 편리함

처음엔 그냥 서버에 직접 설치하려고 했는데, 나중에 다른 서버에도 설치하려니 너무 번거롭더라고요. Docker로 만들어놓으니 docker-compose up -d 한 줄이면 어디서든 실행할 수 있어서 정말 편해요.

2. 실시간 로그 파싱의 어려움

fail2ban 로그 형식이 버전마다 조금씩 달라서 정규식으로 파싱하는 게 생각보다 까다로웠어요.

// 이런 식으로 여러 패턴을 처리해야 했어요
const timestampMatch = line.match(/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/);
const banMatch = line.match(/fail2ban\.actions.*\[(.*?)\]\s*Ban\s+(\d+\.\d+\.\d+\.\d+)/);
Plaintext

3. Redis로 성능 최적화

처음엔 모든 요청마다 fail2ban-client를 실행했는데, 이게 생각보다 무거운 작업이더라고요.

Redis를 도입해서 jail 정보를 30초간 캐싱하고, 각 IP의 정확한 차단 시간을 저장하도록 했어요. 이렇게 하니까 fail2ban-client 호출이 줄어들어서 시스템 부하가 확 줄었습니다.

특히 IP가 차단될 때 정확한 시간을 Redis에 저장해두니까, 나중에 “이 IP 언제 차단됐지?” 할 때 바로 확인할 수 있어서 좋더라고요.

사용해보니…

이제 아침에 일어나서 커피 마시면서 핸드폰으로 대시보드 한번 확인하는 게 일상이 됐어요. 공격 정보들을 한눈에 볼 수 있으니까 서버 관리가 훨씬 수월해졌어요. 특히 놀라웠던 건, 공격이 어디서 오는지 보니까 생각보다 미국이랑 유럽에서도 엄청 많이 오더라고요. IP를 우회한 건지는 모르겠지만, 미국에서 오는 공격이 중국 다음으로 많았어요.

통계를 보니 이런 패턴들이 보였어요.

  • 중국: 주로 SSH 무차별 대입 공격
  • 러시아: WordPress 취약점 스캔
  • 미국: 봇들이 .env 파일이나 설정 파일 찾기
  • 유럽(독일, 프랑스): 다양한 웹 취약점 스캔

정말 전 세계가 내 서버를 노리고 있구나 싶었습니다.. (봇들이 매우 많은 것 같아요!)

앞으로 추가하고 싶은 기능

만들다 보니 욕심이 생겨서 더 추가하고 싶은 기능들이 있어요.

  1. 필터 관리 기능: 지금은 필터를 추가하거나 수정하려면 서버에 직접 접속해서 설정 파일을 편집해야 하는데, 이것도 웹에서 할 수 있으면 좋겠어요. 새로운 공격 패턴을 발견하면 바로 필터를 추가할 수 있도록!
  2. AI 기반 이상 탐지: 평소와 다른 공격 패턴이 감지되면 알림
  3. 자동 대응: 특정 국가에서 너무 많은 공격이 오면 자동으로 차단 규칙 강화
  4. 리포트 생성: 주간/월간 보안 리포트 자동 생성
  5. 다중 서버 통합: 여러 서버의 fail2ban을 한 곳에서 관리

특히 필터 관리 기능은 꼭 만들고 싶어요. 새로운 공격 유형을 발견했을 때, 바로 정규식을 만들어서 필터에 추가하고, 테스트해보고, 적용하는 걸 웹에서 다 할 수 있다면… 정말 편하겠죠?

마치며

퇴사하고 1인 창업을 시작하면서 서버를 직접 운영하게 됐는데, 생각보다 신경 쓸 게 많더라고요. 하지만 이렇게 필요에 의해 직접 도구를 만들어 쓰니까 뭔가 뿌듯해요. 회사에서는 “이미 있는 솔루션을 쓰면 되지 않나?” 했겠지만, 내가 필요한 기능만 딱 넣어서 만드니까 훨씬 편하고요.

무엇보다 내 서버를 내가 지킨다는 느낌이 좋아요. 새벽에 러시아에서 공격이 들어와도 “오, 들어왔네? 막혔지?” 하면서 여유롭게 볼 수 있게 됐거든요. 다음엔 드디어 첫 앱을 출시한 후기를 들고 올게요!

P.S. 서버 운영하시는 분들, fail2ban 로그 꼭 한번 확인해보세요. 생각보다 많은 공격이 들어오고 있을 거예요!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

목차