Тайм-ауты SSH между хостами, которые связаны через несколько маршрутов

У меня неприятная проблема с ssh-соединениями между хостами, которые связаны несколькими путями (маршрутами). Чтобы объяснить это подробно...

Рисунок сети и SSH-соединения

Как видите, между узлами есть два возможных пути прохождения пакетов (зеленая и красная линия). И если я скажу, что они могут путешествовать, они могут!;-) На маршрутизаторе нет правил брандмауэра (или nat), просто переадресация пакетов.

Теперь происходит следующее: если я устанавливаю ssh-соединение от хоста A к хосту B через маршрутизатор (или наоборот), так как это намеченный путь (не прямое соединение в той же сети; ssh-сервер слушает только на другом интерфейсе), что это соединение исчезает через несколько секунд, но только если я бездельничаю. Я попробовал несколько опций keepalive на ssh-сервере (и клиенте), но теперь я могу сказать, что это не проблема и не решение.

Покопавшись немного глубже, я понял, что эта проблема должна быть связана с несколькими интерфейсами и маршрутами на обоих хостах - это единственная ситуация, в которой это происходит; но воспроизводится и в других системах (если они используют одну и ту же настройку if).

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

Что я испытываю, так это то, что если я ssh с хоста A на B (помните, единственный интерфейс, на котором слушает ssh - это тот, который подключен к маршрутизатору) и отключает интерфейс в общей сети, SSH соединение умирает немедленно!

Я предполагаю, что более поздний трафик ssh использует другой способ, чем первоначальное соединение. Может быть, оба экземпляра ssh (клиент / сервер) "видят", что между ними есть общая сеть, так почему бы не использовать ее (конечно, это "прямое" соединение имеет гораздо более высокий приоритет в таблице маршрутизации)?!

Я пытался блокировать трафик ssh на хостах напрямую с помощью фильтрации пакетов, но столкнулся с тем же временем ожидания. Единственное решение, которое работает, это отключить интерфейс к общей сети; это сразу помогает, и соединение долго "простаивает".

Кто-нибудь с хорошей идеей?!

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

- ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ, ЗАПРОШЕННАЯ В КОММЕНТАРИИ -

Все последующие выходные данные были сгенерированы на "хосте B" (ssh "target").

"хост A" находится на "192.168.110.0/24"-subnet!

"ifconfig -a" (несущественные интерфейсы удалены):

em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
  options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
  ether 00:00:00:00:00:00
  inet 192.168.100.5 netmask 0xffffff00 broadcast 192.168.100.255
  media: Ethernet autoselect (1000baseT <full-duplex>)
  status: active
em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
  options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
  ether 00:00:00:00:00:00
  inet 192.168.110.5 netmask 0xffffff00 broadcast 192.168.110.255
  media: Ethernet autoselect (1000baseT <full-duplex>)
  status: active

"netstat -rna" (несущественные маршруты (интерфейсы)):

Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            192.168.100.1      UGS         0      807    em0
127.0.0.1          link#9             UH          0        0    lo0
192.168.100.0/24   link#1             U           0   113430    em0
192.168.100.5      link#1             UHS         0    10437    lo0
192.168.110.0/24   link#2             U           0      319    em1
192.168.110.5      link#2             UHS         0        0    lo0
(...)

"sockstat -l" (другие процессы для полноты сохранены):

USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS      
dhcpd    dhcpd      1416  10 udp4   *:67                  *:*
dhcpd    dhcpd      1416  20 udp4   *:58917               *:*
dhcpd    dhcpd      1416  21 udp6   *:33125               *:*
mysql    mysqld     1629  10 tcp4   192.168.100.5:3306    *:*
root     apcupsd    1353  4  udp4   *:18755               *:*
root     apcupsd    1353  5  udp4   *:162                 *:*
root     apcupsd    1353  7  tcp4   192.168.100.5:3551    *:*
root     collectd   1635  10 udp4   *:65262               *:*
root     collectd   1635  11 udp4   *:49993               *:*
root     collectd   1635  12 udp4   *:51224               *:*
root     collectd   1635  13 udp4   *:58446               *:*
root     collectd   1635  4  udp4   192.168.100.5:25826   *:*
root     collectd   1635  7  udp4   *:16430               *:*
root     collectd   1635  8  udp4   *:12406               *:*
root     collectd   1635  9  udp4   *:16113               *:*
root     inetd      1676  5  udp4   *:69                  *:*
root     monit      1358  7  tcp4   127.0.0.1:2812        *:*
root     sshd       1656  3  tcp4   192.168.100.5:22      *:*
root     syslog-ng  1295  10 dgram  /var/run/logpriv
root     syslog-ng  1295  12 tcp4   192.168.100.5:514     *:*
root     syslog-ng  1295  13 udp4   192.168.100.5:514     *:*
root     syslog-ng  1295  14 tcp4   192.168.100.5:601     *:*
root     syslog-ng  1295  9  dgram  /var/run/log
_ntp     ntpd       1425  6  udp4   192.168.100.5:123     *:*

1 ответ

Как только вы подключаетесь к B, он добавляет ARP для хоста A. После этого он использует локальную подсеть, но, как только ARP истекает через ~300 с или пять минут, он транслирует ваш Ethernet-адрес. Маршрутизатор не пересылает широковещательную рассылку, если он не действует как мост, который, судя по некоторой конфигурации Kerplooie Net, я предполагаю, что это не так.

Вы можете попробовать добавить статическую запись ARP для вашего хоста в таблицу ARP хоста B или просто вручную в командной строке.

Тогда, не могли бы вы объяснить, почему у вас дуплексный Ge работает в симплексном режиме? Кроме того, почему он говорит "эфир 00:00:00:00:00:00"? Вы его зачеркнули (это немного сбивает с толку)?

Другие вопросы по тегам