Всего лишь надо подумать откуда берется hostname и какую роль он играет в механике подключения через ipsec.
DNS - это протокол необязательный для инета. Его цель - заресолвить имя в IP адрес. Это производится отдельным протоколом, который zapret не перехватывает , не анализирует, не запоминает имена и результат их ресолва, не соотносит с дальнейшей механикой подключения по каким-либо другим протоколам. DNS сразу отпадает.
Как может еще zapret получить hostname ? Некоторые протоколы его передают как часть себя. Для http это хедер Host: , для TLS - SNI.
А что у нас для IKE ? НИЧЕГО.
Соответственно хоста у нас нет.
Тогда как будет работать хостлист ?
Никак он не будет работать
tpws может брать hostname из запроса socks с удаленным ресолвом хостов. Но tpws работает только с tcp, здесь он неприменим. socks без удаленного ресолва хостов или прозрачный режим, и tpws тоже ничего не знает о hostname иначе, чем анализируя основной известный ему протокол.
Вывод : отказаться от фильтра по хосту , при необходимости использовать ipset-ы, а если IP мало - использовать дополнительные правила в ip/nf tables. Для linux писать custom script, тк параметры --ipset запрещены в скриптах запуска, а дополнительные параметры иначе не пронести. Хотя --ipset сработает при ручном запуске, это будет плохим решением
bolvan
Понятно. И про хост и про написание скриптов. Для меня займет уйму времени изучение, тестирование… Материал глубокий. А ведь надо работу работать…
Пока решил препарировать ipobfs (kmod). Собрал сразу, но для старых архитектур пришлось повозиться с SDK.
В общем, установил на два конца для тестирования. Принцип понятен. Реализация тоже более менее. Но костыли, как всегда, есть.
Во-первых - u32 под оперврт есть (кмод-ipt-u32). Но с 23.05 iptables правила u32 все равно не заводятся.
C netfilter реально запустить? (АПДЕЙТ. Вроде сработал u32. Но все равно хотелось бы знать - по логике, если заставить netfilter маркировать пакеты, какая разница для ипобфс?..)
А во-вторых, использую xfrm интерфейс, который уже маркирует пакеты… Вот интересно, можно этот марк использовать, или на выходе из eth0 отдельно маркировать обязательно?
правила iptables поставились, пакеты хукаются, счетчики iptables крутятся. На обоих концах.
инсмод тоже с параметрами запустился, и главное, туннель не умер.
НО пинги больше не ходят… ПРИ ЭТОМ при пинге счетчики пакетов на туннеле увеличиваются.
tcpdump после установки insmod с параметрами затыкается и больше не ловит пакеты по указанным портам (что полагаю, хорошо). После рммод тцпдамп оживает на лету.
…но вот пинги при включенном инсмоде… При том что туннель жив. Ощущение, что ломаются маршруты…
Единственный критерий, по которому модуль ipobfs что-то делает с трафиком, это наличие определенных битов в mark по указанной маске.
Их нужно выставлять в iptables/nftables.
Если у вас сделано выставление с учетом входящего интерфейса eth0, это значит, что mark пакета сохранился на его пути в ipsec0. Я не проверял этот случай. Если же фильтра по eth0 нет в правилах, его надо сделать
смотрю код. там сделан сброс битов mark после процессинга
|// clear mask bits to avoid processing in post hook|
skb->mark &= ~markmask;
напишите ваши правила установки марка и параметры запуска модуля ipobfs
нельзя применять нулевой марк
примерно так это работает
Исследовал блокировку VPN. Было интересно, как ТСПУ определяет протокол openvpn (UDP), в котором нет регулярных последовательностей.
Для исследования отправлял пакеты с помощью socat. Провайдер мобильный мегафон.
Вот что выяснил:
Первые 5 пакетов проходят без блокировки. После этого соединение анализируется. Для теста отправлял случайные данные из /dev/random. Отслеживание подключения производится по группе {SRC IP, DST IP, SRC PORT, DST PORT}. Удаление из таблицы отслеживания подключений производится по таймауту. Направление первого пакета не влияет на блокировку.
Производится статистический анализ 0\1 в первом пакете. Даже незначительное преобладание 0 или 1 приводит к разрешению подключения, достаточно добавить 2-4 нулевых байта в первый пакет.
Если заменять часть данных символом ‘f’, у которого количество 0 и 1 одинаковое, то для прохождения фильтра нужно заполнить им примерно половину пакета. Скорее всего есть отдельная проверка на одинаковость байт. Содержимое всех пакетов кроме первого в анализе не используется. Предположу, что они используются для поиска сигнатур известных протоколов.
Если первый пакет короче 83 байт (данные), то он не подвергается статистическому анализу и подключение не блокируется.
Из-за этого у меня на поволжском филиале мобильного Мегафона уже несколько дней даже AmneziaWG не работает при подключении к серверу на котором тоже AmneziaWG. На клиенте просто выставил Jmax 80 (до этого было рекомендованное 1000) и теперь снова стало работать.
На мобильном Билайне у меня пока такая проблема отсутствует.