Zapret: обсуждение

У меня возникло несколько теоретических и любопытных вопросов к @bolvan, натолкнуло на них меня предупреждение о сложностях с nat внутри виртуальных машин. Сами вопросы не связаны с nat на vm.

Первый вопрос. Предположим, что внутри моей локальной сети работает только ipv6 адресация, роутер на котором и установлен zapret получает только динамический ipv4. На роутере работает nat64 и dns64. Механизм перехвата nfqws должен работать после nat64? То есть в теории всё должно работать нормально, или я что-то упускаю?
Второй вопрос. Тут всё сложнее. Скажем у меня есть две квартиры. Они связаны друг с другом тоннелем, через промежуточный сервер в России, сервер отдаёт статический ipv6 /56 префикс. Я связываю две квартиры в единую ipv6 сеть. Все устройства имеют ULA и GUA адреса. Куда в этом случае лучше ставить zapret. На сервер? На каждый роутер? На всех сразу?

Сложности с nat внутри VM связаны исключительно с кривой реализацией NAT в гипервизорах некоторых решений по виртуализации. Конкретно есть проблемы в vmware и virtualbox. Другие не проверял.
Реализация обеспечивает потребности нормальных соединений, но ломает нестандартные случаи.

  1. nat64 не проверял. Теоретически в схеме nftables postnat nfqws должен получать исходящий трафик ipv4 после всех преобразований. nfqws должен быть последним в цепочке, чтобы он работал корректно. С iptables все сломается скорее всего.
  2. Зависит от маршрутизации. Ставить zapret оптимальнее всего на выходное звено в инет. Потому что там он будет один. Хотя в случае ipv6 нет nat и создаваемых им проблем, поэтому сработает отовсюду. Но важно не сделать двойной zapret. Когда один дурит, а второй дурит то, что задурил первый.

Сделал кое-какой патч по поводу интерфейсов в flow table для hardware offload.

Итак, что мы видим в flow таблицах на ipoe.

nft list flowtable inet fw4 ft
table inet fw4 {
        flowtable ft {
                hook ingress priority filter
                devices = { lan1, lan2, lan3, lan4, phy0-ap0, phy0-ap1, phy1-ap0, phy1-ap1, wan }
                flags offload
                counter
        }
}
nft list flowtable inet zapret ft
table inet zapret {
        flowtable ft {
                hook ingress priority filter - 1
                devices = { lan1, lan2, lan3, lan4, phy0-ap0, phy0-ap1, phy1-ap0, phy1-ap1, wan }
                flags offload
        }
}

Как видно, они идентичны по интерфейсам.

В случае pppoe fw4 засовывает либо не засовывает pppoe-wan в зависимости от того как задан интерфейс в /etc/config/network
Вариантов может быть 2. Это либо type=pppoe в интерфейсе wan, либо пассивный интерфейс wan (type=static/none) и отдельный интерфейс для pppoe, где device=@wan
В одном случае fw4 сует pppoe-wan , в другом не сует.
zapret сует всегда.

Другая разница в том, что в zapret инициация offload-а происходит только по исходящему трафику. В fw4 - по обоим направлениям.

Хотя новые ядра и принимают в hard offload wifi интерфейсы, они реально не работают на хард оффлоад, но работают на soft offload.
На хард работает только то, что висит на свитче. Проводочки.

Девайс MT7621

Как легко протестировать работает ли оффлоад.

Запускаем спидтест или любую загрузку/выгрузку.
Смотрим как изменяется counter. Если там мало, значит работает.

nft list chain inet zapret flow_offload
table inet zapret {
        chain flow_offload {
                tcp dport { 80, 443 } ct original packets 1-9 ip daddr != @nozapret return comment "direct flow offloading exemption"
                udp dport { 443, 500, 4500 } ct original packets 1-9 ip daddr != @nozapret return comment "direct flow offloading exemption"
                meta l4proto { tcp, udp } flow add @ft
                meta l4proto { tcp, udp } counter packets 13242 bytes 947561 comment "if offload works here must not be too much traffic"
        }
}

Это все сделано чисто для openwrt устройств и не влияет на работу аппаратного оффлоада в других прошивках? Например в keeneticos на arm устройствах там аппаратный оффлоад неотключаемый

