From 8e2e3a7f399fa74889bb22ca25297353d190842a Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Thu, 4 Dec 2025 00:03:17 +0800 Subject: [PATCH] fix dns parser --- apps/dns_proxy/src/dns_handler.erl | 27 ++++++++++++++++++--------- apps/dns_proxy/src/dns_resolver.erl | 3 ++- config/sys.config | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/apps/dns_proxy/src/dns_handler.erl b/apps/dns_proxy/src/dns_handler.erl index 3d32395..ccb4845 100644 --- a/apps/dns_proxy/src/dns_handler.erl +++ b/apps/dns_proxy/src/dns_handler.erl @@ -32,6 +32,7 @@ src_ip, src_port, packet, + qname, dns_servers = [] }). @@ -93,8 +94,8 @@ handle_cast(handle, State = #state{socket = Sock, src_ip = SrcIp, src_port = Src lager:debug("[dns_handler] cache is miss"), forward_to_upstream(DnsIp, DnsPort, Packet, Msg), %% 开启定时器,超时后递归请求后面的服务 - erlang:start_timer(?UPSTREAM_TIMEOUT, self(), trigger_next), - {noreply, State#state{dns_servers = RestDnsServers}} + erlang:start_timer(?UPSTREAM_TIMEOUT, self(), {trigger_next, Msg}), + {noreply, State#state{dns_servers = RestDnsServers, qname = Qname}} end; Other -> lager:warning("[] decode msg get error: ~p", [Other]), @@ -108,11 +109,11 @@ handle_cast(handle, State = #state{socket = Sock, src_ip = SrcIp, src_port = Src {noreply, NewState :: #state{}, timeout() | hibernate} | {stop, Reason :: term(), NewState :: #state{}}). %% 处理超时重试 -handle_info({timeout, _, trigger_next}, State = #state{packet = Packet, dns_servers = [{DnsIp, DnsPort}|RestDnsServers]}) -> - forward_to_upstream(DnsIp, DnsPort, Packet), - erlang:start_timer(?UPSTREAM_TIMEOUT, self(), trigger_next), +handle_info({timeout, _, {trigger_next, Msg}}, State = #state{packet = Packet, dns_servers = [{DnsIp, DnsPort}|RestDnsServers]}) -> + forward_to_upstream(DnsIp, DnsPort, Packet, Msg), + erlang:start_timer(?UPSTREAM_TIMEOUT, self(), {trigger_next, Msg}), {noreply, State#state{dns_servers = RestDnsServers}}; -handle_info({timeout, _, trigger_next}, State = #state{dns_servers = []}) -> +handle_info({timeout, _, {trigger_next, _}}, State = #state{dns_servers = []}) -> {stop, normal, State}; handle_info({timeout, _, handler_max_ttl}, State) -> @@ -120,8 +121,16 @@ handle_info({timeout, _, handler_max_ttl}, State) -> {stop, normal, State}; %% 收到请求 -handle_info({dns_resolver_reply, Resp}, State = #state{socket = Sock, src_ip = SrcIp, src_port = SrcPort}) -> - gen_udp:send(Sock, SrcIp, SrcPort, dns:encode_message(Resp)), +handle_info({dns_resolver_reply, Resp}, State = #state{socket = Sock, src_ip = SrcIp, src_port = SrcPort, qname = Qname}) -> + %% 尝试解析 + case dns:decode_message(Resp) of + Msg = #dns_message{answers = Answers} -> + lager:debug("[dns_handler] get a resolver reply: ~p", [Msg]), + dns_cache:insert(Qname, Answers), + gen_udp:send(Sock, SrcIp, SrcPort, Resp); + Other -> + lager:debug("[dns_handler] parse reply get error: ~p", [Other]) + end, {stop, normal, State}. %% @private @@ -154,4 +163,4 @@ forward_to_upstream(TargetIp, TargetPort, Request, Msg) -> build_response(Req, RR) -> Msg = Req, - Msg#dns_message{answers=[RR], qr=true, aa=true}. \ No newline at end of file + Msg#dns_message{answers = RR, qr = true, aa = true}. \ No newline at end of file diff --git a/apps/dns_proxy/src/dns_resolver.erl b/apps/dns_proxy/src/dns_resolver.erl index 99239d7..d3ca382 100644 --- a/apps/dns_proxy/src/dns_resolver.erl +++ b/apps/dns_proxy/src/dns_resolver.erl @@ -77,10 +77,11 @@ handle_call(_Request, _From, State = #state{}) -> {noreply, NewState :: #state{}, timeout() | hibernate} | {stop, Reason :: term(), NewState :: #state{}}). handle_cast({forward, ReceiverPid, TargetIp, TargetPort, Request, #dns_message{id = TxId, questions = [#dns_query{name = QName}|_]}}, State = #state{socket = Socket, tid = Tid}) -> + lager:debug("[dns_resolver] forward request to: ~p", [{TargetIp, TargetPort}]), ok = gen_udp:send(Socket, TargetIp, TargetPort, Request), Key = {TxId, TargetIp, TargetPort, QName}, - ok = ets:insert(Tid, {Key, ReceiverPid}), + true = ets:insert(Tid, {Key, ReceiverPid}), erlang:start_timer(?REQUEST_TTL, self(), {clean_ticker, Key}), diff --git a/config/sys.config b/config/sys.config index 6b8e9fc..aabdd38 100644 --- a/config/sys.config +++ b/config/sys.config @@ -3,7 +3,7 @@ %% 公共的dns域名解析服务 {public_dns_servers, [ - {{8,8,8,8}, 53}, + {{114, 114, 114, 114}, 53}, {{8,8,8,8}, 53} ]},