Dirkt가 지적했듯이 정보가 누락되었습니다.이것질문인데 요약하자면 여러 인터페이스가 처리할 수 있는 멀티캐스트 트래픽을 많이 수신하려고 하는데 모든 트래픽을 수신하려면 여러 인터페이스를 사용하고 각 인터페이스에서 개별적으로 스트림에 참여하고 싶습니다.
3개의 NIC가 있는데, 그 중 1개(webIf라고 함)는 인터넷에 연결되어 있고 나머지 2개(lanIf1 및 lanIf2라고 함)는 LAN에 연결되어 있습니다(둘 다 동일함). 두 인터페이스 모두에서 멀티캐스트 트래픽을 수신하려고 시도했지만 단 하나의 인터페이스에서만 IGMP 쿼리 수신을 보고했으며 연결된 스트림에 대해서만 보고했습니다. 따라서 시간 초과 기간이 지나면 스위치는 다른 인터페이스에 의해 결합된 흐름 전송을 중지합니다.
이 문제를 해결하기 위해 정책 라우팅을 사용해 보았습니다. 각 lanIf에 대한 경로 테이블을 만들고, 각 lanIf에 경로를 추가하여 동일한 게이트웨이로 이동하고, 기본 경로 라우팅 테이블 테이블을 사용하기 전에 두 개의 새로운 규칙을 사용하는 두 개의 규칙을 만듭니다.
내 주소가 다음과 같다면:
lanIf1: 25.25.43.88
lanIf2: 25.25.43.84
default gateway of the lan switch: 25.25.43.5
igmp querier: 25.25.43.1
먼저 다음과 같이 /etc/iproute2/rt_tables에 테이블을 추가했습니다
cat /etc/iproute2/rt_tables
.
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
2 lanIf1Table
3 lanIf2Table
그런 다음 이 스크립트를 루트로 실행합니다.
ip route add 25.25.43.0/24 dev lanIf1 src 25.25.43.88 table lanIf1Table
ip route add default via 25.25.43.5 dev lanIf1 table lanIf1Table
ip route add 25.25.43.0/24 dev lanIf2 src 25.25.43.84 table lanIf2Table
ip route add default via 25.25.43.5 dev lanIf2 table lanIf2Table
ip rule add from 25.25.43.88 table lanIf1Table prio 1000
ip rule add from 25.25.43.84 table lanIf2Table prio 1001
그러나 아무 일도 일어나지 않습니다. IGMP 쿼리는 인터페이스 중 하나에서만 응답됩니다.
내가 무엇이든 작동하게 할 수 있는 유일한 방법은 규칙 중 하나를 변경하는 것입니다
ip rule add from 0.0.0.0 table lanIf1Table prio 1000
. 그런 다음 lanIf1에서 IGMP 보고가 완료됩니다. 하지만 모든 트래픽이 통과하기 때문에 물론 모든 인터넷 액세스가 손실됩니다 lanIf1Table
.
내가 뭘 잘못했나요? 나는 다음 튜토리얼을 따라왔습니다: http://www.rjsystems.nl/en/2100-adv-routing.php
https://blog.scottlowe.org/2013/05/29/a-quick-introduction-to-linux-policy-routing/
답변1
스위치 작동 방식은 다음과 같습니다.
스위치에는 컴퓨터의 NIC에 지점 간 연결되는 여러 네트워크 포트가 있습니다. NIC가 25GB/s를 수행할 수 있다면 이는 지점 간 연결이 25GB/s를 수행하는 프로토콜을 사용한다는 의미입니다.
이제 멍청한 스위치가 생겼는데, 이는 또한 다음을 의미합니다.들어오는이 NIC로 라우팅되는 연결은 25GB/s로 제한됩니다. 또한 단순 스위치는 멀티캐스트를 모든 포트로 라우팅합니다. 따라서 동일한 컴퓨터에 두 개의 25GB/s NIC가 있는 경우 각 NIC에서 총 25GB/s 속도로 동일한 멀티캐스트 패킷을 받게 됩니다. 스위치 자체에 강력한 기능이 있거나 더 높은 대역폭이 있는지 여부에 관계없이.
그러나 그 대역폭에서는 스위치가 매우 스마트하고 내부 메모리를 가질 수 있습니다. 따라서 스위치는 여러 가지 작업을 수행할 수 있습니다.
1) 내부 RAM에 패킷을 저장하고 전달합니다. 이는 들어오는 연결이 나가는 연결의 최대 속도로 제한되지 않음을 의미합니다.
2) 본딩이 가능한 경우 두 개의 지점 간 연결을 두 배의 대역폭으로 하나의 연결로 묶을 수 있습니다.
3) 멀티캐스트를 인식하고 멀티캐스트 프로토콜을 수신하는 경우 멀티캐스트 그룹에 등록된 수신자에게만 패킷을 전달합니다. 따라서 두 개의 서로 다른 멀티캐스트 그룹(또는 그 이상)이 있고 한 그룹의 한 NIC 레지스터에 애플리케이션이 있고 다른 그룹에 있는 다른 NIC 레지스터에 애플리케이션이 있는 경우 실제로 대역폭이 두 배로 늘어납니다. 다시 말하지만, 이들은 서로 다른 멀티캐스트 그룹이어야 하며 단지 서로 다른 애플리케이션만으로는 충분하지 않습니다.
따라서 가장 쉬운 방법은 (2)입니다. NIC를 바인딩하고 완료하는 것입니다.
(3)의 경우, Linux가 서로 다른 NIC에서 동일한 서브넷을 제대로 처리하지 못하는 문제를 해결하지 못했습니다. 이 문제를 해결하는 몇 가지 방법이 있습니다.
a) 네트워크 인터페이스를 다른 네트워크 네임스페이스에 배치하고 해당 네임스페이스에서 수신 애플리케이션을 시작합니다.
b) 신청했습니다제본네트워크 인터페이스에. 모든 응용 프로그램이 이 작업을 수행할 수 있는 것은 아니며 실제로 멀티캐스트에 복잡성이 없는지 확신할 수 없습니다(유니캐스트에서 작동함).
c) 다른 서브넷을 사용하고 네트워크 아키텍처(예: 가능한 경우 스위치)의 다른 서브넷 간에 멀티캐스트를 라우팅합니다.
이 모든 것은 (2)보다 훨씬 더 어렵습니다.
이 모든 것은 당신에게 2배의 이득만을 줄 것입니다. 무손실 비디오 압축(비디오에서 노이즈가 있는 픽셀을 보존하려는 경우)도 2~3배의 이득을 제공하는 반면, 약간의 손실이 있는 압축은 더 나은 요소를 제공합니다. 그리고 좋은 결과를 얻기 위해 많은 CPU가 필요하지 않습니다. 따라서 귀하가 속한 대역폭 범위 내에서 네트워크를 복잡하게 만들기 전에 첫 번째 단계로 압축을 고려할 것입니다.
답변2
여기에 설명해보세요: https://access.redhat.com/solutions/53031
여기서는 그다지 명확하지 않습니다. https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
2개의 네트워크 인터페이스(인터페이스 A와 인터페이스 B)가 있는 컴퓨터를 생각해 보십시오. Linux가 인터페이스 B를 사용하여 IP 주소 X로 패킷을 보내기로 결정했다고 가정합니다. 인터페이스 A의 IP 주소 X에서 수신된 패킷을 생각해 보세요. Linux는 패킷을 삭제합니다.
터미널에서 실행 하거나
sysctl net.ipv4.conf.all.rp_filter=2
해당 줄을 /etc/sysctl.conf
.
해당 IP 주소로 패킷을 보내는 데 사용되는 인터페이스와 다른 인터페이스의 IP 주소에서 패킷을 수신할 수 있습니다!