X-Forwarded-For를 이용한 apache 웹 서버 접속 실제 IP 파악하기

발췌 : http://knamhun.blogspot.com/2008/04/ip.html 외 기타

[아파치] 가상서버 내 아차피 로그설정시 리모트 IP 옵션
일반적으로 가상호스트의 아파치 로그 설정은

LogFormat “%v %h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\””

이렇습니다. %v 가 가상호스트명이고, %h 가 리모트 ip 입니다.

근데 가상서버내에서는 %h 가 게이트웨이 IP 로 나오기 때문에 조금 수정이 필요합니다.

LogFormat “%v %{X-Forwarded-For}i %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\””

여기서 %h 를 %{X-Forwarded-For}i 로 변경해 주서야 합니다.

HTTP Header 값인 X-Forwarded-For 를 바로 사용하는 것입니다.

가상서버 이용에 참고하시기 바랍니다.




reverse proxy add forward module로 해결하기
가상서버에서 방문자 IP가 잡히지 않는 문제는 아파치로그 뿐만이 아닌 웹솔루션 소스를 뜯어 고쳐야 하는 것과 사이트 관리상에 상당한 문제점이 발생할 수 있습니다. 따라서 이러한 문제를 근본적으로 해결할 수 있는 것이 바로 reverse proxy add forward(RPAF)입니다. 이 모듈을 올려주면 이러한 문제가 해결이 되므로 가상서버, VPS, UML에서는 필수적인 모듈입니다.

1. 설치방법 방법은 http://www.just4fun.co.kr/drupal/?q=node/233 에서 소개한 것처럼 하면 됩니다.
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar xzvf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
/usr/local/httpd/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

2. mod_rpaf-2.0라는 공유객체가 생성이 되면 아파치 모듈에 자동 복사되어 넣어집니다. LoadModue에도 자동 추가 됩니다.(httpd.conf)
LoadModule rpaf_module modules/mod_rpaf-2.0.so

3. 다음을 2번 아래에 추가합니다.
RPAFenable On
RPAFsethostname On
RPAFproxy_ips [내부IP]

여기서 내부IP는 자신의 가상서버의 IP가 아닌 또다른 내부IP입니다. 제생각에는 포워딩을 해주는 프록시 IP같은데, 아파치 로그를 보면 계속 어떤 특정한 IP로 찍히는 것을 확인할 수 있을 것입니다. 그것을 기입합니다. (예를들면 10.0.0.177 또는 192.0.0.20)
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 10.0.0.177

4. 이제 아파치를 재가동하면 정상적으로 IP가 기록되는 것을 로그파일로 확인할 수 있습니다.
5. 로그설정에서 IP(X-Forwarded-For)식으로 2개를 활용하면 IP(실제IP)가 잡힙니다.

*** 간혹 프록시를 이용해서 장난치는 경우도 실제IP를 파악할 수 있습니다



LogFormat “%v %{X-Forwarded-For}i %l %u %t \”%r\” %>s %b” X-Forwarded-For
CustomLog /var/log/apache/www.example.com-xforwarded.log X-Forwarded-For

EX)
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
LogFormat “%h %l %u %t \”%r\” %>s %b” common
LogFormat “%{Referer}i -> %U” referer
LogFormat “%{User-agent}i” agent
LogFormat “%v %{X-Forwarded-For}i %l %u %t \”%r\” %>s %b” X-Forwarded-For


X-Forwarded-For 헤더를 이용한 Apache ACL 설정





이 설정은 추가 모듈을 필요로 하지 않으며, 현재 Apache에서 제공하는 ACL 기능만으로 구현이 가능합니다.



설정 예)
X-Forwarded-For 헤더값으로 넘어오는 IP가 172.21.21.* network인 모든 Client와 192.168.122.111 인 Client만 접속을 허용하고 나머지에 대해서는 접속을 거부(403 access deny) 함.





<Directory “/app/apache/htdocs”>
SetEnvIf X-Forwarded-For ^172\.21\.21\.* allow_ip
SetEnvIf X-Forwarded-For ^192\.168\.122\.111 allow_ip
Order deny,allow
Deny from all
Allow from env=allow_ip
< /Directory>






위의 allow_ip는 중복해서 계속 추가해서 쓰면 됩니다.

Cache를 통한 서비스를 제공하다보면 오리진쪽에서는 실제 클라이어트 IP를 일반적인 header나 로그로 확인을 할 수가 없습니다. 이럴때 X-Forwarded-For 를 사용하면 실제 클라이언트 IP확인이 가능합니다.


PHP 코드

<?
$check_ip1 = $_SERVER[‘HTTP_X_FORWARDED_FOR’];
$check_ip2 = $_SERVER[‘REMOTE_ADDR’];
echo “HTTP_X_FORWARDED_FOR IP: “.$check_ip1.”<br>”;
echo “REMOTE_ADDR IP: “.$check_ip2.”<br>”;
?>

Apache Logformat

LogFormat “%{X-Forwarded-For}i %l %u %t “%r” %>s %b “%{Referer}i” “%{User-Agent}i”” combined

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.