Вопрос или проблема
Я использую iptables для перехвата входящего трафика сайдкара и использую режим tproxy.
Вот моё решение:
iptables -t mangle -A PREROUTING -j TSTF_PREROUTING
iptables -t mangle -A TSTF_PREROUTING -p tcp --tcp-flags SYN,ACK SYN,ACK -j RETURN
iptables -t mangle -A TSTF_PREROUTING ! -i lo -p tcp -m conntrack ! --ctstate ESTABLISHED -j TPROXY --on-port 20092 --on-ip 0.0.0.0 --tproxy-mark 0x1/0x1
ip rule add fwmark 0x1/0x1 pref 100 table 100
ip route add local default dev lo table 100
PS: прокси сайдкара слушает на 20092.
Вот в чём проблема: это работает на ядре 5.x, но не работает на ядре 3.10.
Решение заключается в перехвате sync и ack для tproxy, но в обход SYN,ACK, чтобы запрос, начиная с контейнера, не пострадал.
curl 10.28.121.25 # с внешнего curl IP пода
Вот tcpdump:
вставьте описание изображения здесь
Вы можете увидеть, что последний ack сбрасывается.
Это меня сбивает с толку.
Есть идеи по этому поводу? Спасибо.
PS: Правило iptables istio слишком сложное, я пытаюсь сделать простое.
Ответ или решение
Использование TPROXY в iptables для перехвата входящего трафика в среде, построенной на ядре Linux, – задача, требующая внимательного подхода, особенно когда речь идет о различных версиях ядра. В вашем случае, вы применяете настройки для работы с TPROXY в ядре 3.10, но они не функционируют должным образом, как в более новых версиях, таких как 5.x.
Анализ ситуации
Вы правильно создали правила iptables для настройки TPROXY. Давайте разберем, почему они могут не работать в ядре 3.10:
-
Поддержка функций: Ядро 3.10 имеет менее широкую поддержку некоторых функций, чем ядра 5.x. Например, поддержка TPROXY была значительно улучшена в более поздних ядрах. Убедитесь, что ваш текущий дистрибутив поддерживает весь функционал, который вы хотите реализовать.
-
Проблемы сState-проверками: В вашем правиле:
iptables -t mangle -A TSTF_PREROUTING -p tcp --tcp-flags SYN,ACK SYN,ACK -j RETURN
вы, по всей видимости, пытаетесь избежать воздействия на SYN-ACK пакеты. Возможно, проблема заключается в том, что версия ядра 3.10 обрабатывает состояния соединений не так, как более новые версии. Проверьте настройки модуля
conntrack
и убедитесь, что он правильно настроен для работы с состояниями соединений. -
Основные ограничения ядра: Вам следует рассмотреть возможность ограничений по производительности и функционалу ядра 3.10 в рамках вашего приложения. Контейнеры могут по-разному обрабатывать сетевой стек, и некоторые возможности могут отсутствовать.
Рекомендации по устранению
Для устранения проблемы с вашим текущим сетевым конфигом рассмотрите следующие шаги:
-
Обновление ядра: Если возможно, обновите ядро до более новой версии (например, 4.x или 5.x). Это даст вам доступ к улучшенному функционалу и исправленным ошибкам.
-
Логирование и анализ: Используйте инструменты мониторинга и логирования, такие как
tcpdump
иiptables-save
, чтобы проверить, как именно трафик проходит через ваши правила аналогично тому, как вы делали это в 5.x. Это поможет выявить несоответствия и понять, на каком этапе происходит сбой. -
Тестирование на разных конфигурациях: Попробуйте способ перенаправления трафика без использования TPROXY, чтобы увидеть, работает ли это. Например, используйте простое перенаправление с помощью DNAT. Это поможет понять, на чем рвется ваша конфигурация.
-
Проверка подключения: Убедитесь, что контейнеры могут корректно обрабатывать SYN и ACK пакеты без какой-либо потери. Возможно, потребуется разделение функционала на уровне приложения и сетевого стека.
Заключение
Несомненно, использование TPROXY в ядре 3.10 может оказаться вызовом. Однако путем тщательной диагностики и возможного обновления окружения можно достигнуть желаемого результата. Постарайтесь проанализировать текущие настройки и следуйте рекомендациям, чтобы улучшить свою конфигурацию сетевых правил.