УСТАНОВЛЕННЫЕ INPUT пакеты многоадресной рассылки udp не могут быть приняты iptables - PullRequest
0 голосов
/ 20 марта 2019

Я использую приведенный ниже код для тестирования на двух устройствах, имя C, S (C для клиента 172.18.91.28, S для сервера 172.18.91.41):

#!/usr/bin/python

import sys, socket, struct

def client():
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

    # work only with add new iptable rule in device S
    sock.bind(("172.18.91.28", 9999))
    sock.connect(("230.1.1.5",9999))

    while True:
        d = raw_input('input:')
        sock.send(d)

def server():
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

    # work only with add new iptable rule in device S
    sock.bind(("230.1.1.5", 9999))
    sock.connect(("172.18.91.28", 9999))

    # join multicast group
    mreq = struct.pack("=4sl", socket.inet_aton("230.1.1.5"), socket.INADDR_ANY)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

    # make sure to create a ESTABLISHED udp connection(in 'netstat -anup').
    sock.send("xxxx")        

    while True:
        data = sock.recv(1024)
        print("receive: "+repr(data))


if(sys.argv[1] == 'client'):
    client()
else:
    server()

iptables обоих устройств:

$ sudo iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
....

Как видите, iptable принимает все УСТАНОВЛЕННЫЕ пакеты.

Когда сервер работает, netstat show:

S ~ # netstat -anup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 172.18.92.41:9999       172.18.91.28:9999       ESTABLISHED 4689/python

Как видите, УСТАНОВЛЕННОЕ соединение udp между C и S.

Проблема в том, что сервер S не может получить пакет клиента, в то время как между C и S. установлено соединение ESTABLISHED (tcpdump может захватывать пакеты.)

Итак Почему iptables отбрасывает пакет ESTABLISHED udp INPUT INPUT? (В то время как пакет ESTABLISHED udp INPUT NON-multicast принимается теми же iptables.)

Относится ли это к модулю impl состояния?

...