질문/조언질답게시판
Extra Form
PHP PHP 7.3
CMS Rhymix

다른 모듈을 보니 사용자의 ip를 $_SERVER['REMOTE_ADDR'] 로 가져오던데 사용해보니 서버의 주소가 출력되네요.

https://gist.github.com/kijin/25be59ac4b0d7c5ef722 여길보니

라이믹스는 클플을 사용해도 정상적으로 작동되는 것 같은데, 현재 바뀐내용이 있나요?

  • ?
    https://gist.github.com/kijin/25be59ac4b0d7c5ef722
    는 라이믹스든 XE 든 무관하게 작동합니다.
    config/config.user.inc.php 파일에 넣어 사용할 것 ( * 파일이 존재하지 않을 경우 생성 )
    이라고 되어있네요 ( 실제 잘 작동합니다 )
  • profile

    바뀐 것은 없습니다. 라이믹스에서는 링크하신 스크립트가 필요하지 않습니다. 라이믹스에서 저걸 중복으로 사용하실 경우 어떤 결과가 나올지는 확인해본 바 없습니다.

     

    단, 로드밸런서 사용 여부나 서버 구성에 따라 $_SERVER['REMOTE_ADDR']가 정확하지 않을 수 있습니다. 구체적으로 어떤 구성으로 되어 있고 어떤 증상이 나타나는지 말씀해 주시면 원인을 찾아볼 수 있겠습니다.

  • profile profile
    현재 haproxy가 도메인으로 요청을 분류해 같은 서버에 도커 컨테이너들로 가르키게 하는 구조? 입니다.
    여기서 $_SERVER['REMOTE_ADDR']가 서버의 프라이빗 ip를 출력하네요.. haproxy설정을 변경해야되는 부분이 있을까요?
  • profile profile

    앞단에 haproxy가 있다면 복잡해지지요. 클플을 포함하여 2개의 프록시를 뚫고 방문자의 실제 IP를 알아내야 하는 상황이니...

    라이믹스나 위의 스크립트나 작동방식은 똑같습니다. $_SERVER['REMOTE_ADDR']에 들어 있는 IP가 클플 IP 대역인 경우 CF-Connecting-IP 헤더를 참조하여 실제 IP를 알아냅니다. 그런데 $_SERVER['REMOTE_ADDR']에 내부망 IP가 들어 있으면 클플 IP 대역이 아니니까 작동하지 않지요. 이렇게 구현해놓은 이유는 맨 아래 문단에서 다시 설명드리겠습니다.

    클플 IP 대역 목록: https://www.cloudflare.com/ips/

    아무튼 이런 상황이라면 haproxy에서 특정 헤더를 사용하여 클플 IP 또는 실제 IP를 넘겨주고, 뒷단의 서버에서 mod_remoteip 등을 사용하여 그 정보를 $_SERVER['REMOTE_ADDR']에 담아주도록 해야 합니다. haproxy와 뒷단 서버 모두의 협력이 필요하지요. 헤더는 CF-Connecting-IP 그대로 넘겨주어도 되고, X-Forwarded-For나 X-Real-IP 등을 사용하기도 하지만 이름은 중요하지 않고 양쪽이 같은 헤더를 참조하기만 하면 됩니다.

    common/framework/filters/ipfilter.php에서 getCloudFlareRealIP() 함수를 수정하여 클플 IP 대역인지 아닌지 상관없이 무조건 IP를 대체하도록 하는 방법도 있습니다만, 이 경우 엉뚱한 사람이 CF-Connecting-IP 헤더를 임의로 추가하여 자기 IP를 숨기려고 하는 경우를 잡아낼 수 없기 때문에 권장하는 방법은 아닙니다.

  • profile profile
    감사합니다 ㅎㅎ 해결되었습니다^^