
악성 봇이 서버에 접근하는 것을 자동으로 차단하세요
CDN 뒤에 숨지 않고도 서버를 설정하여 악성 봇을 차단할 수 있도록 도와주는 TUI, 웹 콘솔 및 CLI입니다.
NGINX 및 기존 방화벽(nftables 또는 iptables)과 함께 작동합니다:

이 앱은 서버에서 잠기는 일이 없도록 최선을 다하지만, 사용에 따른 책임은 본인에게 있습니다. 또한 AGPL 라이선스이므로 상업적으로 사용하는 경우 라이선스를 준수해야 합니다.
Debian 또는 Ubuntu에서는 APT 저장소에서:
curl -fsSL https://ivankovic.github.io/stop-bots/key.gpg \
| sudo tee /usr/share/keyrings/stop-bots.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/stop-bots.gpg] \
https://ivankovic.github.io/stop-bots stable main" \
| sudo tee /etc/apt/sources.list.d/stop-bots.list
sudo apt update && sudo apt install stop-bots
man stop-bots(그리고 man stop-bots-batch와 같이 각 verb별 페이지)와
bash, zsh, fish 자동 완성을 제공합니다. 서비스를 설치하거나 아무것도 시작하지 않습니다.
또는 Rust 1.88 이상이 설치된 환경에서 crates.io를 통해 설치할 수 있습니다:
cargo install stop-bots
또는 GitHub releases에서 x86_64 또는 aarch64 Linux용 정적 바이너리를 다운로드하세요.
install은 Debian 또는 그 파생 배포판이 아닌 호스트를 거부합니다.nft, 또는 iptables-restore와 ip6tables-restore; 나머지를 위해 nginx. 컨테이너 안의 NGINX도 작동합니다 — 컨테이너에서 NGINX 실행하기를 참조하세요.sudo stop-bots가 TUI를 시작합니다. root 권한이 필요합니다: /etc/nginx를 다시 작성하고 방화벽 규칙을 로드하기 때문입니다.u는 모든 목록을 다운로드합니다: 봇 목록, 크롤러 IP 범위, 그리고 활성화한 피드나 국가.1)는 호스트 전체 정책을 담고 있습니다: 어떤 봇 카테고리가 차단되는지, 국가, 그리고 로그를 읽는 탐지기. NGINX 화면(4)에서 r은 사이트를 찾습니다. Blocks 화면(5)은 탐지기나 사용자가 추가한 모든 규칙과 그 이유를 나열합니다.a는 모든 것을 적용합니다. 먼저 무엇이 변경될지 — 파일, 추가 및 제거되는 규칙, 그리고 잠금 검사의 판정(d는 diff) — 를 보여주고 확인을 요청합니다.sudo stop-bots install firewall은 적용된 규칙이 재부팅 후에도 유지되도록 합니다. 이것 없이는 재부팅 시 규칙이 전혀 없는 상태로 돌아옵니다.sudo stop-bots status는 커널, 유닛, 파일을 확인하고 무엇이 누락되었는지 알려줍니다.sudo stop-bots status
sudo stop-bots batch --dry-run --diff
sudo stop-bots batch --apply
sudo stop-bots install firewall
sudo stop-bots status
batch --dry-run은 아무것도 다운로드하거나 스캔하지 않습니다: 새로 설치한 상태에서는 바이너리에 내장된 봇 목록의 NGINX 블록을 보여주고, 아직 방화벽 규칙은 없습니다. 로그에서 아무것도 읽지 않았기 때문입니다. --apply 없이 sudo stop-bots batch를 실행하면 다운로드와 스캔을 수행하고 검토용 파일을 작성하지만 적용하지는 않습니다. batch가 하는 일은 Unattended, from cron을 참조하세요.
sudo stop-bots uninstall all --dry-run
sudo stop-bots uninstall all
첫 번째는 모든 단계를 나열하고, 두 번째는 그것을 수행한다. 업그레이드 및 제거를 참조하라.
알려진 봇, 카테고리별(스캐너 / 검색 엔진 / AI 크롤러), 출처는
ArcJet의 Well-Known Bots,
ai.robots.txt 및
NGINX Ultimate Bad Bot Blocker
목록. 카테고리를 차단하면 각 사이트의 NGINX 설정에 if ($http_user_agent ...) 규칙이
주입된다.
너무 많은 요청, NGINX 자체의 속도 제한을 통해.
먼저 정중하게 — 차단 중인 모든 봇을 나열하는 생성된 robots.txt로, 이를 존중하는
크롤러를 위한 것이며, 아래의 허니팟 경로도 포함된다.
당신이 달리 말하지 않는 한 — 사이트별 경로 예외, 그리고 신뢰할 수 있는 주소와
사용자 에이전트(trust)로, 이에는 어떤 차단, 목록, 속도 제한도 적용되지 않는다.
브라우저처럼 보이지 않는 요청, 사이트별. 여섯 개의 독립적인 규칙으로, 각각 자체 토글을 가지며 기본적으로 모두 꺼져 있다 — 규칙당 하나의 스위치이므로 당신의 무언가가 작동을 멈추면 어떤 규칙 때문인지 알 수 있다:
| 규칙 | 봇 외에 차단하는 것 |
|---|---|
| HTTP/1.0 및 HTTP/1.1 | HTTP/2를 사용하지 않는 크롤러와 API 클라이언트 |
Accept 헤더 없음 | 일부 API 클라이언트는 아무것도 보내지 않음 |
Accept-Language 없음 | 프라이버시 도구가 제거함 |
비어 있거나 없는 User-Agent | 스크립트와 상태 확인이 종종 생략함 |
Host가 순수 IP | IP로 사이트에 접근하는 것을 차단 |
| TLS 1.0 / 1.1 | 매우 오래된 클라이언트만 |
일곱 가지 선택이 있다:
| 옵션 | 용도 |
|---|---|
403 Forbidden (기본값) | 차단이 의도적이었음을 알림; 잘못 걸린 사람이 대응할 수 있는 유일한 옵션 |
404 Not Found | 무언가 차단되었다는 사실 자체를 숨김 |
410 Gone | 예의 바른 크롤러에게 URL을 영구히 삭제하도록 요청 — 공격자가 아닌 크롤러를 돌려보낼 때는 403보다 이쪽을 선호 |
429 Too Many Requests | 예의 바른 클라이언트에게 물러나 재시도하라고 알림 |
418 I'm a teapot | RFC 2324의 농담. 작동은 하지만 IANA에 등록되지 않았고, NGINX는 빈 본문과 함께 보냄 |
444 close connection | 아무 응답도 하지 않음; 가장 저렴하지만 서버가 다운된 것과 구별 불가 |
Tarpit | 403으로 응답하지만 본문을 초당 1바이트로 흘려보내, 클라이언트가 넘어가지 않고 대기하게 함 |
Tarpit은 오탐에 대해 가장 온건한 옵션 — 잘못 걸린 클라이언트는 거부되지 않고 느려질 뿐 —
이며, 봇에게는 비용 측면에서 가장 가혹하다. 봇의 연결은 유휴 상태로 남기 때문이다. 선택하기
전에 알아야 할 한 가지: Tarpit은 그 시간 동안 당신의 워커 연결 중 하나도 점유하므로,
Tarpit에 걸린 클라이언트가 쏟아지면 실제 방문자와 worker_connections를 두고 경쟁한다.
이들 각각은 Dashboard의 "Automatic blocking" 패널 또는 CLI의 set-detector에 있는
독립적인 스위치다. 각각은 시간 제한이 있는 방화벽 차단을 추가한다. nftables에서는 시간이
다하면 커널이 해제하고, iptables에서는 스크립트가 다음에 적용될 때까지 유지된다.
탐지는 윈도우 기반이다: 탐지기는 로그가 윈도우(하루, 또는 아래 세 가지 행동 기반 탐지기의
경우 한 시간; set-detector --window-hours로 변경) 안에서 보여주는 것만 계산하며, 차단은
그것을 만들어낸 증거를 소모한다. 따라서 만료된 차단은 새로운 위반에 대해서만 다시
나타나고, 첫 스캔은 오래된 로그 라인 때문에 절대 차단하지 않는다. list-detectors는
각 탐지기의 스위치, 차단 길이, 임계값, 윈도우를 보여준다.
이들은 매분 SSH 및 NGINX 액세스 로그를 다시 읽는 내부 타이머로 실행된다 — 단, TUI나 웹 UI가 실행 중일 때만. 둘 중 하나라도 같은 스케줄, 같은 데이터베이스에서 유지되므로 웹 UI를 띄워두는 것만으로 충분하다; 둘 다 실행되지 않으면 아무것도 탐지되지 않는다. stop-bots 프로세스가 전혀 없는 서버의 경우, 아래의 무인, cron에서를 참조하라.
처음 다섯 개는 새 데이터베이스에서 켜져 있다:
/.env, /.git/config, /wp-config.php 및 유사한 것에 대한
단일 요청은 즉시 차단이다. 내장 목록은 어딘가에서는 합법적인 경로 — /wp-login.php,
/wp-admin/, /xmlrpc.php, /phpmyadmin — 를 의도적으로 제외하는데, 자신의 관리자를
잠그는 것이 어차피 404 탐지기가 잡을 스캐너를 놓치는 것보다 나쁘기 때문이다.
set-probe-paths로 직접 추가하라.${jndi: 조회, PHP-CGI allow_url_include
익스플로잇, $(wget …) 또는 ../../ 등, 인코딩 방식과 무관하게. 요청 하나면 충분하고,
차단은 일주일간 지속된다. 사람이 입력할 법한 텍스트, 예를 들어 /etc/passwd 또는
union select는 검색 상자와 리퍼러 밖에서만 계산되므로, 블로그에서 그것을 검색하는 것은
안전하다.기본적으로 꺼져 있음:
robots.txt에 Disallow:로만 게시되고 어디에도 링크되지 않은 경로.
여기에 도달한다는 것은 robots.txt를 무시한다는 뜻이며, 이는 차단당할 만하다. 작동하려면
robots.txt 생성이 켜져 있어야 한다.세 가지 더 있는데, 이들은 클라이언트가 무엇을 요청하는지가 아니라 어떻게 행동하는지를 본다. 세 가지 모두 기본적으로 꺼져 있는데, 각각 오탐이 있기 때문이다 — 그리고 세 가지 모두 검증된 검색 엔진 크롤러를 예외로 두는데, 그렇지 않으면 모두 해당 크롤러에 걸릴 것이다:
304는 가져온 자산으로
계산됨)는 잡지 못한다. 자산을 전혀 제공하지 않는 사이트에서는 도움이 될 수 없다.Referer가 전혀 없음.
Referrer-Policy: no-referrer와 프라이버시 도구로 약화되지만, 서로 다른 경로 임계값이
이를 사용 가능하게 만든다.