OSDN Git Service

luci-app-passwall: sync with upstream source
authorTianling Shen <cnsztl@immortalwrt.org>
Fri, 18 Feb 2022 15:57:43 +0000 (23:57 +0800)
committerTianling Shen <cnsztl@immortalwrt.org>
Fri, 18 Feb 2022 15:57:43 +0000 (23:57 +0800)
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
applications/luci-app-passwall/Makefile
applications/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_v2ray.lua
applications/luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua
applications/luci-app-passwall/luasrc/model/cbi/passwall/server/api/app.lua
applications/luci-app-passwall/po/zh_Hans/passwall.po
applications/luci-app-passwall/root/usr/share/passwall/0_default_config
applications/luci-app-passwall/root/usr/share/passwall/app.sh
applications/luci-app-passwall/root/usr/share/passwall/helper_dnsmasq.sh
applications/luci-app-passwall/root/usr/share/passwall/helper_smartdns.sh
applications/luci-app-passwall/root/usr/share/passwall/iptables.sh

index a2849c4..5a70385 100644 (file)
@@ -144,6 +144,7 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_Xray_Plugin
        default n
 
 config PACKAGE_$(PKG_NAME)_INCLUDE_IPv6_Nat
+       depends on PACKAGE_ip6tables
        bool "Include IPv6 Nat"
        default n
 
index 5f1b9f2..32a611a 100644 (file)
@@ -280,7 +280,7 @@ if node_section then
             protocol = "dokodemo-door",
             settings = {network = proto, followRedirect = true},
             streamSettings = {sockopt = {tproxy = proxy_way}},
-            sniffing = {enabled = true, destOverride = {"http", "tls", (dns_fakedns) and "fakedns"}, metadataOnly = false, RouteOnly = route_only and true or nil}
+            sniffing = {enabled = true, destOverride = {"http", "tls", (dns_fakedns) and "fakedns"}, metadataOnly = false, routeOnly = route_only and true or nil}
         })
     end
 
index a8793bb..e92fc8f 100644 (file)
@@ -114,6 +114,9 @@ o = s:option(Flag, "accept_icmpv6", translate("Hijacking ICMPv6 (IPv6 PING)"))
 o:depends("ipv6_tproxy", true)
 o.default = 0
 
