HAProxy Transparent

HTTP 패킷에 X-Forwarded-For 헤더 추가하여 Client Source IP 식별하는 방법 말고, HAproxy에서 백엔드 서버에 인입되는 IP를 Client Source IP로 변조하여 보낼 수 있다.

HAproxy Transparent 기능을 사용하면 된다.

Transparent Proxy 설정

HAproxy.cfg 수정

Transparent를 구현하려면 root로 실행해야한다고 함 setcap으로 여러가지 권한을 haproxy로 부여하였는데 안되어서 root로 실행시킴

[root@HAproxy01 ~]# vi /etc/haproxy/haproxy.cfg
global
    user        root
    group       root
[...]  [...]
frontend test_frontend
  mode tcp #http 모드에서는 Transparent 지원 안됨   
  bind 1.1.1.1:80 transparent
[...]  [...]
backend test_backend
  source 0.0.0.0 usesrc clientip
[...]

firewall-cmd 수정

[root@HAproxy01 ~]# firewall-cmd --permanent --direct --add-chain ipv4 mangle DIVERT
[root@HAproxy01 ~]# firewall-cmd --permanent --direct --add-rule ipv4 mangle PREROUTING 0 -p tcp -m socket -j DIVERT
[root@HAproxy01 ~]# firewall-cmd --permanent --direct --add-rule ipv4 mangle DIVERT 0 -j MARK --set-mark 1
[root@HAproxy01 ~]# firewall-cmd --permanent --direct --add-rule ipv4 mangle DIVERT 1 -j ACCEPT

라우팅 수정

#Redirect all marked packets for local processing, i.e. to the open, transparent socket
[root@HAproxy01 ~]#ip rule add fwmark 1 lookup 100

#백엔드 서버에서 프록시로 전송되는 패킷을 로컬 라우팅 테이블을 통해 로컬로 전달할 수 있도록 한다.
[root@HAproxy01 ~]#ip route add local 0.0.0.0/0 dev lo table 100 

rc.loacl 등록

서버 재부팅 시 위 라우팅 없어지므로 rc.local에 명령어 넣어서 부팅 시 위 라우팅 넣을 수 있도록 한다.

[root@HAproxy01 ~]# vi /etc/rc.d/rc.local 
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
exit 0 

[root@HAproxy01 ~]# chmod 755 /etc/rc.d/rc.local 
[root@HAproxy01 ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 559 Apr  7 10:51 /etc/rc.d/rc.local

[root@HAproxy01 ~]# vi /lib/systemd/system/rc-local.service
[install]
WantedBy=multi-user.target

[root@HAproxy01 ~]# systemctl daemon-reload
[root@HAproxy01 ~]# systemctl enable rc-local
[root@HAproxy01 ~]# systemctl start rc-local

Backend 서버 게이트웨이 수정

192.168.100.10 ← HAproxy IP로 변경

ICMP Redirection 끄기

[root@Nginx01 ~]# vi /etc/sysctl.conf
net.ipv4.conf.all.accept_redirects=0

[root@Nginx01 ~]# sysctl -p
net.ipv4.conf.all.accept_redirects = 0

동작 확인

[root@Nginx01 ~]# tail -f /var/log/nginx/access.log
192.168.137.1 - - [06/Apr/2023:18:25:33 +0900] "GET / HTTP/1.1" 200 4074 "-" "192.168.100.10""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Whale/3.19.166.16 Safari/537.36" "-"

XFF헤더를 넣지않아도 Soruce IP가 변경된다

주의사항 동일한 서브넷에 존재하는 서버가 VIP로 요청할 때는 동작 안됨

Last updated