Как сделать так, чтобы локально завершенные соединения TCP проходили предварительную маршрутизацию и пост-маршрутизацию? - PullRequest
0 голосов
/ 21 января 2012

Я занимаюсь разработкой приложения, которое фильтрует и обрабатывает пакеты, используя очереди netfilter.Это довольно сложно и требует хороших результатов, поэтому я хотел бы автоматизировать некоторые строгие испытания.Для этого мне нужно иметь возможность маршрутизировать некоторые TCP-соединения через мою систему, однако я не хочу полагаться на две другие машины, которые будут действовать как клиент и сервер.Я бы предпочел запустить локальный клиент, который отправляет данные, и локальный сервер, который проверяет искалеченный результат.

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

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

Ответы [ 3 ]

1 голос
/ 21 января 2012

Самый простой способ сделать это - использовать устройство tun .Устройство tun позволяет вводить пакеты из пространства пользователя, которые, как представляется, поступают через интерфейс tun.Вы можете либо написать код для создания и управления интерфейсом tun самостоятельно, либо вы можете использовать приложение типа OpenVPN , которое уже делает это.С OpenVPN это было бы легко: без специальных необработанных сокетов или чего-либо еще: вы просто отправляете ему IP-пакеты, инкапсулированные в UDP, и он заставляет их поступать через интерфейс tun.

0 голосов
/ 22 января 2012

Все соединения от самого локального хоста и до него do проходят через PREROUTING и POSTROUTING. Тот, кто говорит что-то еще, ошибается. (Вы можете проверить это с помощью ip6tables -t raw -I OUTPUT -j TRACE, и вы увидите, что он проходит через OUTPUT-POSTROUTING-PREROUTING-INPUT, когда, например, вы ping6 ::1 сами.)

0 голосов
/ 22 января 2012

Я немного подумал об этом, и используя устройства tun, мои клиентские и серверные тестовые приложения должны иметь возможность использовать простые linux-сокеты.Я объясню, как это может работать, описав путь пакета, отправленного тестовым клиентом.

Предварительные условия:

a) Два устройства tun, каждое из которых обеспечивает доступ к отдельной подсети

b) таблица маршрутизации была настроена для маршрутизации трафика на правильное устройство tun

1) клиент отправляет пакет на адрес в подсети tun1

2) приложение, подключенное к tun1(tun1app) преобразует адрес dst пакета в адрес подсети tun2, а адрес источника - в адрес подсети tun1, отличный от адреса интерфейса tun1

3) tun1app отправит измененный пакетback out

4) после маршрутизации tun2app получит пакет и переведет адрес назначения в интерфейс tun2, а адрес источника в адрес в сети tun2, отличный от адреса интерфейса

5)tun2app отправит его обратно, и сервер получит пакет, предполагая, что порт назначенияСервер прослушивает

Пакеты с сервера будут следовать обратному пути.

Это похоже на основную идею очень полезного инструмента.Кто-нибудь знает инструмент, способный сделать это?

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