0

我有开源 cod(这是它的链接) 在这部分 cod 中访问https://github.com/jtRIPper/dns-tcp-socks-proxy/blob/master/dns_proxy.c

 while(1) 
    {
        // receive a dns request from the client
        printf("wait for a dns request from the client\n");
        len = recvfrom(sock, buffer->buffer, 2048, 0, (struct sockaddr *)&dns_client, &dns_client_size);
        printf("dns request received\n");


        // fork so we can keep receiving requests
        if (fork() != 0) { continue; }

        // the tcp query requires the length to precede the packet, so we put the length there
        query = malloc(len + 3);
        query[0] = 0;
        query[1] = len;
        memcpy(query + 2, buffer->buffer, len);

        // forward the packet to the tcp dns server
        fprintf(LOG_FILE, "tcp query call\n");
        tcp_query(query, buffer, len + 2);

        // send the reply back to the client (minus the length at the beginning)
        sendto(sock, buffer->buffer + 2, buffer->length - 2, 0, (struct sockaddr *)&dns_client, sizeof(dns_client));

        free(buffer->buffer);
        free(buffer);
        free(query);

        exit(0);

,recvfrom() 函数不起作用,我无法继续并显示“收到的 dns 请求\n”是什么问题?然后当我使用 netstat -upan inn 命令时我看到了这个

活动 Internet 连接(服务器和已建立) Proto Recv-Q Send-Q 本地地址 外部地址 状态 PID/程序名称 udp 0 0 127.0.0.1:951 0.0.0.0:* 1623/rpc.statd
udp 0 0 0.0.0.0:54721 0.0.0.0:* 2214/avahi-daemon: udp 0 0 0.0.0.0:45085 0.0.0.0:* 1623/rpc.statd
udp 0 0 127.0.0.1:53 0.0.0.0:* 4084/dns_proxy
udp 0 0 0.0。 0.0:68 0.0.0.0:* 1628/dhclient
udp 0 0 0.0.0.0:111 0.0.0.0:* 1582/rpcbind
udp 0 0 0.0.0.0:631 0.0.0.0:* 2323/cupsd
udp 0 0 0.0.0.0:5353 0.0.0.0:* 2214/avahi-daemon: udp 0 0 0.0.0.0:42756 0.0.0.0:* 1628/ dhclient
udp 0 0 0.0.0.0:1900 0.0.0.0:* 3306/minissdpd
udp 0 0 0.0.0.0:908 0.0.0.0:* 1582/rpcbind
udp6 0 0 :::111 :::* 1582/rpcbind
udp6 0 0 :::34443 :::* 1623/rpc.statd
udp6 0 0 :::5353 :::* 2214/avahi-daemon: udp6 0 0 :::62844 :::* 1628/dhclient
udp6 0 0 :::54654 :::* 2214/avahi-daemon: udp6 0 0 :::908 :::* 1582/rpcbind

4

2 回答 2

1

类似的修改(在 printf 之后添加recvfrom())对我来说很好。除了打印之外,您是否对程序进行了任何其他更改?

这些是我测试它的步骤:

  1. git 克隆仓库
  2. 将 printfs 添加到源
  3. 制作
  4. 编辑 dns_proxy.conf 以记录 /dev/null 以外的其他位置
  5. 在另一个终端中,ssh someuser@a.box.somewhere -D localhost:9050
  6. 须藤 ./dns_proxy
  7. 测试:主机 ftp.funet.fi

顺便提一句。添加printf()您建议的位置会在您运行其他应用程序(如 www 浏览器或电子邮件客户端)的桌面上产生大量输出,因此请小心。也许您可以使用其余源使用的日志记录约定,例如

if (LOG == 1) { fprintf(LOG_FILE, "Using DNS server: %s\n", inet_ntoa(*(struct in_addr *)&remote_dns)); }

顺便说一句。如果您已手动创建或编辑它,请记住在运行 dns_proxy 之前备份您的 /etc/resolv.conf。使用 tailf "your_dns_proxy_logfile.log" 查看发生了什么。

顺便说一句。该程序不是很健壮。string_value()它泄漏 fds,在和do 中有一个不合一的,udp_listener()并且malloc()没有memcpy()检查recvfrom(). 在我的机器上,它有很多段错误。不过,似乎只是勉强发挥作用。

编辑这是我对原件所做的一些更改。https://github.com/thuovila/dns-tcp-socks-proxy/在这些修改之后,它不会为每个中断的recvfrom(). 更改已合并到上游存储库。

于 2013-09-05T08:56:28.283 回答
0

可能一开始就没有数据可以接收。您看不到“dns request received\n”这一事实意味着 recvfrom() 调用处于阻塞状态,等待接收数据。您需要调查发件人是否正在发送数据。接下来,您可能应该重新检查 sock 是否绑定在正确的端口上。您可能希望共享发件人的代码以及发生绑定的 recvfrom 代码。

于 2013-09-04T20:56:40.990 回答