diff --git a/easytier-contrib/easytier-magisk/hotspot_iprule.sh b/easytier-contrib/easytier-magisk/hotspot_iprule.sh index 03b1e646..568e3a48 100644 --- a/easytier-contrib/easytier-magisk/hotspot_iprule.sh +++ b/easytier-contrib/easytier-magisk/hotspot_iprule.sh @@ -22,7 +22,10 @@ get_tun_iface() { ip link | awk -F': ' '/ tun[[:alnum:]]+/ {print $2; exit}' } get_hot_iface() { - ip link | awk -F': ' '/(^| )(swlan[[:alnum:]_]*|softap[[:alnum:]_]*|ap[[:alnum:]_]*)\:/ {print $2; exit}' | cut -d'@' -f1 | head -n1 + ip link | awk -F': ' '/(^| )(swlan[[:alnum:]_]*|softap[[:alnum:]_]*|p2p-wlan[[:alnum:]_]*|ap[[:alnum:]_]*)\:/ {print $2; exit}' | cut -d'@' -f1 | head -n1 +} +get_usb_iface() { + ip link | awk -F': ' '/(^| )(usb[[:alnum:]_]*|rndis[[:alnum:]_]*|eth[[:alnum:]_]*)\:/ {print $2; exit}' | cut -d'@' -f1 | head -n1 } get_hot_cidr() { ip -4 addr show dev "$1" | awk '/inet /{print $2; exit}' @@ -33,10 +36,12 @@ set_nat_rules() { ET_IFACE=$(get_et_iface) [ -z "$ET_IFACE" ] && ET_IFACE="$(get_tun_iface)" HOT_IFACE=$(get_hot_iface) + USB_IFACE=$(get_usb_iface) HOT_CIDR=$(get_hot_cidr "$HOT_IFACE") + USB_CIDR=$(get_hot_cidr "$USB_IFACE") # 如果热点关闭就删除自定义链 - [ -n "$ET_IFACE" ] && [ -n "$HOT_CIDR" ] || return 1 + [ -n "$ET_IFACE" ] && { [ -n "$HOT_CIDR" ] || [ -n "$USB_CIDR" ]; } || return 1 # 创建自定义链(如不存在) iptables -t nat -N ET_NAT 2>/dev/null @@ -49,13 +54,22 @@ set_nat_rules() { iptables -I FORWARD 1 -j ET_FWD # 添加规则 - iptables -t nat -A ET_NAT -s "$HOT_CIDR" -o "$ET_IFACE" -j MASQUERADE - iptables -A ET_FWD -i "$HOT_IFACE" -o "$ET_IFACE" \ - -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT - iptables -A ET_FWD -i "$ET_IFACE" -o "$HOT_IFACE" \ - -m state --state ESTABLISHED,RELATED -j ACCEPT - - echo "[ET-NAT] Rules applied: $HOT_IFACE $HOT_CIDR ↔ $ET_IFACE" >> "$LOG_FILE" + if [ -n "$HOT_CIDR" ]; then + iptables -t nat -A ET_NAT -s "$HOT_CIDR" -o "$ET_IFACE" -j MASQUERADE + iptables -A ET_FWD -i "$HOT_IFACE" -o "$ET_IFACE" \ + -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT + iptables -A ET_FWD -i "$ET_IFACE" -o "$HOT_IFACE" \ + -m state --state ESTABLISHED,RELATED -j ACCEPT + echo "[ET-NAT] Rules applied: $HOT_IFACE $HOT_CIDR ↔ $ET_IFACE" >> "$LOG_FILE" + fi + if [ -n "$USB_CIDR" ]; then + iptables -t nat -A ET_NAT -s "$USB_CIDR" -o "$ET_IFACE" -j MASQUERADE + iptables -A ET_FWD -i "$USB_IFACE" -o "$ET_IFACE" \ + -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT + iptables -A ET_FWD -i "$ET_IFACE" -o "$USB_IFACE" \ + -m state --state ESTABLISHED,RELATED -j ACCEPT + echo "[ET-NAT] Rules applied: $USB_IFACE $USB_CIDR ↔ $ET_IFACE" >> "$LOG_FILE" + fi } flush_rules() {