fix dns parser

This commit is contained in:
anlicheng 2025-12-04 00:03:17 +08:00
parent f5cb87dc6a
commit 8e2e3a7f39
3 changed files with 21 additions and 11 deletions

View File

@ -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}.
Msg#dns_message{answers = RR, qr = true, aa = true}.

View File

@ -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}),

View File

@ -3,7 +3,7 @@
%% 公共的dns域名解析服务
{public_dns_servers, [
{{8,8,8,8}, 53},
{{114, 114, 114, 114}, 53},
{{8,8,8,8}, 53}
]},