使用netty 做dns 解析服务

本文介绍如何使用Netty框架实现DNS解析服务。通过创建UDP Server并利用Netty 4.1.x版本提供的DNS协议支持,实现了DNS查询的接收与响应。文章提供了核心代码示例,包括编解码器的使用及自定义DNS处理器。

概述:

使用netty 做DNS解析服务:

源码:

1.使用netty 做一个UDPserver:netty的版本必须大度4.1.x

netty 在4.1.x 加入DNS协议

final NioEventLoopGroup group = new NioEventLoopGroup();
try {
	Bootstrap bootstrap = new Bootstrap();
	bootstrap.group(group).channel(NioDatagramChannel.class)
			.handler(new ChannelInitializer<NioDatagramChannel>() {
				@Override
				protected void initChannel(NioDatagramChannel nioDatagramChannel) throws Exception {
					nioDatagramChannel.pipeline().addLast(new DatagramDnsQueryDecoder());
					nioDatagramChannel.pipeline().addLast(new DatagramDnsResponseEncoder());
					nioDatagramChannel.pipeline().addLast(new DnsHandler());
				}
			}).option(ChannelOption.SO_BROADCAST, true);

	ChannelFuture future = bootstrap.bind(53).sync();
	future.channel().closeFuture().sync();
} catch (InterruptedException e) {
	e.printStackTrace();
} finally {
	group.shutdownGracefully();
}

DatagramserdnsQueryDecoder,datagramDNSResponseEncoder 编解码器大大减少了自己的编解码工作。

 

二。添加一个hander复写DNS域名服务:hander,channelRead0,根据数据完成:

ublic class DnsHandler extends SimpleChannelInboundHandler<DatagramDnsQuery> {
	@Override
	public void channelRead0(ChannelHandlerContext ctx, DatagramDnsQuery query) throws UnsupportedEncodingException {
		// 假数据,域名和ip的对应关系应该放到数据库中
		Map<String, byte[]> ipMap = new HashMap<>();
		ipMap.put("www.baidu.com.", new byte[] { 61, (byte) 135, (byte) 169, 125 });
		
		DatagramDnsResponse response = new DatagramDnsResponse(query.recipient(), query.sender(), query.id());
		try {
			DefaultDnsQuestion dnsQuestion = query.recordAt(DnsSection.QUESTION);
			response.addRecord(DnsSection.QUESTION, dnsQuestion);
			System.out.println("查询的域名:" + dnsQuestion.name());
			
			ByteBuf buf = null;
			if (ipMap.containsKey(dnsQuestion.name())) {
				buf = Unpooled.wrappedBuffer(ipMap.get(dnsQuestion.name()));
			} else {
				// TODO  对于没有的域名采用迭代方式
				// buf = Unpooled.wrappedBuffer(new byte[] { 127, 0, 0, 1});
			}
			// TTL设置为10s, 如果短时间内多次请求,客户端会使用本地缓存
			DefaultDnsRawRecord queryAnswer = new DefaultDnsRawRecord(dnsQuestion.name(), DnsRecordType.A, 10, buf);
			response.addRecord(DnsSection.ANSWER, queryAnswer);
			
		} catch (Exception e) {
			System.out.println("异常了:" + e);
		}finally {

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迅捷的软件产品制作专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值