기본 IPv6 인터페이스를 설정하는 방법

기본 IPv6 인터페이스를 설정하는 방법

IPv6를 통해 멀티캐스트 트래픽을 보내는 프로그램이 있습니다. 기본 네트워크 인터페이스에서 트래픽을 보냅니다. 제대로 작동하지만(트래픽이 사라짐 eth0) Docker를 로드하면 인터페이스 외부로 트래픽이 전송되고 docker0eth0이상 네트워크에 트래픽이 표시되지 않습니다.

예를 들어 명령을 실행하고 실행하는 동안 as 또는 ping ff05::1as를 사용하여 인터페이스를 확인하는 경우 패킷이 항상 예상대로 떠나지는 않습니다.tcpdump -n host ff05::1 -i XXXXXXeth0docker0eth0

이제 사용 중인 각 프로그램을 확인하고 바인딩할 인터페이스를 지정하여(예: -I위의 ping 옵션 사용) 이 문제를 해결할 수 있지만 여러 컴퓨터 구성 파일에서 동일한 내용을 공유하고 싶기 때문에 문제가 됩니다. 각 주소에 대해 서로 다른 IPv6 주소와 인터페이스 이름을 설정하고 동적 IP 주소가 변경되면 이를 업데이트하는 것을 잊지 마세요.

대신, 각 시스템에서 선호하는 인터페이스를 수동으로 설정할 수 있기를 바라면서 Linux가 소켓에 바인딩할 때 사용할 인터페이스를 선택하는 방법을 이해하고 싶습니다. 그러면 제가 사용하고 있는 프로그램은 특별한 구성 없이 올바른 인터페이스에서 멀티캐스트 트래픽을 보내고 받습니다.

네트워크 경로( )를 추가해 보았 ip -6 route add ff05::/16 dev eth0으나 아무런 차이가 없습니다. 문제는 Linux가 바인딩할 인터페이스를 선택하고(라우팅이 발생하기 전에) 해당 인터페이스의 IP 주소를 나가는 패킷의 소스 주소로 사용하여 라우팅 규칙에 관계없이 해당 인터페이스에 잠그는 것 같습니다.

그렇다면 ping위 명령을 예로 들면 기본 아웃바운드 인터페이스는 어떻게 선택되고( -I사용하지 않을 때) 어떻게 변경할 수 있습니까?

답변1

참고: FF05::2(사이트-로컬 모든 라우터 멀티캐스트 주소) 또는 FF02::1(링크-로컬 모든 노드 멀티캐스트 주소, 아마도 인터페이스 범위를 사용해야 함)을 사용해야 합니다. 로컬 모든 라우터 멀티캐스트 주소 멀티캐스트 주소) 노드 멀티캐스트 주소)아니요 한정된그리고 아마도 답을 얻지 못할 것입니다( ip -6 maddress적어도 라우터에 ff05::2가 표시되는 Linux 시스템에서는 답을 얻지 못할 것입니다).

새로운 인터페이스가 추가되고 나타날 때마다 다양한 자동 주소 중 IPv6 멀티캐스트 경로가 로컬 테이블에 추가되므로 로컬 테이블에는 표시되지 않습니다.기본라우팅 테이블:

$ ip route get ff05::02
multicast ff05::2 from :: dev dummy0 table local proto kernel src fe80::8c5f:87ff:fe50:d08a metric 256 pref medium


$ ip -6 route show type multicast table local
multicast ff00::/8 dev dummy0 proto kernel metric 256 pref medium
multicast ff00::/8 dev lxcbr0 proto kernel metric 256 pref medium
multicast ff00::/8 dev eth0 proto kernel metric 256 pref medium
...

같음 사이의 순서는 매우 무작위이며 재현하기 어렵습니다. 멀티캐스트 항목은 인터페이스가 닫히거나 열릴 때마다 제거되고 다시 추가되지만 순서는 변경될 수 있습니다. 커널만이 이러한 "동등 경로"를 추가할 수 있으며 사용자는 그렇게 할 수 없습니다(=> RTNETLINK answers: File exists). 이것현지의규칙 우선순위(우선순위 0)에서 다른 테이블보다 먼저 사용되는 테이블입니다.기본테이블은 아무런 영향을 미치지 않을 수 있습니다.

$ ip -6 rule
0:  from all lookup local
32766:  from all lookup main

그래도. "기본" 멀티캐스트 경로를 확실하게 결정하려면 메트릭이 더 낮은 멀티캐스트 경로를 로컬 테이블에 수동으로 추가하기만 하면 됩니다.

# ip route add multicast ff00::/8 dev eth0 table local metric 100

$ ip route get ff05::02
multicast ff05::2 from :: dev eth0 table local src 2001:db8:123:4567:52fb:e94:d3b7:5ba8 metric 100 pref medium

이 경로는 인터페이스가 작동 중지(및 작동)되면 사라지므로 이 인터페이스를 구성하는 도구와 함께 추가해야 합니다.


참고: 기본적으로 IPv4에는 어디에도 정의된 멀티캐스트 경로가 없으며 주소가 멀티캐스트인지 확인하기 위해 일부 커널 내장 논리를 따릅니다. 따라서 멀티캐스트 경로는 기본 경로를 따릅니다. 멀티캐스트 블록을 제외하려는 경우(예: 멀티캐스트 스트림을 생성하는 도구를 사용하지만 IGMP 스누핑 기능이 없는 스위치의 해당 스트림으로 LAN을 넘치게 하고 싶지 않은 경우) 반대의 경우를 수행할 수 있습니다. 해당 스트림에 멀티캐스트 유형을 추가합니다. 라우팅 흐름은 다른(여기서는 가상) 인터페이스에 있습니다. 왜냐하면 아무것도 없으니까로컬 테이블상호 작용, 즉기본테이블은 충분하지만 table local추가할 수 있습니다.

# ip route add multicast 239.255.16.0/20 dev dummy0

$ ip route get 239.255.16.2
multicast 239.255.16.2 dev dummy0 src 172.20.21.22 uid 0 
    cache <mc> 

답변2

AB의 자세한 설명을 추가하려면 /etc/systemd/network/*.network멀티캐스트 트래픽을 처리해야 하는 네트워크 인터페이스에 대한 구성 파일을 편집하고 이를 끝에 추가하여 설명된 대로 멀티캐스트 경로를 추가하도록 systemd에 지시할 수 있습니다( [Route]이미 있는 경우).

# Have all IPv6 multicast traffic go out on this interface.
[Route]
Type=multicast
Destination=ff00::/8
Metric=100
Table=local

관련 정보