Linux: как отправить весь пакет на определенный порт на другом хосте?

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

Есть ли способ сделать это?

Большое спасибо!


person ioeric    schedule 06.02.2013    source источник
comment
В TCP пакетов нет. Пакет может (или не может) быть фрагментирован между отправителем и получателем. (и пакеты или фрагменты могут быть получены не по порядку)   -  person wildplasser    schedule 07.02.2013
comment
@wildplasser TCP не имеет фрагментации. ИП делает.   -  person m0skit0    schedule 07.02.2013


Ответы (3)


Вы не указали, какой язык программирования вы используете и что уже пробовали.

Измените поле IP-адреса на целевой IP-адрес, а поле порта TCP на нужный порт. Не забудьте обновить обе контрольные суммы.

формат IP-пакетаФормат пакета TCP

Если вам нужна переадресация TCP, ядро Linux уже сделает это за вас.

person m0skit0    schedule 06.02.2013
comment
Мне жаль. Я использую C и анализирую пакеты с помощью pcap. - person ioeric; 07.02.2013
comment
К сожалению, я не могу изменить целевой IP-адрес (потому что мне нужно его записать). Есть ли способ отправить пакет напрямую на другой хост? И на этом хосте будет другой сниффер, ожидающий этого пакета. - person ioeric; 07.02.2013
comment
Или я могу изменить целевой IP-адрес и записать исходный целевой IP-адрес в другие поля пакета? - person ioeric; 07.02.2013
comment
Вы можете записать IP, а затем изменить его. Если вы хотите, чтобы цель получила адрес, вы можете просто инкапсулировать оба пакета в TCP-пакет. Но я только предполагаю. Я смогу помочь вам лучше, если вы скажете мне, что вы хотите сделать на мишени. - person m0skit0; 07.02.2013
comment
Я пытаюсь собрать захваченные пакеты в виде файла на этом хосте. - person ioeric; 07.02.2013

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

Как экранировать шестнадцатеричные значения в netcat

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

http://www.bjou.de/blog/2008/05/howto-copyteeclone-network-traffic-using-iptables/

Другим вариантом является использование зеркала портов, которое имеет несколько разных имен в зависимости от используемого коммутатора, но позволяет настроить порт на коммутаторе как концентратор.

Я думаю, что вам лучше всего, если вы не можете заставить работать netcat, использовать iptables, и вы даже можете добавить к нему фильтры.

person Chris Hinshaw    schedule 06.02.2013
comment
Могу ли я с помощью netcat отправить пакет напрямую из программы C без предварительного сохранения пакета в файле? - person ioeric; 07.02.2013
comment
Да, но вам пришлось бы использовать fork exec, чтобы сделать что-то вроде popen, и это было бы безумно неэффективно, если вы работаете со сниффером пакетов. Я думаю, что лучший вопрос: чего вы пытаетесь достичь? Да, вы можете отправить пакет с помощью netcat таким образом, но реально вы можете написать свой собственный код, используя libpcap для пересылки пакета. Посмотрите на pcap_sendpacket, возможно, это то, что вам нужно. Он по-прежнему находится в пространстве пользователя по сравнению с пространством ядра, но намного эффективнее, чем использование nc для пересылки. - person Chris Hinshaw; 07.02.2013

Я не знаю, ДОЛЖНЫ ли вы использовать C или нет, но даже если вы это сделаете, я бы рекомендовал для начала создать прототип с помощью Python/Scapy.

Используя scapy, выполните следующие действия:

  1. Прочитайте файл pcap с помощью rdpcap().
  2. Возьмите IP-адрес назначения и номер порта назначения TCP (pkt.getlayer(IP).dst, pkt.getlayer(TCP).dport) и сохраните их как строку в нужном формате (например, payload = "192.168.1.1: 80").
  3. Измените IP-адрес назначения пакета и номер порта назначения, чтобы его мог получить другой хост, прослушивающий определенный порт.
  4. Добавьте полезную нагрузку поверх пакета (pkt = pkt / payload)
  5. Отправьте пакет (sendp(pkt, iface='eth0'))
  6. Вам придется разобрать пакет на другом хосте, чтобы получить полезную нагрузку. Не зная точно, что находится поверх уровня TCP в исходном пакете, я не могу дать вам точный код для этого, но должен быть относительно простым.

Это все довольно просто с Python/Scapy, но я ожидаю, что это будет намного сложнее с C, когда придется вручную вычислять правильные смещения, контрольные суммы и прочее. Удачи, и я надеюсь, что это поможет.

person wookie919    schedule 06.02.2013