Какова цель TPROXY, как его использовать и что происходит внутри?

Почитав немного о TPROXY (например, на https://www.kernel.org/doc/html/latest/networking/tproxy.html), у меня появилось больше вопросов, чем ответов . На самом деле я даже не знаю, что должен делать TPROXY...

Некоторые предположения о том, что я должен делать и что происходит внутри.
Можете ли вы исправить следующие предположения?

Насколько я понимаю, вам следует выполнить следующие команды (хотя я понятия не имею, почему):

  • iptables -t mangle -N DIVERT:
    • Создается цепочка с именем DIVERT.
    • Вы можете выбрать имя. (Пока это то же самое во всех командах).
    • Это должно быть частью mangle, потому что вы будете делать менее тривиальные вещи, чем перенаправление, блокировка и NAT.
  • iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT:
    • Цепочка PREROUTINGгарантирует, что после того, как TCP-пакет будет передан от сетевого устройства к ядру, самое первое, что произойдет, это его отправка на DIVERTцепь.
    • -p tcpгарантирует, что это не так для трафика, отличного от TCP.
    • -m socketгарантирует, что это не относится к пакетам, которые создают и закрывают соединение (например,SYN/ACK)
    • При удалении -p tcp -m socketTPROXY повлияет на все пакеты IP(v4). Это будет другая, но рабочая установка.
  • iptables -t mangle -A DIVERT -j MARK --set-mark 1:
    • Ядро пометит эти пакеты номером 1. Вы можете выбрать другой номер.
    • Также можно добавить к пакету несколько меток. Например: Добавив команду iptables -t mangle -A DIVERT -i eth0 -j MARK --set-mark 2, вы убедитесь, что все TCP-пакеты получают метку 1. ] и все TCP-пакеты, приходящие с eth0, получают как пометку 1, так и 2.
    • «Маркировка номером X» просто означает «отнесение к категории Xбез фактического изменения чего-либо в пакете».
    • И ядро, и программы в пользовательском пространстве могут считывать метки пакетов
    • Только ядро ​​может маркировать пакеты
  • iptables -t mangle -A DIVERT -j ACCEPT: По умолчанию ядро ​​отбрасывает пакеты, так что теперь вы убедитесь, что это не так.
  • IP-правило добавить fwmark 1 поиск 100:
    • Вместо использования таблицы маршрутизации по умолчанию все пакеты с пометкой 1теперь используют таблицу с именем 100.
    • Вы можете выбрать другой номер, если убедитесь, что везде используете тот же номер
  • ip route add local 0.0.0.0/0 dev lo таблица 100:
    • Создает таблицу 100, если она еще не существует.
    • Добавляет правило маршрутизации, которое гарантирует, что все пакеты, исходящие из нашей системы ( локальные), остаются локальными путем отправки их обратно в lo
    • Это относится к пакетам с любым пунктом назначения 0.0.0.0/0(каждый адрес ipv4 является членом этой подсети)
    • Но это не case для пакетов, которые не помечены 1(иначе они не попали бы в 100)
  • iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 50080:
    • Все пакеты, отправленные на tcp/80, получают метку 1и заканчиваются на tcp/50080
    • Для некоторых, по неизвестной мне причине, они отмечен. (Мне кажется, что они все равно проходят мимо DIVERTтам, где они отмечены снова)
    • По какой-то, мне неизвестной причине 0x1пишется дважды

Мое предположение о какова цель TPROXY: перенаправление пакетов без их изменения

1
задан 6 March 2021 в 13:47
1 ответ

«Повторная -маршрутизация без изменения» в основном технически правильна, но чтобы понять, для чего это нужно, лучше подумать о «перехвате» -обычно вы только «по -маршрутизируете» программу, которую вы написали., работающий на той же машине (, которая должна быть точкой доступа Wi-Fi клиента, или чем-то подобным, расположенным между ними и остальным миром ). Это способ получить в вашем C/C++/любом коде то, что выглядит как обычный TCP-сокет, на который вы можете отправлять ()и получать (), но на самом деле позволяет вам олицетворять их предполагаемое место назначения.

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

Взгляните на это.:https://github.com/FarFetchd/simple_tproxy_example

Это минимальный рабочий пример самой простой интересной вещи, которую вы можете сделать с этим, что может дать вам лучшее понимание «почему».

Что касается материала ip rule fwmark, я советую вам найти пример, который работает для вас, и просто рассматривать его как заклинание черной магии, если только вы не пытаетесь получить возможность выполнять серьезную работу разработчиков над самим сетевым стеком Linux.. Я имею в виду, что я считаю себя компетентным в iptables и проделал серьезную полезную работу с TPROXY, и я до сих пор нахожу ip rule fwmarkсовершенно загадочным, ха-ха.

0
ответ дан 15 October 2021 в 19:20

Теги

Похожие вопросы