Почему невозможно прозрачное проксирование на localhost?

Аватар пользователя DRVTiny

Т.е. почему не работает такой вариант:

iptables -t nat -A OUPUT -p tcp -s <один из сетевых интерфейсов компьютера> --sport 1024: --dport 80 -j REDIRECT --to-port 3128
+ на порту 3128 работает SQUID в режиме HTTP-акселлератора (т.е. в прозрачном режиме)

Я много раз читал обсуждения этого вопроса на различных форумах, но ни разу не встречал хоть сколько-нибудь вразумительного, научно обоснованного так сказать, ответа на него Грустный Почему итрафик из локальной сети можно перенаправлять на прозрачный прокси, а трафик, генерируемый на самом компьютере с iptables - нет?

Аватар пользователя woodoo

Re: Почему невозможно прозрачное проксирование на localhost?

Сам сквид под это правило не попадает?

Аватар пользователя DRVTiny

Re: Почему невозможно прозрачное проксирование на localhost?

Нет, поскольку SQUID находится на другом сетевом интерфейсе:
http_port 127.0.0.1:3128
iptables -t nat -A OUPUT -p tcp -s 192.168.1.1 --sport 1024: --dport 80 -j REDIRECT --to-port 3128
И почему это не работает, может мне кому-нибудь объяснить?

Аватар пользователя DRVTiny

Re: Почему невозможно прозрачное проксирование на localhost?

Что-то я туплю очень сильно...
Хорошо, а если так:

http_port $LOOPBACK:3128
iptables -t nat -A OUPUT -p tcp -s $EXTERNAL_INTERFACE --sport 1024: --dport 80 -j DNAT --to-destination 127.0.0.1:3128

Ведь в заголовках протокола HTTP адрес назначения уже есть, так что по идее SQUID без проблем может переадресовать поступивший на его вход HTTP-трафик... Или я опять чего-то недопонимаю?
Может, здесь образуется петля: с внешнего интерфейса пакет идёт на loopback (squid), потом squid'ом пакет снова отправляется с внешнего интерфейса, опять заворачивается на squid и так до бесконечности? Может, в этом случае какие-нибудь модули conntrack помогут (для того, чтобы ассоциировать OUTPUT-пакеты прозрачного прокси и те пакеты, попавшие под REDIRECT)?

Аватар пользователя woodoo

Re: Почему невозможно прозрачное проксирование на localhost?

Обоими правилами заворачиваются все исходящие соединения всех локальных процессов по tcp с "верхних" портов на 80 порт.
Сквид в этом плане не исключение.

Аватар пользователя DRVTiny

Re: Почему невозможно прозрачное проксирование на localhost?

Да почему все-то, если , например, запросы от браузера идут с loopback-интерфейса, а SQUID может быть при этом привязан к IP-адресу сетевой карты или к любому другому IP, являющемуся локальным. Вы на ключ -s не обратили внимание?
Ведь когда SQUID, висящий на реальном сетевом интерфейсе, сгенерирует пакет, то этот пакет уже будет иметь адрес назначения, равный IP интерфейса, а не 127.0.0.1!
Я, пожалуй, попробую сейчас такой вариант:
http_port IP_адрес_интерфейса_eth0:3128
iptables -t nat -A OUPUT -p tcp -s 127.0.0.1 --sport 1024: --dport 80 -j DNAT --to-destinationIP_адрес_интерфейса_eth0:3128

Аватар пользователя DRVTiny

Re: Почему невозможно прозрачное проксирование на localhost?

Читали?
http://www.freesource.info/wiki/Stat'i/NastrojjkaSeti/NastrojjkaProzrachnogoProksi

Аватар пользователя woodoo

Re: Почему невозможно прозрачное проксирование на localhost?

Так вот же решение
iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner squid -j ACCEPT
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 3128

Аватар пользователя DRVTiny

Re: Почему невозможно прозрачное проксирование на localhost?

Цитата:
Так вот же решение

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner squid -j ACCEPT
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 3128

Я пробовал, у меня это не работает (SQUID пишет, что не может форвардить мой запрос) Грустный
woodoo, может Вы попытаете счастья?
Вполне возможно, что у меня просто SQUID коряво настроен (что-то не складываются у меня нормальные отношения с этим супергромоздким прокси, ну хоть убей!)

Аватар пользователя woodoo

Re: Почему невозможно прозрачное проксирование на localhost?

Работает. Пишу через "прозрачный локальный прокс".

