SlideShare a Scribd company logo
1 of 8
Download to read offline
HAPROXY TCP 모드에서 내부 서버로
CLIENT IP 전달 방법
용영환 ( http://xenonix.com )
TABLE OF CONTENTS
HAProxy 의 장점............................................................................................................................................. 2
로드 밸런싱 할 때 Source IP 문제................................................................................................................... 2
HAProxy TCP 모드에서 내부 서버로 Source IP 전달 방법............................................................................... 3
HAProxy Proxy Protocol 지원 애플리케이션............................................................................................... 4
Apache HTTPD 에 Proxy Protocol 설정 방법................................................................................................ 4
HAProxy Proxy Protocol 설정 방법.............................................................................................................. 6
Source IP 확인............................................................................................................................................. 6
Proxy Protocol 적용할 때 주의사항................................................................................................................ 7
참고 문헌 ....................................................................................................................................................... 8
웹서비스 아키텍처를 구성할 때 상대적으로 매우 저렴한 비용으로 트래픽 분산을 하는 방법은
여러가지가 있다. 대표적으로 Nginx 같은 고효율 웹서버에서 제공하는 로드 밸런싱 기능을 이용하는
것인데 설치와 설정이 다소 쉽고 성능도 매우 우수해서 대규모 트래픽을 소화해야 하는 웹서비스에 많이
적용하고 있다.
반면 HAProxy 를 로드밸런서로 사용하는 경우도 있다. 한편에서는 HAProxy 보다 Nginx 를 사용하는게 더
좋다고 말하는 경우도 있으나, 어떤 것이 좋고 나쁘다기 보다는 만들고자 하는 서비스가 무엇이냐에
따라 적절하게 선택하면 그게 가장 좋은 것 아닐까 생각한다. 그런 측면에서 HAProxy 를 선택하는 경우에
대해 먼저 이야기를 나눠보자.
HAPROXY 의 장점
HAProxy 의 큰 장점 중 하나는 상대적으로 저렴한 리눅스 서버에 L4, L7 을 한번에 쉽게 구축할 수 있다는
것이다.
앞서 언급한 Nginx 같은 웹서버의 로드 밸런서는 HTTP 프로토콜에 대한 분산처리만을 해준다. 물론 HTTP
또는 HTTPS 기반의 웹서비스만 제공하는 경우라면 웹서버 로드밸런서가 탁월한 성능을 보여주기
때문에 최선의 선택일 수도 있다.
하지만 웹서버 외에 SMTP, DBMS 등을 비롯하여 소켓통신을 하는 모든 경우에서도 로드 밸런싱을 하고자
한다면 HAProxy 가 합리적인 선택일 수 있다. 이를 위해서 HAProxy 는 HTTP 와 TCP 두 가지 모드를
제공한다.
로드 밸런싱 할 때 SOURCE IP 문제
모두 알고 계시는 바와 같이 HTTP 프로토콜은 Layer 4 인 TCP 위에 구현되어 있다. 그러므로 HTTP 모드를
사용하지 않고서도 TCP 모드에서도 HTTP 로드밸런싱이 가능하다. 왜 굳이 HTTP 모드를 놔두고 복잡하게
TCP 모드를 사용했는 지에 대해서는 이유가 있긴 하지만 이 문서에서 다루지는 않을 것이다.
자, 일단 TCP 모드를 사용하는 것을 전제로 이야기를 계속 진행해보자.
로드밸런서는 아래와 같이 외부에서 들어오는 트래픽을 내부 서버로 분산시켜 준다. 이때 한가지 알아야
하는 것이 패킷이 로드밸런서를 통해 들어오면서 내부 웹서버에서는 Source IP 대신 로드 밸런서 IP 를
원본 IP 로 인식한다.
만약 웹서버에서 보안을 위해 특정 IP 만 접속할 수 있도록 제한을 걸거나, 어떤 IP 에서 접속하는지
로그를 남기고 싶을 때에도 로드 밸런서 IP 로만 보이기 때문에 사실상 불가능 하다.
이러한 현상은 HAProxy 뿐만 아니라 보통 로드 밸런서나 Proxy 서버에서 볼 수 있는 일반적인 것이다.
그럼에도 불구하고 하드웨어 L4 스위치 같은 걸 사용하면 이러한 현상이 나타나지 않는 이유는 그러한
고가의 L4 스위치는 Client IP 를 내부 서버로 전달해주는 기능이 탑재되어 있기 때문이다.
( 이러한 현상들을 직접 해결하기 귀찮다면 역시나 자본으로 해결하는게 가장 쉽고 편한 것 같다. )
HAPROXY TCP 모드에서 내부 서버로 SOURCE IP 전달 방법
우리가 원하는 것은 아래 그림과 같이 내부 웹서버에서 Source IP 를 제대로 인식하는 것이다.
HAProxy 는 Source IP 를 내부 서버로 전달하는 방법으로 Proxy Protocol 을 제공한다. HTTP 의 경우
프로토콜에 X-Forwareded-For 헤더를 붙여 전달할 수 있기 때문에 매우 간단하게 해결할 수 있지만 TCP 는
그러한 헤더가 없기 때문에 별도의 프로토콜을 사용해야 한다.
로드 밸런서
웹서버 1
웹서버 2
웹서버 3
192.168.0.10
10.0.0.1
10.0.0.1
10.0.0.1
10.0.0.1
클라이언트가
10.0.0.1 ???
로드 밸런서
웹서버 1
웹서버 2
웹서버 3
192.168.0.10
10.0.0.1
192.168.0.10
192.168.0.10
192.168.0.10
클라이언트 IP
192.168.0.10
OK
HAPROXY PROXY PROTOCOL 지원 애플리케이션
HAProxy 의 Proxy Protocol 을 지원하는 애플리케이션은 아래와 같다.
• Elastic Load Balancing
• Dovecot 2.2.19 이상
• exaproxy 1.0.0 이상
• exim 4.83 이상
• gunicorn 0.15.0 이상
• haproxy 1.5-dev3 이상
• hitch
• nginx 1.5.12 이상
• Percona DB Server 5.6.25-73.0 이상
• postfix 2.10 이상
• stud
• stunnel 4.45 이상
• Apache HTTPD 2.2 와 2.4
• varnish 4.1 이상
• MariaDB 10.3.1 이상
그리고 아쉽지만 아직 Proxy Protocol 을 지원하지 않는 애플리케이션은 아래와 같다.
• apache ATS
• squid
• MySQL
APACHE HTTPD 에 PROXY PROTOCOL 설정 방법
위 목록에 Apache HTTPD 가 포함되어 있지만 기본적인 상태에서는 Proxy Protocol 을 지원하지 못한다.
외부 모듈을 직접 컴파일 해서 설치해야만 한다. 복잡해 보일 수도 있지만 우리에겐 이 모듈이 꼭
필요하므로 시작해보자. 먼저 아래 Github 에 접속해서 소스 코드를 내부 웹서버에 내려 받아야 한다.
https://github.com/roadrunner2/mod-proxy-protocol
위 화면과 같이 잘 내려받은 후에는 컴파일을 위해 apache-devel 을 설치해야 한다.
Ubuntu
apt-get install apache2-dev
CentOS
yum install httpd-dev
이제 내려 받은 mod_proxy_protocol.c 가 있는 디렉터리에서 아래와 같이 입력한다.
make
그러면 아래 화면과 같은 결과가 보일 것이다.
다시 ls -la 를 해보면 아래와 같이 .libs 디렉터리가 생성되어 있다.
.libs 디렉터리 안으로 들어가면 아래와 같은 파일 목록을 볼 수 있다.
생성된 mod_proxy_protocol.so 파일을 Apache 모듈 디렉터리로 복사해 넣는다. 그리고 Apache 설정
파일에 아래를 추가한다.
LoadModule proxy_protocol_module {모듈 디렉터리}/mod_proxy_protocol.so
끝으로 아파치 웹서버의 전역 설정이나 VirtualHost 항목에 아래와 같이 ProxyProtocol On 을 지정한다.
아파치를 재시작해서 아래와 같이 정상적으로 동작하면 된다.
HAPROXY PROXY PROTOCOL 설정 방법
HAProxy 는 버전 1.5 이상부터 Proxy Protocol 을 지원하므로 되도록 최신 버전을 사용하는 걸 권장한다.
HAProxy 설정은 매우 쉽다. haproxy.cfg 파일을 열고 아래와 같이 내부 서버 IP 위데 send-proxy 를
추가해주기만 하면 된다.
SOURCE IP 확인
Proxy Protocol 적용 전에는 아래와 같이 REMOTE_ADDR 에 서버 IP 가 나타났으나
Proxy Protocol 을 정상적으로 적용하고 난 후에는 아래와 같이 REMOTE_ADDR 에 올바른 클라이언트 IP 가
보인다.
PROXY PROTOCOL 적용할 때 주의사항
Proxy Protocol 을 사용하면 TCP 패킷 맨 앞에 아래와 같이 PROXY TCPx 라는 헤더를 붙여 전송한다. 하지만
HTTP 프로토콜에서는 이러한 PROXY TCPx 헤더 정의가 없으므로 우리가 앞에서 살펴본 아파치용 Proxy
Protocol 모듈이 이러한 헤더를 인식하게 해준 것이다.
그러므로 Proxy Protocol 을 사용할 때에는 HAProxy 와 내부 서버, 양쪽 모두에서 Proxy Protocol 사용을
지정해야 한다. 그렇지 않으면 프로토콜이 맞지 않아 오류가 발생할 것이다.
예를 들어 HAProxy 쪽에서 Proxy Protocol 을 사용하기 위해 send-proxy 를 지정해주고, 내부 서버에서는
아직 Proxy Protocol 을 받을 준비가 안되어있다면 통신이 제대로 되지 않을 수 있다. 만약 HAProxy 에서
send-proxy 를 지정하고, Apache 쪽에서 ProxyProtocol On 을 지정하지 않으면 아래 화면과 같이 연결
오류가 발생한다.
반대의 경우도 마찬가지이다. 내부 서버에서 Proxy Protocol 을 켜고, HAProxy 쪽에서 send-proxy 지정을
해주지 않아도 위 화면과 같이 연결 오류가 발생한다.
물론 PROXY TCPx 헤더 여부를 자동으로 판단하여 상황에 맞게 동작하도록 되어있는 애플리케이션도
있겠으나 HAProxy 의 Proxy Protocol 을 실제 라이브 서버에 적용할 때에는 꼭 미리 확인하여 신중하게
작업을 해야 한다.
참고 문헌
http://www.haproxy.org/download/1.8/doc/proxy-protocol.txt
https://www.haproxy.com/blog/haproxy/proxy-protocol/
https://www.haproxy.com/blog/preserve-source-ip-address-despite-reverse-proxies/
https://roadrunner2.github.io/mod-proxy-protocol/mod_proxy_protocol.html
https://mariadb.com/kb/en/library/proxy-protocol-support/

More Related Content

What's hot

(발표자료) CentOS EOL에 따른 대응 OS 검토 및 적용 방안.pdf
(발표자료) CentOS EOL에 따른 대응 OS 검토 및 적용 방안.pdf(발표자료) CentOS EOL에 따른 대응 OS 검토 및 적용 방안.pdf
(발표자료) CentOS EOL에 따른 대응 OS 검토 및 적용 방안.pdfssuserf8b8bd1
 
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...Amazon Web Services Korea
 
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...AWSKRUG - AWS한국사용자모임
 
[2018] 오픈스택 5년 운영의 경험
[2018] 오픈스택 5년 운영의 경험[2018] 오픈스택 5년 운영의 경험
[2018] 오픈스택 5년 운영의 경험NHN FORWARD
 
Aurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
Aurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 GamingAurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
Aurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 GamingAmazon Web Services Korea
 
Kubernetes Networking - Sreenivas Makam - Google - CC18
Kubernetes Networking - Sreenivas Makam - Google - CC18Kubernetes Networking - Sreenivas Makam - Google - CC18
Kubernetes Networking - Sreenivas Makam - Google - CC18CodeOps Technologies LLP
 
仮想マシンにおけるメモリ管理
仮想マシンにおけるメモリ管理仮想マシンにおけるメモリ管理
仮想マシンにおけるメモリ管理Akari Asai
 
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会Shigeru Hanada
 
ksqlDB로 실시간 데이터 변환 및 스트림 처리
ksqlDB로 실시간 데이터 변환 및 스트림 처리ksqlDB로 실시간 데이터 변환 및 스트림 처리
ksqlDB로 실시간 데이터 변환 및 스트림 처리confluent
 
[오픈소스컨설팅] Open Stack Ceph, Neutron, HA, Multi-Region
[오픈소스컨설팅] Open Stack Ceph, Neutron, HA, Multi-Region[오픈소스컨설팅] Open Stack Ceph, Neutron, HA, Multi-Region
[오픈소스컨설팅] Open Stack Ceph, Neutron, HA, Multi-RegionJi-Woong Choi
 
Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나
Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나
Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나Amazon Web Services Korea
 
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교 및 구축 방법
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교  및 구축 방법[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교  및 구축 방법
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교 및 구축 방법Open Source Consulting
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기NAVER D2
 
Deep Dive on Amazon EC2 Instances & Performance Optimization Best Practices (...
Deep Dive on Amazon EC2 Instances & Performance Optimization Best Practices (...Deep Dive on Amazon EC2 Instances & Performance Optimization Best Practices (...
Deep Dive on Amazon EC2 Instances & Performance Optimization Best Practices (...Amazon Web Services
 
Docker로 서버 개발 편하게 하기
Docker로 서버 개발 편하게 하기Docker로 서버 개발 편하게 하기
Docker로 서버 개발 편하게 하기Dronix
 
AWS DirectConnect 구성 가이드 (김용우) - 파트너 웨비나 시리즈
AWS DirectConnect 구성 가이드 (김용우) -  파트너 웨비나 시리즈AWS DirectConnect 구성 가이드 (김용우) -  파트너 웨비나 시리즈
AWS DirectConnect 구성 가이드 (김용우) - 파트너 웨비나 시리즈Amazon Web Services Korea
 
nexus helm 설치, docker/helm repo 설정과 예제
nexus helm 설치, docker/helm repo 설정과 예제nexus helm 설치, docker/helm repo 설정과 예제
nexus helm 설치, docker/helm repo 설정과 예제choi sungwook
 

What's hot (20)

(발표자료) CentOS EOL에 따른 대응 OS 검토 및 적용 방안.pdf
(발표자료) CentOS EOL에 따른 대응 OS 검토 및 적용 방안.pdf(발표자료) CentOS EOL에 따른 대응 OS 검토 및 적용 방안.pdf
(발표자료) CentOS EOL에 따른 대응 OS 검토 및 적용 방안.pdf
 
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...
 
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...
EKS에서 Opentelemetry로 코드실행 모니터링하기 - 신재현 (인덴트코퍼레이션) :: AWS Community Day Online...
 
[2018] 오픈스택 5년 운영의 경험
[2018] 오픈스택 5년 운영의 경험[2018] 오픈스택 5년 운영의 경험
[2018] 오픈스택 5년 운영의 경험
 
Aurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
Aurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 GamingAurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
Aurora는 어떻게 다른가 - 김일호 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
 
Kubernetes Networking - Sreenivas Makam - Google - CC18
Kubernetes Networking - Sreenivas Makam - Google - CC18Kubernetes Networking - Sreenivas Makam - Google - CC18
Kubernetes Networking - Sreenivas Makam - Google - CC18
 
仮想マシンにおけるメモリ管理
仮想マシンにおけるメモリ管理仮想マシンにおけるメモリ管理
仮想マシンにおけるメモリ管理
 
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
 
ksqlDB로 실시간 데이터 변환 및 스트림 처리
ksqlDB로 실시간 데이터 변환 및 스트림 처리ksqlDB로 실시간 데이터 변환 및 스트림 처리
ksqlDB로 실시간 데이터 변환 및 스트림 처리
 
NGINX Plus on AWS
NGINX Plus on AWSNGINX Plus on AWS
NGINX Plus on AWS
 
Ansible 101
Ansible 101Ansible 101
Ansible 101
 
[오픈소스컨설팅] Open Stack Ceph, Neutron, HA, Multi-Region
[오픈소스컨설팅] Open Stack Ceph, Neutron, HA, Multi-Region[오픈소스컨설팅] Open Stack Ceph, Neutron, HA, Multi-Region
[오픈소스컨설팅] Open Stack Ceph, Neutron, HA, Multi-Region
 
Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나
Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나
Amazon RDS Proxy 집중 탐구 - 윤석찬 :: AWS Unboxing 온라인 세미나
 
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교 및 구축 방법
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교  및 구축 방법[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교  및 구축 방법
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교 및 구축 방법
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
 
Deep Dive on Amazon EC2 Instances & Performance Optimization Best Practices (...
Deep Dive on Amazon EC2 Instances & Performance Optimization Best Practices (...Deep Dive on Amazon EC2 Instances & Performance Optimization Best Practices (...
Deep Dive on Amazon EC2 Instances & Performance Optimization Best Practices (...
 
ansible why ?
ansible why ?ansible why ?
ansible why ?
 
Docker로 서버 개발 편하게 하기
Docker로 서버 개발 편하게 하기Docker로 서버 개발 편하게 하기
Docker로 서버 개발 편하게 하기
 
AWS DirectConnect 구성 가이드 (김용우) - 파트너 웨비나 시리즈
AWS DirectConnect 구성 가이드 (김용우) -  파트너 웨비나 시리즈AWS DirectConnect 구성 가이드 (김용우) -  파트너 웨비나 시리즈
AWS DirectConnect 구성 가이드 (김용우) - 파트너 웨비나 시리즈
 
nexus helm 설치, docker/helm repo 설정과 예제
nexus helm 설치, docker/helm repo 설정과 예제nexus helm 설치, docker/helm repo 설정과 예제
nexus helm 설치, docker/helm repo 설정과 예제
 

Similar to HAProxy TCP 모드에서 내부 서버로 Source IP 전달 방법

[HTTP 101] 웹 개발자라면 반드시 알아야하는 HTTP의 기초
[HTTP 101] 웹 개발자라면 반드시 알아야하는 HTTP의 기초[HTTP 101] 웹 개발자라면 반드시 알아야하는 HTTP의 기초
[HTTP 101] 웹 개발자라면 반드시 알아야하는 HTTP의 기초JinuNoh
 
[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTP[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTPNAVER D2
 
Cse342 chapter 04
Cse342 chapter 04Cse342 chapter 04
Cse342 chapter 04Jinil Nam
 
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요dgmit2009
 
웹소켓 (WebSocket)
웹소켓 (WebSocket)웹소켓 (WebSocket)
웹소켓 (WebSocket)jeongseokoh
 
OpenShift 4버전의 변경사항 및 OPENMARU APM의 CoreOS, CRI-O 모니터링 기능
OpenShift 4버전의 변경사항 및 OPENMARU APM의 CoreOS, CRI-O 모니터링 기능OpenShift 4버전의 변경사항 및 OPENMARU APM의 CoreOS, CRI-O 모니터링 기능
OpenShift 4버전의 변경사항 및 OPENMARU APM의 CoreOS, CRI-O 모니터링 기능Opennaru, inc.
 
[네이버오픈소스세미나] Contribution, 전쟁의 서막 : Apache OpenWhisk 성능 개선 - 김동경
[네이버오픈소스세미나] Contribution, 전쟁의 서막 : Apache OpenWhisk 성능 개선 - 김동경[네이버오픈소스세미나] Contribution, 전쟁의 서막 : Apache OpenWhisk 성능 개선 - 김동경
[네이버오픈소스세미나] Contribution, 전쟁의 서막 : Apache OpenWhisk 성능 개선 - 김동경NAVER Engineering
 
Quic을 이용한 네트워크 성능 개선
 Quic을 이용한 네트워크 성능 개선 Quic을 이용한 네트워크 성능 개선
Quic을 이용한 네트워크 성능 개선NAVER D2
 
DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)
DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)
DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)AWSKRUG - AWS한국사용자모임
 
한국청소년정보과학회 1회 세미나 - RestFul API Basic
한국청소년정보과학회 1회 세미나 - RestFul API Basic한국청소년정보과학회 1회 세미나 - RestFul API Basic
한국청소년정보과학회 1회 세미나 - RestFul API Basic한국청소년정보과학회
 
랩탑으로 tensorflow 도전하기 - tensorflow 설치
랩탑으로 tensorflow 도전하기 - tensorflow 설치랩탑으로 tensorflow 도전하기 - tensorflow 설치
랩탑으로 tensorflow 도전하기 - tensorflow 설치Lee Seungeun
 
F5 spdy 솔루션 선관
F5 spdy 솔루션 선관F5 spdy 솔루션 선관
F5 spdy 솔루션 선관itian-f5
 
Chap8 - HTTP 완벽가이드 8장
Chap8 - HTTP 완벽가이드 8장Chap8 - HTTP 완벽가이드 8장
Chap8 - HTTP 완벽가이드 8장LJH11
 
[DevOn 2013] Dynamic web proxy
[DevOn 2013] Dynamic web proxy[DevOn 2013] Dynamic web proxy
[DevOn 2013] Dynamic web proxy흥래 김
 
HTTP 완벽가이드 10장 http2.0, 11장_클라이언트식별과쿠키
HTTP 완벽가이드 10장 http2.0, 11장_클라이언트식별과쿠키HTTP 완벽가이드 10장 http2.0, 11장_클라이언트식별과쿠키
HTTP 완벽가이드 10장 http2.0, 11장_클라이언트식별과쿠키박 민규
 
build a linux webhosting server
build a linux webhosting serverbuild a linux webhosting server
build a linux webhosting server정현 윤
 

Similar to HAProxy TCP 모드에서 내부 서버로 Source IP 전달 방법 (20)

Docker osc 0508
Docker osc 0508Docker osc 0508
Docker osc 0508
 
L4교육자료
L4교육자료L4교육자료
L4교육자료
 
[HTTP 101] 웹 개발자라면 반드시 알아야하는 HTTP의 기초
[HTTP 101] 웹 개발자라면 반드시 알아야하는 HTTP의 기초[HTTP 101] 웹 개발자라면 반드시 알아야하는 HTTP의 기초
[HTTP 101] 웹 개발자라면 반드시 알아야하는 HTTP의 기초
 
[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTP[D2 CAMPUS]웹 개발자의 스펙 : HTTP
[D2 CAMPUS]웹 개발자의 스펙 : HTTP
 
Cse342 chapter 04
Cse342 chapter 04Cse342 chapter 04
Cse342 chapter 04
 
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
 
웹소켓 (WebSocket)
웹소켓 (WebSocket)웹소켓 (WebSocket)
웹소켓 (WebSocket)
 
OpenShift 4버전의 변경사항 및 OPENMARU APM의 CoreOS, CRI-O 모니터링 기능
OpenShift 4버전의 변경사항 및 OPENMARU APM의 CoreOS, CRI-O 모니터링 기능OpenShift 4버전의 변경사항 및 OPENMARU APM의 CoreOS, CRI-O 모니터링 기능
OpenShift 4버전의 변경사항 및 OPENMARU APM의 CoreOS, CRI-O 모니터링 기능
 
[네이버오픈소스세미나] Contribution, 전쟁의 서막 : Apache OpenWhisk 성능 개선 - 김동경
[네이버오픈소스세미나] Contribution, 전쟁의 서막 : Apache OpenWhisk 성능 개선 - 김동경[네이버오픈소스세미나] Contribution, 전쟁의 서막 : Apache OpenWhisk 성능 개선 - 김동경
[네이버오픈소스세미나] Contribution, 전쟁의 서막 : Apache OpenWhisk 성능 개선 - 김동경
 
Quic을 이용한 네트워크 성능 개선
 Quic을 이용한 네트워크 성능 개선 Quic을 이용한 네트워크 성능 개선
Quic을 이용한 네트워크 성능 개선
 
DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)
DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)
DynamoDB를 이용한 PHP와 Django간 세션 공유 - 강대성 (피플펀드컴퍼니)
 
한국청소년정보과학회 1회 세미나 - RestFul API Basic
한국청소년정보과학회 1회 세미나 - RestFul API Basic한국청소년정보과학회 1회 세미나 - RestFul API Basic
한국청소년정보과학회 1회 세미나 - RestFul API Basic
 
LTM
LTMLTM
LTM
 
랩탑으로 tensorflow 도전하기 - tensorflow 설치
랩탑으로 tensorflow 도전하기 - tensorflow 설치랩탑으로 tensorflow 도전하기 - tensorflow 설치
랩탑으로 tensorflow 도전하기 - tensorflow 설치
 
F5 spdy 솔루션 선관
F5 spdy 솔루션 선관F5 spdy 솔루션 선관
F5 spdy 솔루션 선관
 
Chap8 - HTTP 완벽가이드 8장
Chap8 - HTTP 완벽가이드 8장Chap8 - HTTP 완벽가이드 8장
Chap8 - HTTP 완벽가이드 8장
 
Oracle History #8
Oracle History #8Oracle History #8
Oracle History #8
 
[DevOn 2013] Dynamic web proxy
[DevOn 2013] Dynamic web proxy[DevOn 2013] Dynamic web proxy
[DevOn 2013] Dynamic web proxy
 
HTTP 완벽가이드 10장 http2.0, 11장_클라이언트식별과쿠키
HTTP 완벽가이드 10장 http2.0, 11장_클라이언트식별과쿠키HTTP 완벽가이드 10장 http2.0, 11장_클라이언트식별과쿠키
HTTP 완벽가이드 10장 http2.0, 11장_클라이언트식별과쿠키
 
build a linux webhosting server
build a linux webhosting serverbuild a linux webhosting server
build a linux webhosting server
 

More from Young D

한발 앞서 배워보는 Xamarin overview
한발 앞서 배워보는 Xamarin overview한발 앞서 배워보는 Xamarin overview
한발 앞서 배워보는 Xamarin overviewYoung D
 
Apache JMeter로 웹 성능 테스트 방법
Apache JMeter로 웹 성능 테스트 방법Apache JMeter로 웹 성능 테스트 방법
Apache JMeter로 웹 성능 테스트 방법Young D
 
티켓몬스터를 위한 PHP 개발 방법
티켓몬스터를 위한 PHP 개발 방법티켓몬스터를 위한 PHP 개발 방법
티켓몬스터를 위한 PHP 개발 방법Young D
 
ERD를 이용한 DB 모델링
ERD를 이용한 DB 모델링ERD를 이용한 DB 모델링
ERD를 이용한 DB 모델링Young D
 
유연하게 확장할 수 있는 PHP 웹 개발 이야기
유연하게 확장할 수 있는 PHP 웹 개발 이야기유연하게 확장할 수 있는 PHP 웹 개발 이야기
유연하게 확장할 수 있는 PHP 웹 개발 이야기Young D
 
Microsoft Azure를 통한 Push와 DB 이용방법
Microsoft Azure를 통한 Push와 DB 이용방법Microsoft Azure를 통한 Push와 DB 이용방법
Microsoft Azure를 통한 Push와 DB 이용방법Young D
 
iBeacons가 뭔가
iBeacons가 뭔가iBeacons가 뭔가
iBeacons가 뭔가Young D
 
CentOS 에 MySQL 5.6 설치
CentOS 에 MySQL 5.6 설치CentOS 에 MySQL 5.6 설치
CentOS 에 MySQL 5.6 설치Young D
 
마이크로소프트 Azure 에서 안드로이드 Push 구현과 Data 처리
마이크로소프트 Azure 에서 안드로이드  Push 구현과 Data 처리마이크로소프트 Azure 에서 안드로이드  Push 구현과 Data 처리
마이크로소프트 Azure 에서 안드로이드 Push 구현과 Data 처리Young D
 
무선 랜으로 파일 전송할 때 왜 무선 마우스 랙이 발생할까
무선 랜으로 파일 전송할 때 왜 무선 마우스 랙이 발생할까무선 랜으로 파일 전송할 때 왜 무선 마우스 랙이 발생할까
무선 랜으로 파일 전송할 때 왜 무선 마우스 랙이 발생할까Young D
 
PHP 개발 생산성을 높여주는 통합 개발 환경 - 이클립스 PDT
PHP 개발 생산성을 높여주는 통합 개발 환경 - 이클립스 PDTPHP 개발 생산성을 높여주는 통합 개발 환경 - 이클립스 PDT
PHP 개발 생산성을 높여주는 통합 개발 환경 - 이클립스 PDTYoung D
 
[협업 도구] 위키를 활용한 협업 노하우
[협업 도구] 위키를 활용한 협업 노하우 [협업 도구] 위키를 활용한 협업 노하우
[협업 도구] 위키를 활용한 협업 노하우 Young D
 
교육용 프로그래밍 언어 Small basic
교육용 프로그래밍 언어 Small basic교육용 프로그래밍 언어 Small basic
교육용 프로그래밍 언어 Small basicYoung D
 

More from Young D (13)

한발 앞서 배워보는 Xamarin overview
한발 앞서 배워보는 Xamarin overview한발 앞서 배워보는 Xamarin overview
한발 앞서 배워보는 Xamarin overview
 
Apache JMeter로 웹 성능 테스트 방법
Apache JMeter로 웹 성능 테스트 방법Apache JMeter로 웹 성능 테스트 방법
Apache JMeter로 웹 성능 테스트 방법
 
티켓몬스터를 위한 PHP 개발 방법
티켓몬스터를 위한 PHP 개발 방법티켓몬스터를 위한 PHP 개발 방법
티켓몬스터를 위한 PHP 개발 방법
 
ERD를 이용한 DB 모델링
ERD를 이용한 DB 모델링ERD를 이용한 DB 모델링
ERD를 이용한 DB 모델링
 
유연하게 확장할 수 있는 PHP 웹 개발 이야기
유연하게 확장할 수 있는 PHP 웹 개발 이야기유연하게 확장할 수 있는 PHP 웹 개발 이야기
유연하게 확장할 수 있는 PHP 웹 개발 이야기
 
Microsoft Azure를 통한 Push와 DB 이용방법
Microsoft Azure를 통한 Push와 DB 이용방법Microsoft Azure를 통한 Push와 DB 이용방법
Microsoft Azure를 통한 Push와 DB 이용방법
 
iBeacons가 뭔가
iBeacons가 뭔가iBeacons가 뭔가
iBeacons가 뭔가
 
CentOS 에 MySQL 5.6 설치
CentOS 에 MySQL 5.6 설치CentOS 에 MySQL 5.6 설치
CentOS 에 MySQL 5.6 설치
 
마이크로소프트 Azure 에서 안드로이드 Push 구현과 Data 처리
마이크로소프트 Azure 에서 안드로이드  Push 구현과 Data 처리마이크로소프트 Azure 에서 안드로이드  Push 구현과 Data 처리
마이크로소프트 Azure 에서 안드로이드 Push 구현과 Data 처리
 
무선 랜으로 파일 전송할 때 왜 무선 마우스 랙이 발생할까
무선 랜으로 파일 전송할 때 왜 무선 마우스 랙이 발생할까무선 랜으로 파일 전송할 때 왜 무선 마우스 랙이 발생할까
무선 랜으로 파일 전송할 때 왜 무선 마우스 랙이 발생할까
 
PHP 개발 생산성을 높여주는 통합 개발 환경 - 이클립스 PDT
PHP 개발 생산성을 높여주는 통합 개발 환경 - 이클립스 PDTPHP 개발 생산성을 높여주는 통합 개발 환경 - 이클립스 PDT
PHP 개발 생산성을 높여주는 통합 개발 환경 - 이클립스 PDT
 
[협업 도구] 위키를 활용한 협업 노하우
[협업 도구] 위키를 활용한 협업 노하우 [협업 도구] 위키를 활용한 협업 노하우
[협업 도구] 위키를 활용한 협업 노하우
 
교육용 프로그래밍 언어 Small basic
교육용 프로그래밍 언어 Small basic교육용 프로그래밍 언어 Small basic
교육용 프로그래밍 언어 Small basic
 

Recently uploaded

JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP Korea
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP Korea
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?Jay Park
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP Korea
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석JMP Korea
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP Korea
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화JMP Korea
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법JMP Korea
 

Recently uploaded (8)

JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법
 

HAProxy TCP 모드에서 내부 서버로 Source IP 전달 방법

  • 1. HAPROXY TCP 모드에서 내부 서버로 CLIENT IP 전달 방법 용영환 ( http://xenonix.com ) TABLE OF CONTENTS HAProxy 의 장점............................................................................................................................................. 2 로드 밸런싱 할 때 Source IP 문제................................................................................................................... 2 HAProxy TCP 모드에서 내부 서버로 Source IP 전달 방법............................................................................... 3 HAProxy Proxy Protocol 지원 애플리케이션............................................................................................... 4 Apache HTTPD 에 Proxy Protocol 설정 방법................................................................................................ 4 HAProxy Proxy Protocol 설정 방법.............................................................................................................. 6 Source IP 확인............................................................................................................................................. 6 Proxy Protocol 적용할 때 주의사항................................................................................................................ 7 참고 문헌 ....................................................................................................................................................... 8
  • 2. 웹서비스 아키텍처를 구성할 때 상대적으로 매우 저렴한 비용으로 트래픽 분산을 하는 방법은 여러가지가 있다. 대표적으로 Nginx 같은 고효율 웹서버에서 제공하는 로드 밸런싱 기능을 이용하는 것인데 설치와 설정이 다소 쉽고 성능도 매우 우수해서 대규모 트래픽을 소화해야 하는 웹서비스에 많이 적용하고 있다. 반면 HAProxy 를 로드밸런서로 사용하는 경우도 있다. 한편에서는 HAProxy 보다 Nginx 를 사용하는게 더 좋다고 말하는 경우도 있으나, 어떤 것이 좋고 나쁘다기 보다는 만들고자 하는 서비스가 무엇이냐에 따라 적절하게 선택하면 그게 가장 좋은 것 아닐까 생각한다. 그런 측면에서 HAProxy 를 선택하는 경우에 대해 먼저 이야기를 나눠보자. HAPROXY 의 장점 HAProxy 의 큰 장점 중 하나는 상대적으로 저렴한 리눅스 서버에 L4, L7 을 한번에 쉽게 구축할 수 있다는 것이다. 앞서 언급한 Nginx 같은 웹서버의 로드 밸런서는 HTTP 프로토콜에 대한 분산처리만을 해준다. 물론 HTTP 또는 HTTPS 기반의 웹서비스만 제공하는 경우라면 웹서버 로드밸런서가 탁월한 성능을 보여주기 때문에 최선의 선택일 수도 있다. 하지만 웹서버 외에 SMTP, DBMS 등을 비롯하여 소켓통신을 하는 모든 경우에서도 로드 밸런싱을 하고자 한다면 HAProxy 가 합리적인 선택일 수 있다. 이를 위해서 HAProxy 는 HTTP 와 TCP 두 가지 모드를 제공한다. 로드 밸런싱 할 때 SOURCE IP 문제 모두 알고 계시는 바와 같이 HTTP 프로토콜은 Layer 4 인 TCP 위에 구현되어 있다. 그러므로 HTTP 모드를 사용하지 않고서도 TCP 모드에서도 HTTP 로드밸런싱이 가능하다. 왜 굳이 HTTP 모드를 놔두고 복잡하게 TCP 모드를 사용했는 지에 대해서는 이유가 있긴 하지만 이 문서에서 다루지는 않을 것이다. 자, 일단 TCP 모드를 사용하는 것을 전제로 이야기를 계속 진행해보자. 로드밸런서는 아래와 같이 외부에서 들어오는 트래픽을 내부 서버로 분산시켜 준다. 이때 한가지 알아야 하는 것이 패킷이 로드밸런서를 통해 들어오면서 내부 웹서버에서는 Source IP 대신 로드 밸런서 IP 를 원본 IP 로 인식한다.
  • 3. 만약 웹서버에서 보안을 위해 특정 IP 만 접속할 수 있도록 제한을 걸거나, 어떤 IP 에서 접속하는지 로그를 남기고 싶을 때에도 로드 밸런서 IP 로만 보이기 때문에 사실상 불가능 하다. 이러한 현상은 HAProxy 뿐만 아니라 보통 로드 밸런서나 Proxy 서버에서 볼 수 있는 일반적인 것이다. 그럼에도 불구하고 하드웨어 L4 스위치 같은 걸 사용하면 이러한 현상이 나타나지 않는 이유는 그러한 고가의 L4 스위치는 Client IP 를 내부 서버로 전달해주는 기능이 탑재되어 있기 때문이다. ( 이러한 현상들을 직접 해결하기 귀찮다면 역시나 자본으로 해결하는게 가장 쉽고 편한 것 같다. ) HAPROXY TCP 모드에서 내부 서버로 SOURCE IP 전달 방법 우리가 원하는 것은 아래 그림과 같이 내부 웹서버에서 Source IP 를 제대로 인식하는 것이다. HAProxy 는 Source IP 를 내부 서버로 전달하는 방법으로 Proxy Protocol 을 제공한다. HTTP 의 경우 프로토콜에 X-Forwareded-For 헤더를 붙여 전달할 수 있기 때문에 매우 간단하게 해결할 수 있지만 TCP 는 그러한 헤더가 없기 때문에 별도의 프로토콜을 사용해야 한다. 로드 밸런서 웹서버 1 웹서버 2 웹서버 3 192.168.0.10 10.0.0.1 10.0.0.1 10.0.0.1 10.0.0.1 클라이언트가 10.0.0.1 ??? 로드 밸런서 웹서버 1 웹서버 2 웹서버 3 192.168.0.10 10.0.0.1 192.168.0.10 192.168.0.10 192.168.0.10 클라이언트 IP 192.168.0.10 OK
  • 4. HAPROXY PROXY PROTOCOL 지원 애플리케이션 HAProxy 의 Proxy Protocol 을 지원하는 애플리케이션은 아래와 같다. • Elastic Load Balancing • Dovecot 2.2.19 이상 • exaproxy 1.0.0 이상 • exim 4.83 이상 • gunicorn 0.15.0 이상 • haproxy 1.5-dev3 이상 • hitch • nginx 1.5.12 이상 • Percona DB Server 5.6.25-73.0 이상 • postfix 2.10 이상 • stud • stunnel 4.45 이상 • Apache HTTPD 2.2 와 2.4 • varnish 4.1 이상 • MariaDB 10.3.1 이상 그리고 아쉽지만 아직 Proxy Protocol 을 지원하지 않는 애플리케이션은 아래와 같다. • apache ATS • squid • MySQL APACHE HTTPD 에 PROXY PROTOCOL 설정 방법 위 목록에 Apache HTTPD 가 포함되어 있지만 기본적인 상태에서는 Proxy Protocol 을 지원하지 못한다. 외부 모듈을 직접 컴파일 해서 설치해야만 한다. 복잡해 보일 수도 있지만 우리에겐 이 모듈이 꼭 필요하므로 시작해보자. 먼저 아래 Github 에 접속해서 소스 코드를 내부 웹서버에 내려 받아야 한다. https://github.com/roadrunner2/mod-proxy-protocol
  • 5. 위 화면과 같이 잘 내려받은 후에는 컴파일을 위해 apache-devel 을 설치해야 한다. Ubuntu apt-get install apache2-dev CentOS yum install httpd-dev 이제 내려 받은 mod_proxy_protocol.c 가 있는 디렉터리에서 아래와 같이 입력한다. make 그러면 아래 화면과 같은 결과가 보일 것이다. 다시 ls -la 를 해보면 아래와 같이 .libs 디렉터리가 생성되어 있다. .libs 디렉터리 안으로 들어가면 아래와 같은 파일 목록을 볼 수 있다.
  • 6. 생성된 mod_proxy_protocol.so 파일을 Apache 모듈 디렉터리로 복사해 넣는다. 그리고 Apache 설정 파일에 아래를 추가한다. LoadModule proxy_protocol_module {모듈 디렉터리}/mod_proxy_protocol.so 끝으로 아파치 웹서버의 전역 설정이나 VirtualHost 항목에 아래와 같이 ProxyProtocol On 을 지정한다. 아파치를 재시작해서 아래와 같이 정상적으로 동작하면 된다. HAPROXY PROXY PROTOCOL 설정 방법 HAProxy 는 버전 1.5 이상부터 Proxy Protocol 을 지원하므로 되도록 최신 버전을 사용하는 걸 권장한다. HAProxy 설정은 매우 쉽다. haproxy.cfg 파일을 열고 아래와 같이 내부 서버 IP 위데 send-proxy 를 추가해주기만 하면 된다. SOURCE IP 확인 Proxy Protocol 적용 전에는 아래와 같이 REMOTE_ADDR 에 서버 IP 가 나타났으나 Proxy Protocol 을 정상적으로 적용하고 난 후에는 아래와 같이 REMOTE_ADDR 에 올바른 클라이언트 IP 가 보인다.
  • 7. PROXY PROTOCOL 적용할 때 주의사항 Proxy Protocol 을 사용하면 TCP 패킷 맨 앞에 아래와 같이 PROXY TCPx 라는 헤더를 붙여 전송한다. 하지만 HTTP 프로토콜에서는 이러한 PROXY TCPx 헤더 정의가 없으므로 우리가 앞에서 살펴본 아파치용 Proxy Protocol 모듈이 이러한 헤더를 인식하게 해준 것이다. 그러므로 Proxy Protocol 을 사용할 때에는 HAProxy 와 내부 서버, 양쪽 모두에서 Proxy Protocol 사용을 지정해야 한다. 그렇지 않으면 프로토콜이 맞지 않아 오류가 발생할 것이다. 예를 들어 HAProxy 쪽에서 Proxy Protocol 을 사용하기 위해 send-proxy 를 지정해주고, 내부 서버에서는 아직 Proxy Protocol 을 받을 준비가 안되어있다면 통신이 제대로 되지 않을 수 있다. 만약 HAProxy 에서 send-proxy 를 지정하고, Apache 쪽에서 ProxyProtocol On 을 지정하지 않으면 아래 화면과 같이 연결 오류가 발생한다. 반대의 경우도 마찬가지이다. 내부 서버에서 Proxy Protocol 을 켜고, HAProxy 쪽에서 send-proxy 지정을 해주지 않아도 위 화면과 같이 연결 오류가 발생한다. 물론 PROXY TCPx 헤더 여부를 자동으로 판단하여 상황에 맞게 동작하도록 되어있는 애플리케이션도 있겠으나 HAProxy 의 Proxy Protocol 을 실제 라이브 서버에 적용할 때에는 꼭 미리 확인하여 신중하게 작업을 해야 한다.