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)]