예상치 못한 경로 선택

예상치 못한 경로 선택

여러 컴퓨터의 Debian Linux에서 FRR을 사용하여 BGP를 실행하고 있습니다. 내 질문은 궁극적으로 FRR/BGP 구성과 관련이 있을 수 있지만 Linux 커널에서 특정 IPv6 라우팅이 발생하는 이유를 보다 기본적인 수준에서 이해하려고 노력하고 있습니다.

"a1" 및 "a2"와 피어링되는 시스템 "a3"이 있습니다. "a1"과 "a2"는 경로 리플렉터이며 둘 다 a3에 기본 게이트웨이를 제공합니다. 여기에서 a3의 IPv6 라우팅 테이블을 볼 수 있습니다.

root@a3:~# ip -6 route
::1 dev lo proto kernel metric 256 pref medium
2602:fbbc:0:2::/64 dev vxbr2 proto kernel metric 256 pref medium
2602:fbbc:0:65::/64 dev vxbr101 proto kernel metric 256 pref medium
2602:fbbc:1:1::/64 dev 000_bridge proto kernel metric 256 pref medium
fe80::/64 dev 000_bridge proto kernel metric 256 pref medium
fe80::/64 dev vnet7 proto kernel metric 256 pref medium
fe80::/64 dev vxbr101 proto kernel metric 256 pref medium
fe80::/64 dev vxbr2 proto kernel metric 256 pref medium
fe80::/64 dev vnet40 proto kernel metric 256 pref medium
fe80::/64 dev vnet43 proto kernel metric 256 pref medium
fe80::/64 dev vnet46 proto kernel metric 256 pref medium
fe80::/64 dev vnet47 proto kernel metric 256 pref medium
fe80::/64 dev vnet54 proto kernel metric 256 pref medium
fe80::/64 dev vnet57 proto kernel metric 256 pref medium
fe80::/64 dev vnet58 proto kernel metric 256 pref medium
fe80::/64 dev vnet63 proto kernel metric 256 pref medium
fe80::/64 dev 001_bridge proto kernel metric 256 pref medium
default nhid 36 proto bgp metric 20 pref medium
    nexthop via 2602:fbbc:1:1::1 dev 000_bridge weight 1
    nexthop via 2602:fbbc:1:1::2 dev 000_bridge weight 1

내가 이해한 바에 따르면 아래쪽 판독값 근처의 줄은 default nhid 36 proto bgp metric 20 pref medium36번으로 표시된 다음 홉 항목이 기본 경로로 사용되며 여기에는 두 개의 별도 항목(하나는 for 2602:fbbc:1:1::1및 하나는 for) 이 포함되어 있음을 나타냅니다 2602:fbbc:1:1::2.

다음 홉 테이블은 다음과 같습니다.

root@a3:~# ip nexthop
id 15 dev 001_bridge scope host proto zebra
id 16 dev 000_bridge scope link proto zebra
id 26 dev vxbr2 scope link proto zebra
id 27 dev vxbr101 scope link proto zebra
id 31 via 2602:fbbc:1:1::1 dev 000_bridge scope link proto zebra
id 32 via 10.1.0.1 dev 001_bridge scope link proto zebra
id 36 group 31/37 proto zebra
id 37 via 2602:fbbc:1:1::2 dev 000_bridge scope link proto zebra

그래서 나는 여기의 순서 때문에(다음 홉 목록에서 더 빠르고, 번호가 낮고, 시퀀스에서 첫 번째임 id 36 group 31/37 proto zebra) 2602:fbbc:1:1::1기본 게이트웨이로 선택될 것이라고 생각했지만 그렇지 않습니다. 임의의 공용 IPv6 주소를 검색하면 다음이 생성됩니다.

root@a3:~# ip -6 route get 2001:4860:4860::8888
2001:4860:4860::8888 from :: via 2602:fbbc:1:1::2 dev 000_bridge proto bgp src 2602:fbbc:1:1::a3 metric 20 pref medium

Traceroute6 및 기타 사용 가능한 도구를 사용하여 확인할 수 있습니다.2602:fbbc:1:1::1이 아니라 2602:fbbc:1:1::2가 확실히 게이트웨이로 선택되었습니다. 이유는 모르겠습니다.

