linux - TPROXY 拦截后 Dnsmasq 未收到响应

标签 linux networking dns dnsmasq transparentproxy

我正在路由器上开发一种“监控流量”类型的应用程序,其中我使用 TPROXY 功能来拦截 DNS 数据包并将其发送到监听端口的应用程序服务器。处理后,我修改 TTL 后将数据包转发到实际目的地(即 dnsmasq)。

JFYI,我的防火墙规则 TPROXY 将 DNS 响应数据包转发到监听端口 2345 的应用程序服务器,如下所示:

iptables -t mangle -A PREROUTING -i <WAN-INTERFACE> -p udp --sport 53 -j TPROXY --tproxy-mark 0x3 --on-port 2345

在我的应用程序服务器上,没有错误检查:

sock_fd = socket(AF_INET, SOCK_DGRAM, 0 );

setsockopt(socket_fd, SOL_IP, IP_PKTINFO, &enabled, sizeof(int));
setsockopt(socket_fd, SOL_IP, IP_TRANSPARENT, &enabled, sizeof(int));
setsockopt(socket_fd, SOL_IP, IP_RECVORIGDSTADDR, &enabled, sizeof(int));
setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &enabled, sizeof(int));

/* client_addr points to the source IP (i.e. upstream DNS server's IP) */
bind(sock_fd, (const struct sockaddr *)client_addr, sizeof(struct sockaddr));

/* dst_addr points to the router IP on the WAN interface */
sendto(sock_fd, dns_packet_buffer, data_len, 0,
            (const struct sockaddr *)dst_addr, sizeof(struct sockaddr));

这个sendto成功了,即没有错误!!!但是,dnsmasq没有收到数据!更准确地说,dnsmasq 等待数据的 fd 没有变为“就绪”。

在 dnsmasq 代码中,check_dns_listeners

for (serverfdp = daemon->sfds; serverfdp; serverfdp = serverfdp->next)
    if (FD_ISSET(serverfdp->fd, set))
        reply_query(serverfdp->fd, serverfdp->source_addr.sa.sa_family, now);

FD_ISSET() 返回false。如果我不拦截 DNS 响应流,则此 FD_ISSET() 返回 true。我在这里缺少什么?

最佳答案

终于找到答案了!!让我把它放在这里,假设它对其他人有帮助。

正如我之前提到的,我的应用程序在路由器上运行。路由器制造商修改了现有的 dnsmasq 代码,添加了一个附加选项来限制他们从上游服务器监听的接口(interface)!换句话说,它们仅通过给定接口(interface)(如 eth2)接受来自上游服务器的响应。从代码的角度来看,他们甚至不监听 eth2 以外的其他接口(interface)!因为我的回复是通过“lo”来的,所以他们没有听! :)

我在没有该选项的情况下重新启动了 dnsmasq,并且 viola 可以正常工作! :)

我希望他们在公共(public)论坛上记录了它!这样通用的谷歌搜索就可以工作,而不是阅读 1000 行代码!!

关于linux - TPROXY 拦截后 Dnsmasq 未收到响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32873878/

相关文章:

linux - 使用curl shell脚本登录后上传文件

android - 如何获取用作热点的 Android 设备的子网掩码?

networking - 虚拟机之间通信: creating a named pipe?

java - 如何从 JAVA 应用程序中获取所有 DNS 条目?

Azure CDN HTTPS 停留在启用状态 - 验证请求发送到受 gdpr 保护的电子邮件?有什么解决方法吗?

Linux内核——通过模块动态添加系统调用

linux - 如何重定向到代码中更靠后的函数?

bash - Mac OS X 10.8.4 上的 nc (netcat) 卡住

linux - 使用静态/固定 IP 接收 DNS

c++ - 为什么 Windows Visual Studio 会损坏 C 样式字符串而 Linux 不会?