실패 처리를 통한 Linux 다중 인터넷 연결 로드 밸런싱

실패 처리를 통한 Linux 다중 인터넷 연결 로드 밸런싱

두 개의 ISP 연결이 있고 이들 사이에 자동 로드 밸런싱이 필요합니다. 또한 실패한 연결을 처리해야 합니다(작동하지 않는 연결은 사용하지 않음).

첫 번째 링크는 PPTP 연결( ppp0)이고 두 번째 링크는 일반적인 이더넷입니다. 시스템은 젠투 리눅스입니다.

현재 로 기본적인 밸런싱을 달성했지만 ip route잘 작동하지 않는 것 같습니다. 내가 사용한 것은 다음과 같습니다.

ip rule $ADD from $IP1 table rt_link1
ip rule $ADD fwmark 1 lookup rt_link1
ip rule $ADD from $IP2 table rt_link2
ip rule $ADD fwmark 2 lookup rt_link2
$NET2 dev eth2 src $IP2 table rt_link2
default via GW2 table rt_link2
$NET2 dev eth2 src $IP2
$NET1 dev ppp0 src $IP1 table rt_link1
default via GW1 table rt_link1
$NET1 dev ppp0 src $IP1
default scope global nexthop via $GW1 weight 1 nexthop via $GW2 dev eth2 weight 1

답변1

LVS 프로젝트의 전 핵심 팀원으로서 저는 여러 인터넷 연결의 균형을 유지하기 위해 이 기술을 사용하지 말 것을 강력히 권고합니다. 사실 예상대로 작동하지 않을 것이라고 거의 보장할 수 있습니다.

이제 실패한 공급자 링크 처리를 종종 DGD(Dead Gateway 감지)라고 하며 NUD(이웃 연결 불가능 감지)라고도 합니다. RFC816 및 RFC1122에 따르면 DGD를 수행하는 방법은 여러 가지가 있지만 실제로는 그 중 약 3개만 보았습니다(내 오래된 게시물LVS 메일링 리스트로):

  • 호스트 오류(예: ARPANET Destination Dead 메시지)를 안정적으로 감지하고 보고하는 링크 계층 정보는 부정적인 조언으로 사용해야 합니다.
  • 특정 게이트웨이의 ICMP 리디렉션 메시지는 해당 게이트웨이에 대한 긍정적인 조언으로 사용해야 합니다.
  • 특정 링크 계층 주소에서 도착하는 패킷은 해당 주소의 시스템이 살아 있다는 증거입니다. 그러나 이 정보를 게이트웨이에 대한 조언으로 전환하려면 링크 계층 주소를 IP 주소로 매핑한 다음 경로 캐시가 가리키는 게이트웨이에 대해 해당 IP 주소를 확인해야 합니다. 이는 아마도 엄청나게 비효율적일 것입니다.

2006년에 제가 활성 Linux 커널 네트워킹 개발을 떠났을 때 NUD 상태 변경을 구현하는 방법에 대한 명확한 결정이 아직 없었습니다. 내 친구이자 LVS의 핵심 개발자인 Julian Anastasov는 2002년에 귀하의 문제를 해결해야 했습니다. 그래서 어느 날 저녁 그는 앉아서 FIB에 NUD 상태를 추가하여 정적 라우팅을 위한 DGD의 작동 버전을 작성했습니다. 베이스). 그의 패치를 찾을 수 있습니다여기그리고 문서여기,여기그리고여기. 이는 이 중요하지 않은 작업을 해결하기 위한 추가 탐구에 대한 많은 정보를 제공합니다. 나는 패치가 여전히 광범위하게 사용되고 있으므로 최신 커널로 최신 상태로 유지된다는 것을 알았습니다. 다음과 같은 스크립트로 시작하고 싶을 수도 있습니다(작성자:로버트 쿠르자타):

#!/bin/bash
# This script is done by : Robert Kurjata Sep, 2003.
# feel free to use it in any useful way

# CONFIGURATION
IP=/sbin/ip
PING=/bin/ping

#--------------- LINK PART -----------------
# EXTIFn - interface name
# EXTIPn - outgoing IP
# EXTMn  - netmask length (bits)
# EXTGWn - outgoing gateway
#-------------------------------------------

# LINK 1
EXTIF1=eth2
EXTIP1=
EXTM1=
EXTGW1=

# LINK 2
EXTIF2=eth1
EXTIP2=
EXTM2=
EXTGW2=

#ROUTING PART
# removing old rules and routes

echo "removing old rules"
${IP} rule del prio 50 table main
${IP} rule del prio 201 from ${EXTIP1}/${EXTM1} table 201
${IP} rule del prio 202 from ${EXTIP2}/${EXTM2} table 202
${IP} rule del prio 221 table 221
echo "flushing tables"
${IP} route flush table 201
${IP} route flush table 202
${IP} route flush table 221
echo "removing tables"
${IP} route del table 201
${IP} route del table 202
${IP} route del table 221

# setting new rules
echo "Setting new routing rules"

# main table w/o default gateway here
${IP} rule add prio 50 table main
${IP} route del default table main

# identified routes here
${IP} rule add prio 201 from ${EXTIP1}/${EXTM1} table 201
${IP} rule add prio 202 from ${EXTIP2}/${EXTM2} table 202

${IP} route add default via ${EXTGW1} dev ${EXTIF1} src ${EXTIP1} proto static table 201
${IP} route append prohibit default table 201 metric 1 proto static

${IP} route add default via ${EXTGW2} dev ${EXTIF2} src ${EXTIP2} proto static table 202
${IP} route append prohibit default table 202 metric 1 proto static

# mutipath
${IP} rule add prio 221 table 221

${IP} route add default table 221 proto static \
            nexthop via ${EXTGW1} dev ${EXTIF1} weight 2\
            nexthop via ${EXTGW2} dev ${EXTIF2} weight 3

${IP} route flush cache

while : ; do
  ${PING} -c 1 ${EXTGW1}
  ${PING} -c 1 ${EXTGW2}
  sleep 60
done

그 외에도 동적 라우팅 프로토콜을 실행하는 옵션을 확인할 수 있습니다.

답변2

lvs-kiss와 함께 LVS를 사용하세요. 아니면 비슷한 것.

LVS는 기본적으로 명령입니다 ìpvsadm. 해당 로드 밸런서의 유일한 단점은 모니터링하지 않는다는 것입니다. 따라서 이를 수행하고 구성에서 데드 링크를 제거하고 다시 활성화된 링크를 추가하는 프로그램이 필요합니다.

ldirectord하트비트 스택에서 또 다른 lvs 추가(lvs-kiss 대신)가 있을 수 있습니다.

관련 정보