diff --git a/src/ss-nat b/src/ss-nat index 1dfcc77b..f4b1ebdb 100755 --- a/src/ss-nat +++ b/src/ss-nat @@ -10,6 +10,7 @@ TAG="SS_SPEC" # iptables tag IPT="iptables -t nat" # alias of iptables FWI=$(uci get firewall.shadowsocks.path 2>/dev/null) # firewall include file +IP_REGEX="^([0-9]{1,3}\.){3}[0-9]{1,3}" # used to check if input is a valid IP usage() { cat <<-EOF @@ -21,9 +22,9 @@ usage() { Valid options are: - -s ip address of shadowsocks remote server + -s hostname (requires dig) or ip address of shadowsocks remote server -l port number of shadowsocks local server - -S ip address of shadowsocks remote UDP server + -S hostname (requires dig) or ip address of shadowsocks remote UDP server -L port number of shadowsocks local UDP server -i a file content is bypassed ip list -I lan interface of nat, default: eth0 @@ -126,7 +127,7 @@ tp_rule() { } get_wan_ip() { - cat <<-EOF | grep -E "^([0-9]{1,3}\.){3}[0-9]{1,3}" + cat <<-EOF | grep -E $IP_REGEX $server $SERVER $WAN_BP_IP @@ -170,13 +171,29 @@ EOF while getopts ":s:l:S:L:i:I:e:a:b:w:ouUfh" arg; do case "$arg" in s) - server=$OPTARG + command -v dig > /dev/null && + server=$(dig +short $OPTARG) || + if ! [[ $OPTARG =~ $IP_REGEX ]] + then + loger 3 "Hostname detected for server but no dig present to resolve!" + exit 1 + else + server=$OPTARG + fi ;; l) local_port=$OPTARG ;; S) - SERVER=$OPTARG + command -v dig > /dev/null && + SERVER=$(dig +short $OPTARG) || + if ! [[ $OPTARG =~ $IP_REGEX ]] + then + loger 3 "Hostname detected for UDP server but no dig present to resolve!" + exit 1 + else + SERVER=$OPTARG + fi ;; L) LOCAL_PORT=$OPTARG