SunnyWun 2014-01-17 09:02 采纳率: 0%
浏览 1294

bind + mysql +bind-dlz实现类DNS功能

我现在要做一个物联网的项目。
具体是要可以给任何物体注册一个ID,叫做OID,OID可以分类,每一类OID都类似与IP一样,1.2.16.xxx 等等,1.2.16是固定的,后面的数字可以根据算法分配;
在注册OID的时候,要将其对应的一些信息也记录下来。
大概的查询思路类似与DNS。于是我们设计了这样一个类DNS解析系统。
部署环境如题:bind + mysql +bind-dlz实现类DNS功能(支持多线程)
想到了NAPTR记录方式,如下(类似与sip电话中routing配置):
$ORIGIN 1.3.1.3.1.4.3.2.2.6.8.e164.arpa.
IN NAPTR 10 10 "u" "SIP+E2U" "!^.*$!sip:abel@twnic.net.tw"
但是数据库表不知道应该怎么设计才会高效,因为通常一个OID会对应多条信息,那我的naptr记录也设计成多条么?还有java代码如何实现发送dns查询消息?
希望有bind部署经验以及开发经验的兄弟来支撑下;
如果有南京本地的高手,我司愿意聘为临时顾问,薪资可商议!
谢谢!
可留言,可加QQ(1034546474)好友,验证信息填写 DNS 即可。
在线等。。。

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-01 17:33
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    首先,让我们回顾一下绑定服务(bind)的基本概念和MySQL数据库的使用情况。绑定服务是一种用于在互联网上提供安全、可靠且高性能的域名服务的技术。它允许用户通过输入域名(例如.com, .net, .org)来获取服务器上的相应资源。

    在绑定服务中,通常会有多个数据库或缓存来存储绑定数据,以便于快速检索。对于您的物联网项目,我们可以考虑将绑定信息存储在一个持久化的数据库中,如MySQL。

    至于NAPTR记录,这是在IPv4地址空间中使用的DNS记录类型之一,它定义了一个路由表,告诉客户端应该向哪个IP地址发送DNS请求以获得目标主机的信息。在这种情况下,您想要将每个OID映射到特定的IP地址,并可能还需要一些其他信息,比如端口或者路径。

    为了实现这个系统,我们需要做以下几步:

    1. 设计一个持久化的数据结构来存储绑定信息。
    2. 实现一个DNS查询服务,接收客户端的域名查询请求并根据已有的绑定信息返回相应的响应。
    3. 将这些逻辑封装到一个独立的服务中,然后将服务部署在MySQL上。
    4. 在绑定服务中实现多线程以提高性能。

    下面是基本的Java代码示例,展示如何创建一个简单的DNS查询服务:

    import java.io.*;
    import java.net.*;
    
    public class DnsService {
    
        private static final String BIND_HOST = "localhost";
        private static final int BIND_PORT = 10000;
        private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/mydb";
    
        public void start() throws IOException {
            try (Connection conn = DriverManager.getConnection(DATABASE_URL)) {
                System.out.println("Connected to database");
                while (true) {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
                    PrintWriter writer = new PrintWriter(System.out);
                    System.out.print("Enter domain name or 'exit' to quit: ");
                    String input = reader.readLine();
                    if ("exit".equals(input)) break;
    
                    String query = "SELECT * FROM dns WHERE domain_name = ?";
                    PreparedStatement ps = conn.prepareStatement(query);
                    ps.setString(1, input);
                    ResultSet rs = ps.executeQuery();
    
                    // Handle the result set
                    while (rs.next()) {
                        String ip = rs.getString("ip_address");
                        writer.println(ip);
                    }
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
        public static void main(String[] args) throws IOException {
            new DnsService().start();
        }
    }
    

    在这个例子中,我们创建了一个名为DnsService的服务,它接受从标准输入读取的域名查询请求,并将它们写入标准输出。当用户输入“exit”时,服务将退出。

    请注意,这只是一个非常基础的例子,实际的应用可能会更复杂,包括处理错误、优化查询结果集、支持更多的查询选项等等。

    评论

报告相同问题?