baz*_*i77 10
取决于重定向机制.如果您正在使用REDIRECT(它是引擎盖下的NAT),那么您需要使用SO_ORIGINAL_DST或libnetfilter_conntrack在应用NAT之前查询连接的原始目标.但是,由于您可以使用相同的侦听器套接字提供多个连接,因此必须对每个数据包执行此查找.
您可以使用conntrack命令行工具试验libnetfilter_conntrack及其提供的服务.
另一种方法是使用TPROXY进行重定向,这意味着要在这种情况下使用.在那里,您可以使用recvmsg()使用ancillirary消息获取数据包的原始目的地.要查找的关键是IP_RECVORIGDST setsockopt.
有关TPROXY的更多信息可以在内核Documentation目录中找到,名为tproxy.txt.它有点难以使用,但由于它是由堆栈实现而不是包过滤子系统,因此工作更可靠.
编辑:添加如何使用TProxy查询UDP目标地址.
编辑: SO_ORIGINAL_DST与udp
SO_ORIGINAL_DST应该与udp套接字一起使用,但是内核不允许您指定连接端点,它将使用您调用SO_ORIGINAL_DST的套接字来获取此地址信息.
这意味着它只有在UDP套接字被正确绑定(重定向到地址/端口)并连接(到有问题的客户端)时才能工作.您的侦听器套接字可能绑定到0.0.0.0并且不只是为单个客户端提供服务,而是为多个客户端提供服务.
但是,您不需要使用实际的侦听器套接字来查询目标地址.由于UDP不会在连接建立时传输数据报,因此您可以创建一个新的UDP套接字,将其绑定到重定向地址并将其连接到客户端(因为它始终将第一个数据包发送给您的侦听器,因此您知道其地址).然后你可以使用这个套接字来运行SO_ORIGINAL_DST,但是有罪魁祸首:
基于TProxy的方法显然更好.