다단 계 에이전트 에서 Nginx 가 실제 사용자 IP 주 소 를 가 져 오 는 총 결

7991 단어
nginx 의 급속 한 발전 에 따라 점점 더 많은 회사 들 이 apache 를 nginx 로 바 꾸 는 동시에 점점 더 많은 사람들 이 nginx 를 부하 균형 으로 사용 하고 대리 앞 에 CDN 가속 도 추가 할 수 있 지만 이에 따라 문제 가 발생 합 니 다. nginx 는 사용자 의 실제 IP 주 소 를 어떻게 얻 습 니까? 백 엔 드 가 apache 라면 < apache 로 이동 하여 사용자 의 실제 IP 주 소 를 가 져 옵 니 다 >.백 엔 드 리 얼 서버 가 nginx 라면 계속 내 려 다 보 세 요.
인 스 턴 스 환경: 사용자 IP 120.22.11.1.11CDN 전단 61.2.22.22.22.2.222CDN 중계 121.207.33.33 회사 NGINX 전단 대리 192.168.50.121 (외부 네트워크 121.207.231.22)
1. CDN 사용자 정의 IP 헤드 로 가 져 오기
만약 당신 의 CDN 업 체 가 nginx 를 사용한다 면, nginx 에서 $remoteaddr 가 지정 한 머리 에 값 을 부여 합 니 다. 방법 은 다음 과 같 습 니 다.proxy_set_header remote-user-ip $remote_addr;
/ / 위 와 같이 백 엔 드 는 remoteuser_ip 의 http 머리, 어떤 사람들 은 잘못 골 랐 을 수도 있 습 니 다. 제 가 설정 한 머리 가 remote - user - ip 이 아니 라 고 했 습 니 다. 어떻게 remote 라 고 썼 습 니까?user_ip, 작가 가 잘못 쓴 것 아 닙 니까?set_헤더 사용자 정의 헤더 가 잘못 되 었 습 니 다 >
백 엔 드 PHP 코드 getRemoteUserIP. php<?php      $ip = getenv( "HTTP_REMOTE_USER_IP" );      echo   $ip;    ?>
getRemoteUserIP. php 에 접근 한 결 과 는 다음 과 같 습 니 다.120.22.11.11 // IP
주: 여기 $remoteaddr 는 nginx 의 변수 입 니 다. 일반적인 상황 은 메시지 발송 자의 IP 주소 입 니 다. 만약 에 발송 자가 proxy 라면 여 기 는 proxy 의 ip 입 니 다. 사용자 의 실제 ip 이 아 닙 니 다.
메모: 이 안에 문제 가 있 습 니 다. 이른바 XFF 사기 입 니 다. 사용자 가 백 엔 드 를 직접 방문 할 때 그 는 HTTP 헤더 REMOTE 를 위 조 했 습 니 다.USER_IP, 그러면 백 엔 드 에서 얻 을 수 있 는 것 은 허위 사용자 IP 입 니 다. 이 럴 때 안전 문제 가 발생 할 수 있 습 니 다.가능 하 다 면, 권장 하 는 방법 은 백 엔 드 서비스 가 외부 사용자 에 대한 접근 을 허용 하지 않 습 니 다. 맨 앞 에 있 는 에이전트, proxy 입 니 다.set_header xxxxx $remote_addr;이렇게 하면 사 기 를 해결 할 수 있 습 니 다. $remoteaddr 는 사용자 IP 패 킷 의 IP 를 가 져 옵 니 다. 위 조 된 HTTP 메시지 의 첫 번 째 부분 이 아 닙 니 다.
2 、 HTTPX_FORWARDED_FOR IP 주소 가 져 오기
일반적으로 CDN 서버 는 HTTP 를 전송 합 니 다.X_FORWARDED_FOR 머리.그리고 proxyset_header X-Forwarded-For $proxy_add_x_forwarded_for;
여기, $proxyadd_x_forwarded_for 는 신기 한 변수 입 니 다. 받 은 메시지 에 X - FORWARDED - FOR 첫 번 째 부분 이 포함 되 어 있다 면 nginx 는 뒤에 $remote 를 추가 합 니 다.addr (즉 발송 자의 ip 주소 가 마지막) 이 므 로 백 엔 드 의 실제 서버 에서 HTTP 를 가 져 옵 니 다.X_FORWARDED_FOR 헤드, 문자열 의 첫 번 째 unown 이 아 닌 IP 를 사용자 의 실제 IP 주소 로 캡 처 합 니 다. 예 를 들 어:
120.22.11.11,  61.22.22.22,  121.207.33.33,192.  168.50.121 (사용자 IP, CDN 전단 IP, CDN 중계, 회사 NGINX 대리)
getFor.php <?php      $ip = getenv( "HTTP_X_FORWARDED_FOR" );      echo   $ip; ?>
getFor. php 에 접근 한 결 과 는 다음 과 같 습 니 다.120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
만약 당신 이 phop 프로그래머 라면, unknow 가 아 닌 첫 번 째 ip 주 소 를 가 져 옵 니 다. 여 기 는 120.22.11.11 입 니 다.
마찬가지 로 XFF 사 기 를 방지 하기 위해 서 는 1 층 대 리 를 제외 하고 나머지 는 일반 사용자 의 접근 을 금지 합 니 다. 1 층 대 리 는 $remote 를 사용 합 니 다.addr 에서 pass 를 설정 합 니 다. X - Forward - for 면 됩 니 다.
3. nginx 자체 모듈 realip 를 사용 하여 사용자 IP 주 소 를 가 져 옵 니 다.
어떤 때 는 중간 이나 백 엔 드 의 에이전트 가 일반 사용자 에 게 접근 하거나 nginx 로그 에서 $remoteadrr 설정 형식 은 외부 사용자 의 ip 를 표시 할 수 있 습 니 다. 이 럴 때 realip 모듈 을 사용 해 야 합 니 다.nginx 를 설치 할 때 realip 모듈 을 추가 합 니 다. 제 인 자 는 다음 과 같 습 니 다../configure --prefix=/usr/ local /nginx-1.4.1 --with-http_realip_module
실제 서버 nginx 설정server {      listen       80;      server_name  www.ttlsa.com;      access_log  /data/logs/nginx/www.ttlsa.com.access.log  main;      index index.php index.html index.html;      root /data/site/www.ttlsa.com;      location /      {              root /data/site/www.ttlsa.com;      }      location = /getRealip.php      {              set_real_ip_from  192.168.50.0/24;              set_real_ip_from  61.22.22.22;              set_real_ip_from  121.207.33.33;              set_real_ip_from 127.0.0.1;              real_ip_header    X-Forwarded-For;              real_ip_recursive on;              fastcgi_pass  unix:/var/run/phpfpm.sock;              fastcgi_index index.php;              include fastcgi.conf;      } }
getRealip. php 내용<?php      $ip =  $_SERVER[ 'REMOTE_ADDR' ];      echo   $ip;    ?>
www. ttlsa. com / getRealip. php 를 방문 하여 다음 을 되 돌려 줍 니 다.120.22.11.11
하면, 만약, 만약...ip_recursive on 또는 realip_recursive off www. ttlsa. com / getRealip. php 를 방문 하고 돌아 갑 니 다.121.207.33.33
불 행 히 도 중계 IP 를 얻 었 습 니 다. realip_recursive 의 효 과 는 알 겠 지?
set_real_ip_from: 실제 서버 의 이전 프 록 시 IP 주소 나 IP 세그먼트, 여러 줄 realip_header: 어느 header 헤드 에서 원 하 는 IP 주 소 를 검색 합 니까 realip_recursive: IP 주 소 를 재 귀적 으로 제거 하고 ip 문자열 은 오른쪽 에서 왼쪽으로 set 를 제거 합 니 다.real_ip_from 에 나타 난 IP 는 이 ip 세그먼트 가 나타 나 지 않 은 IP 가 나타 나 면 이 IP 는 사용자 의 IP 로 여 겨 집 니 다.예 를 들 어 제 예 를 들 어 실제 서버 에서 얻 은 IP 주소 문자열 은 다음 과 같 습 니 다. 120.22.11.11, 61.22.22, 121.207.33.33, 192.168.510.121 은 real 에 있 습 니 다.ip_recursive on 의 경우 61.22.22, 121.207.33.33, 192.168.50.121 이 set 에 나 타 났 다.real_ip_from 에서 120.22.11.11 만 나타 나 지 않 았 다 면 그 는 사용자 의 ip 주소 로 여 겨 지고 reote 에 할당 되 었 다.addr 변수
realip_recursive off 또는 설정 하지 않 은 상태 에서 192.168.50.121 이 set 에 나타 납 니 다.real_ip_from 에서 제외 하면 다음 ip 주 소 는 사용자 의 ip 주소 라 고 생각 합 니 다.
다음 설정 만 있 으 면:set_real_ip_from   192.168.50.0/24; set_real_ip_from 127.0.0.1; real_ip_header    X-Forwarded-For; real_ip_recursive on;
방문 결 과 는 다음 과 같 습 니 다.121.207.33.33
여기 서 이해 못 하 는 친구 가 있 을 수 있 으 니 httprealip_module 이 모듈 은 세 가지 명령 을 포함 합 니 다.
1、set_real_ip_from 은 어떤 신뢰 전 대리 로부터 실제 사용자 ip 를 받 아들 이 는 것 을 말한다.
2、real_ip_header 는 메 시 지 를 받 은 http 의 첫 번 째 부분 에서 전 프 록 시 전송 사용자 ip 를 가 져 오 는 것 을 말 합 니 다.
3、real_ip_recursive 에서 사용자 ip 을 얻 을 때 까지 재 귀적 으로 제거 할 지 여부 (기본 값 은 off) 
우선, realip_header 는 http 의 첫 번 째 이름 을 지정 합 니 다. 기본 값 은 X - Real - IP 입 니 다. 기본 값 을 사용 하면 nginx 는 메 시 지 를 받 은 후에 http 의 첫 번 째 X - Real - IP 를 볼 수 있 습 니 다.
(1) IP 가 1 개 있 으 면 발송 자의 ip 이 set 에 있 는 지 확인 합 니 다.real_ip_from 지정 한 신뢰 ip 목록 에서.신뢰 받 는 것 이 라면 이 X - Real - IP 의 IP 값 이 전 에이전트 가 자신 에 게 알려 준 것 이 라 고 생각 합 니 다. 사용자 의 실제 IP 값 이기 때문에 이 값 을 자신의 $remote 에 할당 합 니 다.addr 변수;신뢰 를 받 지 못 하면 처리 하지 않 습 니 다. 그러면 $remoteaddr 또는 발송 자의 ip 주소 입 니 다.
(2) X - Real - IP 에 여러 개의 IP 값 이 있다 면, 예 를 들 어 이전 에이전트 가 이렇게 설정 한 것: proxyset_header X-Real-Ip $proxy_add_x_forwarded_for;
IP 를 얻 었 습 니 다. 그러면 이때 realip_recursive 의 값 이 중요 합 니 다.nginx 는 ip 목록 의 오른쪽 에서 왼쪽으로 set 를 비교 합 니 다.real_ip_from 신뢰 목록 의 ip.하면, 만약, 만약...ip_recursive 는 off 입 니 다. 그러면 맨 오른쪽 에 있 는 IP 가 신뢰 IP 라 는 것 을 알 게 되 었 습 니 다. 즉, 다음 IP (오른쪽 두 번 째) 가 사용자 의 진정한 IP 라 고 생각 합 니 다.하면, 만약, 만약...ip_recursive 가 on 이면 오른쪽 에서 왼쪽 까지 차례대로 비교 하여 신뢰 IP 가 아 닌 것 을 찾 을 때 까지 알 수 있 습 니 다.그리고 IP 값 을 $remote 에 복사 합 니 다.addr。(위의 예 를 참고 하여 이 과정 을 이해 하 는 데 도움 을 줄 수 있다)
따라서 전체 과정 을 알 게 된 후에 우 리 는 realip 모듈 을 사용 하 는 것 이 매우 좋 고 각종 사용자 IP 를 얻 는 수 요 를 만족 시 킬 수 있 으 며 XFF 에 속 지 않 는 다 는 것 을 알 게 되 었 습 니 다!
그러면 문제 가 생 겼 습 니 다. 백 엔 드 는 사용자 ip 을 얻 고 싶 을 뿐만 아니 라 대리 ip 도 얻 고 싶 습 니 다. 어떻게 해 야 합 니까?그럼 이때 $proxyadd_x_forwarded_도움 이 되다.각 층 의 프 록 시 IP 만 있 으 면 좋 은 습관 을 유지 할 수 있 습 니 다: proxyset_header X-Forwarded-For $proxy_add_x_forwarded_for;그 다음 에 백 엔 드 에서 얻 은 X - Forward - For 의 첫 번 째 부분 은 바로 사용자 IP 가 각 층 에 대리 되 는 IP 입 니 다. 자신의 대리 ip 에 가장 가 깝 고 각종 웹 개발 언어 는 발송 자의 실제 IP 를 얻 는 인터페이스 가 있 습 니 다. 그리고 어떻게 해 야 하 는 지 아 시 죠?!

좋은 웹페이지 즐겨찾기