Прозрачый прокси: по каким цепочкам IPTables проходят пакеты из инета в LAN?

Автор: DRVTiny Дата: 04.04.2006 16:26 У меня осуществляется прозрачный REDIRECT всего HTTP-трафика, направляющегося в Интернет из LAN, на SQUID, т.е. осуществляется прозрачное проксирование HTTP-трафика.
В принципе, мой вопрос предельно чётко сформулирован в названии самой темы топика, но на всякий случай поясняю, что именно меня смущает:
Вопрос в следующем: попадают ли пакеты, направляемые с веб-серверов в Интернет клиентам LAN через прозрачный прокси в цепочку iptables -A FORWARD -i $extIF -o $intIF, или же эти пакеты сначала попадают в INPUT из Интернета на шлюз (частично попадая в кеш прокси), потом - в OUTPUT со шлюза на машины локальной сети? Есть ещё и третий вариант:сначала пакеты идут по цепочке INPUT из Интернет на шлюз, потом из-за редиректа оказываются в цепочке "FORWARD из инета", т.е. если я отправлю программе учёта трафика пакеты из "INPUT'а на шлюз" и из "FORWARD'а из Инета через шлюз", то я, таким образом, "учту" один и тот же HTTP 2 раза!
Пожалуйста, если кто-нибудь разбирается в том, **как именно**, через какие цепочки IPTables проходят те пакеты, которые идут из Интернет через локальный прокси, объясните это мне хотя бы очень лаконично, но доходчиво (только не матом Улыбка ). Дело в том, что мне пока что **абсолютно** непонятен сам механизм функционирования прозрачного прокси на пути HTTP-пакетов: с одной стороны, пакеты передаются в сокет на шлюзе, что можно делать только через INPUT и OUTPUT-цепочки, а с другой стороны - ведь заворачивается-то не какой-нибудь, а именно FORWARD-трафик! Стандартные схемы прохождения пакетов через IPTables (все эти рисунки, ссылки на котрые так любят давать в качестве "наглядного пособия";-) не помогают понять, как может FORWARD быть всё-таки не FORWARD'ом???
Re: Прозрачый прокси: по каким цепочкам IPTables проходят пакеты из инета в LAN? 04.04.2006 16:44DRVTiny Пока что методом проб и ошибок пришёл к тому выводу, что трафик, проходящий через прозрачный прокси, в плане фильтрации (с точки зрения IPTables), ничем ен отличается от трафика обычного прокси...
Я прав или не совсем?
Re: Прозрачый прокси: по каким цепочкам IPTables проходят пакеты из инета в LAN? 05.04.2006 09:22Ladur нифига не понял где прокси - в локалке или на шлюзе?
Re: Прозрачый прокси: по каким цепочкам IPTables проходят пакеты из инета в LAN? 05.04.2006 20:16DRVTiny Я слово "шлюз", наверное, с 10-ок раз употребил в своём первом посте. Именно на нём, на интернет-шлюзе, и стоит прокси, а где ещё-то он по-Вашему может "иметь место быть"?
Re: Прозрачый прокси: по каким цепочкам IPTables проходят пакеты из инета в LAN? 21.04.2006 12:42Neo91 не попадает трафик прокси в цепочку FORWARD по той простой причине что этот трафик принадлежит локальному процессу, по этому должны быть правила в INPUT и OUTPUT, а трафик который проходит через шлюз, почта например проходит через цепочку FORWARD. То есть если что то обрабатывает на шлюзе трафик то INPUT OUTPUT если просто проходит мимо) то FORWARD
Re: Прозрачый прокси: по каким цепочкам IPTables проходят пакеты из инета в LAN? 16.05.2006 17:10lyo Абсолютно верно.
Но, не забывай, что это nat-цепочка. Посему, если тебе это нужно для подсчета трафика, то получить значение кол-ва пакетов/байт, прошедших по этой цепочке можно так:
iptables -t nat -L -v
Re: Прозрачый прокси: по каким цепочкам IPTables проходят пакеты из инета в LAN? 17.05.2006 10:49dvc Изначально пакет идет так:
запрос
LAN_ip:unpriv_port -> nat (PREROUTING) -> filter (FORWARD) -> nat (POSTROUTING) -> inet_ip:80
ответ
inet_ip:80 -> nat (PREROUTING) -> filter (FORWARD) -> nat (POSTROUTING) -> LAN_ip:unpriv_port


