03 基于 java udp 做一個dns服務器 和 一個dns代理服務器

前言

這個也是 來自于一個朋友的需求?

最終的目的是實現一個 dns 代理服務器, 當然 這本質也是一個 dns 服務器?

并且 dns 代理服務器是依賴于 一個 dns 服務器的, 因此 順便給一個 dns 服務器的 demo?

這里 主要是 基于 udp 的一個 dns 請求, 響應數據的交互?

?

?

dns 服務器?

一個基礎的 dns 服務器 demo 如下?

為了方便測試, 可以將 端口改為 53, 然后使用 System.out.println 之類的進行調試?

package com.hx.test15;import org.xbill.DNS.*;import java.io.ByteArrayOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.ByteBuffer;/*** @author Jerry.X.He <970655147@qq.com>* @version 1.0* @date 2024-07-02 22:33*/
public class Test25SimpleDnsServer {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(8053);System.out.println("DNS Server listening on port 8053...");while (true) {byte[] receiveData = new byte[512];DatagramPacket requestPacket = new DatagramPacket(receiveData, receiveData.length);socket.receive(requestPacket);byte[] data = requestPacket.getData();int offset = requestPacket.getOffset();int length = requestPacket.getLength();Message request = new Message(ByteBuffer.wrap(data, offset, length));Message response = handleRequest(request);ByteArrayOutputStream baos = new ByteArrayOutputStream();DNSOutput out = new DNSOutput();baos.write(out.toByteArray());baos.write(response.toWire());byte[] responseData = baos.toByteArray();DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length,requestPacket.getAddress(), requestPacket.getPort());socket.send(responsePacket);}}private static Message handleRequest(Message request) throws Exception {Message response = new Message(request.getHeader().getID());response.getHeader().setFlag(Flags.QR);response.getHeader().setOpcode(Opcode.QUERY);Record question = request.getQuestion();if (question.getName().toString().startsWith("www.abc.com") && question.getType() == Type.A) {ARecord answer = new ARecord(question.getName(), DClass.IN, 300, InetAddress.getByName("172.0.0.2"));response.addRecord(answer, Section.ANSWER);} else {// apply default}return response;}}

?

?

最終實現效果如下, dns 服務器中僅僅配置了 "www.abc.com" -> "172.0.0.2"?

因此 www.abc.com 能夠拿到查詢結果, www.baidu.com 拿不到查詢結果?

?

?

dns 代理服務器

主需求是實現一個 dns 的代理服務器??

實現如下, 無非就是 代理發送一次 dns 的請求 到目標 dns 服務器, 拿到響應之后 響應給客戶端?

package com.hx.test15;import org.xbill.DNS.Message;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.ByteBuffer;/*** Test25JavaDnsForwardServer** @author Jerry.X.He <970655147@qq.com>* @version 1.0* @date 2024-07-02 22:10*/
public class Test25JavaDnsForwardServer {public static void main(String[] args) throws IOException {DatagramSocket serverSocket = new DatagramSocket(53);System.out.println("DNS Proxy Server listening on port 53...");while (true) {byte[] receiveData = new byte[512];DatagramPacket requestPacket = new DatagramPacket(receiveData, receiveData.length);serverSocket.receive(requestPacket);Message request = readMessage(requestPacket);Message response = proxyRequest(request);ByteArrayOutputStream baos = new ByteArrayOutputStream();baos.write(response.toWire());byte[] responseData = baos.toByteArray();DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length,requestPacket.getAddress(), requestPacket.getPort());serverSocket.send(responsePacket);}}private static Message readMessage(DatagramPacket packet) throws IOException {byte[] data = packet.getData();int offset = packet.getOffset();int length = packet.getLength();return new Message(ByteBuffer.wrap(data, offset, length));}private static Message proxyRequest(Message request) throws IOException {DatagramSocket upstreamSocket = new DatagramSocket();InetAddress upstreamAddress = InetAddress.getByName("127.0.0.1");int upstreamPort = 8053;ByteArrayOutputStream baos = new ByteArrayOutputStream();baos.write(request.toWire());byte[] requestData = baos.toByteArray();DatagramPacket upstreamRequest = new DatagramPacket(requestData, requestData.length, upstreamAddress, upstreamPort);upstreamSocket.send(upstreamRequest);byte[] upstreamResponseData = new byte[512];DatagramPacket upstreamResponse = new DatagramPacket(upstreamResponseData, upstreamResponseData.length);upstreamSocket.receive(upstreamResponse);Message response = new Message(ByteBuffer.wrap(upstreamResponseData, upstreamResponse.getOffset(), upstreamResponse.getLength()));upstreamSocket.close();return response;}}

?

最終實現效果如下, dns 服務器中僅僅配置了 "www.abc.com" -> "172.0.0.2"?

因此 www.abc.com 能夠拿到查詢結果, www.baidu.com 拿不到查詢結果?

如果 關閉 目標dns服務, 代理服務器會阻塞住?

?

?

完?

?

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907234.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907234.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907234.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【HITCSAPP 哈工大計算機系統期末大作業】 程序人生-Hello’s P2P

計算機系統 大作業 題 目 程序人生-Hello’s P2P 專 業 計算機與電子通信類 學   號 2023112915 班   級 23L0505 學 生 楊昕彥 指 導 教 師 劉宏偉 計算機科學…

第十周作業

一、CSRF 1、DVWA-High等級 2、使用Burp生成CSRF利用POC并實現攻擊 二、SSRF&#xff1a;file_get_content實驗&#xff0c;要求獲取ssrf.php的源碼 三、RCE 1、 ThinkPHP 2、 Weblogic 3、Shiro

PTA刷題筆記(難度預警!!!有詳解)

7-18 二分法求多項式單根 代碼如下&#xff1a; ? #include <stdio.h> #include <math.h>// 定義多項式函數 double polynomial(double x, double a3, double a2, double a1, double a0) {return a3 * x * x * x a2 * x * x a1 * x a0; }// 二分法求根函數 do…

打破傳統范式,線上 3D 畫展彰顯多元亮點

&#xff08;一&#xff09;沉浸式體驗&#xff0c;身臨其境賞畫? 線上 3D 畫展運用先進的 3D 建模和虛擬現實&#xff08;VR&#xff09;技術&#xff0c;高度還原了真實的展廳環境 。展廳內的布局、燈光&#xff0c;甚至墻壁的質感都被完美復刻&#xff0c;讓觀眾仿佛置身于…

Docker架構詳解

一,Docker的四大要素&#xff1a;Dockerfile、鏡像(image)、容器(container)、倉庫(repository) 1.dockerfile&#xff1a;在dockerfile文件中寫構建docker的命令,通過dockerbuild構建image 2.鏡像&#xff1a;就是一個只讀的模板&#xff0c;鏡像可以用來創建docker容器&…

【工具類】常用的工具類——CollectionUtil

目錄 cn.hutool.core.collection.CollectionUtil集合創建集合清空集合判空集合去重集合過濾集合轉換集合合并集合交集集合差集集合是否包含元素集合是否包含指定元素&#xff08;自定義條件&#xff09;集合分頁集合分組集合轉字符串元素添加元素刪除根據屬性轉Map獲取元素獲取…

從零起步搭建基于華為云構建碳排放設備管理系統的產品設計

目錄 &#x1f33f; 華為云 IoT&#xff1a;輕松上手碳排放設備管理系統搭建 &#x1f30d; 逐步搭建搭建規劃 &#x1f680; 一、系統藍圖&#xff1a;5大核心模塊&#xff0c;循序漸進 1?? 設備管理與數據采集層 2?? 數據傳輸與協議轉換層 3?? 數據處理與分析層…

華為OD機試真題—— 小明減肥(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 B卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

數據結構 -- 插入排序(直接插入排序和希爾排序)

插入排序 算法思想 每次將?個待排序的記錄按其關鍵字大小插入到前面已排好序的子序列中&#xff0c;直到全部記錄插入完成。 代碼實現 void InsertSort(int A[],int n){int i,j,temp;for(i 1;i<n;i){if(A[i]<A[i-1]){temp A[i]; //用temp暫存A[i]for(ji-1;j>…

word中表格拉不動以及插入圖片有間距

word中的表格寬度和高度怎么調整都改不了&#xff0c;可以將選中表格—右鍵—段落—取消勾選下圖中的兩項。 word中表格插入圖片始終有間隙&#xff0c;怎么也消除不了間隙&#xff0c;可以在表布局—單元格邊距—修改上下左右邊距為0即可

網絡抓包命令tcpdump及分析工具wireshark使用

文章目錄 環境文檔用途詳細信息 環境 系統平臺&#xff1a;Linux x86-64 Red Hat Enterprise Linux 8,Linux x86-64 Red Hat Enterprise Linux 7,Linux x86-64 SLES 12,銀河麒麟 &#xff08;鯤鵬&#xff09;,銀河麒麟 &#xff08;X86_64&#xff09;,銀河麒麟&#xff08;龍…

Eigen矩陣存儲順序以及轉換

一、Eigen矩陣存儲順序 在矩陣運算和線性代數中,"行優先"(Row-major)和"列優先"(Column-major)是兩種不同的存儲方式,它們決定了多維數組(如矩陣)在內存中的布局順序。 1. 行優先(Row-major) 定義:矩陣按行順序存儲在內存中,即第一行的所有元…

快速部起一個Openwhisk平臺,使用telego k8s服務部署能力內網部署

Telego 簡介與 OpenWhisk 部署實踐 概述 Telego 是一個用于便攜式 Kubernetes 部署的工具&#xff0c;旨在解決容器鏡像拉取中的網絡代理問題。本文檔描述了如何通過 Telego 將 Apache OpenWhisk&#xff08;一個 Serverless 計算平臺&#xff09;部署到 Kubernetes 集群&…

LockSupport與Condition解析

本章我們介紹兩個Java 并發包中用于線程協作的工具--LockSupport和Condition LockSupport&#xff1a; Java 并發包&#xff08;java.util.concurrent.locks&#xff09;提供了基于許可&#xff08;permit&#xff09;的線程阻塞和喚醒機制--LockSupport 對于LockSupport是通…

【機器學習基礎】機器學習入門核心算法:邏輯回歸(Decision Tree)

機器學習入門核心算法&#xff1a;邏輯回歸&#xff08;Decision Tree&#xff09; 一、算法邏輯1.1 基本概念1.2 算法流程 二、算法原理與數學推導2.1 特征選擇指標信息熵&#xff08;ID3算法&#xff09;信息增益&#xff08;Information Gain&#xff09;信息增益率&#xf…

網絡編程3

管道的性質 讀緩沖區為空&#xff0c;read阻塞寫緩沖區為空&#xff0c;write阻塞一端先close&#xff0c;另一端繼續read&#xff0c;read不阻塞&#xff0c;立刻返回0一端先close&#xff0c;另一端繼續write&#xff0c;write會觸發SIGPIPE信號&#xff0c;進程異常終止 soc…

influxdb時序數據庫

以下概念及操作均來自influxdb2 官方文檔 InfluxDB2 is the platform purpose-built to collect, store, process and visualize time series data. Time series data is a sequence of data points indexed in time order. Data points typically consist of successive meas…

洛谷 P3372 【模板】線段樹 1

【題目鏈接】 洛谷 P3372 【模板】線段樹 1 【題目考點】 1. 線段樹 2. 樹狀數組 【解題思路】 本題要求維護區間和&#xff0c;實現區間修改、區間查詢。 可以使用樹狀數組或線段樹完成該問題&#xff0c;本文僅介紹使用線段樹的解法。 解法1&#xff1a;線段樹 線段樹…

軟件更新 | TSMaster 202504 版本已上線!三大功能讓車載測試更智能

車載測試的智能化時代正在加速到來&#xff01;TSMaster 202504 版本正式發布&#xff0c;本次更新聚焦以太網通信與數據高效處理&#xff0c;帶來三大核心功能升級—以太網報文信息過濾、XCP on Ethernet支持、按時間范圍離線回放&#xff0c;助力工程師更精準、更靈活地完成測…

java-單列集合list與set。

集合定位&#xff1a;存儲數據的容器 與數組的區別&#xff1a; 數組只能存儲同種數據類型數據&#xff0c;集合可以存儲不同類型的數據。 數組的長度一旦創建長度不可變&#xff0c;集合的長度是可變的 數組的操作單一&#xff0c;集合的操作比較豐富&#xff08;增刪改查&…