|
|
@@ -45,7 +45,9 @@ FORCE_UPDATE=0
|
|
|
CHECK_STATUS=0
|
|
|
RESTORE_RULES=0
|
|
|
FLUSH_RULES=0
|
|
|
-CLEANUP_PERSISTENCE=0
|
|
|
+CLEANUP_PERSISTENCE=0
|
|
|
+# ASCII code for SSRP.Use whatever,just not the same.
|
|
|
+FWMARK="0x53535250"
|
|
|
|
|
|
if [ "$USE_NFT" = "1" ]; then
|
|
|
# NFTables persistence directory
|
|
|
@@ -263,11 +265,11 @@ flush_nftables() {
|
|
|
fi
|
|
|
|
|
|
# Delete policy routing mark rules
|
|
|
- if ip rule show | grep -Eq "fwmark 0x0*1.*lookup 100"; then
|
|
|
- ip rule del fwmark 0x01/0x01 table 100 2>/dev/null
|
|
|
+ if ip rule show | grep -Eq "fwmark ${FWMARK}.*lookup 999"; then
|
|
|
+ ip rule del fwmark ${FWMARK} table 999 2>/dev/null
|
|
|
fi
|
|
|
- if ip route show table 100 | grep -Eq "^local.*dev lo"; then
|
|
|
- ip route del local 0.0.0.0/0 dev lo table 100 2>/dev/null
|
|
|
+ if ip route show table 999 | grep -Eq "^local.*dev lo"; then
|
|
|
+ ip route del local 0.0.0.0/0 dev lo table 999 2>/dev/null
|
|
|
fi
|
|
|
|
|
|
# Optional: force delete all ss_spec related sets (even if table was accidentally deleted)
|
|
|
@@ -301,11 +303,11 @@ flush_iptables_legacy() {
|
|
|
}
|
|
|
flush_iptables nat
|
|
|
flush_iptables mangle
|
|
|
- if ip rule show | grep -Eq "fwmark 0x0*1.*lookup 100"; then
|
|
|
- ip rule del fwmark 0x01/0x01 table 100 2>/dev/null
|
|
|
+ if ip rule show | grep -Eq "fwmark ${FWMARK}.*lookup 999"; then
|
|
|
+ ip rule del fwmark ${FWMARK} table 999 2>/dev/null
|
|
|
fi
|
|
|
- if ip route show table 100 | grep -Eq "^local.*dev lo"; then
|
|
|
- ip route del local 0.0.0.0/0 dev lo table 100 2>/dev/null
|
|
|
+ if ip route show table 999 | grep -Eq "^local.*dev lo"; then
|
|
|
+ ip route del local 0.0.0.0/0 dev lo table 999 2>/dev/null
|
|
|
fi
|
|
|
for setname in ss_spec_lan_ac ss_spec_wan_ac ssr_gen_router \
|
|
|
china fplan bplan gmlan oversea whitelist blacklist netflix gfwlist music; do
|
|
|
@@ -793,25 +795,43 @@ ac_rule_iptables() {
|
|
|
if [ -z "$TPROXY" ]; then
|
|
|
# Add UDP 443 block rule
|
|
|
if [ -z "$Interface" ]; then
|
|
|
- $ipt -I PREROUTING 1 -p udp $EXT_ARGS $MATCH_SET --dport 443 -j DROP -m comment --comment "$TAG"
|
|
|
+ # Global rules
|
|
|
+ if [ -n "$MATCH_SET" ]; then
|
|
|
+ $ipt -I PREROUTING 1 -p udp $EXT_ARGS $MATCH_SET --dport 443 -j DROP -m comment --comment "$TAG"
|
|
|
+ else
|
|
|
+ $ipt -I PREROUTING 1 -p udp $EXT_ARGS --dport 443 -j DROP -m comment --comment "$TAG"
|
|
|
+ fi
|
|
|
else
|
|
|
for name in $Interface; do
|
|
|
local IFNAME=$(uci -P /var/state get network."$name".ifname 2>/dev/null)
|
|
|
[ -z "$IFNAME" ] && IFNAME=$(uci -P /var/state get network."$name".device 2>/dev/null)
|
|
|
if [ -n "$IFNAME" ]; then
|
|
|
- $ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS $MATCH_SET --dport 443 -j DROP -m comment --comment "$TAG"
|
|
|
+ if [ -n "$MATCH_SET" ]; then
|
|
|
+ $ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS $MATCH_SET --dport 443 -j DROP -m comment --comment "$TAG"
|
|
|
+ else
|
|
|
+ $ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS --dport 443 -j DROP -m comment --comment "$TAG"
|
|
|
+ fi
|
|
|
fi
|
|
|
done
|
|
|
fi
|
|
|
fi
|
|
|
if [ -z "$Interface" ]; then
|
|
|
- $IPT -I PREROUTING 1 -p tcp $EXT_ARGS $MATCH_SET -m comment --comment "$TAG" -j SS_SPEC_WAN_AC
|
|
|
+ # Global rules
|
|
|
+ if [ -n "$MATCH_SET" ]; then
|
|
|
+ $IPT -I PREROUTING 1 -p tcp $EXT_ARGS $MATCH_SET -m comment --comment "$TAG" -j SS_SPEC_WAN_AC
|
|
|
+ else
|
|
|
+ $IPT -I PREROUTING 1 -p tcp $EXT_ARGS -m comment --comment "$TAG" -j SS_SPEC_WAN_AC
|
|
|
+ fi
|
|
|
else
|
|
|
for name in $Interface; do
|
|
|
local IFNAME=$(uci -P /var/state get network."$name".ifname 2>/dev/null)
|
|
|
[ -z "$IFNAME" ] && IFNAME=$(uci -P /var/state get network."$name".device 2>/dev/null)
|
|
|
if [ -n "$IFNAME" ]; then
|
|
|
- $IPT -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p tcp $EXT_ARGS $MATCH_SET -m comment --comment "$TAG" -j SS_SPEC_WAN_AC
|
|
|
+ if [ -n "$MATCH_SET" ]; then
|
|
|
+ $IPT -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p tcp $EXT_ARGS $MATCH_SET -m comment --comment "$TAG" -j SS_SPEC_WAN_AC
|
|
|
+ else
|
|
|
+ $IPT -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p tcp $EXT_ARGS -m comment --comment "$TAG" -j SS_SPEC_WAN_AC
|
|
|
+ fi
|
|
|
fi
|
|
|
done
|
|
|
fi
|
|
|
@@ -847,12 +867,12 @@ tp_rule() {
|
|
|
|
|
|
tp_rule_nft() {
|
|
|
# set up routing table for tproxy
|
|
|
- if ! ip rule show | grep -Eq "fwmark 0x0*1.*lookup 100"; then
|
|
|
- ip rule add fwmark 0x01/0x01 table 100 2>/dev/null
|
|
|
+ if ! ip rule show | grep -Eq "fwmark ${FWMARK}.*lookup 999"; then
|
|
|
+ ip rule add fwmark ${FWMARK} table 999 priority 999 2>/dev/null
|
|
|
fi
|
|
|
|
|
|
- if ! ip route show table 100 | grep -Eq "^local.*dev lo"; then
|
|
|
- ip route add local 0.0.0.0/0 dev lo table 100 2>/dev/null
|
|
|
+ if ! ip route show table 999 | grep -Eq "^local.*dev lo"; then
|
|
|
+ ip route add local 0.0.0.0/0 dev lo table 999 2>/dev/null
|
|
|
fi
|
|
|
|
|
|
# create mangle table and tproxy chain
|
|
|
@@ -954,7 +974,7 @@ tp_rule_nft() {
|
|
|
|
|
|
# access control and tproxy rules
|
|
|
$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip saddr @bplan return 2>/dev/null
|
|
|
- $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip saddr @fplan counter tproxy ip to :"$LOCAL_PORT" meta mark set 0x01 2>/dev/null
|
|
|
+ $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip saddr @fplan counter tproxy ip to :"$LOCAL_PORT" meta mark set ${FWMARK} 2>/dev/null
|
|
|
|
|
|
# Handle different run modes for nftables
|
|
|
case "$RUNMODE" in
|
|
|
@@ -973,8 +993,8 @@ tp_rule_nft() {
|
|
|
$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip daddr @china return 2>/dev/null
|
|
|
$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp udp dport 80 counter drop comment "\"$TAG\"" 2>/dev/null
|
|
|
$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp udp dport 443 counter drop comment "\"$TAG\"" 2>/dev/null
|
|
|
- $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip saddr @gmlan ip daddr != @china counter tproxy ip to :"$LOCAL_PORT" meta mark set 0x01 2>/dev/null
|
|
|
- $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip daddr != @ss_spec_wan_ac counter tproxy ip to :"$LOCAL_PORT" meta mark set 0x01 2>/dev/null
|
|
|
+ $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip saddr @gmlan ip daddr != @china counter tproxy ip to :"$LOCAL_PORT" meta mark set ${FWMARK} 2>/dev/null
|
|
|
+ $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip daddr != @ss_spec_wan_ac counter tproxy ip to :"$LOCAL_PORT" meta mark set ${FWMARK} 2>/dev/null
|
|
|
;;
|
|
|
gfw)
|
|
|
if ! $NFT list set ip ss_spec_mangle gfwlist >/dev/null 2>&1; then
|
|
|
@@ -983,19 +1003,19 @@ tp_rule_nft() {
|
|
|
$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip daddr @china return 2>/dev/null
|
|
|
$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp udp dport 80 counter drop comment "\"$TAG\"" 2>/dev/null
|
|
|
$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp udp dport 443 counter drop comment "\"$TAG\"" 2>/dev/null
|
|
|
- $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip daddr @gfwlist counter tproxy ip to :"$LOCAL_PORT" meta mark set 0x01 2>/dev/null
|
|
|
- $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip saddr @gmlan ip daddr != @china counter tproxy ip to :"$LOCAL_PORT" meta mark set 0x01 2>/dev/null
|
|
|
+ $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip daddr @gfwlist counter tproxy ip to :"$LOCAL_PORT" meta mark set ${FWMARK} 2>/dev/null
|
|
|
+ $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip saddr @gmlan ip daddr != @china counter tproxy ip to :"$LOCAL_PORT" meta mark set ${FWMARK} 2>/dev/null
|
|
|
;;
|
|
|
oversea)
|
|
|
if ! $NFT list set ip ss_spec_mangle oversea >/dev/null 2>&1; then
|
|
|
$NFT add set ip ss_spec_mangle oversea '{ type ipv4_addr; flags interval; auto-merge; }' 2>/dev/null
|
|
|
fi
|
|
|
- $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip saddr @oversea counter tproxy ip to :"$LOCAL_PORT" meta mark set 0x01 2>/dev/null
|
|
|
- $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip daddr @china counter tproxy ip to :"$LOCAL_PORT" meta mark set 0x01 2>/dev/null
|
|
|
- $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip saddr @gmlan counter tproxy ip to :"$LOCAL_PORT" meta mark set 0x01 2>/dev/null
|
|
|
+ $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip saddr @oversea counter tproxy ip to :"$LOCAL_PORT" meta mark set ${FWMARK} 2>/dev/null
|
|
|
+ $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip daddr @china counter tproxy ip to :"$LOCAL_PORT" meta mark set ${FWMARK} 2>/dev/null
|
|
|
+ $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip saddr @gmlan counter tproxy ip to :"$LOCAL_PORT" meta mark set ${FWMARK} 2>/dev/null
|
|
|
;;
|
|
|
all)
|
|
|
- $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS counter tproxy ip to :"$LOCAL_PORT" meta mark set 0x01 2>/dev/null
|
|
|
+ $NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS counter tproxy ip to :"$LOCAL_PORT" meta mark set ${FWMARK} 2>/dev/null
|
|
|
;;
|
|
|
esac
|
|
|
|
|
|
@@ -1032,12 +1052,12 @@ tp_rule_nft() {
|
|
|
|
|
|
tp_rule_iptables() {
|
|
|
# set up routing table for tproxy
|
|
|
- if ! ip rule show | grep -Eq "fwmark 0x0*1.*lookup 100"; then
|
|
|
- ip rule add fwmark 0x01/0x01 table 100 2>/dev/null
|
|
|
+ if ! ip rule show | grep -Eq "fwmark ${FWMARK}.*lookup 999"; then
|
|
|
+ ip rule add fwmark ${FWMARK} table 999 priority 999 2>/dev/null
|
|
|
fi
|
|
|
|
|
|
- if ! ip route show table 100 | grep -Eq "^local.*dev lo"; then
|
|
|
- ip route add local 0.0.0.0/0 dev lo table 100 2>/dev/null
|
|
|
+ if ! ip route show table 999 | grep -Eq "^local.*dev lo"; then
|
|
|
+ ip route add local 0.0.0.0/0 dev lo table 999 2>/dev/null
|
|
|
fi
|
|
|
$ipt -N SS_SPEC_TPROXY 2>/dev/null
|
|
|
$ipt -F SS_SPEC_TPROXY
|
|
|
@@ -1048,10 +1068,10 @@ tp_rule_iptables() {
|
|
|
if [ -n "$LAN_AC_IP" ]; then
|
|
|
case "${LAN_AC_IP%${LAN_AC_IP#?}}" in
|
|
|
w | W)
|
|
|
- MATCH_SET_UDP="-m set --match-set ss_spec_lan_ac src"
|
|
|
+ MATCH_SET="-m set --match-set ss_spec_lan_ac src"
|
|
|
;;
|
|
|
b | B)
|
|
|
- MATCH_SET_UDP="-m set ! --match-set ss_spec_lan_ac src"
|
|
|
+ MATCH_SET="-m set ! --match-set ss_spec_lan_ac src"
|
|
|
;;
|
|
|
*)
|
|
|
loger 3 "Bad argument \`-a $LAN_AC_IP\`."
|
|
|
@@ -1078,7 +1098,7 @@ tp_rule_iptables() {
|
|
|
done < "$xhttp_ip"
|
|
|
fi
|
|
|
$ipt -A SS_SPEC_TPROXY -p udp -m set --match-set bplan src -j RETURN
|
|
|
- $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set fplan src -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01
|
|
|
+ $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set fplan src -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark ${FWMARK}
|
|
|
case "$RUNMODE" in
|
|
|
router)
|
|
|
ipset -! -R <<-EOF || return 1
|
|
|
@@ -1089,32 +1109,43 @@ tp_rule_iptables() {
|
|
|
$ipt -A SS_SPEC_TPROXY -p udp -m set --match-set china dst -j RETURN
|
|
|
$ipt -A SS_SPEC_TPROXY -p udp --dport 80 -j DROP
|
|
|
$ipt -A SS_SPEC_TPROXY -p udp --dport 443 -j DROP
|
|
|
- $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set ! --match-set china dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01
|
|
|
- $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set ! --match-set ss_spec_wan_ac dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01
|
|
|
+ $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set ! --match-set china dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark ${FWMARK}
|
|
|
+ $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set ! --match-set ss_spec_wan_ac dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark ${FWMARK}
|
|
|
;;
|
|
|
gfw)
|
|
|
$ipt -A SS_SPEC_TPROXY -p udp -m set --match-set china dst -j RETURN
|
|
|
$ipt -A SS_SPEC_TPROXY -p udp --dport 80 -j DROP
|
|
|
$ipt -A SS_SPEC_TPROXY -p udp --dport 443 -j DROP
|
|
|
- $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set gfwlist dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01
|
|
|
- $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set ! --match-set china dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01
|
|
|
+ $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set gfwlist dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark ${FWMARK}
|
|
|
+ $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set ! --match-set china dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark ${FWMARK}
|
|
|
;;
|
|
|
oversea)
|
|
|
- $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set oversea src -m dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01
|
|
|
- $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01
|
|
|
- $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set china dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01
|
|
|
+ $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set oversea src -m dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark ${FWMARK}
|
|
|
+ $ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark ${FWMARK}
|
|
|
+ $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set china dst -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark ${FWMARK}
|
|
|
;;
|
|
|
all)
|
|
|
- $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark 0x01/0x01
|
|
|
+ $ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -j TPROXY --on-port "$LOCAL_PORT" --tproxy-mark ${FWMARK}
|
|
|
;;
|
|
|
esac
|
|
|
if [ -z "$Interface" ]; then
|
|
|
- $ipt -I PREROUTING 1 -p udp $EXT_ARGS $MATCH_SET -m comment --comment "$TAG" -j SS_SPEC_TPROXY
|
|
|
+ # Global rules
|
|
|
+ if [ -n "$MATCH_SET" ]; then
|
|
|
+ $ipt -I PREROUTING 1 -p udp $EXT_ARGS $MATCH_SET -m comment --comment "$TAG" -j SS_SPEC_TPROXY
|
|
|
+ else
|
|
|
+ $ipt -I PREROUTING 1 -p udp $EXT_ARGS -m comment --comment "$TAG" -j SS_SPEC_TPROXY
|
|
|
+ fi
|
|
|
else
|
|
|
for name in $Interface; do
|
|
|
local IFNAME=$(uci -P /var/state get network."$name".ifname 2>/dev/null)
|
|
|
[ -z "$IFNAME" ] && IFNAME=$(uci -P /var/state get network."$name".device 2>/dev/null)
|
|
|
- [ -n "$IFNAME" ] && $ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS $MATCH_SET -m comment --comment "$TAG" -j SS_SPEC_TPROXY
|
|
|
+ if [ -n "$IFNAME" ]; then
|
|
|
+ if [ -n "$MATCH_SET" ]; then
|
|
|
+ $ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS $MATCH_SET -m comment --comment "$TAG" -j SS_SPEC_TPROXY
|
|
|
+ else
|
|
|
+ $ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS -m comment --comment "$TAG" -j SS_SPEC_TPROXY
|
|
|
+ fi
|
|
|
+ fi
|
|
|
done
|
|
|
fi
|
|
|
return $?
|