无法通过 Windows 10 和 DLINK DIR-615 路由器中的 Java 代码获取 DNS 请求

Cannot Get DNS Requests via Java Code in Windows 10 and DLINK DIR-615 router

所以我正在开发一个软件,它将监控(并可能通过充当 Forrowder 来改变)我的路由器发出的所有 DNS 请求。

我做了什么?

所以首先我写了一个 Java 代码,它可以侦听特定端口并将所有请求打印到控制台[现在我只想测试请求]。

密码是:

import java.net.*;
import java.io.*;

public class PortLogger{
    public static void main(String[] args) {
        LoggerServer loggerServer = new LoggerServer(53);
        loggerServer.start();
    }
}

class LoggerServer extends Thread{
    private int port;

    public LoggerServer(int port){
        this.port = port;
    }

    @Override
    public void run(){
        try{
            int id = 1;
            ServerSocket server = new ServerSocket(port);
            System.out.println("Server Listening at port " + port);
            Socket client;
            while(true){
                client = server.accept();
                ClientHandler clientHandler = new ClientHandler(client, id++);
                clientHandler.start();
            }
        }catch(Exception ex){
            System.out.println("Exception at Server : 1 :: EX = " + ex);
        }
    }
}

class ClientHandler extends Thread{
    private Socket client;
    private int id;

    public ClientHandler(Socket client, int id){
        this.client = client;
        this.id = id;
    }

    @Override
    public void run(){
        try {
            String data = "";
            BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            while(true){
                data = reader.readLine();
                if(data.length() > 0){
                    System.out.println("Client : " + id + " :: " + data);
                }
            }
        }catch(Exception ex){
            System.out.println("Exception at Client : " + id + " :: EX = " + ex);
        }
    }
}

目前此代码的唯一建议是向我显示对服务器发出的所有请求。

我知道我还必须为此更改路由器中的 DNS 服务器。

因此,为此我首先尝试进行互联网设置,并将我计算机的本地 IP 作为 DNS 服务器。

但它正在显示:

DNS IP and LAN IP must be on different networks!

但我找到了另一种方法。

如下:

我进入路由器的设置向导并将 DNS 服务器设置为相同的 IP。

令人惊讶的是这有效!

[我不知道这是否是 D-Link 固件中的错误。

我还添加了一个例外,允许所有入站和出站请求到端口 53。

问题是什么?

所以现在的问题是,即使成功将 DNS 更改为我的服务器。控制台似乎根本没有请求。我尝试了很多,但都没有。

我通过使用 telnet 自愿向它发送请求来检查该程序是否工作正常?

现在我做错了什么或路由器有一些错误(它是旧的)。

注意:图片上的黑线只是为了隐藏我的 public IP 地址,没什么特别的。

编辑:我又尝试了几次,然后发现当我更改路由器中的 DNS 时网站无法打开,但控制台中仍然没有任何内容!

虽然很难给出您的应用程序为何无法运行的完整答案,但我可以建议一些调查方法:

  1. 端口 53 是特权端口。这意味着 Linux 绑定到该端口需要 root 权限,如果以 'normal' 用户身份执行,应用程序将因 'permission denied' 而抛出异常。当您使用 Windows 时,我不知道如果您尝试以 'normal' 用户身份绑定,或者您可能以管理员用户身份执行(或 'root' 在 Windows) 而你不知道。它甚至可能只是悄无声息地失败,即看似绑定,但实际上并没有绑定,并且没有数据通过您的应用程序传递。顺便说一句,默认 'root' 作为 Linux 中的默认执行用户不是常态,因为它是不安全的,而且大多数 Linux 发行版(如果不是全部的话)都不允许这样做 by default 即你可以有这个但是你必须告诉发行版这是你在安装过程中想要的。 Windows 采取什么立场让用户 'admin'...
  2. 让你自己得出结论
  3. 在这种情况下,如果是我,我会立即去一些网络工具看看发生了什么。在 Linux 上,这是 tcpdump 或 Wireshark。您还可以获得 Windows 的 Wireshark,因为它是一个 GUI 应用程序。这将使您能够监控和过滤网络流量,因此将独立于您的应用程序。您可以按源地址或目标地址过滤 and/or 端口号。
  4. 我会在路由器中单独保留 DNS 设置,先在一台机器上更改 DNS 设置,将其称为 测试客户端,并将其 DNS 地址设置为所在的机器您的申请是 运行。使用 tcpdump 或 Wireshark,您可以在 test_client 上发出请求,例如浏览器请求并查看生成的网络流量。
  5. 您从未提到在更改路由器的 DNS 设置后来自客户端的所有浏览器请求是否都失败。如果您的路由器无法再获得名称解析,这就是我希望看到的。但是,您的客户端中可能正在进行一些 DNS 缓存,因此您可能会在 test_client 上获得成功的 DNS 请求。再次查看网络流量或使用 Linux 客户端,这将为您提供更好的网络工具。