Откуда tcpdump получает IP-адрес источника для TCP-пакета?

Я пытался придумать решение проблемы маршрутизации (несколько интерфейсов, подключенных к одному контейнеру Docker, гарантирующие пакеты ответа выйдите из правильного интерфейса), и натолкнулись на интересное наблюдение: при использовании TRACE для регистрации пакетов только исходный IP-адрес отображается как сетевой интерфейс Docker, а tcpdump удается показать фактический исходный IP-адрес подключенного интерфейса. Смотри ниже. Может кто-нибудь сказать мне, откуда взялся этот исходный адрес? И бонусный вопрос, если у кого-то есть идея, как мне сопоставить этот исходный адрес в правиле iptables (если это вообще возможно)?

Oct 23 09:54:43 <hostname> kernel: [145206.331674] TRACE: raw:PREROUTING:policy:3 IN=br-55939cd46cf5 OUT= PHYSIN=<phys> MAC=<mac> SRC=172.23.0.2 DST=<ext ip> LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=80 DPT=63742 SEQ=515334190 ACK=1161940855 WINDOW=28960 RES=0x00 ACK SYN URGP=0 OPT (020405B40402080A0228C591A136C09A01030307)

10.112.0.103.80 > <external ip>.64710: Flags [S.], cksum 0x839a (incorrect -> 0x3647), seq 3129672596, ack 2031230462, win 28960, options [mss 1460,sackOK,TS val 36559662 ecr 2706000943,nop,wscale 7], length 0

Это не моя настоящая проблема, но это, по крайней мере, поможет мне понять ее. Заранее благодарим!

0
задан 23 October 2020 в 02:42
1 ответ

Сетевой пакет (например, пакет TCP/IP) можно проверить во многих местах в системе Linux. Когда вы упоминаете TRACE, я предполагаю, что вы имеете в виду TRACE от iptables. tcpdump и iptables просматривают пакеты в разное время во время их прохождения через систему.Как прокомментировал Майкл Хэмптон: «Один до NAT, а другой после NAT».

Существует ряд полезных диаграмм, иллюстрирующих поток пакетов через систему Linux (поиск «поток сетевых пакетов linux» в Google). Чтобы получить более подробный ответ, взгляните на диаграмму в следующем вопросе StackExchange Unix и Linux:

https://unix.stackexchange.com/questions/281108/understanding-bridge-check-hop- in-packet-flow-in-linux-kernel

Также доступно в SVG здесь: https://en.wikipedia.org/wiki/Netfilter#/media/File:Netfilter-packet-flow.svg

На этой диаграмме я считаю, что tcpdump (через libpcap) проверяет пакет на шаге помечены как «отводы (например, AF_PACKET)». Затем, в зависимости от того, куда вы вставили свой TRACE, вы можете увидеть другой исходный адрес. Куда вы вставили свой TRACE (например, в базовый хост или в док-контейнер)? Я должен спросить об этом в комментарии, но у меня все еще недостаточно репутации, чтобы добавить комментарий к вопросу в Server Fault.

На сайте Stack Exchange Superuser также есть похожий вопрос с хорошим ответом: https://superuser.com/questions/925286/does-tcpdump-bypass-iptables

2
ответ дан 23 October 2020 в 21:25

Теги

Похожие вопросы