멀티 캐스트 UDP 패킷을 통과하지 않는 Linux 커널


35

최근에 새로운 Ubuntu Server 10.04를 설정했으며 멀티 캐스트 그룹에 가입 한 후에도 UDP 서버가 더 이상 인터페이스로 전송 된 멀티 캐스트 데이터를 볼 수 없습니다. 다른 두 개의 Ubuntu 8.04.4 LTS 시스템에 정확히 동일한 설정이 있으며 동일한 멀티 캐스트 그룹에 가입 한 후 데이터를 수신하는 데 아무런 문제가 없습니다.

이더넷 카드는 Broadcom netXtreme II BCM5709이며 드라이버는 다음과 같습니다.

b $ ethtool -i eth1
driver: bnx2
version: 2.0.2
firmware-version: 5.0.11 NCSI 2.0.5
bus-info: 0000:01:00.1

멀티 캐스트 등록을 관리하기 위해 smcroute를 사용하고 있습니다.

b$ smcroute -d
b$ smcroute -j eth1 233.37.54.71

ip maddr 그룹에 가입하면 새로 추가 된 등록이 표시됩니다.

b$ ip maddr

    1:  lo
        inet  224.0.0.1
        inet6 ff02::1
    2:  eth0
        link  33:33:ff:40:c6:ad
        link  01:00:5e:00:00:01
        link  33:33:00:00:00:01
        inet  224.0.0.1
        inet6 ff02::1:ff40:c6ad
        inet6 ff02::1
    3:  eth1
        link  01:00:5e:25:36:47
        link  01:00:5e:25:36:3e
        link  01:00:5e:25:36:3d
        link  33:33:ff:40:c6:af
        link  01:00:5e:00:00:01
        link  33:33:00:00:00:01
        inet  233.37.54.71 <------- McastGroup.
        inet  224.0.0.1
        inet6 ff02::1:ff40:c6af
        inet6 ff02::1

지금까지이 멀티 캐스트 그룹에 대한 데이터를 수신하고 있음을 알 수 있습니다.

b$ sudo tcpdump -i eth1 -s 65534 host 233.37.54.71
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65534 bytes
09:30:09.924337 IP 192.164.1.120.58848 > 233.37.54.71.15572: UDP, length 212
09:30:09.947547 IP 192.164.1.120.58848 > 233.37.54.71.15572: UDP, length 212
09:30:10.108378 IP 192.164.1.120.58866 > 233.37.54.71.15574: UDP, length 268
09:30:10.196841 IP 192.164.1.120.58848 > 233.37.54.71.15572: UDP, length 212
...

인터페이스가 mcast 패킷을 수신하고 있음을 확인할 수도 있습니다.

b $ ethtool -S eth1 | grep mcast_pack
rx_mcast_packets: 103998
tx_mcast_packets: 33

이제 문제가 있습니다. 간단한 루비 UDP 서버를 사용하여 트래픽을 캡처하려고하면 데이터가 없습니다! 다음은 포트 15572에서 데이터 전송을 읽고 처음 두 문자를 인쇄하는 간단한 서버입니다. 이것은 두 개의 8.04.4 Ubuntu 서버에서 작동하지만 10.04 서버에서는 작동하지 않습니다.

require 'socket'
s = UDPSocket.new
s.bind("", 15572)
5.times do
  text, sender = s.recvfrom(2)
  puts text
end

루비로 제작 된 UDP 패킷을 localhost로 보내면 서버가이를 수신하여 처음 두 문자를 인쇄합니다. 따라서 위의 서버가 올바르게 작동한다는 것을 알고 있습니다.

irb(main):001:0> require 'socket'
=> true
irb(main):002:0> s = UDPSocket.new
=> #<UDPSocket:0x7f3ccd6615f0>
irb(main):003:0> s.send("I2 XXX", 0, 'localhost', 15572)

프로토콜 통계를 확인하면 InMcastPkts가 증가하지 않는 것을 알 수 있습니다. 다른 8.04 서버의 동일한 네트워크에서 10 초 동안 수천 개의 패킷을 수신했습니다.

b $ netstat -sgu ; sleep 10 ; netstat -sgu
IcmpMsg:
    InType3: 11
    OutType3: 11
