LINUX.ORG.RU
решено ФорумAdmin

Как сделать прозрачный прокси?


0

2

Имеется Debian 6 Squeeze и установлен на нем squid, ip машины 192.168.1.1. Все работает нормально. Пользователи локалки 192.168.1.0/24 выходят в инет через прописанный в браузере вышеуказанный прокси. Хочется чтоб на машинах локалки был прописан только шлюз и никаких прокси в настройках браузера. Погуглил, это делается написанием правила на iptables. Переписал это правило под свою сеть, вот оно: iptables -t nat -A PREROUTING -s 192.168.1.0/24 ! -d 192.168.1.1 -p tcp -m multiport --dport 80,443 -j REDIRECT --to-port 3128

Как я понимаю это правило должно перенаправлять весь трафик не идущий на машину 192.168.1.1 на порт 3128. У меня почему то не работает так. В iptables знаний маловато, подскажите где не прав.

Ответ на: комментарий от no-dashi

iptables -t nat -A PREROUTING -s 192.168.1.0/24 ! -d 192.168.1.1 -p tcp -m multiport --dport 80,8080 -j REDIRECT --to-port 3128

так должно работать? или нужно ! -d 192.168.1.0/24 или и так и так правильно будет?

degrees ()
Ответ на: комментарий от degrees

В смысле «подробнее»? При работе по https клиент пытается установить подключение к серверу на порт 443, затем делает согласование SSL и проверяет сертификат сервера.

Если мы предъявим свой сертификат - клиент выругается (но это можно пережить). Проблема начинается, если сервер захочет сертификат клиента - тут то и придет песец. И придет он всяким клиентбанкам, вебманям и прочему, что захочет аутентфицировать клиента по сертификату, поскольку прокся, которая коннектится к серверу, этого сертификата взять нигде не сможет.

Собственно, для реализации «прозрачного прокси на 443 порту» надо успешно реализовать атаку man-in-the-middle, чего пока что полностью никто сделать не смог.

no-dashi ★★★★★ ()
Ответ на: комментарий от no-dashi

Собственно, для реализации «прозрачного прокси на 443 порту» надо успешно реализовать атаку man-in-the-middle, чего пока что полностью никто сделать не смог.

мне бы пока с 80 портом разобраться )

degrees ()

iptables -t nat -A PREROUTING -s 192.168.1.0/24 ! -d 192.168.1.1 -p tcp -m multiport --dport 80,8080 -j REDIRECT --to-port 3128

это правило правильно по логике записано или нет?

degrees ()
Ответ на: комментарий от degrees

Правило верное. Но нужен сквид собраный с потдержкой прозрачности и в конфиге должно быть это: http_port 3128 transparent --enable-linux-netfilter опция для включения прозрачности. Всё это верно для версии 3.1, в старых кажись опции другие были.

anonymous ()
Ответ на: комментарий от degrees

блин ну и форматирование. Это опция --enable-linux-netfilter к configure А это http_port 3128 transparent в конфиге сквида.

anonymous ()

У меня всё работает так:

-A PREROUTING -s 192.168.1.0/24 -p tcp -m tcp -m multiport --dports 80,81,82,83,88,8000,8001,8002,8080,8081 -j REDIRECT --to-ports 3128 
и в конфиге
http_port 3128 transparent

Gordon01 ★★ ()
Ответ на: комментарий от azure

Что выводит?

# sysctl -A |grep ip_forward

error: «Success» reading key «dev.parport.parport0.autoprobe»

error: «Success» reading key «dev.parport.parport0.autoprobe0»

error: «Success» reading key «dev.parport.parport0.autoprobe1»

error: «Success» reading key «dev.parport.parport0.autoprobe2»

error: «Success» reading key «dev.parport.parport0.autoprobe3»

error: permission denied on key 'net.ipv4.route.flush'

net.ipv4.ip_forward = 1

error: permission denied on key 'net.ipv6.route.flush'

degrees ()
Ответ на: комментарий от Gordon01

-A PREROUTING -s 192.168.1.0/24 -p tcp -m tcp -m multiport --dports 80,81,82,83,88,8000,8001,8002,8080,8081 -j REDIRECT --to-ports 3128
и в конфиге
http_port 3128 transparent

попробовал, не работает почему то

degrees ()
Ответ на: комментарий от degrees

Squid - локальный сервис и разрешения должны быть в INPUT/OUTPUT

iptables -A INPUT -s $LAN_NET -p tcp --dport 3128 -j ACCEPT
iptables -A OUTPUT -d $LAN_NET -p tcp --sport 3128 -j ACCEPT

Galant ()

В iptables знаний маловато

Берешь картинку из общеизвестного мана и медитируешь до просветления.

Galant ()
Ответ на: комментарий от Galant

Берешь картинку из общеизвестного мана и медитируешь до просветления.

