두 개의 NIC가 있는 호스트가 있는데, 각 NIC는 동일한 LAN( 10.0.0.0/16
)에 있는 별도의 스위치에 연결되어 있습니다. 스위치는 각각 로컬 게이트웨이에 연결됩니다. 한 스위치의 모든 호스트는 서브넷에 있고 10.0.0.8/29
다른 스위치의 모든 호스트는 서브넷에 있습니다 10.0.0.16/29
.
내 목표는 이 호스트를 떠나는 트래픽이 두 서브넷 중 하나에 있는 경우 대상에 가장 적합한 스위치를 사용해야 하는 것입니다 /29
. LAN의 다른 곳에 있으면 두 경로 중 하나를 사용할 수 있습니다. 또한 스위치 중 하나가 중단되더라도 호스트의 두 주소 모두 중단 없이 트래픽이 계속해서 흐르기를 바랍니다.
$ ip -4 addr show enp5s0
16: enp5s0: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
inet 10.0.0.9/29 scope global enp5s0
$ ip -4 addr show enp6s0
17: enp6s0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
inet 10.0.0.17/29 scope global enp6s0
$ ip route add 10.0.0.0/16 \
nexthop dev enp5s0 \
nexthop dev enp6s0
$ ip route
10.0.0.0/16
nexthop dev enp5s0 weight 1 linkdown
nexthop dev enp6s0 weight 1
10.0.0.8/29 dev enp5s0 proto kernel scope link src 10.0.0.9 linkdown
10.0.0.16/29 dev enp6s0 proto kernel scope link src 10.0.0.17
위의 경로와 주소로 호스트를 설정했으며 게이트웨이 10.0.0.1과의 통신이 제대로 작동합니다. 그런데 기본 경로를 추가하려고 할 때 문제가 발생합니다.
$ sudo ip route add default nexthop via 10.0.0.1
Error: Nexthop has invalid gateway.
나는 에 대한 다중 경로 경로에서 게이트웨이 주소를 생략함으로써 10.0.0.0/16
Linux가 직접 연결된 LAN임을 인식할 것이라고 생각했습니다. 인터페이스 중 하나를 통해 게이트웨이에 명시적인 경로를 추가할 수 있지만 둘 다를 추가할 수는 없습니다. 명시적인 경로를 추가한 후 Linux는 그것이 직접 연결된 서브넷임을 알고 있으므로 기본값을 추가할 수 있습니다.
$ sudo ip route add 10.0.0.1/32 dev enp6s0
$ sudo ip route add 10.0.0.1/32 dev enp5s0
RTNETLINK answers: File exists
$ sudo ip route add default via 10.0.0.1
$ ip route
default via 10.0.0.1 dev enp6s0
10.0.0.0/16
nexthop dev enp5s0 weight 1 linkdown
nexthop dev enp6s0 weight 1
10.0.0.1 dev enp6s0 scope link
10.0.0.8/29 dev enp5s0 proto kernel scope link src 10.0.0.9 linkdown
10.0.0.16/29 dev enp6s0 proto kernel scope link src 10.0.0.17
짜증나게도 할 수 있어삭제이 시점에서 명시적인 경로를 지정하면 모든 것이 계속 작동합니다. ARP 캐시에서 게이트웨이를 플러시하더라도 마찬가지입니다.
$ sudo ip route del 10.0.0.1
$ sudo ip neigh flush 10.0.0.1
$ ip route
default via 10.0.0.1 dev enp6s0
10.0.0.0/16
nexthop dev enp5s0 weight 1 linkdown
nexthop dev enp6s0 weight 1
10.0.0.8/29 dev enp5s0 proto kernel scope link src 10.0.0.9 linkdown
10.0.0.16/29 dev enp6s0 proto kernel scope link src 10.0.0.17
$ ping -n -c 1 10.0.0.1 | grep icmp_seq
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.492 ms
답변1
해결책은 추가를 통해 다중 경로 경로가 로컬 네트워크의 일부임을 Linux에 알리고 scope link
해당 경로에 대해 다중 경로 경로도 사용해야 한다는 것입니다 default
.
$ ip route add 10.0.0.0/16 scope link \
nexthop dev enp5s0 \
nexthop dev enp6s0
$ ip route add default \
nexthop via 10.0.0.1 dev enp5s0 \
nexthop via 10.0.0.1 dev enp6s0
$ ip route
default
nexthop via 10.0.0.1 dev enp5s0 weight 1 linkdown
nexthop via 10.0.0.1 dev enp6s0 weight 1
10.0.0.0/16 scope link
nexthop dev enp5s0 weight 1 linkdown
nexthop dev enp6s0 weight 1
10.0.0.8/29 dev enp5s0 proto kernel scope link src 10.0.0.9 linkdown
10.0.0.16/29 dev enp6s0 proto kernel scope link src 10.0.0.17