Если оффлоад не отключается, то nfqws не получится завести.
Он не будет получать трафик.
Хотя есть вариант локализовать трафик через transparent tpws. Именно так и делал на хуавеи модемах.
Речь шла о выборочном управлении offload на openwrt в скриптах запуска zapret, когда системная установка отключена

Неск постов назад кто-то жаловался, что с системной установкой работает, а с zapret не работает

Странно, тогда я возможно что-то перепутал, но на кинетиках nfqws работает без проблем или ими названный сетевой ускоритель это не оффлоад? Если это все таки оффлоад и на некоторых моделях как написано он неотключаем, как эксперт тогда скажите почему все таки nfqws работает, хотя вы пишите что он по логике не должен

Если nfqws работает, то оффлоада нет. По крайней мере по первым пакетам соединения.
Обычно offload запускается на этапе tcp handshake, и больше в netfilter соединение не фигурирует.
Если это так, то nfqws не может работать

Спасибо,уточню тогда у поддержки кинетик как они реализовали работу nfqws при по умолчанию включенном оффлоаде

Если напишут что-то интересное, поделитесь pls.

Цель любого offload-а - сократить участие процессора в процессе передачи пакетов с одного интерфейса на другой с попутной модификацией заголовков вплоть до L4 (NAT).
Есть стандартный путь пакета в linux, который проходит через систему netfilter.
Грубо говоря схема такая : ingress - netfilter - egress
Чтение и передача пакетов обычно работают через DMA. Сетевой адаптер читает данные прямо из памяти, проц их в основном не вычитывает из регистров адаптера как при PIO.
Часть функций по вычислению или проверке чексум так же забирает на себя адаптер. На дешевых роутерах может не забирать.
Но в любом случае какая-то трата проца и шины данных на технические нужды и передачу байтиков все равно есть.
Полный оффлоад внутри свитча вообще исключает задействование процессора. Нет ни ingress, ни egress. Потому на гигабитном спидтесте cpu даже не шелохнется.
software оффлоад в стандартном linux ядре представляет собой “fast path”. ingress → fast_path → egress.
fast_path - это простенький обработчик, который кэширует в таблице пары ип адресов и портов и информацию что с ними делать. Поддерживает и nat. Все это в замещение тяжелого netfilter. iptables/nftables тут не работают.
Потому ускорение происходит, но не такое значительное, как при hardware.

Вопрос : какова схема в кинетике, при которой может работать классификатор трафика и шейпер ?
А если еще и nfqws работает, то работают и iptables. Как такое возможно ? В чем состоит ускорение ?
Интересно и как реализован offload между ethernet и wifi

Нашёл примеры IP адресов у одного впн-сервиса (torguard. net), которые начисто заблокированы на ТСПУ. Через zapret их не получается пробить никак для подключения к ним по wireguard. По крайней мере мне не удалось.
Если кто из старожил форума хочет попробовать поиграться с ним, чтобы проверить какая стратегия пробьёт подключение к нему по wireguard, то напишите в теме и в личке - предоставлю конфиг для тестирования.

У нас этого гуталина этих адресов - полный консенсус. С каких бы пор блоки по IP вообще пробивались zapret?

С iptables все сломается скорее всего.

Это очень интересно. Как люди вообще жили без nftables с возможностью задавать приоритеты? Какая же мука была работать с набором жёстких последовательных таблиц.

В том числе для этого и придумали nft.
С iptables-legacy только править код модулей ядра

ДВ, р*стелек*м, сегодня каким-то чудесным образом навернулись все стратегии где используется dpi-desync=fake; что с опцией dpi-desync-fake-tls до файла с clienthello, что без нее. :thinking:

МТС, Дальневосточный регион. Подтверждаю, все стратегии с fake не работают.

Опять,видимо, в определенных регионах что-то тестят

В Wireshark вот такие ответы приходят.

Спойлер

UPD: Если сделать батник (использовать фейк), чтобы он дурил все сайты, то умирают все сайты. Не понимаю, как они детектят фейк.

UPD 2: Все что работает, это disorder или multidisorder (фейк нельзя использовать). Но такое подходит не всем сайтам, там и фейк тоже им нужен.

На это и был рассчет, что фейк гугла использовали для пробития ggc

Подтверждаю. Тоже используется на ДВ рстелекм и не работает стратегия dpi-desync=fake для подключения к дискорду. Не нашёл ещё рабочего варианта

ByeDPI с использованием фейка пробивает ютуб. Странно, как-то.