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-localBackend 서버 게이트웨이 수정
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