【问题标题】:Is transparent proxying with UDP possible?是否可以使用 UDP 进行透明代理?
【发布时间】:2020-03-20 17:50:48
【问题描述】:

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

【问题讨论】:

    标签: python sockets udp iptables transparentproxy


    【解决方案1】:

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

     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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2011-09-10
      相关资源
      最近更新 更多