11.04.2012 08:09, Mykola Dzham написал:

Это подтверждает только то, что вы двое наблюдали какую-то хрень.
Система по умолчанию отправляет пакет согласно роутингу, а не "откуда
пришел запрос". Так что или продемонстрируйте route -n get и tcpdump,
демонстрирующие что у Вас оно ходит не по роутингу, или прекращайте
дезинформировать людей.


Именно какую-то хрень!
Если посмотреть tcpdump, то пакеты уходят согласно таблице маршрутизации (как и должно быть), но при этом в host IP подменяется тем IP на которых пришёл запрос. При этом ответ будет уже идти с int2, хотя в src host будет указан ip1 (ip на интерфейсе int1)
Что бы не быть голословным приведу то, что просят.

Приведу пример, когда запрос приходит на один интерфейс, а сервер на него отвечает через другой (согласно таблице маршрутизации)

XX.XX.XX.85 - IP удалённого хоста, с которого будем производить проверку нашего 2-канального сервера
AA.AA.AA.161 - шлюз для первого канала
AA.AA.AA.162 - IP на первом канале сервере (сетевая igb0)
BB.BB.BB.9 - шлюз для второго канала
BB.BB.BB.10 - IP на втором канале сервере (сетевая igb1)

# route -n get XX.XX.XX.85
   route to: XX.XX.XX.85
destination: XX.XX.XX.0
       mask: 255.255.254.0
    gateway: BB.BB.BB.9
  interface: igb1
      flags: <UP,GATEWAY,DONE,STATIC>
 recvpipe  sendpipe  ssthresh  rtt,msec    mtu        weight    expire
       0         0         0         0      1500         1         0

Как видим, ответ должен уйти через второй канал.
Запускаем ping на первый канал (то есть ответ должен уйти через второй канал) и смотрим tcpdump:

# tcpdump -i igb0 -t -v -n 'host XX.XX.XX.85 and ip proto \icmp'
tcpdump: listening on igb0, link-type EN10MB (Ethernet), capture size 96 bytes IP (tos 0x0, ttl 58, id 56746, offset 0, flags [none], proto ICMP (1), length 84) XX.XX.XX.85 > AA.AA.AA.162: ICMP echo request, id 1589, seq 0, length 64 IP (tos 0x0, ttl 58, id 56816, offset 0, flags [none], proto ICMP (1), length 84) XX.XX.XX.85 > AA.AA.AA.162: ICMP echo request, id 1589, seq 1, length 64

а что в этот момент твориться на втором канале:

# tcpdump -i igb1 -t -v -n 'host XX.XX.XX.85 and ip proto \icmp'
tcpdump: listening on igb1, link-type EN10MB (Ethernet), capture size 96 bytes IP (tos 0x0, ttl 64, id 58291, offset 0, flags [none], proto ICMP (1), length 84)
    AA.AA.AA.162 > XX.XX.XX.85: ICMP echo reply, id 1589, seq 13, length 64
IP (tos 0x0, ttl 64, id 58420, offset 0, flags [none], proto ICMP (1), length 84)
    AA.AA.AA.162 > XX.XX.XX.85: ICMP echo reply, id 1589, seq 14, length 64

Как видим, запрос приходит на один канал, а ответ уходит через второй (ну согласно таблице маршрутизации). Интересно так же посмотреть, что покажет tcpdump на XX.XX.XX.85:

# tcpdump -i em0 -t -v -n '(host AA.AA.AA.162 or host BB.BB.BB.10) and ip proto \icmp' tcpdump: listening on em0, link-type EN10MB (Ethernet), capture size 96 bytes IP (tos 0x0, ttl 64, id 8102, offset 0, flags [none], proto ICMP (1), length 84) XX.XX.XX.85 > AA.AA.AA.162: ICMP echo request, id 22837, seq 0, length 64 IP (tos 0x0, ttl 60, id 26758, offset 0, flags [none], proto ICMP (1), length 84)
    AA.AA.AA.162 > XX.XX.XX.85: ICMP echo reply, id 22837, seq 0, length 64
IP (tos 0x0, ttl 64, id 8114, offset 0, flags [none], proto ICMP (1), length 84) XX.XX.XX.85 > AA.AA.AA.162: ICMP echo request, id 22837, seq 1, length 64 IP (tos 0x0, ttl 60, id 26879, offset 0, flags [none], proto ICMP (1), length 84)
    AA.AA.AA.162 > XX.XX.XX.85: ICMP echo reply, id 22837, seq 1, length 64

то есть для конечно хоста достаточно то, что удалённый хост представился нужным ему IP. Соответственно он делает вывод, что всё ок и сервер доступен. Показывать tcpdump, если запрос пришёл на тот интерфейс с которого уйдёт (согласно таблице маршрутизации) смысла не вижу, так как там картина будет ясна.

Возможно я где-то неправ или ошибся, но такая схема работает.
Критика приветствуется.

Ответить