Preface
최근들어 부쩍 스팸성 댓글이 활발한것 같다. WordPress에서 글이나 댓글이 작성되면, 스팸 필터링 등을 위해 작성자 IP등의 정보가 기록된다. 스팸으로 의심되는 IP나 댓글 본문은 자동으로 스팸 필터링이 적용되는데, 이 때 구축 환경 때문에 실제 IP (Real IP)가 기록되지 않는 문제가 종종 있는것 같다.
지금 구축된 환경에서는 사실 실제 IP(Real IP)가 직접 전달되기는 어렵다. 이를 해결하려면 끝점에 있는 WordPress에서 HTTP Header를 파싱하여 실제 IP를 가져올 필요가 있다.
Experiment #1. Cloudflare without Proxy
Experiment #2. Cloudflare with Proxy
Forwarded Headers
이를 해결하기 위해서는 Header로 포워딩된 Original IP를 파싱할 필요가 있다. Cloudflare는 Origin IP를 CF-Connecting-IP
와 X-Original-Forwarded-For
두 가지로 Forward한다. 여기서는 CF-Connecting-IP
를 가지고 Origin IP를 파싱하는 방법을 사용한다.
WordPress에서의 세팅 방법은 간단하다. wp-config.php
에 아래와 같이 세팅한다.
/**
* Fixing original IP detection behind Nginx proxy
*/
if(isset($_SERVER['HTTP_CF_CONNECTING_IP'])) {
$list = explode(',',$_SERVER['HTTP_CF_CONNECTING_IP']);
$_SERVER['REMOTE_ADDR'] = $list[0];
}
Conclusion
결국 wp-config.php
에 몇 줄만 추가되면 되는 내용인데. 사실상 정확히 알고자 하면 복잡한 부분이다. 현재 구축되어 있는 Reverse proxy에 대한 구조에 대한 이해 등이 일부 필요한 부분이 있다. 실제로 Reference [1]에서는 X-Forwarded-For를 사용하는 방법을 명시하고 있는데, Kubernetes Ingress 뒤에 있는 경우 이 값도 사실상 Internal IP이거나 Private IP일 확률이 높다. 그렇기 때문에, 정확하게 어떤 Header가 전달되는지를 확인할 필요가 있다.
아래 jungin500/http-request-tester
레포지토리는 필요한 경우 테스트 목적으로 활용 가능하다.
jungin500/http-request-tester:python
jungin500/http-request-tester:cplusplus
처음에는 Python 구현체로 만들고, 다시 C++로 변환하였다. Claude 만만세
Reference
[1] Technicus, Configure WordPress to report true IP addresses when behind a reverse proxy: https://techblog.jeppson.org/2014/09/configure-wordpress-to-report-true-ip-addresses-when-behind-a-reverse-proxy/
[2] Cloudflare Docs, Restoring original visitor IPs: https://developers.cloudflare.com/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips/#nginx-1
[3] Cloudflare, IP Ranges: https://www.cloudflare.com/ko-kr/ips/