diff --git a/Cargo.lock b/Cargo.lock index 61b06f6d..23e20727 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1623,7 +1623,7 @@ dependencies = [ [[package]] name = "shadowsocks-rust" -version = "1.12.1" +version = "1.12.2" dependencies = [ "build-time", "byte_string", diff --git a/Cargo.toml b/Cargo.toml index 22618993..56923391 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "shadowsocks-rust" -version = "1.12.1" +version = "1.12.2" authors = ["Shadowsocks Contributors"] description = "shadowsocks is a fast tunnel proxy that helps you bypass firewalls." repository = "https://github.com/shadowsocks/shadowsocks-rust" diff --git a/bin/sslocal.rs b/bin/sslocal.rs index 086d8310..e8648006 100644 --- a/bin/sslocal.rs +++ b/bin/sslocal.rs @@ -329,7 +329,25 @@ fn main() { #[cfg(feature = "local-dns")] { - use shadowsocks_service::local::dns::NameServerAddr; + use shadowsocks_service::{local::dns::NameServerAddr, shadowsocks::relay::socks5::AddressError}; + use std::net::SocketAddr; + + #[inline] + fn parse_remote_dns_addr(a: &str) -> Result { + if let Ok(ip) = a.parse::() { + return Ok(Address::SocketAddress(SocketAddr::new(ip, 53))); + } + + if let Ok(saddr) = a.parse::() { + return Ok(Address::SocketAddress(saddr)); + } + + if a.find(':').is_some() { + a.parse::
() + } else { + Ok(Address::DomainNameAddress(a.to_owned(), 53)) + } + } if let Some(local_dns_addr) = matches.value_of("LOCAL_DNS_ADDR") { let addr = local_dns_addr.parse::().expect("local dns address"); @@ -337,7 +355,7 @@ fn main() { } if let Some(remote_dns_addr) = matches.value_of("REMOTE_DNS_ADDR") { - let addr = remote_dns_addr.parse::
().expect("remote dns address"); + let addr = parse_remote_dns_addr(remote_dns_addr).expect("remote dns address"); local_config.remote_dns_addr = Some(addr); } } diff --git a/crates/shadowsocks-service/src/local/dns/config.rs b/crates/shadowsocks-service/src/local/dns/config.rs index 94efb243..b0eed8b9 100644 --- a/crates/shadowsocks-service/src/local/dns/config.rs +++ b/crates/shadowsocks-service/src/local/dns/config.rs @@ -4,7 +4,7 @@ use std::{convert::Infallible, path::PathBuf}; use std::{ fmt::{self, Display}, - net::SocketAddr, + net::{IpAddr, SocketAddr}, str::FromStr, }; @@ -31,6 +31,10 @@ impl FromStr for NameServerAddr { type Err = NameServerAddrError; fn from_str(s: &str) -> Result { + if let Ok(ip) = s.parse::() { + return Ok(NameServerAddr::SocketAddr(SocketAddr::new(ip, 53))); + } + match s.parse::() { Ok(addr) => Ok(NameServerAddr::SocketAddr(addr)), #[cfg(unix)]