또한 ip -6 route show cache출력이 제공되지 않으며 ip -6 route flush cache아무런 영향도 미치지 않으므로 경로 캐싱과 관련이 없는 것으로 보입니다. 다음 중 하나에도 구성된 사용자 정의 규칙이 없는 것 같습니다.

root@a3:~# ip -6 rule show
0:  from all lookup local
32766:  from all lookup main

이 문제를 해결하려면 BGP 구성을 더 조정해야 할 것입니다. 하지만 Linux에서 라우팅이 수행되는 방식의 관점에서 볼 때 이 문제의 원인이 무엇인지 아는 사람이 있습니까? (이 문제를 해결하기 위해 어떤 매개변수를 조정할 수 있는지에 대한 아이디어가 있습니까?)

답변1

이는 다중 경로 경로입니다. 두 게이트웨이가 모두 사용되며 하나의 게이트웨이에는 우선 순위가 없지만 특정 대상(및 기타 요소)의 경우 동일한 게이트웨이를 사용하여 이를 사용하는 트래픽을 방해하지 않습니다. 따라서 대상이 거의 사용되지 않거나 테스트되는 경우 하나의 게이트웨이가 다른 게이트웨이보다 선호될 수 있습니다.

다중 경로 라우팅은 "간단한" 구문을 사용하여 직접 설정하거나 ip route add ... nexthop ... nexthop ...및 를 사용하여 더욱 새롭고 강력한 구문을 사용하여 설정할 수 있습니다.ip nexthop add id XXX ...ip route add ... nhid XXX

여기서, Route nhid 36은 id 31과 id 37의 nexthop 그룹인 nexthop id 36을 선택합니다. 그들은 그룹에 동등하게 참여합니다(특정 가중치가 설정되지 않았기 때문에).

알고리즘은 사용할 게이트웨이를 선택합니다.특정 목적지에 대한:기본값은 다음에 설명된 대로 해시 임계값 알고리즘입니다.대체(탄력적) 알고리즘에 대한 문서그리고RFC 2992. 이 알고리즘은 다음을 보장합니다.일반적으로두 개의 게이트웨이가 사용되지만 특정 대상의 경우 항상 동일한 게이트웨이가 사용됩니다.

여러 다른 목적지 주소에 대한 경로를 비교하여 이를 확인할 수 있습니다. 예를 들어 OP의 기본 라우팅을 모방하는 모델 구성을 사용하면 루프( bashjq)는 다음을 제공합니다.

# for i in 2001:db8::{{0..9},{a..f}}; do ip -6 -json route get $i; done | jq -j '.[] | .dst, " via ", .gateway, "\n"'
2001:db8:: via 2602:fbbc:1:1::1
2001:db8::1 via 2602:fbbc:1:1::2
2001:db8::2 via 2602:fbbc:1:1::2
2001:db8::3 via 2602:fbbc:1:1::2
2001:db8::4 via 2602:fbbc:1:1::2
2001:db8::5 via 2602:fbbc:1:1::1
2001:db8::6 via 2602:fbbc:1:1::1
2001:db8::7 via 2602:fbbc:1:1::1
2001:db8::8 via 2602:fbbc:1:1::2
2001:db8::9 via 2602:fbbc:1:1::1
2001:db8::a via 2602:fbbc:1:1::1
2001:db8::b via 2602:fbbc:1:1::1
2001:db8::c via 2602:fbbc:1:1::2
2001:db8::d via 2602:fbbc:1:1::2
2001:db8::e via 2602:fbbc:1:1::2
2001:db8::f via 2602:fbbc:1:1::1

다른 시스템에 대한 결과는 다를 수 있지만 일반적으로 두 게이트웨이 모두 균등하게 사용되며 흐름 중단을 최소화하기 위해 대상당 하나의 게이트웨이만 사용됩니다(예: 경로의 방화벽은 스트림의 일부만 보는 대신 전체 스트림을 보아야 합니다).

해시는 실제로 대상을 기반으로 할 뿐만 아니라 소스, 프로토콜 및 기타 속성도 사용할 수 있습니다(예: 위에 명령을 추가하면 ipproto tcp결과 ip route get가 변경되거나 다시 선택되거나 udp변경 되지 ipv6-icmp않습니다 ).tcp

관련 정보