mirror of
https://github.com/EasyTier/EasyTier.git
synced 2025-11-01 12:32:40 +08:00
增加magisk模块功能:热点局域网转发。 (#1252)
* 增加magisk模块功能:热点局域网转发。该功能由后台监控,热点打开,可自动增加转发规则。在三星fold3测试通过。 * 增加了默认tun名称的识别 1.防止配置文件没有配置dev_name的情况,按默认名称tun+在网络设备中查找; 2.一旦热点关闭,自动删除规则。 * 考虑到主程序已可通过模块开关来重新加载,将操作按钮用于转发开关。此外对状态栏信息进行了一些修饰,加入了转发状态的显示。
This commit is contained in:
@@ -1,14 +1,43 @@
|
|||||||
#!/data/adb/magisk/busybox sh
|
#!/data/adb/magisk/busybox sh
|
||||||
MODDIR=${0%/*}
|
MODDIR=${0%/*}
|
||||||
|
MODULE_PROP="${MODDIR}/module.prop"
|
||||||
|
|
||||||
# 查找 easytier-core 进程的 PID
|
ET_STATUS=""
|
||||||
PID=$(pgrep easytier-core)
|
REDIR_STATUS=""
|
||||||
|
# 更新module.prop文件中的description
|
||||||
|
update_module_description() {
|
||||||
|
local status_message=$1
|
||||||
|
sed -i "/^description=/c\description=[状态]${status_message}" ${MODULE_PROP}
|
||||||
|
}
|
||||||
|
|
||||||
# 检查是否找到了进程
|
|
||||||
if [ -z "$PID" ]; then
|
if [ -f "${MODDIR}/disable" ]; then
|
||||||
echo "easytier-core 进程未找到"
|
ET_STATUS="已关闭"
|
||||||
else
|
elif pgrep -f 'easytier-core' >/dev/null; then
|
||||||
# 结束进程
|
if [ -f "${MODDIR}/config/command_args"]; then
|
||||||
kill $PID
|
ET_STATUS="主程序已开启(启动参数模式)"
|
||||||
echo "已结束 easytier-core 进程 (PID: $PID)"
|
else
|
||||||
|
ET_STATUS="主程序已开启(配置文件模式)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
#ET_STATUS不存在说明开启模块未正常运行,不修改状态
|
||||||
|
if [ -n "$ET_STATUS" ]; then
|
||||||
|
if [ -f "${MODDIR}/enable_IP_rule" ]; then
|
||||||
|
rm -f "${MODDIR}/enable_IP_rule"
|
||||||
|
${MODDIR}/hotspot_iprule.sh del
|
||||||
|
REDIR_STATUS="转发已禁用"
|
||||||
|
echo "热点子网转发已禁用"
|
||||||
|
echo "[ET-NAT] IP rule disabled." >> "${MODDIR}/log.log"
|
||||||
|
else
|
||||||
|
touch "${MODDIR}/enable_IP_rule"
|
||||||
|
${MODDIR}/hotspot_iprule.sh del
|
||||||
|
${MODDIR}/hotspot_iprule.sh add_once
|
||||||
|
REDIR_STATUS="转发已激活"
|
||||||
|
echo "热点子网转发已激活,热点开启后将自动将热点加入转发网络(要求已配置本地网络cidr=参数)。转发规则将随着热点开关而自动开关。该状态将保持到转发被禁用为止。"
|
||||||
|
echo "[ET-NAT] IP rule enabled." >> "${MODDIR}/log.log"
|
||||||
|
fi
|
||||||
|
update_module_description "${ET_STATUS} | ${REDIR_STATUS}"
|
||||||
|
else
|
||||||
|
echo "主程序未正常启动,请先检查配置文件"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -4,5 +4,6 @@ ui_print '当前系统版本为' + $API
|
|||||||
ui_print '安装目录为: /data/adb/modules/easytier_magisk'
|
ui_print '安装目录为: /data/adb/modules/easytier_magisk'
|
||||||
ui_print '配置文件位置: /data/adb/modules/easytier_magisk/config/config.toml'
|
ui_print '配置文件位置: /data/adb/modules/easytier_magisk/config/config.toml'
|
||||||
ui_print '如果需要自定义启动参数,可将 /data/adb/modules/easytier_magisk/config/command_args_sample 重命名为 command_args,并修改其中内容,使用自定义启动参数时会忽略配置文件'
|
ui_print '如果需要自定义启动参数,可将 /data/adb/modules/easytier_magisk/config/command_args_sample 重命名为 command_args,并修改其中内容,使用自定义启动参数时会忽略配置文件'
|
||||||
ui_print '修改后配置文件后在magisk app点击操作按钮即可生效'
|
ui_print '修改配置文件后在magisk app禁用应用再启动即可生效'
|
||||||
|
ui_print '点击操作按钮可启动/关闭热点子网转发,配合easytier的子网代理功能实现手机热点访问easytier网络'
|
||||||
ui_print '记得重启'
|
ui_print '记得重启'
|
||||||
@@ -5,6 +5,7 @@ CONFIG_FILE="${MODDIR}/config/config.toml"
|
|||||||
LOG_FILE="${MODDIR}/log.log"
|
LOG_FILE="${MODDIR}/log.log"
|
||||||
MODULE_PROP="${MODDIR}/module.prop"
|
MODULE_PROP="${MODDIR}/module.prop"
|
||||||
EASYTIER="${MODDIR}/easytier-core"
|
EASYTIER="${MODDIR}/easytier-core"
|
||||||
|
REDIR_STATUS=""
|
||||||
|
|
||||||
# 更新module.prop文件中的description
|
# 更新module.prop文件中的description
|
||||||
update_module_description() {
|
update_module_description() {
|
||||||
@@ -12,6 +13,12 @@ update_module_description() {
|
|||||||
sed -i "/^description=/c\description=[状态]${status_message}" ${MODULE_PROP}
|
sed -i "/^description=/c\description=[状态]${status_message}" ${MODULE_PROP}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if [ -f "${MODDIR}/enable_IP_rule" ]; then
|
||||||
|
REDIR_STATUS="转发已激活"
|
||||||
|
else
|
||||||
|
REDIR_STATUS="转发已禁用"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ ! -e /dev/net/tun ]; then
|
if [ ! -e /dev/net/tun ]; then
|
||||||
if [ ! -d /dev/net ]; then
|
if [ ! -d /dev/net ]; then
|
||||||
mkdir -p /dev/net
|
mkdir -p /dev/net
|
||||||
@@ -22,7 +29,7 @@ fi
|
|||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
if ls $MODDIR | grep -q "disable"; then
|
if ls $MODDIR | grep -q "disable"; then
|
||||||
update_module_description "关闭中"
|
update_module_description "关闭中 | ${REDIR_STATUS}"
|
||||||
if pgrep -f 'easytier-core' >/dev/null; then
|
if pgrep -f 'easytier-core' >/dev/null; then
|
||||||
echo "开关控制$(date "+%Y-%m-%d %H:%M:%S") 进程已存在,正在关闭 ..."
|
echo "开关控制$(date "+%Y-%m-%d %H:%M:%S") 进程已存在,正在关闭 ..."
|
||||||
pkill easytier-core # 关闭进程
|
pkill easytier-core # 关闭进程
|
||||||
@@ -39,13 +46,16 @@ while true; do
|
|||||||
if [ -f "${MODDIR}/config/command_args" ]; then
|
if [ -f "${MODDIR}/config/command_args" ]; then
|
||||||
TZ=Asia/Shanghai ${EASYTIER} $(cat ${MODDIR}/config/command_args) > ${LOG_FILE} &
|
TZ=Asia/Shanghai ${EASYTIER} $(cat ${MODDIR}/config/command_args) > ${LOG_FILE} &
|
||||||
sleep 5s # 等待easytier-core启动完成
|
sleep 5s # 等待easytier-core启动完成
|
||||||
update_module_description "已开启(自定义启动参数)(不一定运行成功)"
|
update_module_description "主程序已开启(启动参数模式) | ${REDIR_STATUS}"
|
||||||
else
|
else
|
||||||
TZ=Asia/Shanghai ${EASYTIER} -c ${CONFIG_FILE} > ${LOG_FILE} &
|
TZ=Asia/Shanghai ${EASYTIER} -c ${CONFIG_FILE} > ${LOG_FILE} &
|
||||||
sleep 5s # 等待easytier-core启动完成
|
sleep 5s # 等待easytier-core启动完成
|
||||||
update_module_description "已开启(不一定运行成功)"
|
update_module_description "主程序已开启(配置文件模式) | ${REDIR_STATUS}"
|
||||||
fi
|
fi
|
||||||
ip rule add from all lookup main
|
ip rule add from all lookup main
|
||||||
|
if ! pgrep -f 'easytier-core' >/dev/null; then
|
||||||
|
update_module_descriptio "主程序启动失败,请检查配置文件"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
echo "开关控制$(date "+%Y-%m-%d %H:%M:%S") 进程已存在"
|
echo "开关控制$(date "+%Y-%m-%d %H:%M:%S") 进程已存在"
|
||||||
fi
|
fi
|
||||||
|
|||||||
90
easytier-contrib/easytier-magisk/hotspot_iprule.sh
Normal file
90
easytier-contrib/easytier-magisk/hotspot_iprule.sh
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
#!/system/bin/sh
|
||||||
|
MODDIR=${0%/*}
|
||||||
|
CONFIG_FILE="${MODDIR}/config/config.toml"
|
||||||
|
LOG_FILE="${MODDIR}/log.log"
|
||||||
|
ACTION="$1" # 参数:add add_once del
|
||||||
|
|
||||||
|
|
||||||
|
# 获取接口/IP
|
||||||
|
get_et_iface() {
|
||||||
|
awk '
|
||||||
|
BEGIN { IGNORECASE = 1 }
|
||||||
|
/^[[:space:]]*dev_name[[:space:]]*=/ {
|
||||||
|
val = $0
|
||||||
|
sub(/^[^=]*=[[:space:]]*/, "", val)
|
||||||
|
gsub(/[" \t]/, "", val)
|
||||||
|
print val
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
' "$CONFIG_FILE"
|
||||||
|
}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
get_hot_cidr() {
|
||||||
|
ip -4 addr show dev "$1" | awk '/inet /{print $2; exit}'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
set_nat_rules() {
|
||||||
|
ET_IFACE=$(get_et_iface)
|
||||||
|
[ -z "$ET_IFACE" ] && ET_IFACE="$(get_tun_iface)"
|
||||||
|
HOT_IFACE=$(get_hot_iface)
|
||||||
|
HOT_CIDR=$(get_hot_cidr "$HOT_IFACE")
|
||||||
|
|
||||||
|
# 如果热点关闭就删除自定义链
|
||||||
|
[ -n "$ET_IFACE" ] && [ -n "$HOT_CIDR" ] || return 1
|
||||||
|
|
||||||
|
# 创建自定义链(如不存在)
|
||||||
|
iptables -t nat -N ET_NAT 2>/dev/null
|
||||||
|
iptables -N ET_FWD 2>/dev/null
|
||||||
|
|
||||||
|
# 确保主链首条跳转到自定义链
|
||||||
|
iptables -t nat -C POSTROUTING -j ET_NAT 2>/dev/null || \
|
||||||
|
iptables -t nat -I POSTROUTING 1 -j ET_NAT
|
||||||
|
iptables -C FORWARD -j ET_FWD 2>/dev/null || \
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
|
||||||
|
flush_rules() {
|
||||||
|
iptables -t nat -F ET_NAT 2>/dev/null
|
||||||
|
iptables -F ET_FWD 2>/dev/null
|
||||||
|
echo "[ET-NAT] Custom chains flushed." >> "$LOG_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$ACTION" in
|
||||||
|
add)
|
||||||
|
set_nat_rules
|
||||||
|
echo "[ET-NAT] Guard started." >> "$LOG_FILE"
|
||||||
|
ip monitor link addr | while read -r _; do
|
||||||
|
if [ -f "${MODDIR}/enable_IP_rule" ]; then
|
||||||
|
flush_rules
|
||||||
|
set_nat_rules
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
add_once)
|
||||||
|
flush_rules
|
||||||
|
set_nat_rules
|
||||||
|
echo "[ET-NAT] One-time rules applied." >> "$LOG_FILE"
|
||||||
|
;;
|
||||||
|
del)
|
||||||
|
flush_rules
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 [add|del]"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
@@ -18,10 +18,7 @@ sed -i 's/$(description=)$[^"]*/\1[状态]关闭中/' "$MODDIR/module.prop"
|
|||||||
sleep 3s
|
sleep 3s
|
||||||
|
|
||||||
"${MODDIR}/easytier_core.sh" &
|
"${MODDIR}/easytier_core.sh" &
|
||||||
|
"${MODDIR}/hotspot_iprule.sh" add &
|
||||||
|
|
||||||
# 检查是否启用模块
|
# easytier_core.sh 和 hotspot_iprule.sh 都有内部循环做守护,
|
||||||
while [ ! -f ${MODDIR}/disable ]; do
|
# 所以这里不需要再做守护了
|
||||||
sleep 2
|
|
||||||
done
|
|
||||||
|
|
||||||
pkill easytier-core
|
|
||||||
|
|||||||
Reference in New Issue
Block a user