Когда ты делаешь прозрачное проксирование, то маршрут меняется так:
запрос:
LAN_ip:unpriv_port1 -> nat (PREROUTING) -> localhost:3128 -> localhost:unpriv_port2 > nat (PREROUTING) -> filter (OUTPUT) -> nat (POSTROUTING) -> inet_ip:80

ответ:
net_ip:80 -> nat (PREROUTING) -> filter (INPUT) -> nat (POSTROUTING) -> localhost:unpriv_port2 -> localhost:80 -> nat (PREROUTING) -> filter (OUTPUT) -> nat (POSTROUTING) -> LAN_ip:unpriv_port1


Что тут можно прокомментировать:
1) При переходе nat (POSTROUTING) -> inet_ip:80 происходит маскирование. Если это транзитный пакет, то подменяется на адрес внешнего интерфейса адрес из локалки. Если это сквид, то подменяется localhost. При ответе происходит обратная операция.
2) Если ты делаешь прозрачное проксирование, то, насколько я понимаю, в nat (PREROUTING) не меняется ничего - iptables всовывает пакет в нужный локальный порт (3128) с криком "вы не поверите, но это вам". Именно поэтому на другом конце провода должно быть приложение, которое такие шуточки (прозрачное проксирование) понимает. Оно (сквид в данном случае) берет под козырек и делает свое маскирование, подменяя адрес отправителя на localhost. На обратном пути никаких редиректов не происходит. Просто сквид получает свой, честно запрошенный пакет... и отдает его в соответствии со своей таблицей маскировки, не забывая подделать и адрес отправителя. Впрочем, какое-то модифицирование пакета всё-таки происходит, потому что я попробовал шифрованный трафик одного приложения (не веб) прозрачно проксировать - дык не вышло. Какие-то проверки уже не проходят...


Доказать эти рассуждения очень просто:
В filter (forward) запрети исходящие из локалки на внешний 80-й порт (это необязательно, всё равно у тебя в таблице nat (Prerouting) эти запросы редиректятся, но убедишься, что через forward эти пакеты не идут).
И попробуй обрезать исходящие с шлюза на 80-й порт в цепочке filter(Output). Вся сетка окажется без инета (а не только шлюз).
Можно поиграть и запретить только исходящие в локальную сетку с 80-го порта. Тогда на шлюзе инет будет, а в сетке - нет.

Вот тебе и ответ. Правда в том, что тебе нужно считать прокси трафик (не обязательно только 80-й порт, может быть и 443 и 8080 и 3128 и т.п.) по прокси логам, а всё остальное тебе не даст точного ответа.
Почему? Потому что ты можешь замерить на шлюзе сколько было отдано сквидом трафика локальным пользователям через filter(OUTPUT). Причем именно разделить по локальным ip-адресам. И ты можешь измерить сколько сам сквид, от своего имени вытянул из инета через filter(INPUT). И эти данные будут отличаться, на ту разницу, сколько тебе сэкономил сквид за счет кэширования. И только сам сквид точно знает, сколько, откуда и кому он вернул...

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


Разумеется, это всё для случая, когда тебе нужно анализировать трафик по внутренним адресам. А если хватает суммарного, то проблем вообще нет.
Re: Прозрачый прокси: по каким цепочкам IPTables проходят пакеты из инета в LAN? 18.05.2006 07:13Neonovice Добавлю свои 5 копеек, хотя я восе не специалист по iptables.
Недавно поднял у себя на шлюзе, на котором стоит H323-proxy, и который являтся шлюзом для 10-ка хостов с обеспечением традиционных интернет запросов, ipt_account (http://www.barbara.eu.org/~quaker/ipt_account/index.html.en). Именно для более точного подсчета траффика от и к разным хостам в локалке, включая сам шлюз. Меня тоже интересовал вопрос, сколько раз учтется разнообразный траффик в цепочках INPUT, FORWARD и OUTPUT.
Ответ оказался прост и очевиден даже из поверхностного анализа логов.
И он полностью совпадает с тем, что написали коллеги ранее.
А написал я это именно чтобы порекомендовать использование модуля ipt_account, даже если имеются другие считалки.
RSS-материал