IP 터널링을 이용한 가상서버

다음은 가상 서버의 확장성을 대규모로 증가시키기 위해 IP 터널링을 어떻게 사용하는지에 대해 설명한다.

IP 터널링

IP 터널링 (IP encapsulation)은 IP 데이터그램안에 IP 데이터그램을 넣는 기술로서, 어떤 IP 주소를 향하는 데이터그램을 감싸 다른 IP 주소로 재지향할 수 있다. IP encapsulation은 현재 엑스트라넷, 모빌-IP, IP-멀티캐스트, tunnled 호스트나 네트웍 등에 일반적으로 사용되고 있다. 상세한 내용은 NET-3-HOWTO를 참고하자.

가상 서버에서 IP 터널링 사용하기

먼저 IP 터널링을 이용한 가상 서버 그림을 보자. IP 터널링을 이용한 가상 서버가 NAT를 이용한 방식과 가장 다른 것은, 전자의 경우 부하분산서버에서 IP 터널을 이용해 요구를 실제 서버로 보내는 반면, 후자의 경우는 네트웍 주소 변환방식을 이용한다는 것이다.

 

사용자가 서버 클러스터에서 제공하는 서비스에 접근할때, 가상 IP 주소(가상 서버의 IP 주소)로 향하는 요구 패킷이 부하분산서버로 간다. 부하분산서버에서 패킷의 목적지 주소와 포트 번호를 검사한다. 그 내용이 가상 서버 서비스와 일치하면 스케쥴링 알고리즘에 따라 클러스터에서 실제 서버를 선택하고, 접속을 기록하는 해쉬 테이블에 새로운 접속을 추가한다. 그러고 나서 부하분산서버에서 IP 데이터그램안에 패킷을 감싸 넣고(encapsulate) 실제 서버로 전송한다. 들어오는 패킷이 이러한 접속에 해당하고 해쉬 테이블에서 선택한 서버를 찾을 수 있으면 패킷을 감싸넣어 선택한 서버로 전송을 할 것이다. 서버에서 감싸넣어진 패킷을 받으면 패킷을 다시 풀고 요청을 처리한다음 최종적으로 실제 서버의 라우팅 테이블에 따라 사용자에게 직접 결과를 돌려준다. 접속이 해제되거나 시간을 초과하면, 해쉬 테이블에서 연결 기록을 제거한다. 작업의 흐름은 다음과 같다.

 

**역주)위 그림에서 LinuxDirector에 있는 내용을 보면 "client-to-server half connection"이란 말이 있다. 이건 클라이언트에서 요청을 받을 때만 부하분산서버가 패킷을 변환하고 응답은 실제 서버에서 직접 클라이언트로 간다는 것이다. NAT를 이용할 때는 들어오고 나가는 패킷이 모두 부하분산서버에서 변환되는데 이것은 Full connection이라고 할 수 있다.

실제 서버는 어떠한 네트웍의 어떠한 IP 주소도 사용할 수 있고 지역적으로 분산이 가능하다는 것을 기억하자. 그렇지만 IP 감싸기 프로토콜(IP encapsulation protocol)을 지원해야한다. 터널 디바이스를 제대로 설정해야 시스템에서 감싸진 패킷을 제대로 풀 수 있다. 가상 IP 주소는 non-arp 디바이스나 non-arp 디바이스의 알리아스로 설정해야한다. 또는 시스템에서 가상 IP 주소의 패킷을 지역 소켓으로 재지향할 수 있어야한다. 자세한 정보는 다음을 참고하자. the arp problem page

마지막으로, 감싸진 패킷이 도착하면 실제 서버가 패킷을 풀어 가상 IP 주소로 향하는 패킷을 찾고, "이건 나에게 온거야, 내가 처리할께용~" 이라고 이야기를 한다. 그러고 요청를 처리한다음 그결과를 최종 사용자에게 직접 보내는 것이다.

 

커널 설정하기

1. The VS patch for kernel 2.0.36

