LINUX.ORG.RU

Как ходит трафик между клиентом и сервером работающими на одной машине?

 ,


0

4

Допустим клиент и сервер работают на одной и той же linux машине и общаются по IP адресу интерфейса eth0. Если я хочу собрать трафик между ними с помощью wireshark/tshark, то собирать надо на интерфейсе lo, а не eth0. Почему? Оптимизация на уровне ядра? В общем киньте кто-нибудь ссылок, разъясняющих это момент в деталях?


tcpdump ловит только те данные на интерфейсе, которые через этот интерфейс на самом деле отправляются. Поэтому логично, что на eth0 он ничего не поймает.

Sorcerer ★★★★★
()
$ ip rule show
0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default
$ ip route show table local
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
broadcast 192.168.0.0 dev enp2s0  proto kernel  scope link  src 192.168.0.100 
local 192.168.0.100 dev enp2s0  proto kernel  scope host  src 192.168.0.100
broadcast 192.168.0.255 dev enp2s0  proto kernel  scope link  src 192.168.0.100
anonymous
()
Ответ на: комментарий от Sorcerer

tcpdump ловит только те данные на интерфейсе, которые через этот интерфейс на самом деле отправляются. Поэтому логично, что на eth0 он ничего не поймает.

Не вижу логики: если клиент отправляет данные на IP адрес интерфейса eth0, то и ожидать данные логично на eth0.

ricie
() автор топика
Ответ на: комментарий от UVV

Поясните как из привиденной таблицы следует, что если процесс на машине isolde отправляет данные на IP адрес ее интерфейса eth0 (192.168.100.17), то реально данные пойдут через интерфейс lo.

ricie
() автор топика

«ip ro get <local_ip>» в 99.99% скажет «dev lo»

Так что слушать в этом случае нужно «lo»

Только есть проблема - ты увидишь все пакеты дважды, если не укажешь в фильтре направление

vel ★★★★★
()
Ответ на: комментарий от Sorcerer

Ну так разъясните для тех кто не видит логики.

ricie
() автор топика
Ответ на: комментарий от vel

«ip ro get <local_ip>» в 99.99% скажет «dev lo»
Так что слушать в этом случае нужно «lo»

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

ricie
() автор топика

1. Если сервер привязан слушать только eth0, то с этого же хоста к нему не обратиться.

lo потому и lo, что отправленный через него пакет на нём же и принимается. Реальные интерфейсы таким свойством не обладают.

А как система определяет, что пакет с адресом назначения, принадлежащим одному из интерфейсов этого же хоста, следует направить на lo, это уже вторично, и не так уж интересно.

Elyas ★★★★★
()
Ответ на: комментарий от ricie

ответ находится в таблицах правил маршрутизации и таблицах маршрутизации.

посмотри «ip ro ls table local». Тип маршрута local говорит, что передача через localhost

«ip ro get» возвращает результат этих поисков в читаемом виде

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 2)
Ответ на: комментарий от Elyas

Если сервер привязан слушать только eth0, то с этого же хоста к нему не обратиться.

Нельзя привязаться слушать только eth0, если ты про sockets и ip. Можно лишь фильтром запретить все syn'ы, кроме in via eth0.

arturpub ★★
()
Ответ на: комментарий от ricie

Перед попаданием в интерфейс пакет проходит маршрутизацию. Роута для локальных адресов обязана вести в loopback interface, иначе пакет физически уйдет в подсеть. Если он попал в eth0, то уже поздно, он уже прошел маршрутизацию и *будет отправлен* в линк. tcpdump ловит трафик через границу интерфейса, а не все пакеты, имеющие его айпи.

arturpub ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.