Как я могу предотвратить зацикливание перенаправлений с помощью iptables при работе с локальным форвардным прокси?

Вопрос или проблема

Я пытаюсь перенаправить исходящий трафик на форвардный прокси под названием mitmproxy, работающий на моем компьютере. Я пробовал использовать два подхода (см. ниже): один с использованием ttl и один с установкой метки. К сожалению, оба подхода создают сетевой цикл. Документация mitmproxy рекомендует создать отдельного пользователя для mitmproxy и фильтровать трафик на основе пользователя, но я ищу способ сделать это без создания другого пользователя. Есть ли лучший способ это сделать?

Подход с меткой

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

iptables -t nat -A OUTPUT -p tcp -m mark ! --mark 1 --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A OUTPUT -p tcp -m mark ! --mark 1 --dport 443  -j REDIRECT --to-port 8080
# установить метку
iptables -t mangle -A POSTROUTING -p tcp -j CONNMARK --set-mark 1

удалить правила метки с:

iptables -t nat -D OUTPUT -p tcp -m mark ! --mark 1 --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -D OUTPUT -p tcp -m mark ! --mark 1 --dport 443 -j REDIRECT --to-port 8080
iptables -t mangle -D POSTROUTING -p tcp -j CONNMARK --set-mark 1

Подход с TTL

Здесь я перенаправляю пакет на прокси по 8080, если TTL не был уменьшен.

iptables -t nat -A OUTPUT -p tcp -m ttl --ttl-gt $TTL_SIZE --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A OUTPUT -p tcp -m ttl --ttl-gt $TTL_SIZE --dport 443 -j REDIRECT --to-port 8080

удалить правила TTL с:

iptables -t nat -D OUTPUT -p tcp -m ttl --ttl-gt $TTL_SIZE --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -D OUTPUT -p tcp -m ttl --ttl-gt $TTL_SIZE --dport 443 -j REDIRECT --to-port 8080

Я адаптировал этот пост на stackoverflow в следующий код, который, похоже, работает для меня. То, что мне не хватало, это фильтрация по исходному порту.

#! /bin/bash

echo "____ПЕРЕД ЛЮБЫМИ ИЗМЕНЕНИЯМИ:"
sudo iptables -t nat --line-numbers -n  -L OUTPUT

echo "____ИЗМЕНЯЮ"
# https://docs.mitmproxy.org/stable/howto-transparent/
iptables -t nat -A OUTPUT -p tcp --sport 80 --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A OUTPUT -p tcp --sport 443 --dport 443 -j REDIRECT --to-port 8080

echo "____ИЗМЕНЕНО"
sudo iptables -t nat --line-numbers -n  -L OUTPUT

echo "нажмите enter для продолжения"
read var1

echo "____ПЕРЕД ВОЗВРАТОМ:"
sudo iptables -t nat --line-numbers -n  -L OUTPUT

echo "____ВОЗВРАЩАЮ"
iptables -t nat -D OUTPUT -p tcp --sport 80 --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -D OUTPUT -p tcp --sport 443 --dport 443 -j REDIRECT --to-port 8080 

echo "____ПОСЛЕ ВОЗВРАТА"
sudo iptables -t nat --line-numbers -n  -L OUTPUT

Ответ или решение

Запуск локального прокси-сервера, такого как mitmproxy, может вести к проблемам с зацикливанием перенаправления, особенно если правила iptables настроены неправильно. Я расскажу, как избежать этой проблемы, основываясь на различных подходах к фильтрации трафика.

Понимание проблемы с зацикливанием перенаправления

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

Решение с использованием маркировки

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

# Настройка NAT для перенаправления к прокси
iptables -t nat -A OUTPUT -p tcp -m mark ! --mark 1 --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A OUTPUT -p tcp -m mark ! --mark 1 --dport 443 -j REDIRECT --to-port 8080

# Установка метки для пакетов
iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner <your-username> -j CONNMARK --set-mark 1

Здесь важно использовать опцию --uid-owner, чтобы пометить трафик, исходящий от вашего пользователя, что позволит избежать зацикливания, перенаправляя только трафик не отмеченных пакетов.

Решение с использованием TTL

Другим подходом к решению данной проблемы является корректировка значения TTL (времени жизни). Если вы хотите использовать этот метод, убедитесь, что изменяете TTL для трафика, перенаправляемого к proxy:

# Перенаправление трафика в зависимости от TTL
iptables -t nat -A OUTPUT -p tcp -m ttl --ttl-gt 64 --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A OUTPUT -p tcp -m ttl --ttl-gt 64 --dport 443 -j REDIRECT --to-port 8080

Здесь TTL устанавливается таким образом, чтобы определять пакеты, пришедшие от локальной системы, не превышающие этого значения.

Итоговые рекомендации

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

  2. Проверка и обход зацикливания: Убедитесь, что ваши правила корректно определяют и обрабатывают трафик, исходящий от локальной системы.

  3. Обдейт документов и тесты: Всегда следите за актуальным состоянием документации mitmproxy и проводите тестирование на регулируемой среде перед применением их на продуктивной системе.

Используя эти методы, вы сможете перестать сталкиваться с проблемами перенаправления и успешно использовать mitmproxy на своем устройстве.

Оцените материал
Добавить комментарий

Капча загружается...