먼저 적당한 버전의 리눅스 커널 소스를 구한다. 그러고나서 커널에 가상 서버 패치를 적용한다. 세 번째로 최소한 여기서 선택한 커널 컴파일 옵션을 선택했는지 확인한다.

커널 컴파일 옵션:

Code maturity level options --->
    [*] Prompt for development and/or incomplete code/drivers
 
Networking options --->
    [*] Network firewalls
    ...
    [*] IP: forwarding/gatewaying
    ...
    [*] IP: firewalling
    ...
    [*] IP: masquerading
    ...
    [*] IP: ippfvs(LinuxDirector) masquerading (EXPERIMENTAL)
    Virtual server request dispatching technique---
    ( ) VS-NAT
    (X) VS-Tunneling
    ( ) VS-DRouting

그리고 하나의 스케쥴링 알고리즘을 선택해야한다.

    Virtual server scheduling algorithm
    (X) WeightedRoundRobin
    ( ) LeastConnection
    ( ) WeightedLeastConnection
    [ ] IP: enabling ippfvs with the local node feature

그다음 커널을 컴파일한다. 적절하게 커널이 컴파일되었다면, 시스템 커널을 업데이트하고 재부팅한다. 마지막으로 cd 명령을 이용, ipvsadm 소스 디렉토리로 이동하여 "make install" 이라고 명령을 치면 ipvsadm 프로그램을 시스템 디렉토리에 설치한다.

 

2. The VS patch for kernel 2.2.14

커널 컴파일 옵션:

Code maturity level options --->
    [*] Prompt for development and/or incomplete code/drivers
 
Networking options --->
    [*] Network firewalls
    ...
    [*] IP: forwarding/gatewaying
    ...
    [*] IP: firewalling
    ...
    [*] IP: masquerading
    ...
    [*] IP: masquerading virtual server support (EXPERIMENTAL)
    (12) IP masquerading table size (the Nth power of 2)
    <M> IPVS: round-robin scheduling(NEW)
    <M> IPVS: weighted round-robin scheduling(NEW)
    <M> IPVS: weighted least-connection scheduling(NEW)
    <M> IPVS: persistent client connection scheduling(NEW)

그다음 커널을 컴파일한다. 적절하게 커널이 컴파일되었다면, 시스템 커널을 업데이트하고 재부팅한다. 마지막으로 cd 명령을 이용, ipvsadm 소스 디렉토리로 이동하여 "make install" 이라고 명령을 치면 ipvsadm 프로그램을 시스템 디렉토리에 설치한다.

 

사용방법

사용방법을 알기 위해 예제를 보자. 다음 표는 IP 터널링을 이용하여 가상 서버를 지원하는 리눅스 서버에서 사용한 규칙이다. 실제 서버에서 운영하는 서비스와 가상 서비스가 같은 포트를 사용해야하며 실제 서버에서 서비스 포트를 지정할 필요가 없다는 것을 기억하자.

 

Protocol

Virtual IP Address

Port

Real IP Address

Weight

TCP

202.103.106.5

80

202.103.107.2

1

202.103.106.3

2

 

IP 주소 202.103.106.5 포트 80을 향하는 모든 트래픽은 실제 주소가 202.103.107.2 포트 80과 202.103.106.3 포트 80로 부하분산된다.

다음과 갈이 위에서 설명한 테이블 규칙을 설정할 수 있다.

1. For kernel 2.0.x

ippfvsadm -A -t 202.103.106.5:80 -R 202.103.107.2 -w 1
ippfvsadm -A -t 202.103.106.5:80 -R 202.103.106.3 -w 2

2. For kernel 2.2.x

ipvsadm -A -t 202.103.106.5:80 -s wlc
ipvsadm -a -t 202.103.106.5:80 -R 202.103.107.2 -i -w 1
ipvsadm -a -t 202.103.106.5:80 -R 202.103.106.3 -i -w 2
 

터널링을 사용한 가상 서버 실험 예제

