diff --git a/src/dns.rs b/src/dns.rs index 8aefd03..33be70c 100644 --- a/src/dns.rs +++ b/src/dns.rs @@ -50,6 +50,12 @@ pub fn build_dns_response(mut request: Message, domain: &str, ip: IpAddr, ttl: u Ok(request) } +pub fn remove_ipv6_entries(message: &mut Message) { + message + .answers_mut() + .retain(|answer| !matches!(answer.data(), Some(RData::AAAA(_)))); +} + pub fn extract_ipaddr_from_dns_message(message: &Message) -> Result { if message.response_code() != ResponseCode::NoError { return Err(format!("{:?}", message.response_code())); diff --git a/src/tun2proxy.rs b/src/tun2proxy.rs index f4c0854..d68abdb 100644 --- a/src/tun2proxy.rs +++ b/src/tun2proxy.rs @@ -771,9 +771,17 @@ impl<'a> TunToProxy<'a> { let buf = buf[..packet_size].to_vec(); let header = UdpHeader::retrieve_from_stream(&mut &buf[..])?; + let buf = if info.dst.port() == 53 { + let mut message = dns::parse_data_to_dns_message(&buf[header.len()..], false)?; + dns::remove_ipv6_entries(&mut message); // TODO: Configurable + message.to_vec()? + } else { + buf[header.len()..].to_vec() + }; + // Write to client let src = state.udp_origin_dst.ok_or("udp address")?; - self.send_udp_packet_to_client(src, info.src, &buf[header.len()..])?; + self.send_udp_packet_to_client(src, info.src, &buf)?; } return Ok(());