Найти в Дзене
ProdNetDev

Отправить пакет с конкретного SRC порта на конкретный DST порт без netcat, socat и т.п.

Бывает, что в распоряжении кроме стандартных сетевых утилит ничего нет, например только набор утилит из встроенного в устройство BusyBox, и так же нет возможности применить нужные дополнительные утилиты (netcat, socat и т.п.) под конкретную архитектуру. Но при этом необходимо отправить сетевой пакет с конкретного SRC порта на конкретный DST порт в целях какой-либо сетевой диагностики. Для решения задачи подойдёт утилита traceroute. Сначала посмотрим стандартную трассировку до хоста назначения и выясним на каком хопе он находится: # traceroute 10.10.11.2 -n traceroute to 10.10.11.2 (10.10.11.2), 30 hops max, 60 byte packets 1 192.168.18.254 1.878 ms 2.013 ms 2.153 ms 2 192.168.200.2 1.194 ms 1.271 ms 1.348 ms 3 10.10.11.2 0.928 ms 0.933 ms 1.037 ms Хост назначения на 3-ем хопе. Далее обратите внимание на параметр -f 3, в данном случае он нужен для того, что бы пакет сразу отправлялся на хост назначения без траты времени на промежуточные узлы. Пример отправки пакета UDP SRC

Бывает, что в распоряжении кроме стандартных сетевых утилит ничего нет, например только набор утилит из встроенного в устройство BusyBox, и так же нет возможности применить нужные дополнительные утилиты (netcat, socat и т.п.) под конкретную архитектуру. Но при этом необходимо отправить сетевой пакет с конкретного SRC порта на конкретный DST порт в целях какой-либо сетевой диагностики.

Для решения задачи подойдёт утилита traceroute.

Сначала посмотрим стандартную трассировку до хоста назначения и выясним на каком хопе он находится:

# traceroute 10.10.11.2 -n
traceroute to 10.10.11.2 (10.10.11.2), 30 hops max, 60 byte packets
1 192.168.18.254 1.878 ms 2.013 ms 2.153 ms
2 192.168.200.2 1.194 ms 1.271 ms 1.348 ms
3 10.10.11.2 0.928 ms 0.933 ms 1.037 ms

Хост назначения на 3-ем хопе.

Далее обратите внимание на параметр -f 3, в данном случае он нужен для того, что бы пакет сразу отправлялся на хост назначения без траты времени на промежуточные узлы.

Пример отправки пакета UDP SRC PORT 67 > DST PORT 67 из BusyBox используя traceroute:

traceroute 10.10.11.2 -n -s 192.168.18.2:67 -i eth0 -p 66 -w 1 -f 3 -q 1 -m 3

На принимающей стороне пакет будет выглядеть так:

01:24:14.238997 IP 192.168.18.2.67 > 10.10.11.2.67: BOOTP/DHCP, Request, length 972

Подробнее о применённых параметрах:

-n - отключаем резолвинг IP в domain name, что бы не тратить на это время;

-s - указываем SRC IP:PORT;

-i - при необходимости указываем исходящий интерфейс;

-p - тут указываем [SRC PORT] -1 от того порта с которого желаем отправить пакет, т.е. в данном примере 67-1=66;

-w - время ожидания ответа;

-f - номер хопа, на который утилита traceroute начнёт отправлять пакеты. Именно тут для данного примера мы указали 3, т.к. интересующий нас хост назначения находится от нас на 3-ем хопе, и мы не хотим тратить время на то, что бы traceroute отправлял пакеты на L3 узлы находящиеся между нами и целевым хостом;

-q - количество пакетов, которое будет отправлено на каждый хоп, но в нашем случае по сути это количество пакетов, которое будет отправлено на хост назначения;

-m - максимальное количество хопов. В нашем случае устанавливаем равное номеру хопа хоста назначения (3), т.к. если мы не получим ответа от хоста назначения, то мы не хотим тратить время пока утилита traceroute отправит ещё 27 пакетов уменьшая TTL.

По поводу ответа. Не обязательно, что бы на хосте назначения был открыт тестируемый порт. Нам будет достаточно того, что бы этот хост ответил пакетом ICMP udp port unreachable или TCP RST (если используем TCP).

Аналогичный пример отправки пакета UDP SRC PORT 67 > DST PORT 67 c использованием стандартной утилиты traceroute в Linux системах:

traceroute 10.10.11.2 -n -f 3 -m 3 -w 1 -q 1 -p 67 --sport=67 -U

Пример отправки пакета TCP SRC PORT 443 > DST PORT 443 c использованием стандартной утилиты traceroute в Linux системах:

traceroute 10.10.11.2 -n -f 5 -w 1 -q 1 -p 443 --sport=443 -T