Skip to content

Commit

Permalink
Update stun_bt_natmap.sh
Browse files Browse the repository at this point in the history
  • Loading branch information
Oniicyan authored Jan 9, 2025
1 parent 37f59e3 commit 0d67a66
Showing 1 changed file with 20 additions and 23 deletions.
43 changes: 20 additions & 23 deletions stun_bt_natmap.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ LANPORT=$4
L4PROTO=$5
OWNADDR=$6

OWNNAME=$(echo stun_bt_$APPADDR:$APPPORT$([ -n "$IFNAME" ] && echo @$IFNAME) | sed 's/[[:punct:]]/_/g')
OWNNAME=$(echo stun_bt_$APPADDR:$APPPORT$([ $IFNAME ] && echo @$IFNAME) | sed 's/[[:punct:]]/_/g')
RELEASE=$(grep ^ID= /etc/os-release | awk -F '=' '{print$2}' | tr -d \")
STUNIFO=/tmp/$OWNNAME.info

Expand All @@ -26,26 +26,26 @@ case $RELEASE in
esac
fi
done
[ $(uci -q get natmap.$SECTTCP) ] || sed -i '/'tcp'/d' $STUNIFO
[ $(uci -q get natmap.$SECTUDP) ] || sed -i '/'udp'/d' $STUNIFO
[ $(uci -q get natmap.$SECTTCP) ] || sed '/tcp/d' -i $STUNIFO
[ $(uci -q get natmap.$SECTUDP) ] || sed '/udp/d' -i $STUNIFO
;;
*)
ps aux | grep $0 | grep "\-h" || sed -i '/'tcp'/d' $STUNIFO
ps aux | grep $0 | grep "\-u" || sed -i '/'udp'/d' $STUNIFO
ps aux | grep $0 | grep "\-h" || sed '/tcp/d' -i $STUNIFO
ps aux | grep $0 | grep "\-u" || sed '/udp/d' -i $STUNIFO
;;
esac

# 若公网端口未发生变化,则退出脚本
OLDPORT=$(grep $L4PROTO $STUNIFO | awk -F ':| ' '{print$3}')
if [ $WANPORT = "$OLDPORT" ]; then
logger -st stun_bt The external port $WANPORT/$L4PROTO$([ -n "$IFNAME" ] && echo @$IFNAME) has not changed.
logger -st stun_bt The external port $WANPORT/$L4PROTO$([ $IFNAME ] && echo @$IFNAME) has not changed.
nft list table ip STUN 2>&1 | grep $(printf '0x%x' $WANPORT) >/dev/null && exit 0
fi

# 更新保存穿透信息
sed -i '/'$L4PROTO'/d' $STUNIFO 2>/dev/null
echo $L4PROTO $WANADDR:$WANPORT '->' $([ -n "$LANPORT" ] && echo $OWNADDR:$LANPORT '->') $APPADDR:$APPPORT $(date +%s) >>$STUNIFO
echo $(date) $L4PROTO $WANADDR:$WANPORT '->' $([ -n "$LANPORT" ] && echo $OWNADDR:$LANPORT '->') $APPADDR:$APPPORT >>/tmp/$OWNNAME.log
sed '/'$L4PROTO'/d' -i $STUNIFO
echo $L4PROTO $WANADDR:$WANPORT '->' $([ $LANPORT ] && echo $OWNADDR:$LANPORT '->') $APPADDR:$APPPORT $(date +%s) >>$STUNIFO
echo $(date) $L4PROTO $WANADDR:$WANPORT '->' $([ $LANPORT ] && echo $OWNADDR:$LANPORT '->') $APPADDR:$APPPORT >>/tmp/$OWNNAME.log