Udp:
    446 packets received
    4 packets to unknown port received.
    0 packet receive errors
    461 packets sent
UdpLite:
IpExt:
    InMcastPkts: 4654 <--------- Same as below
    OutMcastPkts: 3426
    InBcastPkts: 9854
    InOctets: -1691733021
    OutOctets: 51187936
    InMcastOctets: 145207
    OutMcastOctets: 109680
    InBcastOctets: 1246341
IcmpMsg:
    InType3: 11
    OutType3: 11
Udp:
    446 packets received
    4 packets to unknown port received.
    0 packet receive errors
    461 packets sent
UdpLite:
IpExt:
    InMcastPkts: 4656  <-------------- Same as above
    OutMcastPkts: 3427
    InBcastPkts: 9854
    InOctets: -1690886265
    OutOctets: 51188788
    InMcastOctets: 145267
    OutMcastOctets: 109712
    InBcastOctets: 1246341

인터페이스를 promisc 모드로 강제 설정하면 아무 변화가 없습니다.

이 시점에서 나는 붙어 있습니다. 커널 설정에 멀티 캐스트가 활성화되어 있음을 확인했습니다. 확인해야 할 다른 구성 옵션이 있습니까?

b $ grep CONFIG_IP_MULTICAST /boot/config-2.6.32-23-server
CONFIG_IP_MULTICAST=y

여기서 어디로 가야할지 생각이 있습니까?