+o = s:option(Flag, "route_only", translate("Sniffing Route Only (V2Ray/Xray)"))
+o.default = "1"
+
 --[[
 ---- TCP Redir Port
 o = s:option(Value, "tcp_redir_port", translate("TCP Redir Port"))
index 93e8a3c..a61412f 100755 (executable)
@@ -12,6 +12,9 @@ local LOG_APP_FILE = "/tmp/log/" .. CONFIG .. ".log"
 local TMP_BIN_PATH = CONFIG_PATH .. "/bin"
 local require_dir = "luci.model.cbi.passwall.server.api."
 
+local ipt_bin = sys.exec("echo -n $(/usr/share/passwall/iptables.sh get_ipt_bin)")
+local ip6t_bin = sys.exec("echo -n $(/usr/share/passwall/iptables.sh get_ip6t_bin)")
+
 local function log(...)
        local f, err = io.open(LOG_APP_FILE, "a")
     if f and err == nil then
@@ -25,6 +28,14 @@ local function cmd(cmd)
     sys.call(cmd)
 end
 
+local function ipt(arg)
+    cmd(ipt_bin .. " -w " .. arg)
+end
+
+local function ip6t(arg)
+    cmd(ip6t_bin .. " -w " .. arg)
+end
+
 local function ln_run(s, d, command, output)
     if not output then
         output = "/dev/null"
@@ -37,9 +48,9 @@ end
 local function gen_include()
     cmd(string.format("echo '#!/bin/sh' > /tmp/etc/%s.include", CONFIG))
     local function extract_rules(n, a)
-        local _ipt = "iptables"
+        local _ipt = ipt_bin
         if n == "6" then
-            _ipt = "ip6tables"
+            _ipt = ip6t_bin
         end
         local result = "*" .. a
         result = result .. "\n" .. sys.exec(_ipt .. '-save -t ' .. a .. ' | grep "PSW-SERVER" | sed -e "s/^-A \\(INPUT\\)/-I \\1 1/"')
@@ -48,12 +59,12 @@ local function gen_include()
     end
     local f, err = io.open("/tmp/etc/" .. CONFIG .. ".include", "a")
     if f and err == nil then
-        f:write('iptables-save -c | grep -v "PSW-SERVER" | iptables-restore -c' .. "\n")
-        f:write('iptables-restore -n <<-EOT' .. "\n")
+        f:write(ipt_bin .. '-save -c | grep -v "PSW-SERVER" | ' .. ipt_bin .. '-restore -c' .. "\n")
+        f:write(ipt_bin .. '-restore -n <<-EOT' .. "\n")
         f:write(extract_rules("4", "filter") .. "\n")
         f:write("EOT" .. "\n")
-        f:write('ip6tables-save -c | grep -v "PSW-SERVER" | ip6tables-restore -c' .. "\n")
-        f:write('ip6tables-restore -n <<-EOT' .. "\n")
+        f:write(ip6t_bin .. '-save -c | grep -v "PSW-SERVER" | ' .. ip6t_bin .. '-restore -c' .. "\n")
+        f:write(ip6t_bin .. '-restore -n <<-EOT' .. "\n")
         f:write(extract_rules("6", "filter") .. "\n")
         f:write("EOT" .. "\n")
         f:close()
@@ -67,10 +78,10 @@ local function start()
     end
     cmd(string.format("mkdir -p %s %s", CONFIG_PATH, TMP_BIN_PATH))
     cmd(string.format("touch %s", LOG_APP_FILE))
-    cmd("iptables -N PSW-SERVER")
-    cmd("iptables -I INPUT -j PSW-SERVER")
-    cmd("ip6tables -N PSW-SERVER")
-    cmd("ip6tables -I INPUT -j PSW-SERVER")
+    ipt("-N PSW-SERVER")
+    ipt("-I INPUT -j PSW-SERVER")
+    ip6t("-N PSW-SERVER")
+    ip6t("-I INPUT -j PSW-SERVER")
     uci:foreach(CONFIG, "user", function(user)
         local id = user[".name"]
         local enable = user.enable
@@ -154,11 +165,11 @@ local function start()
 
             local bind_local = user.bind_local or 0
             if bind_local and tonumber(bind_local) ~= 1 then
-                cmd(string.format('iptables -A PSW-SERVER -p tcp --dport %s -m comment --comment "%s" -j ACCEPT', port, remarks))
-                cmd(string.format('ip6tables -A PSW-SERVER -p tcp --dport %s -m comment --comment "%s" -j ACCEPT', port, remarks))
+                ipt(string.format('-A PSW-SERVER -p tcp --dport %s -m comment --comment "%s" -j ACCEPT', port, remarks))
+                ip6t(string.format('-A PSW-SERVER -p tcp --dport %s -m comment --comment "%s" -j ACCEPT', port, remarks))
                 if udp_forward == 1 then
-                    cmd(string.format('iptables -A PSW-SERVER -p udp --dport %s -m comment --comment "%s" -j ACCEPT', port, remarks))
-                    cmd(string.format('ip6tables -A PSW-SERVER -p udp --dport %s -m comment --comment "%s" -j ACCEPT', port, remarks))
+                    ipt(string.format('-A PSW-SERVER -p udp --dport %s -m comment --comment "%s" -j ACCEPT', port, remarks))
+                    ip6t(string.format('-A PSW-SERVER -p udp --dport %s -m comment --comment "%s" -j ACCEPT', port, remarks))
                 end 
             end
         end
@@ -168,12 +179,12 @@ end
 
 local function stop()
     cmd(string.format("top -bn1 | grep -v 'grep' | grep '%s/' | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1", CONFIG_PATH))
-    cmd("iptables -D INPUT -j PSW-SERVER 2>/dev/null")
-    cmd("iptables -F PSW-SERVER 2>/dev/null")
-    cmd("iptables -X PSW-SERVER 2>/dev/null")
-    cmd("ip6tables -D INPUT -j PSW-SERVER 2>/dev/null")
-    cmd("ip6tables -F PSW-SERVER 2>/dev/null")
-    cmd("ip6tables -X PSW-SERVER 2>/dev/null")
+    ipt("-D INPUT -j PSW-SERVER 2>/dev/null")
+    ipt("-F PSW-SERVER 2>/dev/null")
+    ipt("-X PSW-SERVER 2>/dev/null")
+    ip6t("-D INPUT -j PSW-SERVER 2>/dev/null")
+    ip6t("-F PSW-SERVER 2>/dev/null")
+    ip6t("-X PSW-SERVER 2>/dev/null")
     cmd(string.format("rm -rf %s %s /tmp/etc/%s.include", CONFIG_PATH, LOG_APP_FILE, CONFIG))
 end
 
index 8333976..c3d8ff8 100644 (file)
@@ -658,6 +658,9 @@ msgstr "劫持ICMP (PING)"
 msgid "Hijacking ICMPv6 (IPv6 PING)"
 msgstr "劫持ICMPv6 (IPv6 PING)"
 
+msgid "Sniffing Route Only (V2Ray/Xray)"
+msgstr "流量嗅探只供路由使用 (V2Ray/Xray)"
+
 msgid "TCP Proxy Way"
 msgstr "TCP代理方式"
 
index 96938c1..3b9cfb3 100644 (file)
@@ -33,6 +33,7 @@ config global_forwarding
        option accept_icmp '0'
        option tcp_proxy_way 'redirect'
        option ipv6_tproxy '0'
+       option route_only '1'
 
 config global_other
        option status 'big_icon show_check_port show_ip111'
index 4a622dd..c68e561 100755 (executable)
@@ -647,7 +647,8 @@ run_redir() {
                                UDP_NODE="nil"
                        }
                        _extra_param="${_extra_param} ${proto}"
-                       _extra_param="${_extra_param} -route_only 1"
+                       local route_only=$(config_t_get global_forwarding route_only 1)
+                       [ "${route_only}" = "1" ] && _extra_param="${_extra_param} -route_only 1"
                        [ "${DNS_MODE}" = "v2ray" -o "${DNS_MODE}" = "xray" ] && {
                                local v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)
                                [ "$(config_t_get global dns_by)" = "tcp" -o "${v2ray_dns_mode}" = "fakedns" ] && {
index 6d81e06..5164660 100755 (executable)
@@ -86,8 +86,8 @@ gen_items() {
 }
 
 gen_address_items() {
-       local address=${1}; shift 1
-       local outf=${1}; shift 1
+       local address outf
+       eval_set_val $@
 
        awk -v address="${address}" -v outf="${outf}" '
                BEGIN {
index f142160..ba51c04 100755 (executable)
@@ -33,8 +33,8 @@ gen_items() {
 }
 
 gen_address_items() {
-       local address=${1}; shift 1
-       local outf=${1}; shift 1
+       local address outf
+       eval_set_val $@
 
        awk -v address="${address}" -v outf="${outf}" '
                BEGIN {
@@ -65,12 +65,13 @@ add() {
        [ -z "${REMOTE_GROUP}" ] && {
                REMOTE_GROUP="${CONFIG}_proxy"
                [ -n "${TUN_DNS}" ] && TUN_DNS="$(echo ${TUN_DNS} | sed 's/#/:/g')"
+               sed -i "/passwall/d" /etc/smartdns/custom.conf >/dev/null 2>&1
                echo "server ${TUN_DNS}  -group ${REMOTE_GROUP} -exclude-default-group" >> ${SMARTDNS_CONF}
        }
 
        #屏蔽列表
        [ -s "${RULES_PATH}/block_host" ] && {
-               cat "${RULES_PATH}/block_host" | tr -s '\n' | grep -v "^#" | sort -u | gen_address_items "-" "${SMARTDNS_CONF}"
+               cat "${RULES_PATH}/block_host" | tr -s '\n' | grep -v "^#" | sort -u | gen_address_items address="-" outf="${SMARTDNS_CONF}"
        }
 
        #始终用国内DNS解析节点域名
@@ -205,7 +206,7 @@ del() {
        rm -rf /tmp/etc/smartdns/passwall.conf
        sed -i "/passwall/d" /etc/smartdns/custom.conf >/dev/null 2>&1
        rm -rf /tmp/smartdns.cache
-       /etc/init.d/smartdns reload
+       /etc/init.d/smartdns reload >/dev/null 2>&1
 }
 
 arg1=$1
index 70d00ad..e74cb96 100755 (executable)
@@ -1,5 +1,7 @@
 #!/bin/sh
 
+DIR="$(cd "$(dirname "$0")" && pwd)"
+MY_PATH=$DIR/iptables.sh
 IPSET_LANIPLIST="laniplist"
 IPSET_VPSIPLIST="vpsiplist"
 IPSET_SHUNTLIST="shuntlist"
@@ -20,10 +22,15 @@ IPSET_BLOCKLIST6="blocklist6"
 
 FORCE_INDEX=2
 
-ipt_n="iptables -t nat -w"
-ipt_m="iptables -t mangle -w"
-ip6t_n="ip6tables -t nat -w"
-ip6t_m="ip6tables -t mangle -w"
+. /lib/functions/network.sh
+
+ipt=$(command -v iptables-legacy || command -v iptables)
+ip6t=$(command -v ip6tables-legacy || command -v ip6tables)
+
+ipt_n="$ipt -t nat -w"
+ipt_m="$ipt -t mangle -w"
+ip6t_n="$ip6t -t nat -w"
+ip6t_m="$ip6t -t mangle -w"
 [ -z "$(lsmod | grep 'ip6table_nat')" ] && ip6t_n="eval #$ip6t_n"
 [ -z "$(lsmod | grep 'ip6table_mangle')" ] && ip6t_m="eval #$ip6t_m"
 FWI=$(uci -q get firewall.passwall.path 2>/dev/null)
@@ -155,6 +162,28 @@ gen_laniplist_6() {
        cat $RULES_PATH/lanlist_ipv6 | tr -s '\n' | grep -v "^#"
 }
 
+get_wan_ip() {
+       local NET_IF
+       local NET_ADDR
+       
+       network_flush_cache
+       network_find_wan NET_IF
+       network_get_ipaddr NET_ADDR "${NET_IF}"
+       
+       echo $NET_ADDR
+}
+
+get_wan6_ip() {
+       local NET_IF
+       local NET_ADDR
+       
+       network_flush_cache
+       network_find_wan6 NET_IF
+       network_get_ipaddr6 NET_ADDR "${NET_IF}"
+       
+       echo $NET_ADDR
+}
+
 load_acl() {
        local items=$(uci show ${CONFIG} | grep "=acl_rule" | cut -d '.' -sf 2 | cut -d '=' -sf 1)
        [ -n "$items" ] && {
@@ -381,10 +410,14 @@ load_acl() {
                                                }
 
                                                if [ "$PROXY_IPV6" == "1" ]; then
-                                                       $ip6t_m -A PSW $(comment "$remarks") -p tcp ${_ipt_source} $(factor $tcp_redir_ports "-m multiport --dport") $(dst $IPSET_SHUNTLIST6) $(REDIRECT $tcp_port TPROXY) 2>/dev/null
-                                                       $ip6t_m -A PSW $(comment "$remarks") -p tcp ${_ipt_source} $(factor $tcp_redir_ports "-m multiport --dport") $(dst $IPSET_BLACKLIST6) $(REDIRECT $tcp_port TPROXY) 2>/dev/null
-                                                       $ip6t_m -A PSW $(comment "$remarks") -p tcp ${_ipt_source} $(factor $tcp_redir_ports "-m multiport --dport") $(get_redirect_ip6t $tcp_proxy_mode $tcp_port TPROXY) 2>/dev/null
-                                                       [ "$accept_icmpv6" = "1" ] && $ip6t_n -A PSW $(comment "$remarks") -p ipv6-icmp ${_ipt_source} $(get_redirect_ip6t $tcp_proxy_mode) 2>/dev/null
+                                                       $ip6t_m -A PSW $(comment "$remarks") -p tcp ${_ipt_source} $(factor $tcp_redir_ports "-m multiport --dport") $(dst $IPSET_SHUNTLIST6) $(REDIRECT $tcp_port TPROXY)
+                                                       $ip6t_m -A PSW $(comment "$remarks") -p tcp ${_ipt_source} $(factor $tcp_redir_ports "-m multiport --dport") $(dst $IPSET_BLACKLIST6) $(REDIRECT $tcp_port TPROXY)
+                                                       $ip6t_m -A PSW $(comment "$remarks") -p tcp ${_ipt_source} $(factor $tcp_redir_ports "-m multiport --dport") $(get_redirect_ip6t $tcp_proxy_mode $tcp_port TPROXY)
+                                                       [ "$accept_icmpv6" = "1" ] && {
+                                                               $ip6t_n -A PSW $(comment "$remarks") -p ipv6-icmp ${_ipt_source} $(dst $IPSET_SHUNTLIST6) $(REDIRECT)
+                                                               $ip6t_n -A PSW $(comment "$remarks") -p ipv6-icmp ${_ipt_source} $(dst $IPSET_BLACKLIST6) $(REDIRECT)
+                                                               $ip6t_n -A PSW $(comment "$remarks") -p ipv6-icmp ${_ipt_source} $(get_redirect_ip6t $tcp_proxy_mode)
+                                                       }
                                                fi
                                        else
                                                msg2="${msg}不代理TCP"
@@ -467,7 +500,11 @@ load_acl() {
                                $ip6t_m -A PSW $(comment "默认") -p tcp $(factor $TCP_REDIR_PORTS "-m multiport --dport") $(dst $IPSET_SHUNTLIST6) $(REDIRECT $TCP_REDIR_PORT TPROXY)
                                $ip6t_m -A PSW $(comment "默认") -p tcp $(factor $TCP_REDIR_PORTS "-m multiport --dport") $(dst $IPSET_BLACKLIST6) $(REDIRECT $TCP_REDIR_PORT TPROXY)
                                $ip6t_m -A PSW $(comment "默认") -p tcp $(factor $TCP_REDIR_PORTS "-m multiport --dport") $(get_redirect_ip6t $TCP_PROXY_MODE $TCP_REDIR_PORT TPROXY)
-                               [ "$accept_icmpv6" = "1" ] && $ip6t_n -A PSW $(comment "默认") -p ipv6-icmp $(get_redirect_ip6t $TCP_PROXY_MODE)
+                               [ "$accept_icmpv6" = "1" ] && {
+                                       $ip6t_n -A PSW $(comment "默认") -p ipv6-icmp $(dst $IPSET_SHUNTLIST6) $(REDIRECT)
+                                       $ip6t_n -A PSW $(comment "默认") -p ipv6-icmp $(dst $IPSET_BLACKLIST6) $(REDIRECT)
+                                       $ip6t_n -A PSW $(comment "默认") -p ipv6-icmp $(get_redirect_ip6t $TCP_PROXY_MODE)
+                               }
                        fi
 
                        echolog "${msg}"
@@ -763,6 +800,10 @@ add_firewall_rule() {
        $ipt_m -A PSW -m mark --mark 0xff -j RETURN
        $ipt_m -A PSW $(dst $IPSET_BLOCKLIST) -j DROP
        
+       WAN_IP=$(get_wan_ip)
+       [ ! -z "${WAN_IP}" ] && $ipt_m -A PSW $(comment "WAN_IP_RETURN") -d "${WAN_IP}" -j RETURN
+       unset WAN_IP
+       
        PR_INDEX=$((PR_INDEX + 1))
        $ipt_m -I PREROUTING $PR_INDEX -j PSW
        unset PR_INDEX
@@ -805,6 +846,10 @@ add_firewall_rule() {
        $ip6t_m -A PSW $(dst $IPSET_WHITELIST6) -j RETURN
        $ip6t_m -A PSW -m mark --mark 0xff -j RETURN
        $ip6t_m -A PSW $(dst $IPSET_BLOCKLIST6) -j DROP
+       
+       WAN6_IP=$(get_wan6_ip)
+       [ ! -z "${WAN6_IP}" ] && $ip6t_m -A PSW $(comment "WAN6_IP_RETURN") -d ${WAN6_IP} -j RETURN
+       unset WAN6_IP
 
        PR_INDEX=$((PR_INDEX + 1))
        $ip6t_m -I PREROUTING $PR_INDEX -j PSW
@@ -845,6 +890,8 @@ add_firewall_rule() {
 
                [ "$accept_icmpv6" = "1" ] && {
                        $ip6t_n -A OUTPUT -p ipv6-icmp -j PSW_OUTPUT
+                       $ip6t_n -A PSW_OUTPUT -p ipv6-icmp $(dst $IPSET_SHUNTLIST6) $(REDIRECT)
+                       $ip6t_n -A PSW_OUTPUT -p ipv6-icmp $(dst $IPSET_BLACKLIST6) $(REDIRECT)
                        $ip6t_n -A PSW_OUTPUT -p ipv6-icmp $(get_redirect_ip6t $TCP_PROXY_MODE)
                }
 
@@ -1048,47 +1095,67 @@ flush_include() {
 gen_include() {
        flush_include
        extract_rules() {
-               local _ipt="iptables"
-               [ "$1" == "6" ] && _ipt="ip6tables"
+               local _ipt="$ipt"
+               [ "$1" == "6" ] && _ipt="$ip6t"
 
                echo "*$2"
                ${_ipt}-save -t $2 | grep "PSW" | grep -v "\-j PSW$" | grep -v "socket \-j PSW_DIVERT$" | sed -e "s/^-A \(OUTPUT\|PREROUTING\)/-I \1 1/"
                echo 'COMMIT'
        }
        cat <<-EOF >> $FWI
-               iptables-save -c | grep -v "PSW" | iptables-restore -c
-               iptables-restore -n <<-EOT
+               $ipt-save -c | grep -v "PSW" | $ipt-restore -c
+               $ipt-restore -n <<-EOT
                $(extract_rules 4 nat)
                $(extract_rules 4 mangle)
                EOT
-               ip6tables-save -c | grep -v "PSW" | ip6tables-restore -c
-               ip6tables-restore -n <<-EOT
+               $ip6t-save -c | grep -v "PSW" | $ip6t-restore -c
+               $ip6t-restore -n <<-EOT
                $(extract_rules 6 nat)
                $(extract_rules 6 mangle)
                EOT
                
-               PR_INDEX=\$(/usr/share/passwall/iptables.sh RULE_LAST_INDEX "$ipt_n" PREROUTING prerouting_rule 1)
+               PR_INDEX=\$(${MY_PATH} RULE_LAST_INDEX "$ipt_n" PREROUTING prerouting_rule 1)
                PR_INDEX=\$((PR_INDEX + 1))
                [ "$accept_icmp" = "1" ] && $ipt_n -I PREROUTING \$PR_INDEX -p icmp -j PSW
                [ -z "${is_tproxy}" ] && $ipt_n -I PREROUTING \$PR_INDEX -p tcp -j PSW
                
-               PR_INDEX=\$(/usr/share/passwall/iptables.sh RULE_LAST_INDEX "$ipt_m" PREROUTING mwan3 1)
+               PR_INDEX=\$(${MY_PATH} RULE_LAST_INDEX "$ipt_m" PREROUTING mwan3 1)
                $ipt_m -I PREROUTING \$PR_INDEX -p tcp -m socket -j PSW_DIVERT
                
                PR_INDEX=\$((PR_INDEX + 1))
                $ipt_m -I PREROUTING \$PR_INDEX -j PSW
                
+               PR_INDEX=\$(${MY_PATH} RULE_LAST_INDEX "$ipt_m" PSW WAN_IP_RETURN -1)
+               if [ \$PR_INDEX -ge 0 ]; then
+                       WAN_IP=\$(${MY_PATH} get_wan_ip)
+                       [ ! -z "\${WAN_IP}" ] && $ipt_m -R PSW \$PR_INDEX $(comment "WAN_IP_RETURN") -d "\${WAN_IP}" -j RETURN
+               fi
+               
                [ "$accept_icmpv6" = "1" ] && $ip6t_n -A PREROUTING -p ipv6-icmp -j PSW
                
-               PR_INDEX=\$(/usr/share/passwall/iptables.sh RULE_LAST_INDEX "$ip6t_m" PREROUTING mwan3 1)
+               PR_INDEX=\$(${MY_PATH} RULE_LAST_INDEX "$ip6t_m" PREROUTING mwan3 1)
                $ip6t_m -I PREROUTING \$PR_INDEX -p tcp -m socket -j PSW_DIVERT
                
                PR_INDEX=\$((PR_INDEX + 1))
                $ip6t_m -I PREROUTING \$PR_INDEX -j PSW
+               
+               PR_INDEX=\$(${MY_PATH} RULE_LAST_INDEX "$ip6t_m" PSW WAN6_IP_RETURN -1)
+               if [ \$PR_INDEX -ge 0 ]; then
+                       WAN6_IP=\$(${MY_PATH} get_wan6_ip)
+                       [ ! -z "\${WAN6_IP}" ] && $ip6t_m -R PSW \$PR_INDEX $(comment "WAN6_IP_RETURN") -d "\${WAN6_IP}" -j RETURN
+               fi
        EOF
        return 0
 }
 
+get_ipt_bin() {
+       echo $ipt
+}
+
+get_ip6t_bin() {
+       echo $ip6t
+}
+
 start() {
        add_firewall_rule
        gen_include
@@ -1107,6 +1174,18 @@ RULE_LAST_INDEX)
 flush_ipset)
        flush_ipset
        ;;
+get_ipt_bin)
+       get_ipt_bin
+       ;;
+get_ip6t_bin)
+       get_ip6t_bin
+       ;;
+get_wan_ip)
+       get_wan_ip
+       ;;
+get_wan6_ip)
+       get_wan6_ip
+       ;;
 stop)
        stop
        ;;