이 설정들이 Discourse에서 이루어지기 때문에, IP가 NGINX가 아닌 Discourse에 의해 차단되는 것이라 생각되며, 따라서 NGINX 로그에 표시될 것입니다. 차단하는 주체는 nginx가 아니라 Discourse입니다. NGINX 로그에 표시되지 않도록 하려면 방화벽을 통해 차단할 수 있습니다.
제이, 감사합니다. 앱 레벨에서 차단하더라도 Nginx 로그에 여전히 기록된다는 점에 대해서는 말씀이 맞습니다. 다만, 앱 레벨에서의 차단도 제가 기대했던 대로 작동하지 않고 있습니다. VPN으로 연결한 후 제 IP 주소를 “Screened IPs” 목록에 추가해 보았지만, 여전히 포럼을 탐색할 수 있었습니다. 아마도 "Blocked IPs"가 아니라 "Screened IPs"라고 불리는 이유는, 해당 IP 주소가 계정 등록만 방지하는 것일 수도 있기 때문이 아닐까 싶습니다.
제가 원하는 것은, 해당 주소에서 오는 요청에 대해 Discourse 앱이 요청된 페이지에 대한 액세스를 거부하고, 특히 해당 페이지를 렌더링하지 않는 것입니다. 모든 이러한 요청이 CPU 사용량을 최대치로 끌어올리고 있기 때문입니다.
관리자 패널의 /admin/users에서 사용자 기록을 확인하면, Discourse가 해당 사용자가 차단된 IP 중 하나로 접속한 것으로 인식합니까? (Cloudflare 같은 프록시 뒤에 있는 경우, Discourse는 사용자의 실제 IP가 아니라 프록시 IP를 확인할 수 있습니다.)
/var/discourse/launcher enter app
apt install nano
nano /etc/nginx/conf.d/discourse.conf
그리고 server { 블록에 다음을 추가하세요:
## 2025-10-27
deny 12.34.0.0/16;
그 후 저장하고
nginx -t
service nginx reload
Nginx의 access.log에서 여전히 12.34.x.x에서 온 요청을 확인하는 이유를 정확히 이해하지는 못했지만, CPU 사용량이 다시 정상 수준으로 돌아왔기 때문에 작동하는 것으로 보입니다. 개인적으로 이 과정은 믿을 수 없을 만큼 복잡하다고 생각하지만, 당장 사이트를 다시 정상적으로 구동시키기에는 충분한 해결책입니다.
주로 이제 영구 링크(permalinks)를 타격하고 있는 것 같습니다(오래된 포럼 플랫폼에서 이관된 것). deny 규칙을 우회하는 영구 링크 관련 취약점이 있는 걸까요? 아직 production.log를 확인하지 않았습니다.
전체적으로 말씀드리자면, 액세스 로그를 검사하기 위한 GUI가 없고 앱 수준의 IP 차단 목록이 없다는 것은 Discourse의 상당히 큰 한계라고 생각합니다. 드문 일이긴 하지만, 이런 봇/스크레이퍼/크롤러 공격을 받을 때 원인을 즉시 파악하고 대응하고 싶어지는데, 특히 Docker 컨테이너 깊숙한 곳에서 일어나는 이상한 추상화 문제를 고려할 때, 수많은 설정 파일과 난해한 명령어에 얽매이는 것은 피하고 싶습니다. 제가 이전에서 이관해 온 아주 오래된 포럼 플랫폼에는 조정 가능한 시간 창 동안 가장 많은 요청을 보낸 사용자 또는 IP의 간단한 목록을 보여주었고, 심지어 CPU 시간을 가장 많이 차지한 사용자 또는 IP로 필터링할 수도 있었습니다. 이렇게 하면 문제의 주소나 범위를 빠르게 식별할 수 있었고, 차단 목록에 추가하기 위한 클릭형 인터페이스도 있어 해당 IP에서 온 요청에는 404를 반환하도록 할 수 있었습니다.
안녕하세요. 현재 이 문제는 “일반적인” 방법으로 해결하기가 쉽지 않다고 생각합니다. “차단된 IP” 관리 인터페이스는 대부분의 사용자가 기대하는 동작을 하지 않으며, 실제로 작동하는 방법은 Discourse의 Docker 컨테이너 내부의 설정 파일을 직접 수정해야 하는 방식이라, 적어도 제 생각에는 해결책이라기보다 더티 해킹에 가깝습니다. 이 문제가 좀 더 관심을 받았으면 좋겠습니다: