sslContext.newHandler(ch.alloc(), dnsServer, dnsPort)newHandler还需要指定dnsServer和dnsPort信息 。
处理完ssl,接下来就是对dns查询和响应的编码解码器,这里使用的是TcpDnsQueryEncoder和TcpDnsResponseDecoder 。
TcpDnsQueryEncoder和TcpDnsResponseDecoder在之前介绍使用netty搭建tcp客户端的时候就已经详细解说过了,这里就不再进行讲解了 。
编码解码之后,就是自定义的消息处理器DotChannelInboundHandler:
class DotChannelInboundHandler extends SimpleChannelInboundHandler<DefaultDnsResponse>DotChannelInboundHandler中定义了消息的具体处理方法:
private static void readMsg(DefaultDnsResponse msg) {if (msg.count(DnsSection.QUESTION) > 0) {DnsQuestion question = msg.recordAt(DnsSection.QUESTION, 0);log.info("question is :{}", question);}int i = 0, count = msg.count(DnsSection.ANSWER);while (i < count) {DnsRecord record = msg.recordAt(DnsSection.ANSWER, i);if (record.type() == DnsRecordType.A) {//A记录用来指定主机名或者域名对应的IP地址DnsRawRecord raw = (DnsRawRecord) record;log.info("ip address is: {}",NetUtil.bytesToIpAddress(ByteBufUtil.getBytes(raw.content())));}i++;}}读取的逻辑很简单,先从DefaultDnsResponse中读取QUESTION,打印出来,然后再读取它的ANSWER,因为这里是A address,所以调用NetUtil.bytesToIpAddress方法将ANSWER转换为ip地址打印出来 。
最后我们可能得到这样的输出:
INFOc.f.dnsdot.DotChannelInboundHandler - question is :DefaultDnsQuestion(www.flydean.com. IN A)INFOc.f.dnsdot.DotChannelInboundHandler - ip address is: 47.107.98.187TLS的客户端请求我们创建好channel之后,就需要向DNS server端发送查询请求了 。因为是DoT,那么和普通的TCP查询有什么区别呢?
答案是并没有什么区别,因为TLS的操作SslHandler我们已经在handler中添加了 。所以这里的查询和普通查询没什么区别 。
int randomID = (int) (System.currentTimeMillis() / 1000);DnsQuery query = new DefaultDnsQuery(randomID, DnsOpCode.QUERY).setRecord(DnsSection.QUESTION, new DefaultDnsQuestion(queryDomain, DnsRecordType.A));ch.writeAndFlush(query).sync();boolean result = ch.closeFuture().await(10, TimeUnit.SECONDS);if (!result) {log.error("DNS查询失败");ch.close().sync();}同样我们需要构建一个DnsQuery,这里使用的是DefaultDnsQuery,通过传入一个randomID和opcode即可 。
因为是查询,所以这里的opcode是DnsOpCode.QUERY 。
然后需要向QUESTION section中添加一个DefaultDnsQuestion,用来查询具体的域名和类型 。
这里的queryDomain是www.flydean.com,查询类型是A,表示的是对域名进行IP解析 。
最后将得到的query,写入到channel中即可 。
总结这里我们使用netty构建了一个基于TLS的DNS查询客户端,除了添加TLS handler之外,其他操作和普通的TCP操作类似 。但是要注意的是,要想客户端可以正常工作,我们需要请求支持DoT协议的DNS服务器才可以 。
本文的代码,大家可以参考:
learn-netty4
【netty系列之: 在netty中使用 tls 协议请求 DNS 服务器】
经验总结扩展阅读
- 明日之后热晶实验室奇遇任务的完成方法是什么
- 世界上第一个双奥之城是哪里
- 高光的使用是用在定妆之前还是之后?
- 描写草的好词好句大全 对小草的赞美之情
- 皙之密1到9号使用步骤是什么?
- 网吧怎么玩明日之后(网吧怎么登录明日之后pc)
- 怎么玩好明日之后(明日之后从零开始教程)
- 低配电脑怎么玩明日之后(电脑如何玩明日之后)
- 【JVM】关于JVM,你需要掌握这些 | 一文彻底吃透JVM系列
- 死磕面试系列,Java到底是值传递还是引用传递?
