TPROXY拦截后Dnsmasq没有收到回复

时间:2015-09-30 19:10:32

标签: 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不会准备就绪。&#34;

在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。我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

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

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

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

我希望他们在公共论坛上记录它!所以通用的谷歌搜索工作,而不是阅读1000行代码!!