Cloudflare 템플릿으로 사용자 실제 IP를 가져오는 방법 제안

모두 안녕하세요,

nginx에서 Cloudflare의 real_ip_header CF-Connecting-IP; 설정에 대해 길고 험난한 과정을 거쳐서야 알게 되었습니다…

nginx proxy manager가 자체 docker 이미지로 실행되는 꽤 복잡한 구성을 사용하고 있습니다(참고로 linuxserver.io의 SWAG을 사용 중인데, 정말 훌륭합니다). 따라서 연결 경로는 다음과 같습니다:
사용자 -> Cloudflare -> 서버(1번째 docker 컨테이너: Nginx -> 2번째 docker 컨테이너: Discourse)

두 docker 컨테이너는 같은 docker 네트워크에 있으므로 통신이 가능합니다. 그 부분은 문제가 없었습니다.
Discourse 로그에서 사용자의 원본 IP를 가져오려다 큰 문제를 겪었습니다. 이곳의 유용한 스레드들을 모두 읽고 app.yml 파일에 cloudflare 템플릿을 추가했지만, 여전히 작동하지 않았습니다…

머리가 빠질 뻔하다가, 문제는 Cloudflare 템플릿 자체보다는 Discourse 컨테이너가 IP 주소를 NGINX 컨테이너에서 가져오고 있었고, set_real_ip_from에 docker 네트워크 IP CIDR를 다음과 같이 추가해야 한다는 사실을 깨달았습니다:
set_real_ip_from 172.18.0.0/16;

미래의 호스트들을 돕기 위해, 이 줄을 cloudflare 템플릿에 추가하는 것이 가능할까요? IP 범위 172.18.0.0/16은 어차피 사설 주소이므로, NPM을 docker 컨테이너로 사용하지 않더라도 이 범위를 추가하는 데 아무런 해가 되지 않을 것입니다.

제 제안은 cloudflare.template.yml의 이 줄을:
sed -i "/sendfile on;/a $CONTENTS\nreal_ip_header CF-Connecting-IP;" /etc/nginx/conf.d/discourse.conf
다음 줄로 변경하는 것입니다:
sed -i "/sendfile on;/a set_real_ip_from 172.18.0.0/16;\n$CONTENTS\nreal_ip_header CF-Connecting-IP;" /etc/nginx/conf.d/discourse.conf

어떻게 생각하시나요?

리버스 프록시를 사용하는 방법에 대해 설명하는 다양한 주제가 있습니다. Cloudflare를 사용하는 모든 사람이 리버스 프록시를 사용하는 것은 아닙니다.

다만, 스크립트 없이 설정할 때마다 매번 찾아봐야 하는 점을 고려하면 리버스 프록시 템플릿이 있으면 좋을 것 같습니다.

맞습니다. 그 반대도 마찬가지입니다. 리버스 프록시를 사용하는 모든 사람이 클라우드플레어를 사용하는 것은 아니죠 :wink:

이 제안은 정말로 클라우드플레어를 사용하는 사람들의 삶을 더 쉽게 만들어 줄 것입니다. 도커에서 리버스 프록시를 사용하지 않는 사람들에게는 아무것도 변하지 않을 것이지만, 단순한 문제에 대한 답을 찾는 데 수 시간을 절약해 줄 수 있습니다.

Cloudflare를 사용하는 사람들은 대체로 힘든 삶을 살고 있을 가능성이 높습니다. 여기에서 검색해 보면 그 이유에 대한 수많은 예시를 찾을 수 있습니다. 템플릿 설치 문제는 여러분이 겪을 수 있는 문제들 중 일부일 뿐이며, 그중에서도 가장 쉽게 해결할 수 있는 부분입니다. (저라면 저렴하지만 무료는 아니며 설정이 쉬운 bunny.net 같은 실제 CDN 사용을 권할 것인데, 그것이 여러분이 질문하신 내용은 아닙니다.)

물론, 여러분의 문제는 Cloudflare와는 무관하고 리버스 프록시와 관련이 있었기 때문에 Cloudflare로 검색하는 것은 도움이 되지 않았을 가능성이 큽니다!

그래도 리버스 프록시(그리고 제가 정말 원했던 것—에셋을 사전 컴파일하여 S3에 푸시하는 템플릿)와 같은 몇 가지 추가 표준 템플릿을 제공하는 것은 좋은 아이디어입니다.

행운을 빕니다.