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

标签 java sockets networking dns

因此,我正在开发一种软​​件,该软件将监视(并可能通过充当 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!


IMAGE OF ROUTER NOT ALLOWING
但我找到了另一种方法。
如下:
我去了路由器的设置向导并将DNS服务器设置为相同的IP。
令人惊讶的是,这奏效了!
[我不知道这是否是 D-Link 固件中的错误。
IP SUCESSFULLY ADDED
我还添加了一个异常(exception),以允许所有入站和出站请求到端口 53。
问题是什么?
所以现在的问题是,即使成功地将 DNS 更改为我的服务器。控制台似乎根本没有任何请求。我尝试了很多,但没有。
我通过使用 telnet 自愿向它发送请求来检查程序是否运行良好?
现在我做错了什么还是路由器有一些错误(它是一个旧的)。
注意:图像上的黑线只是为了隐藏我的公共(public) IP 地址,没什么特别的。
编辑:我又试了几次,然后发现当我更改路由器中的 DNS 时网站没有打开,但控制台中仍然没有任何内容!

最佳答案

虽然很难给您一个完整的答案,为什么您的应用程序不起作用,但我可以建议一些调查方法:

  • 端口 53 是一个特权端口。这意味着在 Linux 上绑定(bind)到该端口需要 root 权限,如果作为“普通”用户执行,应用程序将由于“权限被拒绝”而引发异常。当您使用 Windows 时,我不知道如果您尝试以“普通”用户身份绑定(bind),或者您可能以管理员用户身份执行(或 Windows 中任何相当于“root”的用户)并且您不知道它会做什么不知道。它甚至可能只是默默地失败,即似乎绑定(bind)了,而实际上它没有绑定(bind),并且没有数据通过您的应用程序传递。顺便说一句,默认将“root”作为 Linux 中的默认执行用户不是常态,因为它不安全,而且大多数 Linux 发行版(如果不是全部)默认情况下都不允许这样做,即你可以拥有这个,但你必须告诉发行版这是您在安装过程中的意图。我会让你得出你自己的结论 Windows 将用户设置为“管理员”的立场...
  • 在这种情况下,如果是我,我会立即使用一些网络工具来查看发生了什么。在 Linux 上,这是 tcpdump或 Wireshark。您还可以获取适用于 Windows 的 Wireshark,因为它是一个 GUI 应用程序。这将允许您监控和过滤网络流量,因此将独立于您的应用程序。您可以按源或目标地址和/或端口号进行过滤。
  • 我会将 DNS 设置单独留在路由器中,并首先在一台机器上更改 DNS 设置,将其称为测试客户端,然后将其 DNS 地址设置为运行应用程序的机器。使用 tcpdump或 Wireshark 然后您可以在您的 test_client 上发出请求,例如浏览器请求并查看产生的网络流量。
  • 您从未提及更改路由器的 DNS 设置后是否所有来自客户端的浏览器请求都失败。如果您的路由器无法再获得名称解析,这就是我希望看到的。但是,您的客户端中可能正在进行一些 DNS 缓存,因此您可能会在 test_client 上获得成功的 DNS 请求。再次查看网络流量或使用 Linux 客户端,这将为您提供更好的网络工具。
  • 关于java - 无法通过 Windows 10 和 DLINK DIR-615 路由器中的 Java 代码获取 DNS 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65598139/

    相关文章:

    networking - 如果没有打开端口,WebRTC 对等点如何相互连接?

    networking - 如何通过 UNC 路径使用 CMD 通过网络登录?

    java - 用 Java 表示十六进制映射

    java - 给定一组具有 2 个值的对象。根据第一个值对集合进行排序,然后根据第二个值对集合进行排序

    带 VPN 连接的 Java Socket

    C 套接字读取太多数据

    javascript - Jersey 客户端接收 pojo us 字节

    java - 在嵌入式 Jetty Web 容器中运行 OSGi 容器。可能的?

    sockets - 在 GO 中通过原始套接字读取 TCP 数据包

    python - 使用python在wordpress上发布