프락시를 통해서 웹서버를 접근하게 되면 시스템내 아파치로그에는 프락시아이피가 찍히게 된다...이럴경우 실제 리얼아이피를 확인하기위한 방법은... HTTP_X_FORWARDED_FOR 환경변수를 사용!!
실제로 HTTP 헤더에는 서비스요청시에 헤더부분에 클라이언트의 IP를 포함하게 되는데 이때 서비스를 요청하는 클라이언트가 보내는 패킷의 헤더를 검사하면 IP를 역추적이 가능하다..
헤더의 X-Forwarded-For : IP 부분에 나오는 아이피가 실제 리얼아이피!!
패킷캡처(tcpdump)
17:45:42.048773 IP xxx.xxx.xxx.xxx.8932 > 218.236.115.222.80: P 3605509893:3605510720(827) ack 1557948306 win 170 <nop,nop,timestamp 675799409 1767044308>
E..o.f@.6...t}."..s."..P....\.g............
(G.qiR..GET /js/wrest.gif HTTP/1.0
Accept: */*
Referer:
http://board.mojily.com/Accept-Language: ko
UA-CPU: x86
Accept-Encoding: gzip, deflate
If-Modified-Since: Tue, 20 Feb 2007 01:20:48 GMT
If-None-Match: "9f38c-33-45da4cf0"
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)
Host: board.mojily.com
Cookie: f33d2ed86bd82d4c22123c9da444d8ab=MTIyNTk1Njk4NA%3D%3D; 2a0d2363701f23f8a75028924a3af643=MTE2LjEyNS4yOC4zNA%3D%3D; 96b28b766b7e0699aa91c9ff3d890663=aHR0cDovL2JvYXJkLm1vamlseS5jb20v; PHPSESSID=d3c0e000a9b2acdf8a6443dbb59426e1
Via: 1.1 proxy.smileserv.com:80 (squid)
X-Forwarded-For: 220.90.215.4Cache-Control: max-age=259200
Connection: keep-alive
샘플 파일
<?
if ($HTTP_X_FORWARDED_FOR)
{
echo "현재 Proxy Server 사용중이네요;;;<br>";
echo "Proxy IP : $REMOTE_ADDR<BR>";
echo "Real IP : $HTTP_X_FORWARDED_FOR<BR>";
}
else {
echo "현재 Proxy Server 미사용중";
echo "Real IP : $REMOTE_ADDR <BR>";
}
?>
ASP의 경우
asp 경우에도 마찬가지로
HTTP_X_FORWARDED_FOR 값으로 동일하게 값을 받습니다. 앞에 $ 붙고 않붙고 차이 정도 ^^
그리고
HTTP_CLIENT_IP 로도 접속자의 실제 아이피를 출력합니다.
프록시 - Proxy 는 크래커를 지켜주지 못한다.
인터넷 상에서 데이터를 전송할 때 꼭 필요한 것 중에 하나가 IP Address 이다.
네트워크 상에서 IP 는 자신의 고유 주소로써 데이터를 송/수신할 때 꼭 필요한
것 중에 하나이다.
본래 Proxy 는 네트워크의 중간에 설치함으로써 Cache 등의 기능을 활용하여
네트워크 트래픽을 줄이거나 자원의 절약을 위해서 사용되었으나 근래에 들어서
그 용도가 많이 변질되었다.
Proxy 라 함은 주로 Web Proxy 를 많이 뜻하는데, Web Proxy 를 이용하여 인터넷을
사용할 경우 자신의 IP 를 노출시키지 않고 Proxy Server 의 IP 를 이용한다는
점에서, 사용자의 프라이버시를 지킬 수 있다는 것에 많은 사람들이 애용하고 있다.
그러나 특정 부류의 경우 Proxy 를 이용하여 악성 리플을 남기거나, 불법적인
행위를 하는 경우가 있는데, Proxy 의 익명성을 이용하여 이러한 행동을 한다면
이는 잘못된 생각이다. Proxy 는 사용자를 지켜주기 위해 개발된 것이 아니다.
이 글은 Proxy 의 익명성을 이용하여 인터넷에서 악의적인 행동을 하는
사람들을 대상으로 쓸 것이다.
Proxy 서비스를 제공해주는 A 라는 Proxy 서버가 있다고 가정하자. B 라는 사용자는
A Proxy 서버를 이용하여 C 사이트에 연결할 것이다. B 는 인터넷 익스플로어의
Proxy 관련 설정으로 A Proxy 를 지정하였다. 이럴 경우 B 사용자는 C 사이트에 연결
할 때 다음과 같은 경로를 거치게 된다. (중간의 Network 경로는 생략하였다.)
B (사용자) -> A (Proxy Server) -> C (웹 사이트)
보기에, B 사용자는 A Proxy 서버를 거쳐서 C 에 가기 때문에, C 사이트는 B 사용자의
주소를 모를 것처럼 보인다. 이 것이 Proxy 서버가 사용자의 익명성을 지켜준다고
생각한다. 하지만 실제로는 그렇지 않다.
Proxy 서버가 C 사이트에 Web Contents 를 요청할 때, 여러 가지 헤더를 넘기게
되는데, 이 때 Proxy 를 이용하는 원래 사용자의 IP 도 같이 넘겨주기 때문이다.
여기서 A Proxy 서버는 C 사이트에 Web 요청을 보낼 때, B 사용자의 IP 정보도
같이 넘겨주게 되는데, 그 메소드는 "X-Forwarded-For" 이다.
Apache 웹 서버를 대상으로 설명하자면, Apache 웹 서버는 Request 의 헤더 중에
X-Forwarded-For 라는 것이 있다면 이 것을 환경 변수에 저장한다. 즉, C 사이트는
A Proxy 서버를 이용하는 B 사용자의 IP 주소도 알 수 있다는 이야기가 된다.
여기서는 웹 사이트에 접속한 사용자가 Proxy 서버를 이용하여 들어왔는지 알아
내는 방법을 PHP 를 대상으로 설명해보겠다. PHP 에서는 Apache 웹 서버에서 저장한
환경 변수를 상속받아 PHP 의 환경 변수로 다시 저장하는데, Proxy 가 보내온
헤더의 정보 중 "X-Forwarded-For" 는, PHP 에서 $HTTP_X_FORWARDED_FOR 변수에
담기게 된다.
만약 서버 관리자의 입장으로써, Proxy 서버를 이용하는 사람들을 막고 싶다면
HTTP_X_FORWARDED_FOR 환경 변수를 체크함으로 이용할 수 있을 것이다. 그러나
여기서 한가지 주의해야 할 점은, 회사나 학교 등에서는 내부 IP 를 사용하는
경우가 가끔 존재하는데, 이럴 경우 외부로 나가는 패킷은 집단 내에 존재하는
Proxy 서버를 통해서 나가게 되는 경우가 있다.
이럴 경우에, HTTP_X_FORWARDED_FOR 환경 변수가 존재한다고 무조건 사용자의
접근을 차단하는 방법을 이용해서는 안되고, Original IP 가 가상 IP 에서만
존재할 수 있는 것인지 확인을 한 후 처리를 해야할 것이다. 예를 들어 Original
IP 가 "192.168.0.100" 이라면 가상 IP 이다.