Extra Form
PHP PHP 7.1
CMS XpressEngine

현재 LB + CDN 을 사용하고 있습니다. dns 에서 lb 서버 ip 로 등록했구요. 헤더 체크하고 캐시설정 되어있으면 cdn 에서 몽땅 해결하는 방식이네요.

 

문제는 cdn 을 사용하면 스팸필터가 말을 제대로 안듣습니다. 

비회원들은 무조건 recaptcha 를 사용하게 했는데, 스팸필터에 ip 를 등록하면 몇분후에 (cdn 캐싱 후 추정) 비회원들이 recaptcha를 성공해도 “블록된 ip” 메세지가 뜹니다. 

 

DB - 서버 - xe캐시 - 스팸필터 - cdn

 

어딘가에 쿵짝이 안맞아서 나는 에러같은데요. 서버에서 무언가가 캐싱되면 스팸필터가 제대로 작동 안하는거 같아요. 어느파일을 캐싱 안해줘야 스팸필터가 제대로 작동할런지 궁금합니다. 참고로 cdn 끄면 또 잘되요. 

 

효율적으론 서버 방화벽에서 ip 블록하는게 가장 좋은거같긴한데, 나중에라도 사이트 관리를 양도하게되면 스팸필터 기능을 전달드리고 싶어서요. 그분들은 방화벽 사용이 벅차실 듯...

