본문 바로가기

시스템/Haproxy

[Haproxy] Proxy Protocol을 이용한 Full Transparent Proxy (TPROXY) 구축

반응형

개요


  • Haproxy TPROXY + Cloudflare Spectrum Proxy protocol v1 을 이용한 Full Transparent Proxy 를 구축
  • Client -> Cloudflare spectrum -> Haproxy(TPROXY) -> Server

 

proxy protocol

  • haproxy에서 개발한 것으로 haproxy 뿐아니라 nginx, apache등에서도 지원
  • web proxy에서 사용하는 "X-forwarded-for" http header와 같이 tcp header에 client ip, port 정보를 3way-handshaking 후 첫번째 psh ack flag packet의 payload data에 넣어서 통신

  • Haproxy는 proxy protocol header를 읽어드려 server로의 request시 src ip를 변조하고 다시 response시에 원복하여 Client와 통신함.

 

네트워크 위치

  • server 입장에서는 client src ip 로 request가 인입 되므로 server 라우팅 테이블에 의해 haproxy가 아닌 다른 네트워크 경로로 갈수 있으므로 주의 해야함.
  • server와 gateway 사이, gateway 혹은 gateway 상단 시리얼 구간에 인라인의 형태로 haproxy가 위치 하여야 함.

 

 

 

설치 및 설정


iptables + ip rule

  • server에서 인입되는 response의 dst ip는 haproxy에서 변조한 것으로 haproxy에서 패킷이 drop되지 않게 라우팅 경로를 수정하여야 함.
  • iptables mangle table과 rt_table을 이용하여 localhost의 haproxy 로 경로를 수정함.

 

  • iptables mangle table
# Generated by iptables-save v1.4.21 on Mon Dec  6 15:42:56 2021
*filter
:INPUT ACCEPT [340997:39182391]
:FORWARD ACCEPT [222671:40689739]
:OUTPUT ACCEPT [348373:48868347]
:CF - [0:0]

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i enp9s0f1 -m state --state NEW -j CF
-A FORWARD -i enp9s0f1 -m state --state NEW -j DROP

# cloudflare ip외 다른 ip는 차단하는 것이 좋음.
-A CF -s 173.245.48.0/20 -j ACCEPT
-A CF -s 103.21.244.0/22 -j ACCEPT
-A CF -s 103.22.200.0/22 -j ACCEPT
-A CF -s 103.31.4.0/22 -j ACCEPT
-A CF -s 141.101.64.0/18 -j ACCEPT
-A CF -s 108.162.192.0/18 -j ACCEPT
-A CF -s 190.93.240.0/20 -j ACCEPT
-A CF -s 188.114.96.0/20 -j ACCEPT
-A CF -s 197.234.240.0/22 -j ACCEPT
-A CF -s 198.41.128.0/17 -j ACCEPT
-A CF -s 162.158.0.0/15 -j ACCEPT
-A CF -s 104.16.0.0/13 -j ACCEPT
-A CF -s 104.24.0.0/14 -j ACCEPT
-A CF -s 172.64.0.0/13 -j ACCEPT
-A CF -s 131.0.72.0/22 -j ACCEPT
-A CF -s 211.222.248.220 -j ACCEPT
-A CF -s 183.111.29.184/29 -j ACCEPT
-A CF -s 218.48.1.130/32 -j ACCEPT
COMMIT
# Completed on Mon Dec  6 15:42:56 2021
# Generated by iptables-save v1.4.21 on Mon Dec  6 15:42:56 2021

*mangle
:PREROUTING ACCEPT [454:29570]
:INPUT ACCEPT [410:27488]
:FORWARD ACCEPT [44:2082]
:OUTPUT ACCEPT [281:30489]
:POSTROUTING ACCEPT [325:32571]
:DIVERT - [0:0]

# server response로 오는 모든 패킷들에 MARK 0x1
-A PREROUTING -s <server ip or net> -p tcp -m socket -j DIVERT
-A DIVERT -j MARK --set-xmark 0x1/0xffffffff
-A DIVERT -j ACCEPT
COMMIT
# Completed on Mon Dec  6 15:42:56 2021

 

  • 라우팅 테이블 생성
> cat /etc/iproute2/rt_tables 
...
100	haproxy
...

 

  • haproxy table의 default 라우팅 설정
> ip route add local 0.0.0.0/0 dev lo table haproxy

> ip route ls table haproxy
local default dev lo scope host

 

  • ip rule 설정
> ip rule add fwmark 1 lookup haproxy
> ip rule ls
0:	from all lookup local 
32765:	from all fwmark 0x1 lookup haproxy 
32766:	from all lookup main 
32767:	from all lookup default

 

 

sysctl.conf

net.ipv4.ip_forward = 1

 

 

haproxy 설치

  • 다운로드
wget https://www.haproxy.org/download/2.4/src/haproxy-2.4.9.tar.gz

 

  • 설치
    • LINUX_TPROXY=1
# 필수 패키지 설치
yum install pcre pcre-devel openssl-devel

make TARGET=linux-glibc USE_PCRE=1 USE_LINUX_TPROXY=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1
make install

 

  • config 설정
listen frontend-tproxy
	bind <bind ip>:<bind port> accept-proxy
	source 0.0.0.0 usesrc clientip
	server backend-server <server ip>:<server port>

 

  • systemd
> cat /usr/lib/systemd/system/haproxy.service 
[Unit]
Description=HAProxy Load Balancer
After=network-online.target
Wants=network-online.target

[Service]
Environment="CONFIG=/usr/local/etc/haproxy/" "PIDFILE=/run/haproxy.pid"
ExecStartPre=/usr/local/sbin/haproxy -f $CONFIG -c -q
ExecStart=/usr/local/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE
ExecReload=/usr/local/sbin/haproxy -f $CONFIG -c -q
ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed
Restart=always
SuccessExitStatus=143
Type=notify

[Install]
WantedBy=multi-user.target

 

 

Cloudflare Spectrum

  • Application에 proxy protocol 적용
  • CF -> Spectrum -> Application -> 편집

 

반응형