본문 바로가기
Technical/System

DSR 구성시 서버 ARP설정 방법

by 박성규 2021. 5. 28.

DSR이란 Direct Server Return의 약자로 원암(One-arm)방식의 L4 로드발란싱 환경에서 클라이언트로부터 받은 요청에 대한 응답을 L4를 통하지 않고 서버가 클라이언트에게 직접 전달해 주는 것을 말한다.

원암(one-arm)구조에서의 DSR

클라이언트가 서버의 ip가 아닌 L4에 설정된 vip로 서비스 요청을 보내면 L4는 그 요청을 로드발랜싱 방식으로 서버1과 서버2로 전달하고 서버는 클라이언트의 요청에 대한 응답을 L4를 거치지 않고 바로 클라이언트로 전송을 한다. 그런데 이렇게 되면 클라이언트는 192.168.0.10으로 요청을 보냈기 때문에 192.168.0.10으로 부터의 응답만 받을 뿐 서버의 IP인 192.168.0.11이나 192.168.0.12로 부터 들어오는 응답은 모두 드랍 시킨다. 결국 응답없음으로 에러가 발생된다.

그렇다고 서버1과 서버2에 동일하게 192.168.0.10 ip를 넣어주게 되면 ip충돌이 발생하게 될것이다.

그래서 서버1이나 서버2에서 각자의 IP가 존재하면서 클라이언트로 응답을 보낼때 192.168.0.10의 ip를 달고 나갈수 있게 설정 하는 것이 ARP이다.

 

ARP설정은 Server#1과 Server#2에서는 L4에 설정된 가상ip를 서버의 loopback 인터페이스에 넣어 주면 되는데

ip 충돌을 피하기 위해선 서버의 loopback 인터페이스에 반드시 arp 요청에 응답을 하지 않도록 설정해 줘야 한다. 이렇게 하면 여러대의 서버에 동일한 ip를 설정 할 수 있게 된다.

DSR구성시 netmask는 255.255.255.255 로 설정한다.

 

- 설정 방법

1. AIX

 AIX에서 네트워크 ip설정은 smitty 에서 진행하지만 loopback 인터페이스인 lo0는 smitty 에서 장치가 보이지 않아 명령어로 alias를 추가해 줘야 한다.

 

DSR 구성

# ifconfig lo0 alias 192.168.0.10 netmask 255.255.255.255 -arp

 * -arp 옵션은 lo0 인터페이스가 arp요청에 응답을 하지 않는다는 옵션이다.

  

DSR 구성 해제

# ifconfig lo0 delete 192.168.0.10

 

재부팅시 DSR 자동 시작

 smitty에서 네트워크 설정을 하면 자동으로 영구 적용 되지만 명령어로 설정 할 경우 일시적으로 적용 되기 때문에

재부팅을 하면 DSR 설정이 사라지게 된다. 위에서 언급 했듯이 smitty에선 lo0 디바이스가 보이지 않기 때문에 스크립트를 작성하여 자동 실행을 하도록 해줘야 한다.

 

우선 적당한 곳에 스크립트 파일을 만들고 파일 안에 ifconfig 명령어를 입력한다.

# vi /home/dsr.sh

ifconfig lo0 alias 192.168.0.10 netmask 255.255.255.255 -arp

 

새로 만든 스크립트 파일을 /etc/rc.d/rc2.d/ 디렉토리 안에 링크 파일을 만들어 준다.

링크 파일명의 형식은 다음과 같다

S + 숫자 + 파일명

반드시 S로 시작해야 하고 실행 순서인 숫자가 들어가야 한다. 파일명은 원본파일과 같지 않아도 된다.

예) S09dsr_start

 

링크파일 생성

# ln -s /home/dsr.sh /etc/rc.d/rc2.d/S09dsr_start

 

 

2. Linux (CentOS 7)

loopback 인터페이스인 ifcfg-lo에 alias 파일인 ifcfg-lo:0을 새로 만들고 ifcfg-lo:0에 ip 설정을 해준다.

 

# vi /etc/sysconfig/network-scripts/ifcfg-lo:0

TYPE=Ethernet
DEVICE=lo:0
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.0.10
NETMASK=255.255.255.255

 

arp 요청에 응답하지 않도록 /etc/sysctl.conf 파일에 아래와 같이 입력해준다.

# vi /etc/sysctl.conf

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

 

아래 명령어로 변경된 사항을 적용한다.

# ifup lo:0

# sysctl -p

 

확인

# ifconfig -a

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.11  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::2a12:dfff:d70d:bc2b  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:44:15:f6  txqueuelen 1000  (Ethernet)
        RX packets 47  bytes 5207 (5.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 70  bytes 10369 (10.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 12  bytes 1404 (1.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12  bytes 1404 (1.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.0.10  netmask 255.255.255.255
        loop  txqueuelen 1  (Local Loopback)

 

 

3. Windows (windwos 2016)

하드웨어 추가 마법사를 통해 loopback 어댑터를 새로 추가하고 ip 설정 및 weak host model을 설정해주면 된다.

 

실행 - hdwwiz

 

'하드웨어 추가 마법사 시작' 창이 뜨면 다음을 클릭한다.

 

'목록에서 직접 선택한 하드웨어 설치'를 선택하고 다음 클릭

 

'일반 하드웨어 종류'에서 네트워크 어댑터를 선택하고 다음을 클릭한다.

 

좌측 '제조업체' 항목에서 Microsoft를 선택하고 우측 '모델' 항목에서 루프백 어댑터를 선택하고 다음을 클릭한다.

 

새하드웨어 설치를 위해 다음 클릭

 

하드웨어 추가가 완료 되었다. 마침을 클릭한다.

 

네트워크 연결에 보면 루프백 어댑터 하나가 새로 추가 된것을 확인 할수 있다.

 

새로 생성된 어댑터에 ip를 설정한다.

 

arp 요청에 응답하지 않게 설정하기

command 창에 아래와 같이 명령어를 입력한다.

> netsh interface ipv4 set interface '루프백_인터페이스_이름' metric=254

 

 

Weak Host Model 설정하기

모든 인터페이스에 receive를 enable 시키고 send는 루프백 인터페이스만 enable 시켜준다.

이 장비에는 일반 네트워크 어댑터인 'Ethernet0' 와 루프백 어댑터 '이더넷' 두개의 인터페이스가 존재한다. 

* 위 네트워크 연결 캡쳐화면 참고

 

command 창에서 아래와 같이 설정한다.

> netsh interface ipv4 set interface Ethernet0 weakhostreceive=enabled
> netsh interface ipv4 set interface 이더넷 weakhostreceive=enabled
> netsh interface ipv4 set interface 이더넷 weakhostsend=enabled

 

netsh interface ip dump 명령어로 확인

 

 

 

 

 

 

 

 

 

댓글