Files
ShellCrash/scripts/menus/dns.sh
2026-01-23 14:42:27 +08:00

492 lines
17 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/sh
# Copyright (C) Juewuy
[ -n "$__IS_MODULE_DNS_LOADED" ] && return
__IS_MODULE_DNS_LOADED=1
load_lang dns
# DNS 模式设置
set_dns_mod() {
while true; do
[ -z "$hosts_opt" ] && hosts_opt=ON
[ -z "$dns_protect" ] && dns_protect=ON
[ -z "$ecs_subnet" ] && ecs_subnet=OFF
line_break
separator_line "="
content_line "$DNS_CURRENT_MODE\033[47;30m $dns_mod \033[0m"
content_line "\033[33m$DNS_RESTART_NOTICE\033[0m"
separator_line "-"
content_line "1) MIX$COMMON_MOD\t\033[32m$DNS_MODE_MIX_DESC\033[0m"
content_line "2) Route$COMMON_MOD\t\033[32m$DNS_MODE_ROUTE_DESC\033[0m"
content_line "3) Redir$COMMON_MOD\t\033[33m$DNS_MODE_REDIR_DESC\033[0m"
content_line ""
content_line "4) $DNS_MENU_PROTECT\t\033[36m$dns_protect\033[0m\t$DNS_PROTECT_DESC"
content_line "5) $DNS_MENU_HOSTS\t\033[36m$hosts_opt\033[0m\t$DNS_HOSTS_DESC"
content_line "6) $DNS_MENU_ECS\t\033[36m$ecs_subnet\033[0m\t$DNS_ECS_DESC"
content_line "7) $DNS_MENU_REDIR\033[36m$dns_redir_port\033[0m\t$DNS_REDIR_PORT_DESC"
[ "$dns_mod" = "mix" ] &&
content_line "8) \033[33m$DNS_FAKEIP_MENU\033[0m"
content_line "9) \033[36m$DNS_ADV_MENU\033[0m"
content_line "0) $COMMON_BACK"
separator_line "="
read -r -p "$COMMON_INPUT> " num
case "$num" in
"" | 0)
break
;;
1 | 2)
line_break
separator_line "="
if echo "$crashcore" | grep -q 'singbox' || [ "$crashcore" = meta ]; then
[ "$num" = 1 ] && dns_mod=mix || dns_mod=route
setconfig dns_mod "$dns_mod"
content_line "\033[36m$DNS_SET_OK$dns_mod\033[0m"
else
econtent_line "\033[31m$DNS_CORE_UNSUPPORTED\033[0m"
fi
separator_line "="
sleep 1
;;
3)
dns_mod=redir_host
setconfig dns_mod "$dns_mod"
line_break
separator_line "="
content_line "\033[36m$DNS_SET_OK$dns_mod\033[0m"
separator_line "="
;;
4)
while true; do
line_break
separator_line "="
if [ "$dns_protect" = ON ]; then
content_line "当前\033[33m已启用\033[0mDNS防泄漏是否确认禁用"
else
content_line "当前\033[33m已禁用\033[0mDNS防泄漏是否确认启用"
fi
separator_line "-"
content_line "1) 是"
content_line "2) 重置为默认值"
content_line "0) 否,返回上级菜单"
separator_line "="
read -r -p "$COMMON_INPUT> " num
case "$num" in
0)
break
;;
1)
if [ "$dns_protect" = ON ]; then
dns_protect=OFF
else
dns_protect=ON
fi
;;
2)
dns_protect=ON
;;
*)
errornum
sleep 1
continue
;;
esac
setconfig dns_protect "$dns_protect"
line_break
separator_line "="
content_line "\033[32m操作成功\033[0m"
separator_line "="
sleep 1
done
;;
5)
while true; do
line_break
separator_line "="
if [ "$hosts_opt" = ON ]; then
content_line "当前\033[33m已启用\033[0mHosts优化是否确认禁用"
else
content_line "当前\033[33m已禁用\033[0mHosts优化是否确认启用"
fi
separator_line "-"
content_line "1) 是"
content_line "2) 重置为默认值"
content_line "0) 否,返回上级菜单"
separator_line "="
read -r -p "$COMMON_INPUT> " num
case "$num" in
0)
break
;;
1)
if [ "$hosts_opt" = ON ]; then
hosts_opt=OFF
else
hosts_opt=ON
fi
;;
2)
hosts_opt=ON
;;
*)
errornum
sleep 1
continue
;;
esac
setconfig dns_protect "$hosts_opt"
line_break
separator_line "="
content_line "\033[32m操作成功\033[0m"
separator_line "="
sleep 1
done
;;
6)
while true; do
line_break
separator_line "="
if [ "$ecs_subnet" = ON ]; then
content_line "当前\033[33m已启用\033[0mHosts优化是否确认禁用"
else
content_line "当前\033[33m已禁用\033[0mHosts优化是否确认启用"
fi
separator_line "-"
content_line "1) 是"
content_line "2) 重置为默认值"
content_line "0) 否,返回上级菜单"
separator_line "="
read -r -p "$COMMON_INPUT> " num
case "$num" in
0)
break
;;
1)
if [ "$ecs_subnet" = ON ]; then
ecs_subnet=OFF
else
ecs_subnet=ON
fi
;;
2)
ecs_subnet=OFF
;;
*)
errornum
sleep 1
continue
;;
esac
setconfig dns_protect "$ecs_subnet"
line_break
separator_line "="
content_line "\033[32m操作成功\033[0m"
separator_line "="
sleep 1
done
;;
7)
while true; do
line_break
separator_line "="
content_line "\033[31m$DNS_REDIR_WARN\033[0m"
content_line "\033[33m$DNS_REDIR_HINT 127.0.0.1:$dns_port\033[0m"
content_line ""
content_line "请直接输入旁路由IPV4地址"
content_line "或输入 r 重置DNS劫持端口"
content_line "或输入 0 返回上级菜单"
separator_line "="
read -r -p "请输入> " num
case "$num" in
0)
break
;;
r)
dns_redir_port="$dns_port"
setconfig dns_redir_port
line_break
separator_line "="
content_line "\033[32m操作成功\033[0m"
separator_line "="
sleep 1
break
;;
*)
if [ "$num" -ge 1 ] && [ "$num" -lt 65535 ]; then
line_break
separator_line "="
if ckcmd netstat && netstat -ntul | grep -q ":$num "; then
dns_redir_port="$num"
setconfig dns_redir_port "$dns_redir_port"
content_line "\033[32m操作成功\033[0m"
separator_line "="
sleep 1
break
else
content_line "\033[33m$DNS_REDIR_NO_SERVICE\033[0m"
separator_line "="
sleep 1
fi
else
errornum
sleep 1
fi
;;
esac
done
;;
8)
fake_ip_filter
;;
9)
set_dns_adv
;;
*)
errornum
sleep 1
;;
esac
done
}
fake_ip_filter() {
while true; do
line_break
separator_line "="
content_line "\033[32m$DNS_FAKEIP_DESC\033[0m"
content_line "\033[31m$DNS_FAKEIP_TIP\033[0m"
content_line "\033[36m$DNS_FAKEIP_EXAMPLE\033[0m"
separator_line "-"
if [ -s "$CRASHDIR/configs/fake_ip_filter" ]; then
content_line "\033[33m$DNS_FAKEIP_EXIST\033[0m"
content_line ""
awk '{print NR") "$1}' "$CRASHDIR/configs/fake_ip_filter" |
while IFS= read -r line; do
content_line "$line"
done
else
content_line "\033[33m$DNS_FAKEIP_EMPTY\033[0m"
fi
content_line ""
content_line "0) 返回上级菜单"
separator_line "="
read -r -p "$DNS_FAKEIP_EDIT> " input
case "$input" in
"" | 0)
break
;;
*)
line_break
separator_line "="
if [ "$input" -ge 1 ] 2>/dev/null; then
if sed -i "${input}d" "$CRASHDIR/configs/fake_ip_filter"; then
content_line "\033[32m移除成功\033[0m"
else
content_line "\033[31m移除失败\033[0m"
fi
else
content_line "请确认需要添加的地址:\033[32m$input\033[0m"
separator_line "-"
content_line "1) 确认无误"
content_line "0) 返回上级菜单"
separator_line "="
read -r -p "$COMMON_INPUT>" res
if [ "$res" = 1 ]; then
line_break
separator_line "="
if echo "$input" >>"$CRASHDIR/configs/fake_ip_filter"; then
content_line "\033[32m添加成功\033[0m"
else
content_line "\033[31m添加失败\033[0m"
fi
else
break
fi
fi
separator_line "="
sleep 1
;;
esac
done
}
# DNS详细设置
set_dns_adv() {
while true; do
line_break
separator_line "="
content_line "\033[31m$DNS_ADV_SINGBOX_LIMIT\033[0m"
content_line "$DNS_ADV_SPLIT"
content_line "\033[33m$DNS_ADV_CERT\033[0m"
content_line ""
content_line "DIRECT-DNS"
content_line "\033[32m$dns_nameserver\033[0m"
content_line ""
content_line "PROXY-DNS"
content_line "\033[36m$dns_fallback\033[0m"
content_line ""
content_line "DEFAULT-DNS"
content_line "\033[33m$dns_resolver\033[0m"
content_line ""
separator_line "-"
content_line "1) $DNS_ADV_EDIT_DIRECT"
content_line "2) $DNS_ADV_EDIT_PROXY"
content_line "3) $DNS_ADV_EDIT_DEFAULT"
content_line "4) \033[32m$DNS_ADV_AUTO_ENCRYPT\033[0m"
content_line "9) \033[33m$DNS_ADV_RESET\033[0m"
content_line "0) $COMMON_BACK"
separator_line "="
read -r -p "$COMMON_INPUT > " num
case "$num" in
"" | 0)
break
;;
1)
line_break
separator_line "="
content_line "当前DIRECT-DNS\033[32m$dns_nameserver\033[0m"
separator_line "-"
content_line "请直接输入新的DIRECT-DNS地址"
content_line "或输入 r 重置DIRECT-DNS地址"
content_line "或输入 0 返回上级菜单"
separator_line "="
read -r -p "请输入> " res
case "$res" in
0)
continue
;;
r)
dns_nameserver="127.0.0.1"
setconfig dns_nameserver "'$dns_nameserver'"
line_break
separator_line "="
content_line "\033[32m操作成功\033[0m"
;;
*)
dns_nameserver=$(echo "$res" | sed 's#|#,\ #g')
line_break
separator_line "="
if [ -n "$dns_nameserver" ]; then
setconfig dns_nameserver "'$dns_nameserver'"
content_line "\033[32m操作成功\033[0m"
else
ontent_line "\033[32m操作失败\033[0m"
fi
;;
esac
separator_line "="
;;
2)
line_break
separator_line "="
content_line "当前PROXY-DNS\033[32m$dns_fallback\033[0m"
separator_line "-"
content_line "请直接输入新的PROXY-DNS地址"
content_line "或输入 r 重置PROXY-DNS地址"
content_line "或输入 0 返回上级菜单"
separator_line "="
read -r -p "请输入> " res
case "$res" in
0)
continue
;;
r)
dns_fallback="1.1.1.1, 8.8.8.8"
setconfig dns_fallback "'$dns_fallback'"
line_break
separator_line "="
content_line "\033[32m操作成功\033[0m"
;;
*)
dns_fallback=$(echo "$res" | sed 's#|#,\ #g')
line_break
separator_line "="
if [ -n "$dns_fallback" ]; then
setconfig dns_fallback "'$dns_fallback'"
content_line "\033[32m操作成功\033[0m"
else
ontent_line "\033[32m操作失败\033[0m"
fi
;;
esac
separator_line "="
;;
3)
line_break
separator_line "="
content_line "当前DEFAULT-DNS\033[32m$dns_resolver\033[0m"
separator_line "-"
content_line "请直接输入新的DEFAULT-DNS地址"
content_line "或输入 r 重置DEFAULT-DNS地址"
content_line "或输入 0 返回上级菜单"
separator_line "="
read -r -p "请输入> " res
case "$res" in
0)
continue
;;
"r")
dns_resolver="223.5.5.5, 2400:3200::1"
setconfig dns_resolver "'$dns_resolver'"
line_break
separator_line "="
content_line "\033[32m操作成功\033[0m"
;;
*)
line_break
separator_line "="
if echo "$res" | grep -qE '://.*::'; then
content_line "\033[31m$DNS_IPV6_NOT_SUPPORT\033[0m"
else
dns_resolver=$(echo "$res" | sed 's#|#,\ #g')
setconfig dns_resolver "'$dns_resolver'"
content_line "\033[32m$COMMON_SUCCESS\033[0m"
fi
;;
esac
separator_line "="
;;
4)
line_break
separator_line "="
if echo "$crashcore" | grep -qE 'meta|singbox'; then
dns_nameserver='https://dns.alidns.com/dns-query, https://doh.pub/dns-query'
dns_fallback='https://cloudflare-dns.com/dns-query, https://dns.google/dns-query, https://doh.opendns.com/dns-query'
dns_resolver='https://223.5.5.5/dns-query, 2400:3200::1'
setconfig dns_nameserver "'$dns_nameserver'"
setconfig dns_fallback "'$dns_fallback'"
setconfig dns_resolver "'$dns_resolver'"
content_line "\033[32m$DNS_ENCRYPT_OK\033[0m"
else
content_line "\033[31m$DNS_CORE_REQUIRE\033[0m"
fi
separator_line "="
;;
9)
setconfig dns_nameserver
setconfig dns_fallback
setconfig dns_resolver
. "$CRASHDIR/libs/get_config.sh"
line_break
separator_line "="
content_line "\033[32m$COMMON_SUCCESS\033[0m"
separator_line "="
;;
*)
errornum
;;
esac
sleep 1
done
}