Возможно ли прозрачное проксирование с UDP? - PullRequest
1 голос
/ 19 марта 2020

Хотелось бы узнать, есть ли возможность использовать прозрачный прокси в пределах Python для UDP. Мой сокет определяется следующим образом:

sock.setsockopt(socket.SOL_IP, IP_TRANSPARENT, 1)
sock.setsockopt(socket.SOL_IP, SO_ORIGINAL_DST, 1)

, где

IP_TRANSPARENT (19) and SO_ORIGINAL_DST (20)

- константы. Теперь я хотел бы получить оригинальный IP и порт этого сокета. Для TCP это работает так sock.getsockname(), но не работает для сокета udp. Конечно, сначала я делаю что-то вроде этого:

iptables -t mangle -I PREROUTING -d {ip} -p UDP --dport 20000:21000 -j TPROXY --on-port=8173 --on-ip={ip}

1 Ответ

0 голосов
/ 20 марта 2020

Итак, я нашел решение, можно сделать это так:

 data, ancdata, _, srcip =  sock.recvmsg(
            8192, socket.CMSG_SPACE(24))

        for cmsg_level, cmsg_type, cmsg_data in ancdata:
            if cmsg_level == socket.SOL_IP and cmsg_type == 20:
                family, port = struct.unpack('=HH', cmsg_data[0:4])
                port = socket.htons(port)
                if family == socket.AF_INET:
                    start = 4
                    length = 4
                else:
                    raise
                ip = socket.inet_ntop(family, cmsg_data[start:start + length])
                dstip = (ip, port)
                break
...