Files
op-packages/luci-app-hijpass/root/usr/lib/hijpass/chinadns-ng.sh
T

103 lines
3.6 KiB
Bash
Executable File

#!/bin/sh
. /usr/lib/hijpass/app-logger.sh
log_debug "$0"
GFW_FILE_PATH=$(uci -q get hijpass.@hijpass[0].gfw_list)
CHN_FILE_PATH=$(uci -q get hijpass.@hijpass[0].chn_list)
DOMAIN_PROXY_FILE_PATH=$(uci -q get hijpass.@hijpass[0].domain_proxy)
DOMAIN_DIRECT_FILE_PATH=$(uci -q get hijpass.@hijpass[0].domain_direct)
DIRECT_DNS=$(uci -q get hijpass.@dns[0].direct_dns)
PROXY_DNS=$(uci -q get hijpass.@dns[0].proxy_dns)
ENABLE_GFW=$(uci -q get hijpass.@dns[0].use_gfw)
ENABLE_CHN=$(uci -q get hijpass.@dns[0].use_chn)
CDG_PORT=$(uci -q get hijpass.@dns[0].cdg_port)
CHINADNS_NG_CONF="/etc/hijpass/chinadns-ng.conf"
GEOVIEW_SCRIPT="/usr/lib/hijpass/geoview.sh"
DOMAIN_PROXY_TEMP_FILE_PATH=/tmp/domain_proxy.tmp
DOMAIN_DIRECT_TEMP_FILE_PATH=/tmp/domain_direct.tmp
touch "$DOMAIN_PROXY_TEMP_FILE_PATH"
touch "$DOMAIN_DIRECT_TEMP_FILE_PATH"
if [ "$DIRECT_DNS" = "custom" ]; then
DIRECT_DNS="$(uci -q get hijpass.@dns[0].direct_dns_custom)"
fi
if [ "$DIRECT_DNS" = "dnsmasq" ] || [ "$DIRECT_DNS" = "system" ]; then
dnsmasq_port=$(uci -q get dhcp.@dnsmasq[0].port || echo "53")
DIRECT_DNS="127.0.0.1#${dnsmasq_port:-53}"
fi
if [ "$PROXY_DNS" = "custom" ]; then
PROXY_DNS="$(uci -q get hijpass.@dns[0].proxy_dns_custom)"
fi
if [ "$PROXY_DNS" = "dnsmasq" ] || [ "$PROXY_DNS" = "system" ]; then
dnsmasq_port=$(uci -q get dhcp.@dnsmasq[0].port || echo "53")
PROXY_DNS="127.0.0.1#${dnsmasq_port:-53}"
fi
proxy_domain_list="$([ -f "$DOMAIN_PROXY_FILE_PATH" ] && cat "$DOMAIN_PROXY_FILE_PATH" || :)"
geosite_proxy_lines=$(echo "$proxy_domain_list" | grep '^geosite:' | sed 's/^geosite://' | tr '\n' ',')
if [ -n "$geosite_proxy_lines" ]; then
geosite_proxy_domains=$($GEOVIEW_SCRIPT -e "geosite" "${geosite_proxy_lines%,}")
proxy_domain_list=$(echo "$proxy_domain_list" | grep -v '^geosite:')
proxy_domain_list="$proxy_domain_list
$geosite_proxy_domains"
fi
echo "$proxy_domain_list" > "$DOMAIN_PROXY_TEMP_FILE_PATH"
direct_domain_list="$([ -f "$DOMAIN_DIRECT_FILE_PATH" ] && cat "$DOMAIN_DIRECT_FILE_PATH" || :)"
geosite_direct_lines=$(echo "$direct_domain_list" | grep '^geosite:' | sed 's/^geosite://' | tr '\n' ',')
if [ -n "$geosite_direct_lines" ]; then
geosite_direct_domains=$($GEOVIEW_SCRIPT -e "geosite" "${geosite_direct_lines%,}")
direct_domain_list=$(echo "$direct_domain_list" | grep -v '^geosite:')
direct_domain_list="$direct_domain_list
$geosite_direct_domains"
fi
echo "$direct_domain_list" > "$DOMAIN_DIRECT_TEMP_FILE_PATH"
CONF="
# 监听地址和端口
bind-addr ::
bind-port $CDG_PORT
# 国内上游、可信上游
china-dns $DIRECT_DNS
trust-dns $PROXY_DNS
# 域名列表,用于分流
$([ "$ENABLE_CHN" = "1" ] && echo "chnlist-file $CHN_FILE_PATH")
$([ "$ENABLE_GFW" = "1" ] && echo "gfwlist-file $GFW_FILE_PATH")
$([ "$ENABLE_CHN" = "1" ] && [ "$ENABLE_GFW" != "1" ] && echo "default-tag gfw")
$([ "$ENABLE_GFW" = "1" ] && [ "$ENABLE_CHN" != "1" ] && echo "default-tag chn")
group userdirect
group-dnl $DOMAIN_DIRECT_TEMP_FILE_PATH
group-upstream $DIRECT_DNS
group-ipset inet@hijpass@dnsbypass4list,inet@hijpass@dnsbypass6list
group userproxy
group-dnl $DOMAIN_PROXY_TEMP_FILE_PATH
group-upstream $PROXY_DNS
group-ipset inet@hijpass@dnsproxy4list,inet@hijpass@dnsproxy6list
# 收集 tag:chn、tag:gfw 域名的 IP (可选)
add-tagchn-ip inet@hijpass@chn4list,inet@hijpass@chn6list
add-taggfw-ip inet@hijpass@gfw4list,inet@hijpass@gfw6list
# 测试 tag:none 域名的 IP (针对国内上游)
ipset-name4 inet@hijpass@chnroute4list
ipset-name6 inet@hijpass@chnroute6list
# dns 缓存
# cache 4096
# cache-stale 86400
# cache-refresh 20
# verdict 缓存 (用于 tag:none 域名)
verdict-cache 4096
# 详细日志
# verbose
"
echo "$CONF" >"$CHINADNS_NG_CONF"