그림을 이동. 새 질문을 입력하면 관련 알고리즘 이이 질문이 있음을 행복하게 보여 주지만 의미있는 답변은 없습니다. 부 :(.
VxJasonxV

현상금을 정확히 어떻게 받을지 잘 모르겠습니다. 동료가 문제를 발견했고 왜 그런 일이 일어 났는지 알아 냈습니다. 현상금을 수여하는 방법에 대한 제안을 기꺼이 환영합니다.
VxJasonxV

아직도 주위에? 질문이 있습니다.
VxJasonxV 5

이 문제도 있습니다. 부킹에게, 당신은 그것을 해결합니까?

이 문제가있는 다른 사람에게 수정해야 할 2-3 개의 O / S 설정이 있으므로이 질문에 대한 모든 답을 읽으십시오. 우리는이 문제를 변경 rp_filter하여 해결 /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts한 다음 작동하기 시작했습니다.
Sam Goldberg

답변:


35

우리의 문제는 Maciej와는 다른 sysctl 매개 변수로 해결되었습니다.

OP (buecking)에 대해 말하지는 않습니다. 기본 세부 정보 (사용자 영역에 멀티 캐스트 트래픽 없음)와 관련된 문제로 인해이 게시물에 올랐습니다.

수신 서버의 인터페이스에 (일반적으로) 직접 연결된 어플라이언스에서 4 개의 멀티 캐스트 주소로 전송 된 데이터와 멀티 캐스트 주소 당 고유 한 포트를 읽는 응용 프로그램이 있습니다.

우리는 알려진 이유없이 신비하게 실패했을 때 고객 사이트에이 소프트웨어를 배포하려고했습니다. 이 소프트웨어를 디버깅하려고 시도하면 모든 시스템 호출을 검사 한 결과 궁극적으로 모두 같은 사실을 알려주었습니다.

우리 소프트웨어는 데이터를 요구하며 OS는 절대로 데이터를 제공하지 않습니다.

멀티 캐스트 패킷 카운터가 증가함에 따라 tcpdump는 트래픽이 박스 / 특정 인터페이스에 도달했음을 보여 주었지만 아무 것도 할 수 없었습니다. SELinux가 사용 불가능하고 iptables가 실행 중이지만 테이블에 규칙이 없습니다.

우연히 만났다.

무작위로 파고 들자, 우리는 sysctl이 처리하는 커널 매개 변수에 대해 생각하기 시작했지만 문서화 된 기능 중 어느 것도 특별히 관련이 없거나 멀티 캐스트 트래픽과 관련이 있다면 활성화되었습니다. 아, ifconfig가 기능 라인에 "MULTICAST"를 나열했습니다 (업, 브로드 캐스트, 실행 중, 멀티 캐스트). 호기심에서 우리는 보았다 /etc/sysctl.conf. '이 고객의 기본 이미지에는 하단에 추가 된 두 줄이 추가되었습니다.

이 경우 고객이 설정했습니다 net.ipv4.all.rp_filter = 1. rp_filter는 라우트 경로 필터로,이 상자에 도달하지 못한 모든 트래픽을 거부합니다. 소스 서브넷이 스푸핑되고 있다고 생각되는 네트워크 서브넷 호핑.

이 서버는 192.168.1 / 24 서브넷에 있었고 멀티 캐스트 트래픽에 대한 어플라이언스의 소스 IP 주소는 10. * 네트워크에있었습니다. 따라서 필터로 인해 서버가 트래픽에 의미있는 작업을 수행하지 못했습니다.

고객이 승인 한 몇 가지 조정; net.ipv4.eth0.rp_filter = 1그리고 net.ipv4.eth1.rp_filter = 0우리는 행복하게 달리고있었습니다.


2
이것은 효과가 있었다! rp_filter우리 10GB의 네트워크 인터페이스에 대한 우리의 UDP 멀티 캐스트 패킷을 모두 덤핑 하였다. 필터를 끄면 모든 것이 흐르게됩니다.
chrisaycock

우분투 수신기의 tun 장치를 통해 AMT 멀티 캐스트를 통해 스트리밍을 설정할 때 문제가 발생했으며 tcpdump를 통해 장치에 패킷이 전달되는 것을 볼 수 있었지만 응용 프로그램은 스트리밍하고 싶지 않습니다. 이 포스트는 우리를 구했다!
소프트웨어 엔지니어

2
Ubuntu 14.04에서 실행하면을 설정 한 후에 만 ​​작동했습니다 net.ipv4.all.rp_filter = 0. 특히, 멀티 캐스트 데이터가 eth2를에 도착으로, 나는 모두를 설정했다 net.ipv4.eth2.rp_filter = 0net.ipv4.all.rp_filter = 0.
T-Hawk

4

TL / DR 또한 멀티 캐스트가 VLAN에서 나오지 않아야합니다. tcpdump -e그들이 결정하는 데 도움이 될 것입니다.

공평하게, 누군가는 멀티 캐스트가 사용자 영역에 도달하지 못하게 할 수있는 점검 목록이있는 페이지를 작성해야합니다. 나는 며칠 동안 그 문제로 고심 해 왔으며 웹에서 찾을 수 없었던 것은 자연스럽게 아무것도 없었다.

의 패킷을 볼 수있을뿐만 아니라 tcpdump다른 제작자를 위해 다른 인터페이스에서 다른 멀티 캐스트 패킷을 실제로받을 수 있습니다. 멀티 캐스트 수신 가능 여부를 테스트하기 위해 사용한 명령은 다음과 같습니다.

$ GRP=224.x.x.x # set me to the group
$ PORT=yyyy # set me to the receiving port
$ IFACE=mmmm # set me to the name or IP address of the interface
$ strace -f socat -  UDP4-DATAGRAM:$GRP:$PORT,ip-add-membership=$GRP:$IFACE,bind=0.0.0.0:$PORT,multicast-loop=0

strace여기에 대한 이유 는 실제로 socatstdout에 패킷을 인쇄 strace할 수 없었지만 출력 socat에서 바운드 소켓에서 실제 데이터를 수신하고 있는지 명확하게 알 수 있기 때문입니다 (두 번의 초기 select호출 후에는 음소거됩니다 )

  • rp_filtersysctl-적용되지 않음, 시스템이 동일한 IP 네트워크에 있습니다 ( 0모두 동일하게 1설정했습니다. 지금은 적어도 우분투의 경우 기본 설정 인 것 같습니다 ).
  • 방화벽 / 기타-수신 시스템에 방화벽이 없습니다 (방화벽이 있으면 패킷이 tcpdump에 나타나지 않을 것이라고 생각하지만 방화벽이 재미 있다면 가능할 것입니다)
  • IP / 멀티 캐스트 라우팅 및 여러 인터페이스-올바른 인터페이스에서 그룹에 명시 적으로 참여했습니다.
  • 엉뚱한 네트워크 하드웨어-이것이 최후의 수단 이었지만 일부 노트북을 인텔 NUC로 변경해도 도움이되지 않았습니다. 팔꿈치를 씹어 SE에 게시하는 것을 시작한 곳입니다.
  • 필자의 경우 문제는 멀티 캐스트 패킷을 생성하는 특수 하드웨어에서 VLAN을 사용하는 것이 었습니다. 이것이 문제인지 확인하려면에 -e플래그를 포함 tcpdump시키고 VLAN 태그를 확인하십시오. userland가 해당 패킷을 가져 오기 전에 올바른 VLAN에 인터페이스를 구성해야합니다. 실제로 멀티 캐스트 제작자는 핑하지 않지만 ARP 캐시에 들어 가지 않지만 ARP 응답을 명확하게 볼 수는 있었지만 실제로는 공짜였습니다.

VLAN으로 실행되도록하려면 이 링크 가 멀티 캐스트 라우팅을 구성하는 데 도움이 될 수 있습니다. (슬프게도 나는 이것에 익숙하지 않기 때문에 평판은 대답을 추가 할 수 없습니다. 따라서이 편집.)

다음은 내가 한 일입니다 (필요한 경우 sudo 사용).

ip link add link eth0 name eth0_100 type vlan id 100
ip addr add 192.168.100.2/24 brd 192.168.100.255 dev eth0_100
ip link set dev eth0_100 up
ip maddr add 01:00:5e:01:01:01 dev eth0_100
route -n add -net 224.0.0.0 netmask 240.0.0.0 dev eth0_100

이렇게하면 VLAN ID가 100 인 VLAN 트래픽에 대해 추가 인터페이스가 생성됩니다. VLAN IP가 필요하지 않을 수 있습니다. 그런 다음 새 인터페이스에 멀티 캐스트 주소가 구성되고 (01 : 00 : 5e : 01 : 01 : 01은 239.1.1.1의 링크 계층 주소 임) 들어오는 모든 멀티 캐스트 트래픽은 eth0_100에 바인딩됩니다. 또한 위의 답변에서 가능한 모든 단계를 수행했습니다 (iptables, rp_filter 등 확인).


@Gero : 멀티 캐스트 경로를 추가하면 들어오는 멀티 캐스트가 아닌 발신 멀티 캐스트를 설정합니다 . 펑키 한 일을하지 않는 한 멀티 캐스트 IP 주소를 인터페이스에 직접 바인딩해서는 안됩니다.
Pawel Veselov

2

다음 설정을 시도해 볼 수 있습니다.

proc

echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

sysctl.conf

sed -i -e 's|^net.ipv4.icmp_echo_ignore_broadcasts =.*|net.ipv4.icmp_echo_ignore_broadcasts = 0|g' /etc/sysctl.conf

RHEL에서 멀티 캐스팅을 활성화하는 데 사용되었습니다.

방화벽이 멀티 캐스트 트래픽을 허용하는지 확인하고 싶을 수도 있습니다. RHEL을 사용하여 다시 다음을 활성화했습니다.

# allow anything in on multicast addresses
-A INPUT -s 224.0.0.0/4 -j ACCEPT
-A INPUT -p igmp -d 224.0.0.0/4 -j ACCEPT
# needed for multicast ping responses
-A INPUT -p icmp --icmp-type 0 -j ACCEPT

"브로드 캐스트"옵션은 "멀티 캐스트"에도 적용됩니까?
Raedwald 2016 년

0

관리되는 스위치를 사용하고 있습니까? 일부는 '브로드 캐스트 폭풍'또는 기타 멀티 캐스트 문제를 방지하는 옵션이있어 특정 유형의 패킷을 방지 할 수 있습니다. 스위치 설명서를 살펴 보는 것이 좋습니다.


0
s.bind("", 15572)

에 대해 확신하다 ""? 멀티 캐스트 IP 주소를 사용하여 바인딩하지 않는 이유는 무엇입니까?


빈 호스트 주소는 일반적으로 "모든 인터페이스"를 의미합니다.
VxJasonxV
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.