Программируемый прозрачный прямой прокси - PullRequest
9 голосов
/ 19 декабря 2009

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

Я обнаружил явный компромисс между прямыми прокси между скриптовостью и надежностью. Например, это бесчисленные прокси, разработанные в Ruby и Python , которые позволяют вам проверять каждый ответ на запрос и регистрировать, изменять, фильтровать по желанию ... однако они либо не в состоянии прокси все необходимо или сбой через 20 минут использования.

С другой стороны, я подозреваю, что Squid и Apache достаточно надежны и стабильны, однако я не могу определить, как я могу развивать динамическое поведение с помощью сценариев. В конечном итоге я хотел бы установить квоту и динамически фильтровать эту квоту. Часть меня чувствует, как смешивать mod_proxy и mod_perl ?? может позволить интересные динамические прокси, но трудно понять, с чего начать, и узнать, возможно ли это вообще.

Пожалуйста, сообщите.

Ответы [ 4 ]

3 голосов
/ 19 декабря 2009

Squid и Apache оба имеют механизмы для вызова внешних скриптов для разрешения / отклонения решений для каждого запроса. Это позволяет вам использовать либо их прокси-серверы, но вызывать ваш внешний скрипт для каждого запроса на обработку произвольной сложности. Ваш код должен управлять только бизнес-логикой, а не тяжелой работой.

В Apache я никогда не использовал mod_proxy таким образом, но я использовал mod_rewrite. mod_rewrite также позволяет вам прокси-запросы. Директива RequestMap позволяет передавать решение во внешний скрипт:

MapType: prg, MapSource: путь файловой системы Unix к действительному обычному файлу

Здесь источником является программа, а не файл карты. Для его создания вы можете использовать язык по вашему выбору, но результатом должна быть исполняемая программа (либо объектный код, либо скрипт с волшебным трюком с печеньем «#! / Path / to / interpreter» в качестве первой строки).

Эта программа запускается один раз, когда запускается сервер Apache, а затем связывается с механизмом перезаписи через дескрипторы файлов stdin и stdout. Для каждого поиска по карте-функции он получит ключ для поиска в виде строки с завершающей новой строкой в ​​stdin. Затем он должен вернуть искомое значение в виде строки с завершающей новой строкой на stdout или четырехсимвольной строки `` NULL '', если он потерпит неудачу (т. Е. Для данного ключа нет соответствующего значения).

С Squid вы можете получить аналогичную функциональность через директиву external_acl_type:

Этот тег определяет, как внешние классы acl, использующие вспомогательную программу, должны искать статус.

g'luck!

2 голосов
/ 19 декабря 2009

Я работал над HTTP-библиотекой на python, написанной специально для прокси-серверов. На данный момент он не очень зрелый (безусловно, нуждается в дополнительном тестировании и модульных тестах), но он достаточно завершен, и я считаю его полезным Я не знаю, будет ли это соответствовать вашим потребностям или нет.

Библиотека называется httpmessage, сайт с Google-кодом находится здесь . Пример написания прокси-сервера приведен на странице примеров .

Я рад получить отзывы и / или исправления ошибок.

2 голосов
/ 19 декабря 2009

Если вы ищете решение Perl, взгляните на HTTP::Proxy

Не уверен ни в каких решениях mod_perl. CPAN вызывает Apache::Proxy, а поиск в Google вызывает MyProxy . Тем не менее, обратите внимание, что оба они немного устарели, так что YMMV, но вы можете найти их полезными.

0 голосов
/ 19 декабря 2009

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

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