Назад | Перейти на главную страницу

Таймауты SSH между хостами, подключенными по нескольким маршрутам

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

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

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

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

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

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

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

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

У кого-нибудь есть хорошая идея ?!

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

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

Весь следующий вывод был создан на «хосте B» (ssh «target»).

"хост A" находится в подсети "192.168.110.0/24"!

"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     *:*

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

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

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