Skip to content

Commit d41404c

Browse files
committed
Revert deprecation of UDS local DNS
- ref shadowsocks/shadowsocks-android#2650 - Server's builtin DNS will not use local-dns-addr
1 parent 7bf6d32 commit d41404c

File tree

8 files changed

+153
-77
lines changed

8 files changed

+153
-77
lines changed

bin/common/validator/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
use std::net::SocketAddr;
66

7+
#[cfg(feature = "local-dns")]
8+
use shadowsocks_service::local::dns::NameServerAddr;
79
use shadowsocks_service::shadowsocks::{relay::socks5::Address, ManagerAddr, ServerAddr, ServerConfig};
810

911
macro_rules! validate_type {
@@ -29,6 +31,11 @@ validate_type!(
2931
ManagerAddr,
3032
"should be either ip:port, domain:port or /path/to/unix.sock"
3133
);
34+
validate_type!(
35+
validate_name_server_addr,
36+
NameServerAddr,
37+
"should be either ip:port or a path to unix domain socket"
38+
);
3239
validate_type!(validate_u64, u64, "should be unsigned integer");
3340
validate_type!(validate_u32, u32, "should be unsigned integer");
3441

bin/sslocal.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ fn main() {
142142
#[cfg(feature = "local-dns")]
143143
{
144144
app = clap_app!(@app (app)
145-
(@arg LOCAL_DNS_ADDR: --("local-dns-addr") +takes_value required_if("PROTOCOL", "dns") {validator::validate_socket_addr} "Specify the address of local DNS server, send queries directly")
145+
(@arg LOCAL_DNS_ADDR: --("local-dns-addr") +takes_value required_if("PROTOCOL", "dns") {validator::validate_name_server_addr} "Specify the address of local DNS server, send queries directly")
146146
(@arg REMOTE_DNS_ADDR: --("remote-dns-addr") +takes_value required_if("PROTOCOL", "dns") {validator::validate_address} "Specify the address of remote DNS server, send queries through shadowsocks' tunnel")
147147
(@arg DNS_LOCAL_ADDR: --("dns-addr") +takes_value requires_all(&["REMOTE_DNS_ADDR"]) {validator::validate_server_addr} "DNS address, listen to this address if specified")
148148
);
@@ -247,10 +247,10 @@ fn main() {
247247

248248
#[cfg(feature = "local-dns")]
249249
{
250-
use std::net::SocketAddr;
250+
use shadowsocks_service::local::dns::NameServerAddr;
251251

252252
if let Some(local_dns_addr) = matches.value_of("LOCAL_DNS_ADDR") {
253-
let addr = local_dns_addr.parse::<SocketAddr>().expect("local dns address");
253+
let addr = local_dns_addr.parse::<NameServerAddr>().expect("local dns address");
254254
config.local_dns_addr = Some(addr);
255255
}
256256

crates/shadowsocks-service/src/config.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ use shadowsocks::{
7070
use trust_dns_resolver::config::{NameServerConfig, Protocol, ResolverConfig};
7171

7272
use crate::acl::AccessControl;
73+
#[cfg(feature = "local-dns")]
74+
use crate::local::dns::NameServerAddr;
7375

7476
#[cfg(feature = "trust-dns")]
7577
#[derive(Serialize, Deserialize, Debug)]
@@ -574,7 +576,7 @@ pub struct Config {
574576
///
575577
/// Sending DNS query directly to this address
576578
#[cfg(feature = "local-dns")]
577-
pub local_dns_addr: Option<SocketAddr>,
579+
pub local_dns_addr: Option<NameServerAddr>,
578580
/// Remote DNS's address
579581
///
580582
/// Sending DNS query through proxy to this address

crates/shadowsocks-service/src/local/dns/client_cache.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@ impl DnsClientCache {
121121
}
122122

123123
#[cfg(unix)]
124-
#[allow(dead_code)]
125124
pub async fn lookup_unix_stream<P: AsRef<Path>>(&self, ns: &P, msg: Message) -> Result<Message, ProtoError> {
126125
let mut last_err = None;
127126

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
//! DNS configurations
2+
3+
#[cfg(unix)]
4+
use std::{convert::Infallible, path::PathBuf};
5+
use std::{
6+
fmt::{self, Display},
7+
net::SocketAddr,
8+
str::FromStr,
9+
};
10+
11+
/// DNS name server address
12+
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
13+
pub enum NameServerAddr {
14+
/// IP address
15+
SocketAddr(SocketAddr),
16+
/// Unix Domain Socket address
17+
///
18+
/// Specifically used by Android, which served as a stream protocol based DNS server
19+
#[cfg(unix)]
20+
UnixSocketAddr(PathBuf),
21+
}
22+
23+
/// Parse `NameServerAddr` error
24+
#[cfg(unix)]
25+
pub type NameServerAddrError = Infallible;
26+
/// Parse `NameServerAddr` error
27+
#[cfg(not(unix))]
28+
pub type NameServerAddrError = <SocketAddr as FromStr>::Err;
29+
30+
impl FromStr for NameServerAddr {
31+
type Err = NameServerAddrError;
32+
33+
fn from_str(s: &str) -> Result<Self, Self::Err> {
34+
match s.parse::<SocketAddr>() {
35+
Ok(addr) => Ok(NameServerAddr::SocketAddr(addr)),
36+
#[cfg(unix)]
37+
Err(..) => Ok(NameServerAddr::UnixSocketAddr(PathBuf::from(s))),
38+
#[cfg(not(unix))]
39+
Err(err) => Err(err),
40+
}
41+
}
42+
}
43+
44+
impl Display for NameServerAddr {
45+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46+
match *self {
47+
NameServerAddr::SocketAddr(ref sa) => Display::fmt(sa, f),
48+
#[cfg(unix)]
49+
NameServerAddr::UnixSocketAddr(ref p) => write!(f, "{}", p.display()),
50+
}
51+
}
52+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
//! Customized DNS resolver
22
3-
pub use self::server::Dns;
3+
pub use self::{config::NameServerAddr, server::Dns};
44

55
mod client_cache;
6+
pub mod config;
67
pub mod server;
78
mod upstream;

crates/shadowsocks-service/src/local/dns/server.rs

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -36,29 +36,29 @@ use crate::{
3636
local::{context::ServiceContext, loadbalancing::PingBalancer},
3737
};
3838

39-
use super::client_cache::DnsClientCache;
39+
use super::{client_cache::DnsClientCache, config::NameServerAddr};
4040

4141
/// DNS Relay server
4242
pub struct Dns {
4343
context: Arc<ServiceContext>,
4444
mode: Mode,
45-
local_addr: SocketAddr,
45+
local_addr: Arc<NameServerAddr>,
4646
remote_addr: Arc<Address>,
4747
}
4848

4949
impl Dns {
5050
/// Create a new DNS Relay server
51-
pub fn new(local_addr: SocketAddr, remote_addr: Address) -> Dns {
51+
pub fn new(local_addr: NameServerAddr, remote_addr: Address) -> Dns {
5252
let context = ServiceContext::new();
5353
Dns::with_context(Arc::new(context), local_addr, remote_addr)
5454
}
5555

5656
/// Create with an existed `context`
57-
pub fn with_context(context: Arc<ServiceContext>, local_addr: SocketAddr, remote_addr: Address) -> Dns {
57+
pub fn with_context(context: Arc<ServiceContext>, local_addr: NameServerAddr, remote_addr: Address) -> Dns {
5858
Dns {
5959
context,
6060
mode: Mode::UdpOnly,
61-
local_addr: local_addr,
61+
local_addr: Arc::new(local_addr),
6262
remote_addr: Arc::new(remote_addr),
6363
}
6464
}
@@ -117,7 +117,7 @@ impl Dns {
117117
client.clone(),
118118
stream,
119119
peer_addr,
120-
self.local_addr,
120+
self.local_addr.clone(),
121121
self.remote_addr.clone(),
122122
));
123123
}
@@ -127,7 +127,7 @@ impl Dns {
127127
client: Arc<DnsClient>,
128128
mut stream: TcpStream,
129129
peer_addr: SocketAddr,
130-
local_addr: SocketAddr,
130+
local_addr: Arc<NameServerAddr>,
131131
remote_addr: Arc<Address>,
132132
) -> io::Result<()> {
133133
let mut length_buf = [0u8; 2];
@@ -168,7 +168,7 @@ impl Dns {
168168
}
169169
};
170170

171-
let respond_message = match client.resolve(message, local_addr, &remote_addr).await {
171+
let respond_message = match client.resolve(message, &local_addr, &remote_addr).await {
172172
Ok(m) => m,
173173
Err(err) => {
174174
error!("dns tcp {} lookup error: {}", peer_addr, err);
@@ -237,7 +237,7 @@ impl Dns {
237237
listener.clone(),
238238
peer_addr,
239239
message,
240-
self.local_addr,
240+
self.local_addr.clone(),
241241
self.remote_addr.clone(),
242242
));
243243
}
@@ -248,10 +248,10 @@ impl Dns {
248248
listener: Arc<UdpSocket>,
249249
peer_addr: SocketAddr,
250250
message: Message,
251-
local_addr: SocketAddr,
251+
local_addr: Arc<NameServerAddr>,
252252
remote_addr: Arc<Address>,
253253
) -> io::Result<()> {
254-
let respond_message = match client.resolve(message, local_addr, &remote_addr).await {
254+
let respond_message = match client.resolve(message, &local_addr, &remote_addr).await {
255255
Ok(m) => m,
256256
Err(err) => {
257257
error!("dns udp {} lookup failed, error: {}", peer_addr, err);
@@ -442,7 +442,12 @@ impl DnsClient {
442442
}
443443
}
444444

445-
async fn resolve(&self, request: Message, local_addr: SocketAddr, remote_addr: &Address) -> io::Result<Message> {
445+
async fn resolve(
446+
&self,
447+
request: Message,
448+
local_addr: &NameServerAddr,
449+
remote_addr: &Address,
450+
) -> io::Result<Message> {
446451
let mut message = Message::new();
447452
message.set_id(request.id());
448453
message.set_recursion_desired(true);
@@ -476,7 +481,7 @@ impl DnsClient {
476481
async fn acl_lookup(
477482
&self,
478483
query: &Query,
479-
local_addr: SocketAddr,
484+
local_addr: &NameServerAddr,
480485
remote_addr: &Address,
481486
) -> (io::Result<Message>, bool) {
482487
// Start querying name servers
@@ -657,7 +662,7 @@ impl DnsClient {
657662
}
658663
}
659664

660-
async fn lookup_local(&self, query: &Query, local_addr: SocketAddr) -> io::Result<Message> {
665+
async fn lookup_local(&self, query: &Query, local_addr: &NameServerAddr) -> io::Result<Message> {
661666
let mut last_err = io::Error::new(ErrorKind::InvalidData, "resolve empty");
662667

663668
for _ in 0..self.attempts {
@@ -672,34 +677,44 @@ impl DnsClient {
672677
Err(last_err)
673678
}
674679

675-
async fn lookup_local_inner(&self, query: &Query, local_addr: SocketAddr) -> io::Result<Message> {
680+
async fn lookup_local_inner(&self, query: &Query, local_addr: &NameServerAddr) -> io::Result<Message> {
676681
let mut message = Message::new();
677682
message.set_id(thread_rng().gen());
678683
message.set_recursion_desired(true);
679684
message.add_query(query.clone());
680685

681-
// Query UDP then TCP
686+
match *local_addr {
687+
NameServerAddr::SocketAddr(ns) => {
688+
// Query UDP then TCP
682689

683-
let udp_query =
684-
self.client_cache
685-
.lookup_udp_local(local_addr, message.clone(), self.context.connect_opts_ref());
686-
let tcp_query = async move {
687-
// Send TCP query after 500ms, because UDP will always return faster than TCP, there is no need to send queries simutaneously
688-
time::sleep(Duration::from_millis(500)).await;
690+
let udp_query =
691+
self.client_cache
692+
.lookup_udp_local(ns, message.clone(), self.context.connect_opts_ref());
693+
let tcp_query = async move {
694+
// Send TCP query after 500ms, because UDP will always return faster than TCP, there is no need to send queries simutaneously
695+
time::sleep(Duration::from_millis(500)).await;
689696

690-
self.client_cache
691-
.lookup_tcp_local(local_addr, message, self.context.connect_opts_ref())
692-
.await
693-
};
697+
self.client_cache
698+
.lookup_tcp_local(ns, message, self.context.connect_opts_ref())
699+
.await
700+
};
694701

695-
tokio::pin!(udp_query);
696-
tokio::pin!(tcp_query);
702+
tokio::pin!(udp_query);
703+
tokio::pin!(tcp_query);
697704

698-
match future::select(udp_query, tcp_query).await {
699-
Either::Left((Ok(m), ..)) => Ok(m),
700-
Either::Left((Err(..), next)) => next.await.map_err(From::from),
701-
Either::Right((Ok(m), ..)) => Ok(m),
702-
Either::Right((Err(..), next)) => next.await.map_err(From::from),
705+
match future::select(udp_query, tcp_query).await {
706+
Either::Left((Ok(m), ..)) => Ok(m),
707+
Either::Left((Err(..), next)) => next.await.map_err(From::from),
708+
Either::Right((Ok(m), ..)) => Ok(m),
709+
Either::Right((Err(..), next)) => next.await.map_err(From::from),
710+
}
711+
}
712+
#[cfg(unix)]
713+
NameServerAddr::UnixSocketAddr(ref path) => self
714+
.client_cache
715+
.lookup_unix_stream(path, message)
716+
.await
717+
.map_err(From::from),
703718
}
704719
}
705720
}

crates/shadowsocks-service/src/local/mod.rs

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -82,44 +82,44 @@ pub async fn run(mut config: Config) -> io::Result<()> {
8282
accept_opts.tcp.recv_buffer_size = config.inbound_recv_buffer_size;
8383
accept_opts.tcp.nodelay = config.no_delay;
8484

85-
#[cfg(all(feature = "local-dns", feature = "trust-dns"))]
86-
if let Some(socket_addr) = config.local_dns_addr {
87-
use trust_dns_resolver::config::{NameServerConfig, Protocol, ResolverConfig};
88-
89-
trace!("initializing direct DNS resolver for {}", socket_addr);
90-
91-
let mut resolver_config = ResolverConfig::new();
92-
93-
resolver_config.add_name_server(NameServerConfig {
94-
socket_addr,
95-
protocol: Protocol::Udp,
96-
tls_dns_name: None,
97-
trust_nx_responses: false,
98-
#[cfg(feature = "dns-over-tls")]
99-
tls_config: None,
100-
});
101-
resolver_config.add_name_server(NameServerConfig {
102-
socket_addr,
103-
protocol: Protocol::Tcp,
104-
tls_dns_name: None,
105-
trust_nx_responses: false,
106-
#[cfg(feature = "dns-over-tls")]
107-
tls_config: None,
108-
});
109-
110-
match DnsResolver::trust_dns_resolver(Some(resolver_config), config.ipv6_first).await {
111-
Ok(r) => {
112-
context.set_dns_resolver(Arc::new(r));
113-
}
114-
Err(err) => {
115-
error!(
116-
"initialize DNS resolver failed, nameserver: {}, error: {}",
117-
socket_addr, err
118-
);
119-
return Err(err);
120-
}
121-
}
122-
}
85+
// #[cfg(all(feature = "local-dns", feature = "trust-dns"))]
86+
// if let Some(socket_addr) = config.local_dns_addr {
87+
// use trust_dns_resolver::config::{NameServerConfig, Protocol, ResolverConfig};
88+
//
89+
// trace!("initializing direct DNS resolver for {}", socket_addr);
90+
//
91+
// let mut resolver_config = ResolverConfig::new();
92+
//
93+
// resolver_config.add_name_server(NameServerConfig {
94+
// socket_addr,
95+
// protocol: Protocol::Udp,
96+
// tls_dns_name: None,
97+
// trust_nx_responses: false,
98+
// #[cfg(feature = "dns-over-tls")]
99+
// tls_config: None,
100+
// });
101+
// resolver_config.add_name_server(NameServerConfig {
102+
// socket_addr,
103+
// protocol: Protocol::Tcp,
104+
// tls_dns_name: None,
105+
// trust_nx_responses: false,
106+
// #[cfg(feature = "dns-over-tls")]
107+
// tls_config: None,
108+
// });
109+
//
110+
// match DnsResolver::trust_dns_resolver(Some(resolver_config), config.ipv6_first).await {
111+
// Ok(r) => {
112+
// context.set_dns_resolver(Arc::new(r));
113+
// }
114+
// Err(err) => {
115+
// error!(
116+
// "initialize DNS resolver failed, nameserver: {}, error: {}",
117+
// socket_addr, err
118+
// );
119+
// return Err(err);
120+
// }
121+
// }
122+
// }
123123

124124
#[cfg(feature = "trust-dns")]
125125
if context.dns_resolver().is_system_resolver() {

0 commit comments

Comments
 (0)