0

私はオープンソースのタラを持っていました(これはリンクです) タラのこの部分で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 request received\n」と表示されます。何が問題なのですか? そして、netstat -upan inn コマンド lin を使用すると、これが表示されます

アクティブなインターネット接続 (サーバーおよび確立済み) 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 clone レポ
  2. printfs をソースに追加
  3. 作る
  4. dns_proxy.conf を編集して、/dev/null 以外の場所にログを記録します
  5. 別のターミナルで、ssh someuser@a.box.somewhere -D localhost:9050を実行します。
  6. sudo ./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)); }

ところで2。/etc/resolv.conf を手動で作成または編集した場合は、dns_proxy を実行する前に忘れずにバックアップを取ってください。tailf "your_dns_proxy_logfile.log" を使用して、何が起こっているかを確認します。

ところで3。そのプログラムはあまり堅牢ではありません。fds をリークします。オフ バイ ワンがstring_value()あり、の戻り値をチェックせずにudp_listener()実行しmalloc()ます。私のマシンでは、多くのセグメンテーション違反が発生します。ただし、ほとんど機能していないようです。memcpy()recvfrom()

編集ここに私がオリジナルに加えたいくつかの変更があります。https://github.com/thuovila/dns-tcp-socks-proxy/これらの変更の後、中断されるたびに segfault は発生しませんrecvfrom()。変更は上流のリポジトリにマージされました。

于 2013-09-05T08:56:28.283 に答える
0

そもそも受信するデータがない可能性があります。"dns request received\n" が表示されないということは、recvfrom() 呼び出しがデータの受信を待機しているブロック状態にあることを意味します。送信者がデータを送信しているかどうかを調査する必要があります。次に、靴下が正しいポートにバインドされているかどうかを再確認する必要があります。送信者のコードと、バインドが発生する recvfrom コードを共有することをお勧めします。

于 2013-09-04T20:56:40.990 に答える