Назад | Перейти на главную страницу

Отправка трафика обратно клиентам напрямую из туннеля конечной точки IPIP при подмене IP-адреса источника

Я сделал программу C в Linux (Ubuntu 18.04), которая перенаправляет трафик на другой сервер через IPIP. Когда конечная точка IPIP отправляет ответы, программа также отправляет обратно данные клиенту после удаления внешнего заголовка IP. Приложение и конечная точка туннеля IPIP в машинном трафике пересылается в пространство внутри сетевого пространства имен, при этом туннель IPIP является маршрутом по умолчанию. Все работает нормально. Однако я хотел бы реализовать что-то, что заставит приложение отправлять трафик обратно клиенту напрямую, подменяя исходный IP-адрес на IP-адрес пересылающей машины через POSTROUTING цепочка в IPTables. Это привело бы к меньшей нагрузке на машину пересылки, поскольку приложению не нужно было бы отправлять трафик обратно клиентам через туннель IPIP, и я считаю, что это сделает его более согласованным.

Для этого я попытался настроить пару veth, в которой один veth находится в сетевом пространстве имен по умолчанию, а одноранговый veth находится в пользовательском сетевом пространстве имен с приложением. Я также установил мост в основном сетевом пространстве имен, назначил ему IP-адрес и создал правило SNAT в POSTROUTING цепочка для исходящего трафика в виде определенного IP-адреса. Затем я подключил veth-интерфейс к основному сетевому пространству имен. Приложение по-прежнему привязывается к туннелю IPIP, но когда ему нужно отправить исходящий трафик, оно отправляет его по маршруту по умолчанию. Поэтому я установил маршрут по умолчанию к интерфейсу veth внутри сетевого пространства имен.

Все это в основном работает. Трафик из приложения отправляется обратно клиентам напрямую, и клиент отвечает обратно серверу пересылки. Затем трафик отправляется обратно на сервер, который пересылается через IPIP. Я подтвердил все это через tcpdump. Однако приложение, которое я использую, не обрабатывает ответы. Я считаю, что причина в том, что приложение ожидает, что ответы вернутся на veth interface (маршрут по умолчанию), поскольку он использовался для отправки ответов клиентам. К сожалению, это приложение с закрытым исходным кодом, поэтому я не могу проверить код. Однако я мог бы создать тестовую программу на C, которая будет использовать маршрут по умолчанию для отправки исходящих подключений и выполнить дальнейшее устранение неполадок.

Мне просто было интересно, есть ли у кого-нибудь предложения по этому поводу. Я читал кое-что о маркировке пакета через IPTables. Я не совсем уверен, останется ли эта отметка после ответа клиента и его отправки на сервер пересылки.

Я считаю, что есть определенный трафик, который ожидается в туннеле IPIP, а затем другой трафик, который ожидается на маршруте по умолчанию. В моем случае клиенты, подключенные к приложению, отправляют трафик в туннель IPIP, а туннель IPIP ожидает его. Однако приложение также устанавливает исходящие подключения к магистрали, и я считаю, что это тип трафика, ожидаемого от интерфейса по умолчанию внутри сетевого пространства имен.

В случае, если весь трафик ожидается по маршруту по умолчанию, возможно ли перенаправить трафик с сервера пересылки на этот конкретный интерфейс вместе с удалением протокола IPIP (удаление внешнего заголовка IP и т. Д.)? Я предполагаю, что это должно произойти после того, как трафик попадет в туннель IPIP.

С учетом сказанного, причина, по которой я хочу использовать IPIP, заключается в том, что я могу выполнять NAT на конечном компьютере (трафик перенаправляется в туннель IPIP с использованием адреса назначения внутреннего IP-заголовка). Поэтому я бы предпочел не избавляться от туннеля IPIP.

Любая помощь приветствуется, и если вам нужна дополнительная информация, сообщите мне!

Я просто хотел предоставить обновленную информацию. Я решил эту проблему примерно через неделю после публикации этого вопроса, создав программу TC BPF, которая автоматически отправляет исходящие IPIP-пакеты обратно клиенту напрямую. Для тех, кто заинтересован, можете попробовать Вот.

Спасибо!