Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kvas crypt: доводок финал #232

Merged
merged 19 commits into from
Nov 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
cc7a3c2
Merge pull request #227 from AltGrF13/disable-api-dns.213
qzeleza Nov 20, 2024
0272e7a
#222 перенос функции для прогрева домена
Nov 24, 2024
a8f3c61
#222 оформление кода
Nov 24, 2024
2b31994
#222 возможное заполнение ipset
Nov 24, 2024
9c1a8f0
#222 скорее всего, имелись ввиду пустые строки
Nov 25, 2024
b05fdf1
#222 есть константа
Nov 25, 2024
0ce5965
#222 обратный порядок
Nov 25, 2024
ba11c78
#222 упрощение
Nov 25, 2024
881e4a4
#222 если это не IP, вычленяем домен
Nov 25, 2024
8b207fc
Merge pull request #229 from AltGrF13/kvas-add.222
qzeleza Nov 25, 2024
bea7a26
Merge pull request #230 from AltGrF13/kvas-add-error.222
qzeleza Nov 25, 2024
409e868
#222 перегенерируем kvas.dnsmasq после kvas crypt on
Nov 25, 2024
6c31a4f
#222 список всегда через dnscrypt, его не надо отключать
Nov 25, 2024
be10ab4
#222 файл с переобходом доменов регулярно правился
Nov 25, 2024
605d7b4
#222 подписи
Nov 25, 2024
a67e67a
#222 подписи
Nov 26, 2024
65757cf
#222 кэш отключен, не имеет смысла менять ttl
Nov 26, 2024
bedb1f9
#222 кэширование и DNSSEC плохо совместимы
Nov 26, 2024
b25411d
#222 трафик списка всегда через dnscrypt, он фильтрует IPv6, в dnsmas…
Nov 26, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions opt/bin/libs/main
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,30 @@ is_dns_server_online(){
DNS_ENABLE=false
DNS_DEFAULT=''

add_host_by_iplist_to_ipset() {
host=${1//\*/}

# получаем список из адресов от текущего dns сервера
# и исключаем из списка адреса типа 0.0.0.0
ip_list=$(get_iplist_from_domain "${host}" \
| grep -Eo "${IP_FILTER}" \
| grep -v '0.0.0.0' )

if [ -z "${ip_list}" ]; then
return
fi

for ip in ${ip_list}; do
# если уже есть в списке
if ipset list "${IPSET_TABLE_NAME}" | grep -qE "^${ip} " ; then
continue
fi

log_warning "Обнаружен новый IP ${ip} для домена ${host} и добавлен в ipset"
ipset -exist add "${IPSET_TABLE_NAME}" "${ip}"
done
}

get_iplist_from_domain(){
#---------------------------------------------------------------------------------
# Получаем список всех ip по доменному имени
Expand Down
79 changes: 51 additions & 28 deletions opt/bin/libs/vpn
Original file line number Diff line number Diff line change
Expand Up @@ -1129,7 +1129,7 @@ ipset_dns_change() {
dns_new=${1};
if echo "${dns_new}" | grep -qE ':|#'; then
_dns_clear=$(echo "${dns_new}" | tr '#' ':' )
sed -i "s/@[a-zA-Z0-9:.]*/@${_dns_clear}/" "/opt/apps/kvas/bin/main/ipset"
sed -i "s/@[a-zA-Z0-9:.]*/@${_dns_clear}/" "/opt/apps/kvas/bin/main/ipset_domain"
fi
}

Expand Down Expand Up @@ -2253,12 +2253,13 @@ dns_crypt_port_change() {

set_config_value DNS_CRYPT_PORT "${port_new}"
sed -i "s/\(^listen_addresses.=.\).*$/\1['127.0.0.1:${port_new}']/g" "${DNSCRYPT_CONFIG}" &> /dev/null
sed -i "s/\(@.*\)\(:[0-9]\{2,6\}\)/\1:${port_new} /g" '/opt/apps/kvas/bin/main/ipset' &> /dev/null
sed -i "s/\(@.*\)\(:[0-9]\{2,6\}\)/\1:${port_new} /g" '/opt/apps/kvas/bin/main/ipset_domain' &> /dev/null

[ -f /opt/etc/dnsmasq.d/kvas.dnsmasq ] && {
server_crypt_1="echo \"server=\/\${host}\/${LOCALHOST_IP}#${port_new}\" >> \/opt\/etc\/dnsmasq.d\/kvas.dnsmasq"
sed -i '/echo \"server/d' '/opt/apps/kvas/bin/main/dnsmasq' &> /dev/null
sed -i "s/\(echo \"ipset=\/\$.*\)/\1\n\t${server_crypt_1}/" '/opt/apps/kvas/bin/main/dnsmasq' &> /dev/null
[ -f /opt/apps/kvas/bin/main/dnsmasq ] && {
# server_crypt_1="echo \"server=\/\${host}\/${LOCALHOST_IP}#${port_new}\" >> \/opt\/etc\/dnsmasq.d\/kvas.dnsmasq"
sed -i '/echo \"server=/d' '/opt/apps/kvas/bin/main/dnsmasq' &> /dev/null
sed -i '/^$/N;/^\n$/D' /opt/apps/kvas/bin/main/dnsmasq
# sed -i "s/\(echo \"ipset=\/\$.*\)/\1\n\t${server_crypt_1}/" '/opt/apps/kvas/bin/main/dnsmasq' &> /dev/null
}


Expand Down Expand Up @@ -2321,7 +2322,7 @@ refresh_dnsmasq_ipset_table(){
get_dns_crypt_status() {
crypt_port=$(get_config_value DNS_CRYPT_PORT)
if [ -f '/opt/sbin/dnscrypt-proxy' ] &&
cat < '/opt/apps/kvas/bin/main/ipset' | grep '@' | grep -q "${crypt_port}" &&
cat < '/opt/apps/kvas/bin/main/ipset_domain' | grep '@' | grep -q "${crypt_port}" &&
cat < '/opt/apps/kvas/bin/main/dnsmasq' | grep -q 'server' &&
netstat -tulnp 2> /dev/null | grep -q dnscrypt; then

Expand Down Expand Up @@ -2408,23 +2409,29 @@ cmd_dns_crypt_on() {
dns_cache_enabled=$(get_config_value DNS_CACHE_ENABLED)
ready "Шифрование DNS"
{
# sed -i "s/\(^cache.=.\).*$/\1${dns_cache_enabled}/g" '/opt/etc/dnscrypt-proxy.toml'
# оставляем кеш выключенным за счет работы механизма кеширвоания dnsmasq
# оставляем кеш выключенным за счет работы механизма кеширвоания dnsmasq
sed -i "s/\(^cache.=.\).*$/\1false/g" '/opt/etc/dnscrypt-proxy.toml'
#sed -i "s/\(^cache_min_ttl.=.\).*$/\10/g" '/opt/etc/dnscrypt-proxy.toml'
#sed -i "s/\(^cache_max_ttl.=.\).*$/\10/g" '/opt/etc/dnscrypt-proxy.toml'
# из-за отключенного кэша можем повысить безопасность
sed -i "s/\(^require_dnssec.=.\).*$/\1true/g" '/opt/etc/dnscrypt-proxy.toml'
# пока нет поддержки IPv6
sed -i "s/\(^block_ipv6.=.\).*$/\1true/g" '/opt/etc/dnscrypt-proxy.toml'
sed -i "s/^[# ]\{0,1\}[ ]\{0,1\}\(doh_servers.=.\).*$/\1false/g" '/opt/etc/dnscrypt-proxy.toml'
sed -i "s/\(^ipv6_servers.=.\).*$/\1false/g" '/opt/etc/dnscrypt-proxy.toml'
sed -i "s/\(^require_dnssec.=.\).*$/\1true/g" '/opt/etc/dnscrypt-proxy.toml'
# более тяжёлые для роутера
sed -i "s/^[# ]\{0,1\}[ ]\{0,1\}\(doh_servers.=.\).*$/\1false/g" '/opt/etc/dnscrypt-proxy.toml'
# слушаем запросы только с роутера
sed -i "s/\(^listen_addresses.=.\).*$/\1['127.0.0.1:${crypt_port}'.*]/g" "${DNSCRYPT_CONFIG}" &> /dev/null
sed -i "s/\(^cache_min_ttl.=.\).*$/\10/g" '/opt/etc/dnscrypt-proxy.toml'
sed -i "s/\(^cache_max_ttl.=.\).*$/\10/g" '/opt/etc/dnscrypt-proxy.toml'
# в идеале выбрать быстрые для РФ без DoH и IPv6, пока просто динамические
sed -i "s/^\(server_names =.*\)/# \1/g" '/opt/etc/dnscrypt-proxy.toml'

# разрешаем ECH
sed -i 's/.*\(filter-rr.*\)/# \1/' /opt/etc/dnsmasq.conf

# sed -i "/proxy-dnssec/d" /opt/etc/dnsmasq.conf
# echo "proxy-dnssec" >> /opt/etc/dnsmasq.conf
dns_crypt_port_change "${dns_crypt_port}" restart

# множество конфигов должно обновиться и службы перезапуститься
cmd_kvas_init 'no'
} 1> /dev/null 2> "${ERROR_LOG_FILE}"
ready_status "${?}" "Произошла непредвиденная ошибка." "ПОДКЛЮЧЕНО"
fi
Expand All @@ -2442,22 +2449,24 @@ cmd_dns_crypt_off() {
{
crypt_port=$(get_config_value DNS_CRYPT_PORT)
static_dns=$(get_config_value DNS_STATIC_1)
sed -i "s/\(@.*\)\(:[0-9]\{2,6\}\)/@localhost/g" '/opt/apps/kvas/bin/main/ipset'
sed -i "/proxy-dnssec/d" /opt/etc/dnsmasq.conf

sed -i "s/\(@.*\)\(:[0-9]\{2,6\}\)/@localhost/g" '/opt/apps/kvas/bin/main/ipset_domain'

sed -i "s/\(^server=\)${LOCALHOST_IP}#${crypt_port}/\1${static_dns}/" /opt/etc/dnsmasq.conf
sed -i 's/.*\(filter-rr.*\)/\1/' /opt/etc/dnsmasq.conf


sed -i '/echo \"server=/d' '/opt/apps/kvas/bin/main/dnsmasq' &> /dev/null
local server_echo="echo \"server=\/\$\{host\}\/${LOCALHOST_IP}#${crypt_port}\" >> \"\$\{ipset_file\}\""
sed -i 's/\(done.*\)/\t'"${server_echo}"'\n\n\1/g' '/opt/apps/kvas/bin/main/dnsmasq'

rm "${DNSMASQ_IPSET_HOSTS}"
_dns=$(cat < "${DNSMASQ_CONFIG}" | sed -n 's/^server=\(.*\)$/\1/p')

set_config_value DNS_DEFAULT "${_dns}#${MAIN_DNS_PORT}"
set_config_value DNS_CRYPT_PORT "${crypt_port}"

/opt/etc/init.d/S09dnscrypt-proxy2 stop
cmd_kvas_init "no"

# множество конфигов должно обновиться и службы перезапуститься
cmd_kvas_init 'no'
} 1> /dev/null 2> "${ERROR_LOG_FILE}"
ready_status "${?}" "Произошла непредвиденная ошибка." "ОТКЛЮЧЕНО"
}
Expand Down Expand Up @@ -2554,7 +2563,7 @@ host_add() {
if echo "${1}" | grep -qE "${IP_FILTER}|${NET_FILTER}" ; then
clear_host="${1}"
else
clear_host=$(echo "${1}" | sed 's/\*//;' | sed -n -E 's|^(http(s)?://)?([^/]+).*|\3|p')
clear_host=$(echo "${1}" | sed 's/\*//;' | sed -n -E 's|^(https?://)?([^/]+).*|\2|p')
fi
reset="${2}"
wild="${3}"
Expand Down Expand Up @@ -2601,6 +2610,16 @@ host_add() {

[ -f /opt/etc/AdGuardHome/AdGuardHome.yaml ] && cmd_adguardhome_status | grep -q ВКЛЮЧЕН && add_host_to_adguard "${clear_host}" &> /dev/null

if echo "${clear_host}" | grep -qE "$(get_regexp_ip_or_range)" ; then
# если строка IP, диапазон или маска; то добавляем напрямую и без ttl
ipset -exist add "${IPSET_TABLE_NAME}" "${clear_host}" timeout 0 &>/dev/null
elif [ "${wild}" != 'import' ] && [ "${reset}" = 'yes' ] ; then
# если это одиночное добавление, то можем
# прогреть переданный домен (без под*),
# чтобы пользователю не пришлось сбрасывать кэш DNS
add_host_by_iplist_to_ipset "${clear_host}" &> /dev/null
fi

[ $? = 0 ] && when_ok "ДОБАВЛЕН" || when_bad "НЕ ДОБАВЛЕН"


Expand All @@ -2617,12 +2636,16 @@ host_add() {
#
# ------------------------------------------------------------------------------------------
cmd_add_one_host() {

host=$(echo "${1}" | sed 's|http[s]\{,1\}://||;')
wild="${3:-}"
reset="${2:-yes}"
wild="${3:-}"

ip_filter="[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
#ToDo: использовать эту переменную ниже
local regexp_ip_or_range=$(get_regexp_ip_or_range)
if echo "${1}" | grep -qE "${regexp_ip_or_range}" ; then
host="${1}"
else
host=$(echo "${1}" | sed 's/\*//;' | sed -n -E 's|^(https?://)?([^/]+).*|\2|p')
fi

# Выходим из функции при отуствии интернет-соединения или VPN
exit_when_no_internet_or_vpn || exit 1
Expand All @@ -2648,7 +2671,7 @@ cmd_add_one_host() {
# то делаем запрос на их доавление.
local _tmpfile=$(mktemp)
echo "${host}" | grep -qE "${IP_FILTER}" || {
_get_same_tag_domains_missing_in_protection_list "${host}" | sed '/$/d' > "${_tmpfile}"
_get_same_tag_domains_missing_in_protection_list "${host}" | sed '/^$/d' > "${_tmpfile}"
}
# Проверяем есть ли в этом списке домены
[ -s "${_tmpfile}" ] && {
Expand All @@ -2672,7 +2695,7 @@ cmd_add_one_host() {
# если точка в имени домена есть, то проверяем на корректность IP
if echo "${clear_host}" | grep -qE "${IP_FILTER}*" ; then
# если точка в имени домена есть, то проверяем на корректность IP
if echo "${clear_host}" | grep -qE "^${IP_FILTER}/[0-9]{1,2}$|^${IP_FILTER}$|^${IP_FILTER}-${ip_filter}$" ; then
if echo "${clear_host}" | grep -qE "^${IP_FILTER}/[0-9]{1,2}$|^${IP_FILTER}$|^${IP_FILTER}-${IP_FILTER}$" ; then
# если включен режим импорта
if [ "${wild}" = import ] ; then
host_add "${host}" "${reset}" "${wild}" | grep -q "ДОБАВЛЕН" && echo "+"
Expand Down
26 changes: 1 addition & 25 deletions opt/bin/main/ipset_domain
Original file line number Diff line number Diff line change
Expand Up @@ -19,30 +19,6 @@ REGEXP_IP_OR_RANGE="${IP_FILTER}|${IP_FILTER}-${IP_FILTER}|${IP_FILTER}/[0-9]{1,

log_warning 'Начат переобход доменов из списка'

add_host_by_iplist_to_ipset() {
host=${1//\*/}

# получаем список из адресов от текущего dns сервера
# и исключаем из списка адреса типа 0.0.0.0
ip_list=$(get_iplist_from_domain "${host}" \
| grep -Eo "${IP_FILTER}" \
| grep -v '0.0.0.0' )

if [ -z "${ip_list}" ]; then
return
fi

for ip in ${ip_list}; do
# если уже есть в списке
if ipset list "${IPSET_TABLE_NAME}" | grep -qE "^${ip} " ; then
continue
fi

log_warning "Обнаружен новый IP ${ip} для домена ${host} и добавлен в ipset"
ipset -exist add "${IPSET_TABLE_NAME}" "${ip}"
done
}

# проверяем доступность сети
until ADDRS=$(kdig +short ya.ru @127.0.0.1:9153 ) && [ -n "${ADDRS}" ] > /dev/null 2>&1; do sleep 5; done

Expand All @@ -51,7 +27,7 @@ while read -r line || [ -n "${line}" ]; do
# пропускаем строки c минусами - это рекламные сайты
# пропускаем пустые строки
# пропускаем строки с комментариями
[ "${line::1}" = "-" ] || [ -z "${line}" ] || [ "${line:0:1}" = "#" ] && continue
[ "${line::1}" = '-' ] || [ -z "${line}" ] || [ "${line:0:1}" = '#' ] && continue

# удаляем из строки комментарии - все что встречается после символа # и сам символ
# удаляем *
Expand Down
1 change: 0 additions & 1 deletion opt/etc/conf/dnsmasq.conf
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ cache-size=1536 # Указываем размер кеша в записях
max-ttl=86400 # Установка максимального значения TTL, которое будет передаваться клиентам. Указанное максимальное значение TTL будет передаваться клиентам вместо истинного значения TTL, если оно меньше. Однако истинное значение TTL сохраняется в кэше, чтобы избежать переполнения вышестоящих DNS-серверов.
# filter-rr=HTTPS # убираем HTTPS RR, из-за этого отключится ECH

filter-AAAA # убираем IPv6 в ответе от DNS
bind-interfaces # разрешаем слушать только на том что перечислено в listen-address
bogus-priv # Разрешаем подделывать обратные запросы для диапазонов частных адресов RFC1918
no-negcache # Запрещаем кэшировать неудачные результаты поиска
Expand Down