Squid

Цитата:
http_port 127.0.0.1:3128
http_access allow all # rem (1)
httpd_accel_host virtual
httpd_accel_port 80 # rem (2)
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

Правила iptables - уже процитированы.

rem (1) - нужно дать доступ не только с lo, но и с "внешнего" интерфейса. Для простоты задал all.
rem (2) - можно задать "0"

Аватар пользователя DRVTiny

Re: Почему невозможно прозрачное проксирование на localhost?

А это и правда работает! Я даже по аналогии с настройкой просева исходящих пакетов SQUID'а сделал переадресацию прокси по cache_peer на Privoxy! Вообще расширение IPTables owner - это, оказывается, просто незаменимая вещь! Ведь если, например, все веб-браузеры запускать под пользователем webman, почтовые клиенты - под mailman, jabber'а - под floodman Улыбка, то можно будет настроить совершенно замечательную гибкую локальную политику фильтрации запросов в интернет от приложений, работающих на шлюзе. Тогда браузер не сможет обращаться на какие-либо порты, кроме 80, 8080 и 443, почтовый клиент - на 25 и 110, jabber вообще можно будет ограничить парой IP:порт. Да если бы ещё я наконец понял, почему у меня расширение condition match (-m condition) из Patch-O-Matic не желает устанавливаться - да, пожалуй, тогда мой и без того довольно навороченный файерволл стал бы пости идеальным (на данном этапе ползучего совершенствования настроек безопасности).
Кстати, woodoo, а Вы устанавливали когда-нибудь расширения из набора Patch-O-Matic?

Аватар пользователя woodoo

Re: Почему невозможно прозрачное проксирование на localhost?

DRVTiny писал(а):
Кстати, woodoo, а Вы устанавливали когда-нибудь расширения из набора Patch-O-Matic?

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

Аватар пользователя DRVTiny

Re: Почему невозможно прозрачное проксирование на localhost?

Цитата:
Если не ошибаюсь, очень много ядерных модулей для iptables родом из этого проекта.

Нет, ну это-то понятно: в POM'е проходят тестирование и "обкатку" все будущие модули NetFilter'а. Проблема в том, что никому не известно, когда в официальное ядро попадёт нужный мне condition match, а пользоваться им хотелось бы уже сейчас. Но вся загвоздка в том, что при установке pom'а скрипт-инсталлятор не предлагает мне поставить condition match ни в обычном, ни в экстра-режиме (хотя я вижу, что в архиве нужный мне модуль есть). Вот, собственно, и хотелось бы спросить у кого-нибудь ещё, кто POM устанавливал/или хотя бы пытался устанавливать, является ли эта моя проблема с -m condition единичным случаем или же это норма и поставить данное расширение при помощи штатного инсталлятора ещё никому не удавалось.

Аватар пользователя kvs

Re: Почему невозможно прозрачное проксирование на localhost?

DRVTiny писал(а):
Нет, ну это-то понятно: в POM'е проходят тестирование и "обкатку" все будущие модули NetFilter'а. Проблема в том, что никому не известно, когда в официальное ядро попадёт нужный мне condition match, а пользоваться им хотелось бы уже сейчас. Но вся загвоздка в том, что при установке pom'а скрипт-инсталлятор не предлагает мне поставить condition match ни в обычном, ни в экстра-режиме (хотя я вижу, что в архиве нужный мне модуль есть). Вот, собственно, и хотелось бы спросить у кого-нибудь ещё, кто POM устанавливал/или хотя бы пытался устанавливать, является ли эта моя проблема с -m condition единичным случаем или же это норма и поставить данное расширение при помощи штатного инсталлятора ещё никому не удавалось.

присоеденяюсь к вопросу.
И еще, чем отличаются модули из patch-o-matic и patch-o-matic-ng.

Аватар пользователя DRVTiny

Re: Почему невозможно прозрачное проксирование на localhost?

Цитата:
И еще, чем отличаются модули из patch-o-matic и patch-o-matic-ng

Насколько я понимаю, patch-o-matic-ng - это просто современный patch-o-matic, формируемый по какой-то там особой схеме, что может волновать лишь самих разработчиков и что отразилось в этом смущающем пользователей окончании ng. Просто основная ветка patch-o-matic сама по себе отвалилась на определённом этапе (возможно, после того как было выпущено певое ядро 2.6.x), а теперь уже она безнадёжно устарела и может использоваться только на старых ядрах 2.4.x

RSS-материал