python - 是否可以使用UDP进行透明代理?

标签 python sockets udp iptables transparentproxy

我想知道是否有可能在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}

最佳答案

所以我找到了一种解决方案,可以做到这一点:

 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

关于python - 是否可以使用UDP进行透明代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60761624/

相关文章:

Python ssl 获取支持的密码

python - 为什么未指定的 Python 多处理调用代码?

java - 在 Java 中通过套接字发送无符号字节

c - C套接字编程错误?

java - Java UDP Server 增加内存

.net - 如何解决 ntdll.dll 中的卡住(或死锁)?

python - celery 引发 ValueError : not enough values to unpack

python - 使用多处理模块更新 Tkinter GUI

java - 尝试使用套接字检索页面时不断收到相同的错误代码(错误请求)

linux - 使用 UDP 传输使用 netcat 丢弃数据包?