안녕하세요! 정말 급한 질문 드려봅니다! ㅜㅜ 부디 도와주세요
CMS/프레임워크 | 기타 |
---|---|
개발 언어 | PHP 5.x |
제가 TCP통신에 클라우드플레어를 사용하고있습니다. 그러므로써 서버컴 DB로그에 유저들이 클플ip대역으로 표시가됩니다. 그래서 구글링결과 nginx로
stream {
server {
listen 5000;
proxy_pass 127.0.0.1:5001;
}
}
이렇게하였지만, 이제는 또 유저들 IP가 전부 127.0.0.1로 나오게됩니다. 진짜 이것때문에 머리털 다빠지것슴다...
한번만 정보공유좀해주세요.앞단에 클플을써도 저의 서버컴 DB에는 실제 ip가 기록되게하는법이요...
댓글 11
클플 공식 매뉴얼: https://developers.cloudflare.com/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips/
PHP에서 땜빵하기: https://gist.github.com/kijin/25be59ac4b0d7c5ef722
nginx 사용중이시면 ngx_stream_realip_moodule 사용하시면 되구요
stream {
real_ip_header X-Forwarded-For;
set_real_ip_from 클페 아이피 범위;
}
그리고 서버 재시작하면 클페에 실제 사용자의 ip 가 전달됩니다.
Stream 구문에서 쓸수없답니다. 참고로 다시말씀드리자면 HTTP 통신이아닌 TCP 통신임을 알아주세요.ㅠ
HTTP가 아니라면 헤더에 의존하는 모든 기능은 무의미할 테고...
클플 Spectrum을 사용해서 TCP 통신을 할 경우, 패킷 앞에 실제 클라이언트의 IP 주소를 마치 헤더처럼 붙여주는 옵션이 있다고 하니 자세히 알아보세요. 해당 프로토콜은 nginx에서도 지원한다고 합니다.
https://developers.cloudflare.com/spectrum/how-to/enable-proxy-protocol/
https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/
실제 IP가 포함된 패킷이 최종적으로 DB를 이용하는 프로그램(백단)까지 전달되어야겠지요. 헤더는 사용할 수 없으니 패킷 내용에다가 집어넣는 수밖에요.
nginx에서는 정상 인식하는데 백단에서 nginx의 로컬 IP밖에 못 보는 것이 문제라면, 프록시 프로토콜을 nginx에서 처리하지 않고 백단에서 처리하도록 하는 방법도 있겠습니다. 그러면 그걸 처리하는 과정에서 클플이 알려준 IP 정보를 추출할 수 있을 테니까요. 사용자와 DB 사이에 1) 클플 2) nginx 이렇게 2단계나 거치니 자꾸 정보가 유실됩니다.