Blog

  • error.log 의 IP주소 차단하기

    nginx의 error.log 파일을 보면 다음 형식으로 되어 있다.

    2025/10/30 07:54:31 [crit] 77854#77854: *24699 SSL_do_handshake() failed (SSL: error:0A00006C:SSL routines::bad key share) while SSL handshaking, client: 45.249.246.17, server: 0.0.0.0:443

    검색해보면 너무 구형의 bot을 이용할 때 발생할 수 있는 오류라고 한다. 그냥 내버려 두어도 괜찮지만 이왕이면 차단해보기로 했다. 여러 단계로 나눈 후, 코파일럿의 도움으로 코드를 작성했다.

    • IP 주소를 관리할 sqlite DB 생성
    • error.log 에서 IP 주소만 parsing
    • IP 주소를 DB에 입력
    • 입력된 IP 주소를 nginx 에서 사용하는 형식으로 변환
    • cron 에 이 과정을 포함시킴
  • access.log

    '$remote_addr - $host [$time_local] '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" "$http_user_agent" "$gzip_ratio"';
    

    nginx의 access 로그 파일의 기본 설정 중 두 번째 $에 붙은 것은 remote_user 이다. 이것을 $host로 바꾸어 주었다.

    나중에 생각해 보니 $host를 추가하면 되는 것이었다. IP 주소로 접속해 오는 것과 도메인으로 접속해 오는 것을 구별하고 싶었다. 그래서 검색했더니 $host를 옵션이 이 기능을 했다.

    로그 파일에서 많은 접속이 IP 주소로 온다는 것을 알게 되었다. 그래서 별도로 nginx 의 블록을 만들어 444 응답을 하도록 했다.

  • goaccess

    설정이 꼬였는지 goaccess 의 기본 옵션 파일인 /etc/goacess/goacess.conf 를 수정해도 반영이 안된다.

    그래서 다른 방법을 선택했다.

    nano ~/.goaccessrc

    옵션은 다음과 같다.

    log-format %h - %v [%d:%t %^] "%r" %s %b "%R" "%u" "%^"
    date-format %d/%b/%Y
    time-format %H:%M:%S