собственно почти так и делал, но нет постоянной практики и быстро забывается )), я в основном ищу в инете подобные примеры и пытаюсь догнать их )

degrees ()
Ответ на: комментарий от Galant

iptables -A INPUT -s $LAN_NET -p tcp --dport 3128 -j ACCEPT
iptables -A OUTPUT -d $LAN_NET -p tcp --sport 3128 -j ACCEPT

я так понимаю что заместо $LAN_NET я должен подставить 192.168.1.0/24 ?

degrees ()

Зачем лишать пользователей гуглопочты, а также многих сайтов, использующих безопасную аутентификацию?

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от degrees

я так понимаю что заместо $LAN_NET я должен подставить 192.168.1.0/24 ?

Ага.

Galant ()

Чтоб работало, нужно: 1) чтоб сквид слушал локалхост на определенном порту и позволял принимать там прозрачные запросы http_port 3128 transparent

В новых версиях сквида этот параметр (transparent) кажись стал называться по другому, гуглите оф. документацию

2) чтобы транзитные запросы приходили на сервер и редиректились

2а) сервер должен быть дефолт шлюзом или иным способом получать транзитный трафик.

2б) сервер должен перехватывать трафик.

iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128 -m comment --comment 'Redirect http traffic to local port 3128'

2в) сервер должен принять трафик:

iptables -I INPUT -p tcp --dport 3128 -s 192.168.1.0/24 -j ACCEPT -m comment --comment 'Accept traffic for http proxy'

Проверить, работает ли система можно:

1) iptables -t nat -L -v -n

2) iptables -L -v -n

3) tail -f /var/log/squid/access.log

В айпитейблз должны накручиваться счетчики пакетов\байт на соответсвующих правилах, в лог сквида должны добавляться записи

azure ★★ ()
Ответ на: комментарий от Galant

Я у себя дома сначала хотел прозрачный прокси сделать, чтобы другие компьютеры в квартирной микролокалке не настраивать, но не вышло (т.к. https и ftp прозрачно не захотели проксироваться, а подмена сертификата https - какой-то грязный хак).

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Пркси для меня - это учет www трафика юзеров, контроль кто куда лазит, кое-какая резалка нежелательного контента. Зачем это делать дома не понимаю. Дома достаточно шлюза.
Для проксирования всего трафика можно посмотреть в сторону SOCKS. Хотя сам не делал, не знаю как там с прозрачностью и логированием.

Galant ()
Ответ на: комментарий от Galant

Зачем это делать дома не понимаю

Для «ускорения» интернета (статика кешируется - все быстрее странички отображаются). А с учетом трафика squid не справится, т.к. не логгирует CONNECT-методы.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Я у себя дома сначала хотел прозрачный прокси сделать, чтобы другие компьютеры в квартирной микролокалке не настраивать, но не вышло (т.к. https и ftp прозрачно не захотели проксироваться, а подмена сертификата https - какой-то грязный хак).

Я вот тоже дома делаю... ну и заодно знания повышаю ))

degrees ()
Ответ на: комментарий от Galant

Пркси для меня - это учет www трафика юзеров, контроль кто куда лазит, кое-какая резалка нежелательного контента.

Имеется опыт использования для подобных целей Ipcop.

Должен сказать, что ограничения по контенту при желании почти всегда можно обойти.

Считалка траффика у сквида кривая. т.к. считает траффик постфактум, т.е. если у юзера установлен лимит в 1гб, а он качает iso-шник в 4 Гб, то сквид даст ему скачать весь файл, а только потом порежет траффик.

wm34 ()
Ответ на: комментарий от wm34

Считалка траффика у сквида кривая.

Дело в том что с появлением жирных каналов с безлимитом отпала надобность ограничивать количество трафика. Разве что скорость. А у сквида очень удобно можно зарезать скорость только для больших файлов. И как средство мониторинга www вполне даже хорош.
Раньше пользовался NetAMS для биллинга.

Если ТС нужно резать трафик по объему - то сквид конечно не очень для этого подходит.

Galant ()
Ответ на: комментарий от azure

2б) сервер должен перехватывать трафик.

iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128 -m comment --comment 'Redirect http traffic to local port 3128'

2в) сервер должен принять трафик:

iptables -I INPUT -p tcp --dport 3128 -s 192.168.1.0/24 -j ACCEPT -m comment --comment 'Accept traffic for http proxy'

Что то я запутался... так в iptables нужно -I или -A ставить?

degrees ()
Ответ на: комментарий от degrees

-I - добавит правило в начало цепочки

-A - добавит правило в конец цепочки

Я написал -I , чтоб быть уверенным, что другие правила не зарубят трафик до того, как он обработается этими правилами.

azure ★★ ()
Ответ на: комментарий от azure

Ну так в чем же был бок? Интересно же, какие ошибки теперь популярные.

Ну скажем я в iptables новичек и не подумал про цепочку INPUT

degrees ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.