From 35f2a7401f8ad8d8b753a9a478dcf68bfdea95ce Mon Sep 17 00:00:00 2001 From: Ycarus Date: Fri, 9 Mar 2018 21:49:05 +0100 Subject: [PATCH] Fix shadowsocks ss-rules call with IPv6 --- .../files/shadowsocks-libev.init | 66 ++++++++++++------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/shadowsocks-libev/files/shadowsocks-libev.init b/shadowsocks-libev/files/shadowsocks-libev.init index c781f2666..26fc661ea 100644 --- a/shadowsocks-libev/files/shadowsocks-libev.init +++ b/shadowsocks-libev/files/shadowsocks-libev.init @@ -193,6 +193,7 @@ ss_rules() { local cfgtype local local_port_tcp local_port_udp local args + local ss_redir_servers4 src_default4 dst_default4 local_default4 dst_ips_bypass4 dst_ips_forward4 src_ips_bypass4 src_ips_forward4 src_ips_checkdst4 [ -x "$bin" ] || return 1 config_get cfgtype "$cfg" TYPE @@ -205,24 +206,33 @@ ss_rules() { eval local_port_tcp="\$ss_rules_redir_tcp_$redir_tcp" eval local_port_udp="\$ss_rules_redir_udp_$redir_udp" [ -n "$local_port_tcp" -o -n "$local_port_udp" ] || return 1 - ss_redir_servers4="$(echo "$ss_redir_servers" | awk -F. 'NF == 4' | tr ' ' '\n' | sort -u)" + ss_redir_servers4="$(echo "$ss_redir_servers" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sort -u)" [ "$dst_forward_recentrst" = 0 ] || args="$args --dst-forward-recentrst" + src_default4="$(echo "$src_default" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sort -u)" + dst_default4="$(echo "$dst_default" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sort -u)" + local_default4="$(echo "$local_default" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sort -u)" + dst_ips_bypass4="$(echo "$dst_ips_bypass" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sort -u)" + dst_ips_forward4="$(echo "$dst_ips_forward" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sort -u)" + src_ips_bypass4="$(echo "$src_ips_bypass" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sort -u)" + src_ips_forward4="$(echo "$src_ips_forward" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sort -u)" + src_ips_checkdst4="$(echo "$src_ips_checkdst" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sort -u)" + "$bin" \ -s "$ss_redir_servers4" \ -l "$local_port_tcp" \ -L "$local_port_udp" \ - --src-default "$src_default" \ - --dst-default "$dst_default" \ - --local-default "$local_default" \ + --src-default "$src_default4" \ + --dst-default "$dst_default4" \ + --local-default "$local_default4" \ --dst-bypass-file "$dst_ips_bypass_file" \ --dst-forward-file "$dst_ips_forward_file" \ - --dst-bypass "$dst_ips_bypass" \ - --dst-forward "$dst_ips_forward" \ - --src-bypass "$src_ips_bypass" \ - --src-forward "$src_ips_forward" \ - --src-checkdst "$src_ips_checkdst" \ + --dst-bypass "$dst_ips_bypass4" \ + --dst-forward "$dst_ips_forward4" \ + --src-bypass "$src_ips_bypass4" \ + --src-forward "$src_ips_forward4" \ + --src-checkdst "$src_ips_checkdst4" \ --ifnames "$ifnames" \ --ipt-extra "$ipt_args" \ $args \ @@ -235,6 +245,7 @@ ss_rules6() { local cfgtype local local_port_tcp local_port_udp local args + local ss_redir_servers6 src_default6 dst_default6 local_default6 dst_ips_bypass6 dst_ips_forward6 src_ips_bypass6 src_ips_forward6 src_ips_checkdst6 [ -x "$bin" ] || return 1 config_get cfgtype "$cfg" TYPE @@ -247,24 +258,33 @@ ss_rules6() { eval local_port_tcp="\$ss_rules6_redir_tcp_$redir_tcp" eval local_port_udp="\$ss_rules6_redir_udp_$redir_udp" [ -n "$local_port_tcp" -o -n "$local_port_udp" ] || return 1 - ss_redir_servers6="$(echo "$ss_redir_servers" | awk -F: 'NF>4' | tr ' ' '\n' | sort -u)" + ss_redir_servers6="$(echo "$ss_redir_servers" | grep -o '\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}' | sort -u)" [ "$dst_forward_recentrst" = 0 ] || args="$args --dst-forward-recentrst" + src_default6="$(echo "$src_default" | grep -o '\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}' | sort -u)" + dst_default6="$(echo "$dst_default" | grep -o '\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}' | sort -u)" + local_default6="$(echo "$local_default" | grep -o '\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}' | sort -u)" + dst_ips_bypass6="$(echo "$dst_ips_bypass" | grep -o '\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}' | sort -u)" + dst_ips_forward6="$(echo "$dst_ips_forward" | grep -o '\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}' | sort -u)" + src_ips_bypass6="$(echo "$src_ips_bypass" | grep -o '\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}' | sort -u)" + src_ips_forward6="$(echo "$src_ips_forward" | grep -o '\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}' | sort -u)" + src_ips_checkdst6="$(echo "$src_ips_checkdst" | grep -o '\([0-9a-fA-F]\{0,4\}:\)\{1,7\}[0-9a-fA-F]\{0,4\}' | sort -u)" + "$bin" \ -s "$ss_redir_servers6" \ -l "$local_port_tcp" \ -L "$local_port_udp" \ - --src-default "$src_default" \ - --dst-default "$dst_default" \ - --local-default "$local_default" \ + --src-default "$src_default6" \ + --dst-default "$dst_default6" \ + --local-default "$local_default6" \ --dst-bypass-file "$dst_ips_bypass_file" \ --dst-forward-file "$dst_ips_forward_file" \ - --dst-bypass "$dst_ips_bypass" \ - --dst-forward "$dst_ips_forward" \ - --src-bypass "$src_ips_bypass" \ - --src-forward "$src_ips_forward" \ - --src-checkdst "$src_ips_checkdst" \ + --dst-bypass "$dst_ips_bypass6" \ + --dst-forward "$dst_ips_forward6" \ + --src-bypass "$src_ips_bypass6" \ + --src-forward "$src_ips_forward6" \ + --src-checkdst "$src_ips_checkdst6" \ --ifnames "$ifnames" \ --ipt-extra "$ipt_args" \ $args \ @@ -383,13 +403,13 @@ validate_ss_rules_section() { 'disabled:bool:0' \ 'redir_tcp:uci("shadowsocks-libev", "@ss_redir")' \ 'redir_udp:uci("shadowsocks-libev", "@ss_redir")' \ - 'src_ips_bypass:or(ip4addr,cidr4)' \ - 'src_ips_forward:or(ip4addr,cidr4)' \ - 'src_ips_checkdst:or(ip4addr,cidr4)' \ + 'src_ips_bypass:or(ip4addr,cidr4,ip6addr,cidr6)' \ + 'src_ips_forward:or(ip4addr,cidr4,ip6addr,cidr6)' \ + 'src_ips_checkdst:or(ip4addr,cidr4,ip6addr,cidr6)' \ 'dst_ips_bypass_file:file' \ - 'dst_ips_bypass:or(ip4addr,cidr4)' \ + 'dst_ips_bypass:or(ip4addr,cidr4,ip6addr,cidr6)' \ 'dst_ips_forward_file:file' \ - 'dst_ips_forward:or(ip4addr,cidr4)' \ + 'dst_ips_forward:or(ip4addr,cidr4,ip6addr,cidr6)' \ 'src_default:or("bypass", "forward", "checkdst"):checkdst' \ 'dst_default:or("bypass", "forward"):bypass' \ 'local_default:or("bypass", "forward", "checkdst"):bypass' \