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

Принудительно передавать локальные TCP-пакеты через сегмент сети для захвата

У меня есть две машины, A и B, под управлением RHEL Linux. У каждой машины есть сетевая карта 1Gig, подключенная к тому, что я называю "LAN" сетью. У каждой машины есть сетевая карта 10Gig, которая подключена к сети, которую я называю «BIGDATA». Эти сети не связаны друг с другом, кроме как через эти машины.

У меня есть оптоволоконные ответвители на интерфейсе 10Gig A в сети BIGDATA. Ответвления ведут к серверу захвата, где я хочу записывать все входящие и исходящие данные. Изначально весь TCP, но, возможно, в будущем пригодится какой-нибудь UDP.

В целях разработки и тестирования я хочу запустить обе стороны TCP-разговора на A и все же записать разговор с помощью этих нажатий. У разработчиков, которые будут использовать эту настройку, не будет учетных записей на B (по крайней мере, это моя цель).

На мой взгляд, суперпользователь должен иметь возможность настроить какую-то пересылку / ретрансляцию на B, что позволит клиенту на A подключаться к серверу на A, но через оптоволокно. То есть трафик идет от A к B в сети LAN, а затем обратно к A в сети BIGDATA. Обратный трафик возвращается тем же путем.

До сих пор я пытался использовать ssh-туннелирование. подобно A:~ $ssh B -L 8051:<A's-BIGDATA-IP>:3434 -N. Это действительно отлично работает для перехвата трафика от клиента к серверу. Но, к сожалению, ответы сервера находят способ просто оставаться локальным и никогда не появляться в оптоволокне. Если посмотреть на wirehark, пакеты знают свой IP-адрес назначения и не чувствуют себя обязанными возвращать туннель.

я нашел этот ответ, но я считаю, что все решения требуют, чтобы оба интерфейса были в одной сети. Может быть, семена моего решения есть, но я не могу их найти.

Думаю, я мог бы написать это с нуля на C, создав программу для запуска на B, чтобы принимать TCP-соединения на интерфейсе LAN, инициировать другое TCP-соединение на интерфейсе BIGDATA, обратно к A, а также пересылать ответы. Он будет копировать только полезную нагрузку TCP, чего было бы достаточно для моих целей.

Есть ли классный инструмент, который уже выполняет эту пересылку / ретрансляцию?

Есть ли способ заставить ssh-туннелирование работать так, как я хочу для обратного трафика?

Посмотри на EtherPuppet, возможно в сочетании с Scapy; EtherPuppet описывается как

небольшая программа для Linux, которая создаст куклу вуду для интерфейса Ethernet.

...

все, что видит реальный интерфейс, будет видно виртуальному. Все, что будет отправлено в виртуальный интерфейс, будет отправлено реальным.

Скапи описывается как

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

Источник и назначение NAT

Вы можете перенаправлять трафик туда и обратно с помощью комбинации DNAT и SNAT, используя ту же идею, что и ответ ты нашел при условии, что вы не возражаете против искажения пакетов, которые вы захватываете. Захваты будут иметь IP-адрес назначения или src IP B, но похоже, что вы уже сделали это со своим клиентом пересылки. Я полагаю, преимуществом NAT будет скорость, все остается в пространстве ядра.

В этом примере клиент на A подключается к серверу на A: BIGDATA: 3434. Правила NAT перенаправляют соединение от A к B, затем B пересылает обратно к A, устанавливая источник как B, чтобы установить обратный путь. Наверное, взгляните на руководство по netfilter если вы не знакомы с таблицами NAT.

  • Убедитесь, что на B включена переадресация IP-адресов:

    sysctl -w net.ipv4.ip_forward=1
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  • трафик идет от A к B в сети LAN

    # On A, forward local traffic for local service out LAN to B.
    iptables -t nat -A OUTPUT -p tcp -d A:BIGDATA --dport 3434 -j DNAT --to-destination B:LAN
    
  • затем вернитесь к A в сети BIGDATA.

    # On B, forward the traffic to back to A over fibre
    iptables -t nat -A PREROUTING -p tcp -d B:LAN --dport 3434 -j DNAT --to-destination A:BIGDATA
    
  • Обратный трафик возвращается тем же путем

    # On B, set the source address for this traffic to B fibre
    iptables -t nat -A POSTROUTING -d A:BIGDATA -p tcp --dport 3434 -j SNAT --to-source B:BIGDATA
    

Отслеживание соединения NAT заботится о последнем сопоставлении с исходным IP-адресом источника.

Хотя это не тот ответ, на который я надеялся найти, в итоге я выбрал свой собственный.

Я написал программу для запуска на B, которая будет принимать соединения через интерфейс LAN и инициировать соединения через интерфейс BIGDATA. Программа копирует полезные данные TCP в новые исходящие сообщения. То же самое и с ответами в обратном направлении. Это не сохраняет информацию заголовка (например, исходный IP-адрес) - в моем случае я думаю, что это хорошо, так как обратный трафик не сокращается.

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

Я собираюсь оставить ответы непринятыми, в надежде, что кто-нибудь в конце концов наткнется на них с идеальным решением!