qzeleza / kvas

vpn и shadowsocks клиент для роутеров keenetic
Other
649 stars 41 forks source link

KVAS и политики доступа в интернет Keenetic #41

Open kilia07 opened 1 year ago

kilia07 commented 1 year ago

Описание проблемы. Если создать профиль доступа в интернет на страничке http://192.168.1.1/controlPanel/policies и в созданный профиль добавить клиента wifi, то сайты из списка разблокировки kvas перестают открываться. При этом сайты не из списка разблокировки открываются как надо.

Мои шаги, приведшие к ошибке/проблеме.

  1. Открыл следующую страницу (http://192.168.1.1/controlPanel/policies)
  2. Создал профиль "Test" и включил все доступные подключения аналогично профилю по умолчанию
  3. На вкладке присвоения политик клиентам добавил клиента в профиль Test
  4. Проверил открывается ли сайт 2ip.ru, rutracker.org - получил ошибку открытия сайта, проверил 2ip.ua - сайт открылся
  5. Выполнил kvas debug, и полный ребут роутера - картина та же

Ожидания о поведении программы. Хотелось бы чтобы KVAS обрабатывал другие профили доступа в интернет также как и профиль по умолчанию

Информация о системе с которой происходит тестирование пакета на роутере (пожалуйста, заполните следующую информацию):

Информация о роутере (пожалуйста, заполните следующую информацию):

Дополнительные пояснения. Проверял поведение KVAS при создании профиля на прошивке 3.9, результат тот же. В прошивке 3.9 на той же странице профилей появилась возможность создавать профиль с интеллектуальной балансировкой трафика при использовании нескольких интернет-подключений. В моем случае по итогу мне наиболее критично использовать KVAS с подобным профилем, так как у меня есть несколько интернет-подключений (проводно+модем+соседский wifi).

qzeleza commented 1 year ago

Доброго дня, Спасибо, по моему мы на страницах форума уже обсуждали данный функционал? В любом случае, данный функционал постараюсь реализовать уже в КВАС 2.0 после реализации WUI для него.

kilia07 commented 1 year ago

Добрый день! Да я писал, но подумал продублирую тут, тут вроде как все структурированней=)

AltGrF13 commented 5 months ago

Небольшое исследование через iptables-save &> /opt/tmp/iptables.txt до и после указанных действий при основном соединении SS для 192.168.1.32

  1. Добавляется REDIRECT
    :_NDM_UPNP_REDIRECT_0 - [0:0]
    -A PREROUTING -j _NDM_UPNP_REDIRECT_0
  2. Добавляется FORWARD
    :_NDM_UPNP_FORWARD_0 - [0:0]
    -A _NDM_FORWARD -j _NDM_UPNP_FORWARD_0
  3. Добавляется PROTECT
    -A _NDM_IP_PROTECT -p udp -m udp --dport 41100 -j _NDM_SL_PROTECT
    -A _NDM_IP_PROTECT -p tcp -m tcp --dport 41100 -j _NDM_SL_PROTECT
  4. Добавляется большой блок редиректов DNS, SSDP, NAT PMP
    -A _NDM_HOTSPOT_DNSREDIR -i br0 -p udp -m mark --mark 0xffffaab -m pkttype --pkt-type unicast -m udp --dport 53 -j REDIRECT --to-ports 41100
    -A _NDM_HOTSPOT_DNSREDIR -i br0 -p tcp -m mark --mark 0xffffaab -m pkttype --pkt-type unicast -m tcp --dport 53 -j REDIRECT --to-ports 41100
    -A _NDM_HOTSPOT_DNSREDIR -i br0 -p udp -m mark --mark 0xffffaab -m pkttype --pkt-type unicast -m udp --dport 1900 -j REDIRECT --to-ports 41300
    -A _NDM_HOTSPOT_DNSREDIR -i br0 -p udp -m mark --mark 0xffffaab -m pkttype --pkt-type unicast -m udp --dport 5351 -j REDIRECT --to-ports 41301
    -A _NDM_HOTSPOT_DNSREDIR -i br0 -p tcp -m mark --mark 0xffffaab -m pkttype --pkt-type unicast -m tcp --dport 1900 -j REDIRECT --to-ports 41300
    -A _NDM_HOTSPOT_DNSREDIR -i br1 -p udp -m mark --mark 0xffffaab -m pkttype --pkt-type unicast -m udp --dport 53 -j REDIRECT --to-ports 41100
    -A _NDM_HOTSPOT_DNSREDIR -i br1 -p tcp -m mark --mark 0xffffaab -m pkttype --pkt-type unicast -m tcp --dport 53 -j REDIRECT --to-ports 41100
    -A _NDM_HOTSPOT_DNSREDIR -i br1 -p udp -m mark --mark 0xffffaab -m pkttype --pkt-type unicast -m udp --dport 1900 -j REDIRECT --to-ports 41300
    -A _NDM_HOTSPOT_DNSREDIR -i br1 -p udp -m mark --mark 0xffffaab -m pkttype --pkt-type unicast -m udp --dport 5351 -j REDIRECT --to-ports 41301
    -A _NDM_HOTSPOT_DNSREDIR -i br1 -p tcp -m mark --mark 0xffffaab -m pkttype --pkt-type unicast -m tcp --dport 1900 -j REDIRECT --to-ports 41300
  5. Смена правил
    -A _NDM_HOTSPOT_PRERT -s 192.168.1.32/32 -i br0 -m connndmmark --mark 0x0/0x0 -j CONNNDMMARK --set-xmark 0x14/0x0
    -A _NDM_HOTSPOT_PRERT -s 192.168.1.32/32 -i br0 -j RETURN

    на

    -A _NDM_HOTSPOT_PRERT -s 192.168.1.32/32 -i br0 -m connndmmark --mark 0x0/0x0 -j CONNNDMMARK --set-xmark 0x14/0x0
    -A _NDM_HOTSPOT_PRERT -s 192.168.1.32/32 -i br0 -j MARK --set-xmark 0xffffaab/0xffffffff
    -A _NDM_HOTSPOT_PRERT -s 192.168.1.32/32 -i br0 -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff
    -A _NDM_HOTSPOT_PRERT -s 192.168.1.32/32 -i br0 -j RETURN

