Я использую приведенный ниже код для тестирования на двух устройствах, имя 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 состояния?