Почитав немного о 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 socket
TPROXY повлияет на все пакеты 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 является членом этой подсети)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: перенаправление пакетов без их изменения
«Повторная -маршрутизация без изменения» в основном технически правильна, но чтобы понять, для чего это нужно, лучше подумать о «перехвате» -обычно вы только «по -маршрутизируете» программу, которую вы написали., работающий на той же машине (, которая должна быть точкой доступа Wi-Fi клиента, или чем-то подобным, расположенным между ними и остальным миром ). Это способ получить в вашем C/C++/любом коде то, что выглядит как обычный TCP-сокет, на который вы можете отправлять ()и получать (), но на самом деле позволяет вам олицетворять их предполагаемое место назначения.
Использование может заключаться в прозрачном проксировании трафика через некоторые настройки, настолько экзотические, что даже, например,. тщательно настроенный Wireguard может справиться с этим, и вместо этого вам нужно написать свою собственную настоящую программу, чтобы заставить ее работать.
Взгляните на это.:https://github.com/FarFetchd/simple_tproxy_example
Это минимальный рабочий пример самой простой интересной вещи, которую вы можете сделать с этим, что может дать вам лучшее понимание «почему».
Что касается материала ip rule fwmark
, я советую вам найти пример, который работает для вас, и просто рассматривать его как заклинание черной магии, если только вы не пытаетесь получить возможность выполнять серьезную работу разработчиков над самим сетевым стеком Linux.. Я имею в виду, что я считаю себя компетентным в iptables и проделал серьезную полезную работу с TPROXY, и я до сих пор нахожу ip rule fwmark
совершенно загадочным, ха-ха.