私はnettyを使用してカスタムDNSサーバーを作成しようとしています。私はDatagramDnsQueryDecoderを受信DNSQuery UDPパケットで解析するのに使用しましたが、ドメイン名を解決するために応答を送信する方法を理解できません。ハンドラからDatagramDnsQueryオブジェクトを受信しましたが、DatagramDnsResponseを初期化し、テストDNSレコードを追加してDatagramDnsResponseEncoderを通してクライアントに返信する方法を見つけることができません。ここで Nettyを使用するカスタムDNSサーバー
は私がこれまでにここにpublic class DNSListen {
public static void main(String[] args) {
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 DNSMessageHandler());
}
})
.option(ChannelOption.SO_BROADCAST, true);
ChannelFuture future = bootstrap.bind(53).sync();
future.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
group.shutdownGracefully();
}
}
}
行わDNSMessages
public class DNSMessageHandler extends SimpleChannelInboundHandler<DatagramDnsQuery> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, DatagramDnsQuery dnsMessage) throws Exception {
System.out.println(dnsMessage.content());
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
}
}
私はこれを実行すると、複数のDNS要求の出力を取得してシステムのDNSを設定ためのハンドラでてきたものです127.0.0.1 しかし、私は、要求されたドメインのIPアドレスが解決されるようにダミーDNS応答を送信する方法を見つけることができません。 (私はDatagramDnsResponseオブジェクトを初期化してユーザーに書き戻すべきだと思いますが、それは正しいですか?解決したIPとしてダミーのIPで初期化するにはどうすればいいですか) 間違ったパスにありますか?私を正しい経路に誘導してください。ありがとう。
あなたが正しい方向にいるかどうかは言うまでもありません。あなたはあなたがしたことを示さなかった。 http://idownvotedbecau.se/nocode/ – blafasel
これまで私が行ったことを加えて、さらに説明しました。ありがとう。 –