Мысли

Как минимум, проблема в том, что у устройства из альтернативной политики DNS трафик редиректится на порт 41100 (проблемные правила легко проверять через iptables-save | grep " 53 "). У всех там 41100? А если несколько политик?

Заставить Dnsmasq слушать два порта возможности нет, нужно что-то делать именно с этими правилами

-A _NDM_HOTSPOT_DNSREDIR -i br0 -p udp -m mark --mark 0xffffaaa -m pkttype --pkt-type unicast -m udp --dport 53 -j REDIRECT --to-ports 41100
-A _NDM_HOTSPOT_DNSREDIR -i br0 -p tcp -m mark --mark 0xffffaaa -m pkttype --pkt-type unicast -m tcp --dport 53 -j REDIRECT --to-ports 41100
-A _NDM_HOTSPOT_DNSREDIR -i br1 -p udp -m mark --mark 0xffffaaa -m pkttype --pkt-type unicast -m udp --dport 53 -j REDIRECT --to-ports 41100
-A _NDM_HOTSPOT_DNSREDIR -i br1 -p tcp -m mark --mark 0xffffaaa -m pkttype --pkt-type unicast -m tcp --dport 53 -j REDIRECT --to-ports 41100
AltGrF13 commented 5 months ago

Если в Web cli (по адресу /a) выполнить show dns-proxy, можно увидеть 2 профиля. У Policy0 видим настройку встроенного DNS Proxy с этим самым портом

dns_tcp_port = 41100
dns_udp_port = 41100

dns-proxy no intercept enable сообщает disable intercept for system profile. dns-proxy filter profile Policy0 no intercept enable не находит профиль Policy0. Т.е. команда отключения проксирования DNS работает лишь с профилем по умолчанию, не у политикового (где перехват и включен).

Если покопать, то узнаём, что DNS-прокси отключить нельзя из-за внутренних процессов в прошивке. При использовании политик работает безусловный перехват днс, тут это обсуждали.

opkg dns-override просто освобождает 53 порт, не отключает встроенный DNS целиком. При использовании профилей/политик DNS трафик, перехваченный встроенным в прошивку прокси, не достаётся дефолтному DNS, и такое поведение довольно тупо.

AltGrF13 commented 5 months ago

Есть такое костыльное решение (скрипт, который постоянно прибивает эти правила от Кинетика), нужно проверить. Но из-за этого какие-то ограничения политик могут перестать работать.

qzeleza commented 5 months ago

Благодарю Вас за столь подробные исследования вопроса. Просто отлично.

AltGrF13 commented 4 months ago

Как мне кажется, вопрос можно закрывать.

  1. Открытыми удобнее держать задачи, требующие вмешательства.
  2. Здесь решение весьма корявое, вмешивающееся в работу прошивки; внедрение этого для всех не выглядит хорошим решением.
  3. На форуме админами несколько раз велись разговоры об отключаемом DNS-прокси (собственно, команды dns-proxy no intercept enable и dns-proxy filter profile Policy0 no intercept enable растут оттуда же), но воз и ныне там (для политик не отключаемы). В общем, скорее, вопрос к Keenetic.