iptable mangle 테이블과 forward fwmark 를 이용해서 Dynamic 한 포트를 이용하여 다중포트에 대해서 밸런싱을 한다거나 80번과 443과 같이 전자상거래에 인증관련해서 항상 그룹지어서 운영하여야할때 사용하는 방식에 대해서 설명하고자 한다.
forward fwmakr (방화벽 표시기능??)
방화벽 표시 기능은 연관된 프로토콜의 프로토콜이나 그룹에 사용되는 가장 쉽고 효과적인 그룹 포트 방법입니다. 예를 들어, LVS가 전자 상거래 사이트를 실행하도록 되어 있을 경우, 방화벽 표시 기능은 포트 80에서의 HTTP 연결과 포트 443에서의 HTTPS 연결을 일괄적으로 묶어 처리하는데 사용될 수 있습니다. 각각의 프로토콜에 대해 가상 서버에 동일한 방화벽 표시 기능을 지정하면 포트가 연결된 후 LVS 라우터가 동일한 실제 서버에 모든 요청을 보내기 때문에 트랜잭션에 대한 상태 정보를 보호할 수 있습니다.
이와 같은 효과적이고 사용 간편함 때문에 LVS 관리자는 그룹 연결을 할 때 마다 지속성 기능보다 방화벽 표시 기능을 사용해야 합니다. 하지만, 클라이언트가 일정 기간 동안 동일한 가상 서버로 다시 연결하게 하기 위해 가상 서버에 방화벽 기능과 함께 지속성 기능을 추가시킬 수 있습니다.
특정포트를 리얼서버 포트에 1:1 매핑지어서 운영하게 될경우 단점
1. Active 적인 포트에 대해서 일일히 서비스를 등록을 해줘야한다.
2. 80포트와 443 포트하고 그룹화되어서 운영되어야 하는경우
Every 2.0s: ipvsadm -ln Tue Feb 1 11:11:36 2011
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.234.6.2:80 sh -> 192.234.6.8:80 Masq 1 0 0 -> 192.234.6.7:80 Masq 1 0 0 TCP 192.234.6.2:443 sh -> 192.234.6.7:443 Masq 1 0 0 -> 192.234.6.8:443 Masq 1 0 0
|
※ 리얼서버를 보면 VIP에 물려있는 순서가 다르다.
ldirectord 모니터링에 따라서 서비스로 새로 올라오고 삭제됨에 따라서 리얼서버 순서가 바뀌게 되는데 세션을 DB화하지 않을경우에는 인증서버(443포트)와 서비스(80포트)가 SH 스케줄링에 의해 각기 다른 서버로 접속해버리면 인증은 7번서버에서 하고 실제 서비스하는 트래픽은 8번 서버를 접속하는 문제로 인해 인증이 바로 풀리게 되버리는 현상이 발생된다.
이럴경우 리얼서버를 그룹화해서 사용해야 한다.
# VIP 로 들어오는 80,443 포트에 대해서 MARK 1
[root@localhost ~]# iptables -t mangle -A PREROUTING -i br0 -p tcp -d 192.234.6.2 -m multiport --dport 80,443 -j MARK --set-mark 1
# MARK1 으로 보내지는 트래픽은 리얼서버로 분산
[root@localhost ~]# ipvsadm -A -f 1 -s sh [root@localhost ~]# ipvsadm -a -f 1 -r 192.234.6.7 [root@localhost ~]# ipvsadm -a -f 1 -r 192.234.6.8
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn FWM 1 sh -> 192.234.6.7:0 Masq 1 2 0 -> 192.234.6.8:0 Masq 1 0 0 |
여기에 ldirectord 를 이용해서 리얼서버 모니터링 부분을 추가하면...
[root@localhost ~]# cat > ldirectord.cf
checktimeout=3 checkinterval=3 autoreload=yes logfile="/var/log/ldirectord.log" quiescent=no
virtual=1 scheduler=sh checktype=connect protocol=fwm checkport=80 real=192.234.6.7 masq real=192.234.6.8 masq |