Исследовал блокировку 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 байт (данные), то он не подвергается статистическому анализу и подключение не блокируется.