TAG •
  • profile

    LB와 CDN을 거치면서 이용자들의 실제 IP 주소가 제대로 파악되지 않고 있는 것 아닐까요? 예를 들어 클라우드플레어를 사용하면서 별도의 조치를 취하지 않으면 모든 이용자의 IP가 불과 수십 개의 클플 IP로 집중되어서, 한 명이라도 차단하면 해당 클플 IP에 배정된 모든 이용자가 차단되어 버리는 문제가 있습니다.

     

    XE에서 생성하는 모든 웹페이지에는 캐시 방지 헤더가 붙어 있기 때문에 (슈퍼캐시 모듈에서 경고를 무시하고 쓸데없이 강력한 캐시 기능을 켜지 않는 한) 웹페이지 자체가 캐싱되는 일은 없습니다.

  • profile ?

    답변 감사합니다.
    아파치에서 직접 캐싱 옵션을 조정해주고. CDN 모니터링을 보니까 캐싱이 실제로 잘 되고 있더라구요. 로딩속도도 좋고, PoP 들도 많고, 방문자들 99%가 미국에 있어서 일단 CDN 은 킵하려구요. xe 라서 슈퍼캐시 모듈은 없는 듯 해요.

    LB 레벨로는 ip deny 지원을 안해서, 서버 방화벽에서 ip deny 해보니 블록이 잘 먹히더라구요. 이걸 보면 LB 에서 서버로 ip 전달을 잘 하고 있는 것 같아요.

    남은건 xe 자체 캐싱을 exclude 하는건데 애당초 xe 가 지원하는 캐싱시스템을 exclude 하면서 CDN 을 사용하면 무슨 side effect 가 생길지 겁나네요. php 디버깅 할 실력도 못되고.

    그냥 서버 방화벽에서 deny 하는걸로 만족해야하려나요.

  • ? profile
    크롬 개발자 도구에서 리턴 헤더를 확인해보세요. Cf-cache: HIT, Cdn-cache: HIT 같은 헤더가 있으면 CDN에서 캐싱 된거일수도 있어요
  • ? profile
    deny하고 계신 IP 주소들의 예를 좀 보여주시겠어요? 클플 IP인지 내부망 IP인지 실제 방문자 IP인지 확인해 보려고요. 앞의 2자리만 보이면 충분합니다. (예: 192.168.x.x)
  • profile ?
    혹시나 해서 확인해봤는데 CDN 회사 IP 주소로 나왔네요! 예전에 whois 로 봤을 때 네덜란드 국기가 나오길래 스팸인가해서 다시 확인해봤는데 CDN 회사거에요. 옮긴 후 부터 문서에 기록된 ip 주소들 모두 CDN 회사로 나오네요 ㅠ
    첫 댓글에서 "별도의 조치"라고 하셨는데 혹시 어떤 조치를 취해야하는지 알려주실 수 있나요? 희망이 보이네요!
  • ? profile

    https://gist.github.com/kijin/25be59ac4b0d7c5ef722

    아파치에 mod_cloudflare 설치하시는 방법도 있는데, LB 구성에 따라서는 안 먹힐 수도 있습니다.
    (LB에서 넘겨줄 때 내부망 IP가 나오는 것을 CDN IP로 이미 한 번 변환해 놓은 상태일 테니...)
    위의 소스는 XE에서 직접 처리하기 때문에 웹서버 구성의 영향을 받지 않습니다.

     

    클플 이외의 CDN이라면 헤더나 IP 대역이 다를 테니 위의 소스를 참고하여 적당히 응용하세요.

    아파치 2.4 이상 버전이라면 mod_remoteip를 사용하여 직접 설정할 수도 있고요.

  • profile ?
    정말 감사합니다.
    제가 쓰는 CDN ip 목록은 public 이 아니네요. 여러군데 찾아서 해봐도 막상 글 써보면 ip 가 다르구요. 일단 CDN 빼고 사용하면서 ip range 하나둘씩 모아봐야겠어요. 과연 리스트 완성이 될런지...
    좋은 클라우드 기능들 써보려고 클라우드 준비가 안된 cms 를 코딩머리 없이 억지로 쓰려니 탈이 나는가봅니다. 공부 한참 더 해야겠네요. 정말 좋은 도움 많이 주셔서 감사합니다.
  • ? profile
    대부분의 로드뱔런서들은 X-Forwarded-For 헤더를 덮어씌워버립니다. 만약 클라이언트 IP가 꼭 필요하다면 CDN에서 다른 헤더로 클라이언트 IP를 넘기던지 아니면 로드벨런서에서 X-forwarded-For 헤더를 유지할 수 있도록 해야 하실겁니다. 아니면 Css,jpg 등 static 파일들만 다른 도메인이 호스팅하고 그 도메인만 CDN을 켜도 되고요
  • profile ?
    감사합니다! CDN 회사의 LB doc 을 보니 과연 X-Forwarded-For 헤더를 언급하네요. LB와 연결되는 서버에서 헤더를 받아오는 방법이 있는데, 한번 해봐야겠어요. 어떻게든 성공하면 꼭 답글 달겠습니다!
  • profile profile
    X-Forwarded-For 헤더를 사용할 때는 조심해야 합니다. 이용자가 프록시를 사용하거나 고의로 헤더를 중복 전송하면 IP 주소 여러 개가 줄줄이 붙어서 나올 수 있기 때문에 XE에서 무척 혼란스러워하는 것은 물론, 문제를 일으키는 이용자가 누구인지 파악하기도 힘들어집니다. 클플에서 CF-Connecting-IP 헤더를 병용하는 이유도 X-Forwarded-For 헤더를 신뢰할 수 없기 때문입니다.

    X-Forwarded-For: 1.2.3.4, 5.6.7.8, 9.10.11.12

    이런 헤더 보신 적 있나요? 실제 존재하는 규격입니다. 이거 어떻게 처리할 건가요? ㅎㅎ
  • profile ?
    앗 아아...
    파면 팔수록 들어가 버리는 코딱지네요.
    doc 읽어보니 제가 사용하는 CDN 회사는 LB 가 알아서 처리한다는 문구가 있는데... 제가 제대로 테스트 해보기 전까진 모를 듯...
  • profile ?
    일단 x-forwarded-for 를 테스트 먼저 해보려고 하는데요.
    헤더는 x-forwarded-for 를 넣는게 맞는거 같은데, value 는 무얼 넣어야 xe (혹은 서버)가 이해할 수 있을까요? <unverified IP>, <immediate client IP>, <global forwarding rule external IP>, <proxies> 이렇게 4개가 리턴되는거 같은데 value 에 뭘 넣어야 2번째인 <immediate client IP> 이걸 xe 로 전달할 수 있을지요?
  • ? profile
    어떤 CDN이고 어떤 서버 구성인지 모르는데 어떻게 답을 드릴 수 있을까요? 차라리 CDN 회사에 물어보세요.
  • ?
    해결했습니다.
    제가 이용하는 회사는 x-forwarded-for 를 보니 쉼표로 나눠서 ip 주소들을 2개 보내네요. Request Header 를 바꿔서 (1.2.3.4) 해보니 그걸 앞에 하나 더 붙혀서 3개를 보내구요. 쉼표들로 나눠오는 ip 주소들을 어떻게 해야할지 검색해보니 explode 사용하면 알아서 array 로 정해주네요. 그걸 count - 2 하니까 2개를 보내던 3개를 보내던 원하는 verified client IP 를 받을 수 있었습니다.

    코딩 하나도 모르는 상태에서 하려니 오래 걸렸어요 ㅎㅎㅎ 힌트 주신 두분께 감사드립니다.