如何通过localhost限制使用多播的流量

Sha*_*way 7 python sockets multicast localhost

我在localhost上使用多播UDP来实现在一台机器上运行的松散的协作程序集合.以下代码适用于Mac OSX,Windows和Linux.缺点是代码也会在localhost网络之外接收UDP数据包.例如,sendSock.sendto(pkt, ('192.168.0.25', 1600))当我从我网络上的另一个盒子发送时,我的测试机器会收到它.

import platform, time, socket, select

addr = ("239.255.2.9", 1600)

sendSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sendSock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 24)
sendSock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, 
    socket.inet_aton("127.0.0.1"))

recvSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
recvSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
if hasattr(socket, 'SO_REUSEPORT'):
    recvSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, True)

recvSock.bind(("0.0.0.0", addr[1]))
status = recvSock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, 
    socket.inet_aton(addr[0]) + socket.inet_aton("127.0.0.1"));

while 1:
    pkt = "Hello host: {1} time: {0}".format(time.ctime(), platform.node())
    print "SEND to: {0} data: {1}".format(addr, pkt)
    r = sendSock.sendto(pkt, addr)

    while select.select([recvSock], [], [], 0)[0]:
        data, fromAddr = recvSock.recvfrom(1024)
        print "RECV from: {0} data: {1}".format(fromAddr, data)

    time.sleep(2)
Run Code Online (Sandbox Code Playgroud)

我试图recvSock.bind(("127.0.0.1", addr[1])),但这可以防止套接字接收任何多播流量.是否有正确的方法将recvSock配置为仅接受来自127/24网络的多播数据包,或者是否需要测试每个接收数据包的地址?

use*_*421 5

与此处其他答案中所述相反,IPv4支持基于TTL的多播作用域,如下所示:

0: node-local (not forwarded outside the current host)
1: link-local (not forwarded outside the current subnet)
< 32: site-local
< 64: region-local
< 128: continent-local
< 255: global
Run Code Online (Sandbox Code Playgroud)

(它还支持Administratively Scoped Multicast.)

来源:WR史蒂文斯,unix网络编程, 2 版,第I卷,第19.2,与修正以符合RFC 2365.


Ale*_*lli 2

不幸的是,多播 IP 没有任何此类“按子网过滤”功能——因此,除非您想使用 IPTables(在 Linux 上)或系统/网络的等效“防火墙”软件/硬件来尝试“丢弃” “地板”您不喜欢的每个多播数据包,我认为您必须在应用程序级别执行此操作(fromAddr例如,在您的内部循环中进行测试)。来自其他主机的 IP 流量是否过多会降低您的性能...?