[РЕШЕНО]Прозрачное проксирование и парсер для http
Написал на python/twisted маленький фильтрующий прокси :)
В общем, хочется странного.
Есть сервер, через который должны ходить пользователи (прозрачный http-proxy). И эти самые пользователи, конечно, любят отправлять всякие разные post и get данные. А серверы, на которые они ходят, отвечают им всяческими http-заголовками и собственно отдают html.
А хотелось бы контроллировать весь http-трафик. То есть берем какой-нибудь python+re+BeautifulSoup, пишем скрипт, и заставляем этот скрипт выполняться на любой чих (любой запрос) на наш прозрачный прокси. И передаем нашему скрипту url как параметр и все данные (headers+html) в STDIN, чтобы он смог их потом обрабатывать. Ну, и так же хотелось бы, чтобы скрипт запускался для документов с Content-Type: text/html, text/plain, text/xml, text/json, к примеру (если нельзя, пофигу, логику можно будет реализовать в самом скрипте).
Понимаю, что нужно копать в сторону squid+squidguard, читал документацию, но так не представил, как это можно реализовать. Есть идеи?
- Для комментирования войдите или зарегистрируйтесь
Запустькаться только для
Запустькаться только для text/html, text/plain, text/xml, text/json принципиально нельзя. Сначала идет запрос от пользователя, его обрабаытвает сервер, генерирует ответ и только тогда становится извесен тип. Соответсвенно GET и POST параметры уже не пофильтруешь.
А это в контексте какой
А это в контексте какой программы?
В любой. Это особенности
В любой. Это особенности протокола HTTP. Сначала на сервер передаются POST, GETи остальное. Если их надо анализировать и менять/пресекать, то это надо делать до того, как запрос дойдет до сервера. А потом сервер ответит и будет ясно, что он за файл возвращает. И тогда можно второй раз поанализировать, уже зная ответ сервера.
cheerfulboy написал(а): В
элементарно
но вариантов, как всегда, больше чем один...
например...
- настроить сквид на "вышестоящий" "прокси"
- отдавать в сокет на "проверку антивирусом" и самому слушать этот сокет
- настроить апач как прокси сервер
- отдавать апачу на 80-й порт (или другой), а там разруливать собственными скриптами
- дампить трафик (trafshow, tcpdump, iplog или что-то из этой серии), а там уже сканировать файлы логов
ну и т.д и т.п.
что-то добрый я сегодня ....
Цитата: - настроить сквид на
Хотелось бы избежать подобного оверхеда в лице еще одного прокси. Тем более не совсем понятно, чем два прокси лучше одного.
Нипоняяятно. По-отдельности слова и даже словосочетания понятны, а вот что получится в итоге — для меня загадко. Опять оверхед какой-то.
Можно еще nginx настроить как прокси. А толку? В том и дело, что после настройки прокси ничего не понятно, куда рыть дальше.
Ага. А еще можно отдать этот порт nginx или squid. Да даже dante. Любому прокси, который прозрачно http умеет проксировать. Толку?
Я могу ошибаться, но мне всегда казалось, что снифферы и утилиты из этой серии дают нелихую нагрузку процессор. Да и потом, из пушки по воробьям, не? Тем более логи анализировать не надо.
Нужно, чтобы скрипт получал всю страницу с хедерами, потом искал, например какой-то хедер до первого входждения, менял его, и отдавал клиенту. Или заменял ссылки на свои. И так далее и тому подобное.
В общем, я пришел к тому, что squid и его директива url_rewrite_program мне должны помочь. Надеюсь, что я не ошибаюсь. Но так я не нашел, как решить свою задачу "изкоробки", то, видимо, мне придется реализовать собственный реврайтер на питоне. Нагуглил вот такую ссылку — http://www.rejik.ru/index140.html. Сам он написан на си, но си я не знаю, поэтому чтобы разобраться в нем и переписать на питоне, придется затратить немало времени.
А еще, дело в том, что клиентов у сквида моего прокси будет не мало, поэтому нужно найти какое-нибудь не очень дорогое решение.
cheerfulboy
этого не получится никак
как я понимаю задачу - вы хотите не мешать сквиду выполнять его работу и при этом, анализируя заголовки, предпринимать свои действия
1) сквид слушает два порта 3128 4128
2) имеет вышестоящий прокси на порту 5128 (где висит ваш "анализатор")
3) клиент приходит на порт 3128, сквид берет из кэша или форвардит запрос в 5128 порт
4) анализируете и делаете что хотите с запросом
5) для скачки страницы с инета посылаете полученный запрос "прозрачно" на порт 4128
обратный проход пойдет по схеме 4128 -> 5128 -> 3128 -> клиент
в сквиде есть возможность настроить c-icap для проверки на антивирусы
суть этого - в определенный порт посылается страница (запрос), а там уже анивирус (любой) работает и возвращает ответ\управление сквиду
ничто не мешает вам повесить на этот порт свою "слушалку"
сам я c-icap не настраивал, т.к. работаю через вышестоящий havp, который уже и проверяет на антивирусы
(почему так лучше - это тема уже другой дискуссии)
можно и ngnix.
суть в том, что скрипт (перл или пхп) получив запрос (хеадеры) без проблем может проанализировать и в случае необходимости через сокеты качнуть инет-страницы в себя.
дальнейшие действия ограничивает лишь полет фантазии и\или желаний
что-то добрый я сегодня ....
Последнее предложение (про
Последнее предложение (про nginx) на мой взгляд самое крутое. По каким словам гуглить?
cheerfulboy
если вам надо править только URL в заголовках, то смотрите внимательно секцию сквида "OPTIONS FOR URL REWRITING" и в чсатности url_rewrite_program
можно для этих же целей использовать .httacces и\или mod_rewrite у апача и\или нгникса
если задача более "интеллектуальная" - анализировать не только заголовки, но get\post запросы и\или содержимое передаваемых страниц - то смотреть в сторону manual PHP (например) в раздел "работа с сокетами" и "обработка запросов (headers)" и "обработка строк"
в принципе задача реализуема на уровне 30-50 строк кода, а на пёрле можно сделать еще компактнее, наверное
в качестве первого примера можно спросить у гугла "скрипт как граббить страницы с чужих сайтов" или что-то в этом роде
что-то добрый я сегодня ....
я не хочу реализовать
я не хочу реализовать веб-сервер. я прекрасно знаю,чем это чревато :)
Минималистический вариант -
Минималистический вариант - вариант с "антивирусом". Скрипт висит и слушает свой порт, сквид кидает ему контент, по проверке которого сквиду сообщается что с эти делать.
Если нужно нечто большее вроде обработки и замены содержимого страниц - то это уже и есть веб-сервер, функционирующий как прокси.
А какая у тебя вообще задача-то по анализу? Разных баннерорезок и т.п. софта хватает и он легко прикручивается к сквиду. Да и сам сквид чего-то да может.
-= Concordia victoriam gignit =-
Задача примерно такая: 1.
Задача примерно такая:
1. Юзер отправил POST, и GET: /login.php
2. Сначала палим, что он отправил, лезем в mysql. Если не нашли, то записываем POST в базу
3. Перенаправляем запрос на реальный сервер
4. Если юзер, например, отправил GET: /messages.php, берем html, разбираем, вытаскаиваем то, что нужно, записываем в бд
стесняюсь спросить, вы,
стесняюсь спросить, вы, конечно, понимаете чем GET отличается от POST?
к тому же, уж коли речь про мускул - то поднимайте свой сервер и не парьтесь
насчет вашего замечания насчет "известных проблем" - не так страшна красавица, как её малюют....
делайте на нестандартном порту и iptables в помощь...
что-то добрый я сегодня ....
А что тут может быть
А что тут может быть непонятного? :)
В общем, да. Займусь написанием своего прокси-сервера на python+gevent. Или python+twisted.