У меня есть кеширующее приложение, которое работает в пользовательском пространстве. Обычно он использует DPDK для взаимодействия с сетевыми адаптерами напрямую без взаимодействия с ядром, перехватывая пакеты из сети и либо пропуская их, генерируя ответ из кэша, либо, в некоторых случаях, блокируя их. Он прозрачен для конечных точек и написан для работы с необработанными пакетными данными прямо с сетевой карты. Примечательно, что здесь я не занимаюсь обычным программированием сокетов — все обрабатывается на уровне пакетов, без взаимодействия со стеком TCP/IP.
По долгим и скучным причинам я хотел добавить некоторые функции NAT. В качестве доказательства концепции я надеялся создать интерфейс для своего приложения с помощью iptables/netfilter. Итак, я сделал части NAT с помощью таких команд:
sudo iptables --table nat --append PREROUTING --in-interface seg1a -j DNAT --to-destination $SERVERIP
sudo iptables --table nat --append POSTROUTING --out-interface seg1b -j MASQUERADE
sudo route add $SERVERIP seg1b
Это хорошо работает для моих целей. Теперь клиенты подключаются к интерфейсу в моей системе, но их трафик перенаправляется на сервер. Я уверен, что их трафик проходит через мою систему, так что все в порядке.
Но чтобы быть полезным в качестве кэша, мне нужно иметь возможность отвечать на некоторые запросы, которые я получаю от клиентов. Я думал, что смогу использовать для этого NFQUEUE с небольшим приложением, которое читает из очереди сетевого фильтра и передает пакеты в мое приложение и из него через IPC. Я использовал такое правило iptables:
sudo iptables --table mangle --append FORWARD -j NFQUEUE
Это работает нормально, пока мое приложение ни на что не отвечает. Но когда мой кеш пытается ответить на что-то с одной из конечных точек, все идет не так. Кэш переворачивает все заголовки L2-4, управляет порядковыми номерами и номерами подтверждения и т. д. Но пакеты не возвращаются клиенту.
Я думаю, что происходит то, что решения о маршрутизации пакета были приняты до того, как он был отправлен в NFQUEUE. Таким образом, даже если кеш возвращает что-то, чьи IP-адреса источника и получателя поменялись местами, это не имеет значения для маршрутизации пакета.
Я пробовал несколько вещей, чтобы изменить маршрутизацию моих ответных пакетов, но, похоже, ничего не работает. Как можно изменить маршрутизацию пакета, прочитанного из очередей сетевого фильтра? В противном случае есть ли хороший способ просто вводить пакеты в сеть из очередей сетевого фильтра? Если бы это было выполнимо, я мог бы заблокировать первоначальный запрос, а затем отправить ответ кеша как совершенно новый.
Спасибо заранее за любые предложения.
I need to be able to respond to some requests that I get from clients and the packets don't get back to the client.
. Клиент работает на вашем сервере, используя сетевую карту, отличную от dpdk? Требуется ли вам отвечать на запрос клиента, поступающий на сетевую карту, отличную от DPDK? Если вы знаете подпись клиентского пакета, на который вам нужно ответить, почему бы не использовать eBPF или XDP для перенаправления в ваше приложение кэширования DPDK, а затем внедрить его обратно в ядро через интерфейс DPDK-TAP? - person Vipin Varghese   schedule 17.09.2020NIC <==> iptables/netfilter <= application reads from NFQUEUE and forwards via IPC => Caching userspace application
. Вопрос касаетсяpackets not getting forwarded after getting modified from caching application by reversing L2-4 headers, manages sequence and ack. numbers
. Как уже говорилось, любой интерфейс tap из пользовательского пространства с правильным dst-ip должен маршрутизировать пакеты. Но вы подозреваетеrouting is not considered
. Это правильно? - person Vipin Varghese   schedule 18.09.2020