Маршрутизировать все пакеты через мою программу?

Я хочу создать приложение, которое направляет весь сетевой трафик (не только HTTP) через мое приложение. По сути, я хочу, чтобы весь трафик был передан моему приложению (они никогда не должны достигать фактической цели, мое приложение должно обрабатывать это), который, в свою очередь, будет перенаправлен на сервер; то же самое касается ввода, только наоборот (сервер -> приложение -> программа, которая хочет получить ответ). Существуют ли какие-либо библиотеки (или подобные вещи), которые упростили бы создание приложения? Я ищу что-то, что я могу использовать из Python или Java, но если это действительно необходимо, я могу выучить другой язык.


person Bogdacutu    schedule 10.01.2012    source источник
comment
Это будет брандмауэр с фильтрами. Это НЕ то, что вы хотите попробовать реализовать самостоятельно.   -  person Marc B    schedule 10.01.2012
comment
@Bogdacutu: это будет невероятно сложный многолетний проект, который вы вряд ли создадите без зияющих недостатков безопасности, ошибок или и того, и другого.   -  person Daenyth    schedule 10.01.2012
comment
@Daenyth: ни одна из этих причин НЕ пытается реализовать что-то самостоятельно. Не пытайтесь! Это будет трудно! Где была бы цивилизация, если бы все прислушались к этому совету?   -  person maerics    schedule 10.01.2012
comment
@maerics - Сидеть у костра и смотреть на звездное небо?   -  person Robᵩ    schedule 10.01.2012
comment
@Роб: Я желаю! А если серьезно, я не думаю, что в этом сообществе отговаривать других разработчиков от попыток что-то сделать — хорошая идея; Однако указание на проблемы и подводные камни абсолютно справедливо.   -  person maerics    schedule 10.01.2012
comment
@maerics: это зависит от причины. Если ему это нужно для бизнес-приложений, создавать его с нуля кажется плохой практикой. Очевидно, что если он просто делает это, чтобы узнать о чем-то, тогда можно продолжать, но это действительно зависит от контекста.   -  person Daenyth    schedule 11.01.2012
comment
@Bogdacutu: Вы делаете это только для самообразования или действительно собираетесь это использовать?   -  person Steven Rumbalski    schedule 11.01.2012


Ответы (4)


То, что вы хотите использовать, это библиотека захвата пакетов, вы можете использовать e pcap или его реализацию или привязки в python или java.

Однако такие вещи обычно реализуются на низком уровне, в идеале с использованием C. Вот учебник Tutorial

РЕДАКТИРОВАТЬ: в свете ваших комментариев вы определенно хотите взглянуть на хуки netfilter

Пока вы этим занимаетесь, вы также можете взглянуть на netfilter крючки

person anijhaw    schedule 10.01.2012

Взгляните на Jpcap.

person mindas    schedule 10.01.2012
comment
Это только для захвата; мое приложение должно действовать как шлюз. - person Bogdacutu; 10.01.2012

Если вы хотите маршрутизировать только tcp-трафик, на самом деле достаточно просто использовать потоки и сокеты. Вы должны прослушивать разные порты для каждого сервера, к которому хотите подключиться. Либо в Java, либо в Python вам нужно создать «сокет» для каждого порта, который вы хотите прослушивать.

Для каждого нового соединения вы создаете новое соединение с сервером и создаете два новых потока для обработки этого соединения, один поток будет считывать все данные с клиента и отправлять их на сервер. Другой будет читать все с сервера и отправлять клиенту. Когда какой-либо конец соединения закрывает его, вы закрываете другой и завершаете оба потока.

person pmoleri    schedule 10.01.2012

Если вы делаете это в Linux, вам следует подумать об использовании устройства TUN/TAP, которое является очень удобным инструментом для перехвата сетевого трафика для пользовательской обработки. Вот базовое руководство, если вы не знакомы с http://backreference.org/2010/03/26/tuntap-interface-tutorial/

person TJD    schedule 10.01.2012