Счётчик TPROXY может расти, а приложение при этом ничего не получает. Правило совпало, но локальная доставка по-прежнему зависит от маршрутизации по политике и подходящего принимающего сокета.

TPROXY в Linux может перехватывать трафик, не переписывая адрес назначения, как это делает DNAT. Поэтому пакеты, адресованные нелокальному получателю, должны доходить до подходящего локального сокета.

Пройдите по пути доставки

  1. Трафик приходит на узел перехвата через нужный интерфейс и семейство адресов.
  2. Правило перехвата и метка пакета задают политику локальной доставки.
  3. Подходящее правило политики выбирает маршрут, доставляющий пакеты локально.
  4. Прокси использует поддерживаемый прозрачный прослушиватель с нужным параметром сокета.

Пример IPv4 из ядра требует поддержки IP_TRANSPARENT со стороны приложения. Обычный прослушиватель на том же порту или глобальная настройка нелокального связывания такую поддержку не подтверждают.

НаблюдениеСледующая проверка
Нет подходящих входящих пакетовПуть трафика и входной интерфейс
Пакеты приходят, счётчик перехвата стоитСемейство адресов, цепочка и условия совпадения
Правило совпало, локальная доставка не удаётсяМетка и выбор маршрута политики
Сокет слушает, приложение ничего не видитВозможности прозрачного сокета и владелец прослушивателя
Запрос начинается, последующие ответы срываютсяСовпадение установленного сокета и обратные маршруты

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

Учтите последующие пакеты

Пример из ядра включает совпадение сокета и путь DIVERT, который помечает пакеты прозрачных сокетов. Если его опустить, последующий трафик может остаться на другом пути даже при успешном первом перехвате.

Используйте поддерживаемый приложением прозрачный режим и соответствующую документацию ядра для каждого семейства адресов. Команда локального маршрута для IPv4 не настраивает IPv6, а поддержка в одном семействе не подтверждает поведение сокета в другом.

TPROXY также не создаёт согласование SOCKS. Компонент перехода от прозрачного к SOCKS всё равно должен обнаружить назначение и договориться со своим вышестоящим сервером.

Переход с REDIRECT

Запишите, как существующее приложение получает исходное назначение. REDIRECT меняет назначение и опирается на подходящий механизм восстановления; TPROXY нужен свой прозрачный сокет и схема маршрутизации. Выбирайте по приложению и политике адреса источника.

Сопоставьте счётчики с выбранным маршрутом, возможностями сокета и журналом приложения, прежде чем менять режим перехвата. В дистрибутиве, где есть нужные средства, отсутствующий шаг доставки — лучшая отправная точка, чем пересборка ядра.

Похожие статьи