java - 无法通过 Windows 10 和 DLINK DIR-615 路由器中的 Java 代码获取 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 和 LAN IP 必须在不同的网络上!
但我找到了另一种方法。
如下:
我去了路由器的设置向导并将DNS服务器设置为相同的IP。
令人惊讶的是,这奏效了!
[我不知道这是否是 D-Link 固件中的错误。
我还添加了一个例外,以允许所有入站和出站请求到端口 53。
问题是什么?
所以现在的问题是,即使成功地将 DNS 更改为我的服务器。控制台似乎根本没有任何请求。我尝试了很多,但没有。
我通过使用 telnet 自愿向它发送请求来检查程序是否运行良好?
现在我做错了什么还是路由器有一些错误(它是一个旧的)。
注意:图像上的黑线只是为了隐藏我的公共 IP 地址,没什么特别的。
编辑:我又试了几次,然后发现当我更改路由器中的 DNS 时网站没有打开,但控制台中仍然没有任何内容!
解决方案
虽然很难给您一个完整的答案,为什么您的应用程序不起作用,但我可以建议一些调查方法:
- 端口 53 是一个特权端口。这意味着在 Linux 上绑定到该端口需要 root 权限,如果作为“普通”用户执行,应用程序将由于“权限被拒绝”而引发异常。当您使用 Windows 时,我不知道如果您尝试以“普通”用户身份绑定,或者您可能以管理员用户身份执行(或 Windows 中任何相当于“root”的用户)并且您不知道它会做什么不知道。它甚至可能只是默默地失败,即似乎绑定了,而实际上它没有绑定,并且没有数据通过您的应用程序。顺便说一句,默认将“root”作为 Linux 中的默认执行用户并不是常态,因为它不安全,而且大多数 Linux 发行版(如果不是全部)默认情况下都不允许这样做即你可以拥有它,但你必须告诉发行版这是你在安装过程中想要的。我会让你得出你自己的结论 Windows 对让用户成为“管理员”的立场......
- 在这种情况下,如果是我,我会立即使用一些网络工具来查看发生了什么。在 Linux 上,这是
tcpdump
或 Wireshark。您还可以获取适用于 Windows 的 Wireshark,因为它是一个 GUI 应用程序。这将允许您监控和过滤网络流量,因此将独立于您的应用程序。您可以按源或目标地址和/或端口号进行过滤。 - 我会将 DNS 设置单独留在路由器中,并首先在一台机器上更改 DNS 设置,将其称为测试客户端,然后将其 DNS 地址设置为运行应用程序的机器。然后,使用
tcpdump
或 Wireshark,您可以在您的 test_client 上发出请求,例如浏览器请求并查看产生的网络流量。 - 您从未提及更改路由器的 DNS 设置后是否所有来自客户端的浏览器请求都失败。如果您的路由器无法再获得名称解析,这就是我希望看到的。但是,您的客户端中可能正在进行一些 DNS 缓存,因此您可能会在 test_client 上获得成功的 DNS 请求。再次查看网络流量或使用 Linux 客户端,这将为您提供更好的网络工具。
推荐阅读
- java - 无法应用插件 [id 'com.google.firebase.crashlytics']
- macos - Termius 的 SSH 会话一直断开连接
- php - PHP获取括号内的文本
- netlogo - 如果它们在 Netlogo 上共享相同的补丁,如何要求相同品种的两只海龟做某事?
- django - 如何在 django DRF 中处理时区而不重复自己太多?
- angularjs - ngx-sortablejs TypeError:无法读取未定义的属性“选项”
- arduino - Arduino 串行字符串不返回预期结果
- assembly - 接受一个字符串并在汇编中显示它的长度
- c# - 将 DBCC 与选择一起使用
- react-native - 在 DrawerContentScrollView 中实现 Refresh 控件