# 防止脚本同时操作 nftables 导致冲突
[ $L4PROTO = udp ] && sleep 1 && \
Expand All @@ -57,20 +57,17 @@ nft add chain ip STUN BTTR { type filter hook postrouting priority filter \; }
nft flush chain ip STUN BTTR
WANTCP=$(grep tcp $STUNIFO | awk -F ':| ' '{print$3}')
WANUDP=$(grep udp $STUNIFO | awk -F ':| ' '{print$3}')
if [ -n "$IFNAME" ]; then
IIFNAME="iifname $IFNAME"
OIFNAME="oifname $IFNAME"
fi
[ $IFNAME ] && OIFNAME='oifname '$IFNAME''

# HTTP Tracker
STRAPP=0x706f72743d$(printf $APPPORT | xxd -p)
STRTCP=0x3d$(printf 30$(printf "$WANTCP" | xxd -p) | tail -c 10)
STRUDP=0x3d$(printf 30$(printf "$WANUDP" | xxd -p) | tail -c 10)
if [ -n "$WANTCP" ] && [ -n "$WANUDP" ]; then
SETSTR="numgen inc mod 2 map { 0 : $STRTCP, 1 : $STRUDP }"
elif [ -n "$WANTCP" ]; then
if [ $WANTCP ] && [ $WANUDP ]; then
SETSTR='numgen inc mod 2 map { 0 : '$STRTCP', 1 : '$STRUDP' }'
elif [ $WANTCP ]; then
SETSTR=$STRTCP
elif [ -n "$WANUDP" ]; then
elif [ $WANUDP ]; then
SETSTR=$STRUDP
fi
nft add set ip STUN BTTR_HTTP "{ type ipv4_addr . inet_service; flags dynamic; timeout 1h; }"
Expand All @@ -85,11 +82,11 @@ for OFFSET in $(seq 768 16 1056); do
done

# UDP Tracker
if [ -n "$WANTCP" ] && [ -n "$WANUDP" ]; then
SETNUM="numgen inc mod 2 map { 0 : $WANTCP, 1 : $WANUDP }"
elif [ -n "$WANTCP" ]; then
if [ $WANTCP ] && [ $WANUDP ]; then
SETNUM='numgen inc mod 2 map { 0 : '$WANTCP', 1 : '$WANUDP' }'
elif [ $WANTCP ]; then
SETNUM=$WANTCP
elif [ -n "$WANUDP" ]; then
elif [ $WANUDP ]; then
SETNUM=$WANUDP
fi
nft add set ip STUN BTTR_UDP "{ type ipv4_addr . inet_service; flags dynamic; timeout 1h; }"
Expand All @@ -100,7 +97,7 @@ nft delete rule ip STUN BTTR_UDP handle $(nft -a list chain ip STUN BTTR_UDP 2>/
nft insert rule ip STUN BTTR_UDP $OIFNAME ip saddr $APPADDR @ih,64,32 1 @ih,768,16 $APPPORT @ih,768,16 set $SETNUM update @BTTR_UDP { ip daddr . udp dport } counter accept comment "$OWNNAME"

# Tracker 流量需绕过软件加速
# 仅检测 OpenWrt fw4 的软件加速,其他加速请自行解决
# 仅检测 OpenWrt firewall4 的软件加速,其他加速请自行解决
CTMARK=0x$(echo $APPADDR | awk -F . '{print$NF}')$APPPORT
if uci show firewall 2>&1 | grep "flow_offloading='1'" >/dev/null; then
if ! nft list chain ip STUN BTTR_NOFT 2>&1 | grep $OWNNAME >/dev/null; then
Expand Down Expand Up @@ -132,4 +129,4 @@ else
nft list chain inet fw4 forward | grep _noft >/dev/null && fw4 -q reload >/dev/null
fi

logger -st stun_bt $WANADDR:$WANPORT/$L4PROTO$([ -n "$IFNAME" ] && echo @$IFNAME) to $APPADDR:$APPPORT
logger -st stun_bt $WANADDR:$WANPORT/$L4PROTO$([ $IFNAME ] && echo @$IFNAME) to $APPADDR:$APPPORT

0 comments on commit 0d67a66

Please sign in to comment.