From 00354513e6f8c0ced651eac637064ec690177562 Mon Sep 17 00:00:00 2001 From: hwchan Date: Sat, 7 Jul 2018 17:05:34 +0800 Subject: [PATCH] Multipe nameservers support --- doc/shadowsocks-libev.asciidoc | 2 +- doc/ss-manager.asciidoc | 2 +- doc/ss-server.asciidoc | 2 +- docker/alpine/Dockerfile | 6 ++---- docker/alpine/README.md | 4 ++-- src/manager.c | 16 ++++++---------- src/manager.h | 3 +-- 7 files changed, 14 insertions(+), 21 deletions(-) diff --git a/doc/shadowsocks-libev.asciidoc b/doc/shadowsocks-libev.asciidoc index 5f69e452..c7306376 100644 --- a/doc/shadowsocks-libev.asciidoc +++ b/doc/shadowsocks-libev.asciidoc @@ -121,7 +121,7 @@ Specify destination server address and port for local port forwarding. Only available in tunnel mode. -d :: -Setup name servers for internal DNS resolver (libudns). +Setup name servers for internal DNS resolver (libc-ares). The default server is fetched from /etc/resolv.conf. + Only available in server and manager mode. diff --git a/doc/ss-manager.asciidoc b/doc/ss-manager.asciidoc index 505c7d12..b510d3d5 100644 --- a/doc/ss-manager.asciidoc +++ b/doc/ss-manager.asciidoc @@ -90,7 +90,7 @@ Enable UDP relay and disable TCP relay. Enable onetime authentication. -d :: -Setup name servers for internal DNS resolver (libudns). +Setup name servers for internal DNS resolver (libc-ares). The default server is fetched from `/etc/resolv.conf`. --fast-open:: diff --git a/doc/ss-server.asciidoc b/doc/ss-server.asciidoc index 866f0605..3ac3d196 100644 --- a/doc/ss-server.asciidoc +++ b/doc/ss-server.asciidoc @@ -100,7 +100,7 @@ Enable UDP relay and disable TCP relay. Resovle hostname to IPv6 address first. -d :: -Setup name servers for internal DNS resolver (libudns). +Setup name servers for internal DNS resolver (libc-ares). The default server is fetched from '/etc/resolv.conf'. --fast-open:: diff --git a/docker/alpine/Dockerfile b/docker/alpine/Dockerfile index 207a6c2d..deeea283 100644 --- a/docker/alpine/Dockerfile +++ b/docker/alpine/Dockerfile @@ -10,8 +10,7 @@ ENV SERVER_PORT 8388 ENV PASSWORD= ENV METHOD aes-256-cfb ENV TIMEOUT 300 -ENV DNS_ADDR 8.8.8.8 -ENV DNS_ADDR_2 8.8.4.4 +ENV DNS_ADDRS 8.8.8.8,8.8.4.4 ENV ARGS= COPY . /tmp/repo @@ -51,7 +50,6 @@ CMD exec ss-server \ -m $METHOD \ -t $TIMEOUT \ --fast-open \ - -d $DNS_ADDR \ - -d $DNS_ADDR_2 \ + -d $DNS_ADDRS \ -u \ $ARGS diff --git a/docker/alpine/README.md b/docker/alpine/README.md index fdd91c16..4e767ffd 100644 --- a/docker/alpine/README.md +++ b/docker/alpine/README.md @@ -33,7 +33,7 @@ $ docker run -p 8388:8388 -p 8388:8388/udp -d --restart always shadowsocks/shado ``` This starts a container of the latest release with all the default settings, which is equivalent to ```bash -$ ss-server -s 0.0.0.0 -p 8388 -k "$(hostname)" -m aes-256-cfb -t 300 --fast-open -d 8.8.8.8 -d 8.8.4.4 -u +$ ss-server -s 0.0.0.0 -p 8388 -k "$(hostname)" -m aes-256-cfb -t 300 --fast-open -d "8.8.8.8,8.8.4.4" -u ``` > **Note**: It's the hostname in the container that is used as the password, not that of the host. @@ -61,7 +61,7 @@ Besides `PASSWORD`, the image also defines the following environment variables t * `SERVER_ADDR`: the IP/domain to bind to, defaults to `0.0.0.0` * `METHOD`: encryption method to use, defaults to `aes-256-cfb` * `TIMEOUT`: defaults to `300` -* `DNS_ADDR`, `DNS_ADDR_2`: DNS servers to redirect NS lookup requests to, defaults to `8.8.8.8` and `8.8.4.4` +* `DNS_ADDRS`: DNS servers to redirect NS lookup requests to, defaults to `8.8.8.8,8.8.4.4` Additional arguments supported by `ss-server` can be passed with the environment variable `ARGS`, for instance to start in verbose mode: ```bash diff --git a/src/manager.c b/src/manager.c index 4472eef6..bbdf71a0 100644 --- a/src/manager.c +++ b/src/manager.c @@ -208,9 +208,9 @@ construct_command_line(struct manager_ctx *manager, struct server *server) int len = strlen(cmd); snprintf(cmd + len, BUF_SIZE - len, " --plugin-opts \"%s\"", manager->plugin_opts); } - for (i = 0; i < manager->nameserver_num; i++) { + if (manager->nameservers) { int len = strlen(cmd); - snprintf(cmd + len, BUF_SIZE - len, " -d %s", manager->nameservers[i]); + snprintf(cmd + len, BUF_SIZE - len, " -d \"%s\"", manager->nameservers); } for (i = 0; i < manager->host_num; i++) { int len = strlen(cmd); @@ -871,8 +871,7 @@ main(int argc, char **argv) int server_num = 0; char *server_host[MAX_REMOTE_NUM]; - char *nameservers[MAX_DNS_NUM + 1]; - int nameserver_num = 0; + char *nameservers = NULL; jconf_t *conf = NULL; @@ -953,9 +952,7 @@ main(int argc, char **argv) iface = optarg; break; case 'd': - if (nameserver_num < MAX_DNS_NUM) { - nameservers[nameserver_num++] = optarg; - } + nameservers = optarg; break; case 'a': user = optarg; @@ -1024,8 +1021,8 @@ main(int argc, char **argv) if (reuse_port == 0) { reuse_port = conf->reuse_port; } - if (conf->nameserver != NULL) { - nameservers[nameserver_num++] = conf->nameserver; + if (nameservers == NULL) { + nameservers = conf->nameserver; } if (mode == TCP_ONLY) { mode = conf->mode; @@ -1118,7 +1115,6 @@ main(int argc, char **argv) manager.hosts = server_host; manager.host_num = server_num; manager.nameservers = nameservers; - manager.nameserver_num = nameserver_num; manager.mtu = mtu; manager.plugin = plugin; manager.plugin_opts = plugin_opts; diff --git a/src/manager.h b/src/manager.h index 8619baa1..2c7c3fcc 100644 --- a/src/manager.h +++ b/src/manager.h @@ -56,8 +56,7 @@ struct manager_ctx { char *manager_address; char **hosts; int host_num; - char **nameservers; - int nameserver_num; + char *nameservers; int mtu; int ipv6first; #ifdef HAVE_SETRLIMIT