-
Notifications
You must be signed in to change notification settings - Fork 64
Description
Есть куча скриптов в opt/etc/ndm/netfilter.d
, которые срабатывают при перезапуске роутера целиком или какого-то из его интерфейсов (например, в веб-морде что-то изменили). В 100-dns-local
идёт вызов ip4_firewall_dns_rules_set
из opt/etc/ndm/ndm:129
, где:
- Правила iptables без протокола, т.е. ALL. Т.е. туда полетят и ICMP (как минимум), а SS умеет работать только с TCP и UDP. В общем, для SS нельзя создавать правила iptables без -p, посыл коммита 6e5db2e2dda07537aa1d4a285b2b4cf09a31d52e не верен. Как минимум не откачено ещё в:
- ip4_firewall_vpn_mark
- ip4_firewall_mark_rules_tcp_udp_on
- ip4tbl_flush_rm_match_set
- В if остался grep закомментированного protocol, после вышеназванного коммита условие не срабатывает никогда (более того, в логе роутера постоянный спам ошибки), для подключения SS этих правил DNS в iptables больше нет (хотя несколько лет подряд КВАСом для SS они создавались всегда)
iptables -A PREROUTING -w -t nat -i br0 -p tcp --dport 53 -j DNAT --to 192.168.1.1
iptables -A PREROUTING -w -t nat -i br0 -p udp --dport 53 -j DNAT --to 192.168.1.1
И знаете… пока прекрасно работает без этого. Если я правильно их понимаю, они были нужны, если клиенты WiFi указывали кастомный нешифрованный DNS, то обход продолжал работать. Но если человек так поступил, то сам себе злобный Буратино — в доке описано так не поступать; да и смущает разное поведение на шифрованный и нешифрованный DNS из-за них.
В общем, предлагаю этот метод откатить (к использованию protocol) и временно задокументировать целиком. Если жалоб не будет, то при очередном рефакторинге почистить и его тело, и вызов в 100-dns-local
.
ip4_firewall_dns_rules_set() {
# interface=$(get_local_inface)
local_ip=$(get_router_ip)
# for protocol in tcp udp ; do
# Если не заданы аргументы, то ничего не выполняем
# if [ -n "${interface}" ] && [ -n "${local_ip}" ]; then
# если правила для tcp есть, то пропускаем их добавление
# if ! ip4save | grep -q "${protocol} \-\-dport ${DNS_PORT} \-j DNAT" ; then
# log_warning "Подключаем правила для корректной работы DNS трафика через 53 порт:"
# log_warning "Интерфейс: ${interface}, IP: ${local_ip}, протокол: ${protocol}."
# ip4tables PREROUTING -w -t nat -i "${interface}" -p "${protocol}" --dport ${DNS_PORT} -j DNAT --to "${local_ip}" &>/dev/null \
# || error "[${FUNCNAME}] Возникла ошибка в функции при установке правил iptables."
# fi
# else
# log_error "При вызове ip4_firewall_dns_rules_set не были заданы обязательные аргументы."
# fi
# done
}