IPv6를 통해 멀티캐스트 트래픽을 보내는 프로그램이 있습니다. 기본 네트워크 인터페이스에서 트래픽을 보냅니다. 제대로 작동하지만(트래픽이 사라짐 eth0
) Docker를 로드하면 인터페이스 외부로 트래픽이 전송되고 docker0
더 eth0
이상 네트워크에 트래픽이 표시되지 않습니다.
예를 들어 명령을 실행하고 실행하는 동안 as 또는 ping ff05::1
as를 사용하여 인터페이스를 확인하는 경우 패킷이 항상 예상대로 떠나지는 않습니다.tcpdump -n host ff05::1 -i XXX
XXX
eth0
docker0
eth0
이제 사용 중인 각 프로그램을 확인하고 바인딩할 인터페이스를 지정하여(예: -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