개발노트

고즐의 개발 및 서버 개발 노트

Rocky Linux에서 Fail2ban으로 SSH 무차별 대입 방어하기

# fail2ban # ssh보안 # RockyLinux # 무차별대입 # 서버보안

Server 2025.12.16 7일 전 55 회 읽음



오늘 서버 접속해보니 아래와 같이 53회 로그인 실패 알림이 표시되었다.

Last login: Fri Dec 12 09:43:01 KST 2025 on pts/0
Last failed login: Tue Dec 16 10:30:15 KST 2025 from 87.121.84.136 on ssh:notty
There were 53 failed login attempts since the last successful login.

지금 로그가 의미하는 것

  • 외부 IP(87.121.84.136) 에서 SSH 무차별 대입 시도
  • 아직 뚫린 건 아님 → 운이 좋았을 뿐
  • 53회 실패 → 자동화 봇 스캔 단계

    이건 네 서버가 이미 타겟 리스트에 올라갔다는 뜻이다.


    Fail2ban으로 SSH 공격 자동 차단하는 이유

    SSH는 노출되는 순간 무차별 대입 공격이 붙기 쉽습니다. Fail2ban은 로그인 실패 패턴을 감지해 공격 IP를 자동 차단해 서버를 실전 수준으로 방어합니다.


    서버에 SSH 포트가 열려 있으면 봇이 24시간 스캔합니다. 문제는 공격 자체가 아니라, 언젠가 약한 계정이나 설정 실수로 뚫릴 수 있다는 점입니다. Fail2ban은 반복 실패를 빠르게 차단해 리스크를 크게 줄입니다.

    • 로그인 실패 누적을 기반으로 자동 차단
    • SSH 뿐 아니라 웹, DB, 프록시 등 확장 가능
    • 설정이 단순하고 운영 부담이 낮음


    점검: Fail2ban이 실제로 동작 중인지 확인

    설치 여부가 아니라 실행 여부, jail 활성 여부, 로그 감지 여부를 확인해야 합니다.


    아래 명령어로 서비스 상태와 jail 목록을 확인합니다.

    systemctl status fail2ban fail2ban-client status


    정상이라면 sshd jail이 리스트에 보여야 합니다.

    fail2ban-client status sshd


    SSH 포트 변경으로 기본 스캔을 회피

    22 포트는 봇이 기본값으로 두드리는 구간입니다. 포트 변경은 보안의 전부는 아니지만 공격 트래픽을 크게 줄입니다.


    예시로 SSH 포트를 24888로 변경합니다. 실제 운영에서는 본인 환경에 맞는 포트를 선택하세요.

    vi /etc/ssh/sshd_config Port 24888


    포트 변경 후 SSH를 재 시작합니다.

    systemctl restart sshd


    firewalld를 사용 중이면 새 포트를 허용합니다.

    firewall-cmd --add-port=24888/tcp --permanent firewall-cmd --reload


    Fail2ban sshd jail 실전 설정 템플릿

    핵심은 maxretry를 낮게, bantime을 길게, mode를 aggressive로 두는 것입니다. 봇은 짧게 잡고 오래 묶는 구조가 효과적입니다.


    /etc/fail2ban/jail.local 파일을 사용해 sshd jail을 명확히 설정합니다.

    vi /etc/fail2ban/jail.local


    아래 예시는 실전에서 많이 쓰는 구성입니다. 허용 IP와 SSH 포트는 예시 값이며, 글에서 사용하는 값은 실제 서버 값과 다르게 구성했습니다.

    [sshd] 
    enabled = true 
    port = 24888 
    maxretry = 3 
    findtime = 10m 
    bantime = 1d 
    mode = aggressive 
    ignoreip = 127.0.0.1/8 203.0.113.10 198.51.100.25
    • maxretry 3: 사람은 보통 3번 이상 틀리지 않지만 봇은 바로 걸립니다
    • findtime 10m: 10분 안에 실패 누적을 판단합니다
    • bantime 1d: 하루 차단으로 재시도를 크게 줄입니다
    • mode aggressive: 더 다양한 실패 패턴까지 잡습니다
    • ignoreip: 운영자 고정 IP나 내부 대역만 최소로 추가합니다


    설정 적용을 위해 fail2ban을 재 시작합니다.

    systemctl restart fail2ban


    동작 확인: bantime과 로그 감지 체크

    상태 출력에서 bantime이 86400으로 보이면 1일 차단이 정상 적용된 것입니다. 그리고 실제 공격 IP가 Found 또는 Ban으로 찍히는지 확인합니다.


    bantime 값이 제대로 반영됐는지 확인합니다.

    fail2ban-client get sshd bantime


    1일 차단이면 다음과 같이 표시됩니다.

    86400


    실시간 로그를 보며 감지 및 밴이 되는지 확인합니다.

    tail -f /var/log/fail2ban.log

    로그에서 확인할 대표 패턴입니다.

    • Found x.x.x.x: 실패 감지 단계
    • Ban x.x.x.x: 설정 조건 충족으로 차단 단계


    추가 강화 옵션

    Fail2ban은 기본 방패고, SSH 자체 설정을 강화하면 체감 보안이 한 단계 더 올라갑니다.
    • root 직접 로그인 금지: PermitRootLogin no
    • 비밀번호 로그인 금지: PasswordAuthentication no, 키 인증만 허용
    • 운영자 IP가 고정이면 SSH 포트를 특정 IP만 허용하는 방식 고려


    SSH 설정을 변경했다면 반드시 재시작합니다.

    systemctl restart sshd


    정리

    Fail2ban은 실행 상태, sshd jail 활성, aggressive 모드, 충분한 bantime, 그리고 로그 감지 확인까지 끝나야 실전 대응이 됩니다.

    이 글의 템플릿대로 적용하면 SSH 무차별 대입 공격은 대부분 자동 차단됩니다. 운영에서는 ignoreip를 최소화하고, 가능하면 키 인증 기반으로 전환하는 것을 권장합니다.

    문의답변