다음은 터널링을 이용 가상 서버를 실험한 예제이다. 설정은 다음과 같다. 이건 이 글을 보는 사람들에게 하나의 실마리를 주기 바란다. 부하 분산서버은 172.26.20.111 주소를 가지고 있고 실제 서버는 172.26.112이다. 가상 IP 주소는 172.26.20.110 이다. 이 예제에서 "telnet 172.26.20.110"을 하면 실제 서버에 접속할 것이다.

1. For kernel 2.0.x

The load balancer (LinuxDirector), kernel 2.0.36

ifconfig eth0 172.26.20.111 netmask 255.255.255.0 broadcast 172.26.20.255 up
route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0
ifconfig eth0:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
route add -host 172.26.20.110 dev eth0:0
ippfvsadm -A -t 172.26.20.110:23 -R 172.26.20.112

The real server 1, kernel 2.0.36 (IP forwarding enabled)

ifconfig eth0 172.26.20.112 netmask 255.255.255.0 broadcast 172.26.20.255 up
route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0
ifconfig tunl0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
route add -host 172.26.20.110 dev tunl0

2. For kernel 2.2.x

The load balancer (LinuxDirector), kernel 2.2.14

ifconfig eth0 172.26.20.111 netmask 255.255.255.0 broadcast 172.26.20.255 up
route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0
ifconfig eth0:0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
route add -host 172.26.20.110 dev eth0:0
echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm -A -t 172.26.20.110:23 -s wlc
ipvsadm -a -t 172.26.20.110:23 -r 172.26.20.112 -i

The real server 1, kernel 2.0.36 (IP forwarding enabled)

ifconfig eth0 172.26.20.112 netmask 255.255.255.0 broadcast 172.26.20.255 up
route add -net 172.26.20.0 netmask 255.255.255.0 dev eth0
ifconfig tunl0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
route add -host 172.26.20.110 dev tunl0
 

더 자세한 설정 예제

IP 터널링을 이용한 가상 서버에 대한 더 자세한 설정 예제이다. 공간을 절약하기 위해, 중요한 명령만 사용했으며 그다지 중요하지 않은 명령은 제외했다.

1. Real server running kernel 2.2.14 or later with hidden device

The load balancer (LinuxDirector), kernel 2.2.14

echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm -A -t 172.26.20.110:23 -s wlc
ipvsadm -a -t 172.26.20.110:23 -r 172.26.20.112 -i

The real server 1, kernel 2.2.14

echo 1 > /proc/sys/net/ipv4/ip_forward
# insert it if it is compiled as module
insmod ipip
ifconfig tunl0 172.26.20.110 netmask 255.255.255.255 broadcast 172.26.20.110 up
route add -host 172.26.20.110 dev tunl0
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/tunl0/hidden

커널 2.2는 하나의 터널 디바이스 tunl0만 가지고 있기 때문에 이 설정에서는 하나의 가상 IP(VIP)만 가질 수 있다. 다중 VIP를 위해, tunl0 디바이스를 올리고(up), tunnel/dummy/loopback 디바이스의 알리아스를 이용해 이를 설정한 다음 디바이스를 감춘다. 다음 예제를 보자:

echo 1 > /proc/sys/net/ipv4/ip_forward
# insert it if it is compiled as module
insmod ipip
ifconfig tunl0 up
ifconfig dummy0 up
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/dummy0/hidden
ifconfig dummy0:0 172.26.20.110 up
route add -host 172.26.20.110 dev dummy0:0
ifconfig dummy0:1 <Another-VIP> up
...

2. Real servers runing kernel 2.2.x with redirect approach(재지향 방법 이용)

부하분산서버의 설정은 위 예제와 같다. 커널 2.2.x를 가지고 운영하는 리얼 서버는 다음과 같이 설정할 수 있다:

echo 1 > /proc/sys/net/ipv4/ip_forward
# insert it if it is compiled as module
insmod ipip
ifconfig tunl0 up
ipchains -A input -j REDIRECT 23 -d 172.26.20.110 23 -p tcp
...


Created on: 1998/11/29