모두 안녕하세요,
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
어떻게 생각하시나요?