[L4 SWITCH] DSR 모드에서의 서버 네트워크 설정 방법

이번글은 서버관리자 입장에서의 글입니다. 네트워크 분야에서 일하시는 분들에게는 별볼일 없는 내용일 것입니다.

하지만 서버 관리자입장에서는 모르시는 분들도 있을꺼 같아 글을 적어봅니다.

보통 수많은 서버를 가지고 서비스를 하는 업체라면 L4 스위치가 한대이상 존재할 것입니다.

L4 스위치한대만으로도 엄청나게 빠른 속도로 많은 량의 분산처리를 위한 라우팅을 완벽하게 해내죠.

L4란 OSI 7계층을 공부하시면서 들오보셨을 텐데 Layer 4 라우팅을 하는 스위치라는 뜻입니다.

L4 스위치의 라우팅 모드중에 DSR(Direct Server Return)이라는 평범하지 않은 모드가 있습니다.

말그대로 서버에서 결과를 바로 리턴한다는 뜻이지요. 어떤것인지 다음의 그림을 보면서 설명 드리겠습니다.

사용자 삽입 이미지
위와 같은 네트워크 구조가 있다고 합시다. 위의 구조는 전형적인 DSR을 위한 구조이지만 우선 평범한 SLB(Server Load Balancer) 에 대해 설명 드리겠습니다.

편의를 위해 L3 스위치의 아이피는 표시하지 않았습니다. 123.123.123.123은 외부에 공개되는 아이피입니다.

저 아이피를 통해 웹서비스에 접속할 수 있습니다. 10.1.1.x 대의 아이피들은 잘 아시겠지만 내부 네트워크입니다.

이것을 보시면 외부 인터넷에서 L4를 거치지 않고는 웹서버들에게 접근할 수 없다는 것을 알 수 있습니다.

일반적인 로드밸런싱은 다음과 같은 방법으로 이루어 집니다. DSR용 구조라 설명이 좀 복잡합니다;;

SLB 접속 :

Internet → A → L3 Switch → B  → L4 Switch → C → L3 Switch → D → Web Server 1 → D → L3 Switch → C → L4 Switch → B → L3 Switch → A → Internet

설명을 적으면서 계속 잘못되었다는 생각이 들지만 중요한점은 클라이언트의 Request와 서버의 Response가 둘다 L4를 거쳐간다는것만 알아주시면 됩니다.

하지만 DSR구조는 L4가 서버들의 로드밸런싱은 하지만 리턴은 서버에서 클라이언트에게 바로 리턴합니다. L4를 거치지 않습니다.

그렇다면 다음과 같은 방법으로 이루어 지겠죠.

DSR 접속 :

Internet → A → L3 Switch → B → L4 Switch → C → L3 Switch → D → Web Server 1 → D → L3 Switch → A → Internet

어떤 차이가 있는지 보이시나요? 답장은 L4를 거치지 않고 바로 클라이언트에게 전송됩니다.

하지만 여기서 서버에 추가적인 설정이 필요합니다.

클라이언트는 분명히 123.123.123.123으로 Request를 보냈기 때문에 마찬가지로 123.123.123.123으로부터 Response가 돌아와야 합니다.

하지만 10.1.1.2아이피를 가지고 있는 서버가 반환을 하였죠. 클라이언트의 컴퓨터는 답장을 받았지만 잘못된 패킷으로 인지하고 버려버리게 됩니다.

이래선 통신이 제대로 되질 못하죠. 해결 방법은 서버의 Loopback 주소를 변경하면 됩니다.

하지만 제가 무식하게 lo의 아이피를 127.0.0.1에서 123.123.123.123으로 바꿨더니 서버가 바보가 되더군요.

채널본딩을 사용하면 됩니다. lo가 특수한 장치라서 정상적인 설정 방법으로는 채널본딩이 안되지만 다음과 같은 명령어는 잘됩니다.

/sbin/ifconfig lo:0 123.123.123.123 netmask 255.255.255.255

이때 주의할것인 서브넷마스크가 255.255.255.255여야 한다는겁니다. 이렇게 함으로써 잘못된 Loopback주소를 브로드캐스팅 하는것을 막을 수있습니다.

[eye@theeye /] $ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0B:DB:95:0E:E1  
          inet addr:123.123.123.123  Bcast:123.123.123.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:30871472 errors:0 dropped:0 overruns:0 frame:0
          TX packets:42803475 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:414432160 (395.2 MiB)  TX bytes:1433412018 (1.3 GiB)
          Interrupt:185



lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:30192781 errors:0 dropped:0 overruns:0 frame:0
          TX packets:30192781 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1340081608 (1.2 GiB)  TX bytes:1340081608 (1.2 GiB)



lo:0      Link encap:Local Loopback  
          inet addr:123.123.123.123  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:16436  Metric:1

추가적으로 /etc/sysctl.conf에 다음의 내용을 추가하여 주도록 합시다.

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

이후에 sysctl -p 명령을 통해 설정을 적용하시면 됩니다. 잘 되나요?^^