Вопрос или проблема
Я пытаюсь перенаправить исходящий трафик на форвардный прокси под названием 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 устанавливается таким образом, чтобы определять пакеты, пришедшие от локальной системы, не превышающие этого значения.
Итоговые рекомендации
-
Соблюдайте аккуратность при настройке правил: Важно применять и тестировать правила один за другим, чтобы отслеживать их влияние на сетевой трафик.
-
Проверка и обход зацикливания: Убедитесь, что ваши правила корректно определяют и обрабатывают трафик, исходящий от локальной системы.
-
Обдейт документов и тесты: Всегда следите за актуальным состоянием документации mitmproxy и проводите тестирование на регулируемой среде перед применением их на продуктивной системе.
Используя эти методы, вы сможете перестать сталкиваться с проблемами перенаправления и успешно использовать mitmproxy на своем устройстве.