반응형
개요
- 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 -> 편집
반응형