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(Neighbor Unreachable 감지)라고도 합니다. RFC816 및 RFC1122에 따르면 DGD를 수행하는 방법은 여러 가지가 있지만 그 중 3가지 정도만 보았습니다(출처:내 오래된 게시물LVS 메일링 리스트로):

  • 호스트 오류(예: ARPANET 대상 오류 메시지)를 안정적으로 감지하고 보고하는 링크 계층 정보는 부정적인 권고로 사용해야 합니다.
  • 특정 게이트웨이의 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-addition(lvs-kiss 대신)일 것입니다.

관련 정보