Back to writing
미분류 2 min read HYEONG HWAN, MUN

Ubuntu에서 X_FORWARDED_FOR 와 REMOTE_ADDR 일치시키기

가장 앞단에 proxy 서버가 있고, 이 proxy 서버의 80포트에 데몬(해석 프로그램)이 구동되고 있고,

이 데몬은 http host 를 해석에서 알맞은 내부서버로 포워딩하는 역할을 한다.

 

외부에서 보기에는 하나의 서버가 다 처리하는 것처럼 보이는데, 실제로는 내부의 전용 서버가 요청을 받아서 처리하는 것이다.

 

이때 내부서버의 apache 에서는 REMOTE_ADDR 에는 proxy server 의 아이피가 찍히고, X_FORWARDED_FOR 에 실제 요청을 하는 고객 아이피가 찍힌다.

이것은 많은 웹프로그램에게 혼란을 준다. 예를 들어 스팸글이 등록되었는데 proxy server 의 아이피로 기록이 되고, 관리자가 proxy server를 차단하면 서버가 모두 먹통이 되는 현상이 발생한다.

 

내부 서버에서 proxy 서버 정보를 설정해서 고객의 아이피가 REMOTE_ADDR에 기록되게 하자.

 


자세한 이론.

전문용어를 풀어쓰지 않고 그냥 쓰겠다.

 

패킷을 전달하는 routing 방식에는 pre-routing과 post-routing이 있다.

우리가 사용하는 인터넷은 OSI 7 네트워크 구성중 TCP/IP 모델을 사용하고 있다.

- 5계층 : 응용계층 (Application Layer)

- 4계층 : 전송계층 (Transport Layer)

- 3계층 : 네트워크계층 (Network Layer)

- 2계층 : 데이터링크계층 (Datalink Layer)

- 1계층 : 물리계층 (Physical Layer)

보통 응용계층을 생략하고 4계층이라고 말하거나, 또는 5계층이라고 말한다.

계층마다 정해진 역할이 있는데, 3계층에서는 패킷의 ip를 해석할 수 있고, 4계층에서는 패킷을 해석할 수 있다.

- 3계층에서 할 수 있는 라우팅은 ip 기반 라우팅 : 120번 아이피의 요청이면 -> k 서버에게

pre-routing, 일반적인 라우팅방식, 패킷의 ttl 줄어들고 라우팅

- 4계층에서 할 수 있는 라우팅은 문맥 기반 라우팅 : abc.com 요청이면 -> p 서버에게

post-routing, 프록시서버에서 재 전송해는 방식, 패킷의 source address 가 바뀐다.


 

1) Advanced Packaging Tool 패키지 목록 갱신

#apt-get update

 

2) Advanced Packaging Tool 갱신된 패키지 목록에서 rpaf 있는지 찾기

#apt-cache search rpaf

libapache2-mod-rpaf - module for Apache2 which takes the last IP from the 'X-Forwarded-For' header

3) rpaf 설치

#apt-get install libapache2-mod-rpaf

 

4) rpaf 모듈 켜기

#a2enmod rpaf

 

5) Proxy 아이피 등록

#vi /etc/apache2/mods-available/rpaf.conf

 

<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 #set your proxy ip here
</IfModule>

 

6) Apache 재시작

#service apache2 restart

 

7) 테스트

다음의 php문서를 작성하고 실행시켜보자.

<?php echo $_SERVER['REMOTE_ADDR']; ?>