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

Как работает ssh, когда клиент и хост находятся на одном компьютере?

Я проиллюстрирую свой вопрос с помощью контейнеров докеров, но этот пример ортогонален остальной части проблемы. Фактически подойдет любая программа, которая позволяет использовать мостовые интерфейсы и ssh.

Я использую контейнер Docker, который запускает sshd демон в фоновом режиме, порожденный supervisord который проходит на переднем плане. В основном я использую ssh, чтобы иметь безопасный способ пересылки X11 без привязки монтирования /tmp/.X11-unix в контейнер для консервов и полностью открыв розетку для контейнера. Если я использую docker top containername сразу после того, как я запустил контейнер, я получаю следующий результат:

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4732                535                 1                   19:56               ?                   00:00:00            /usr/bin/python /usr/bin/supervisord
root                4745                4732                0                   19:56               ?                   00:00:00            /usr/sbin/sshd

как и ожидалось. Теперь я выставил порт 22 на контейнере на порт 5000 на хосте. Следовательно, я могу войти в свой контейнер, используя ssh -X username@localhost -p 5000. Я знаю, как работает ssh, когда клиент и хост - это разные компьютеры и в разных сетях, но у меня есть некоторые вопросы, когда клиент и хост - это один и тот же компьютер (в моем случае клиент - это моя обычная машина, а хост - это контейнер на моем обычном компьютере). Я знаю, что докер устанавливает мост между физическим сетевым устройством на моем обычном компьютере и виртуальным сетевым устройством на моем компьютере.

  1. Но как именно моя обычная машина и контейнер взаимодействуют друг с другом? Используют ли они IP-адреса, назначенные им устройством моста, и общаются ли через них?

  2. Как порты задействованы в этом процессе, избавляют ли они от необходимости использовать IP-адреса?

  3. Есть ли наиболее эффективный / рекомендуемый способ использования ssh, когда клиент и хост находятся на одном компьютере и настроены так, как я только что обрисовал.

Обширный поиск в Интернете не дал достаточных ответов. При этом я, конечно, не стал бы утверждать, что такого сайта не существует!

Как работает только местная связь? Это просто: точно так же, как и обычная нелокальная связь, за исключением того, что сетевой стек определяет, что место назначения связи находится на том же компьютере, поэтому ему не нужно передавать трафик вниз по стеку на физический уровень, а вместо этого передает его. к принимающей части уровня IP.

В частности, это означает, что IP-адреса по-прежнему необходимы в качестве сетевых IP-соединений. всегда нужен исходный порт и адрес, а также порт и адрес назначения - «особая» часть - это просто то, что исходный и целевой адрес совпадают, в данном случае 127.0.0.1/localhost.

С точки зрения SSH или любого другого сетевого протокола вообще ничего не меняется.

Что касается виртуализации, существует два подхода: мостовая сеть и NAT.

  • В мостовой сети виртуальная машина является полноправным членом сети со своим адресом и всем остальным. Это работает следующим образом:
    • Программное обеспечение виртуализации создает виртуальный сетевой интерфейс на хост-машине, который отражает моделируемое физическое устройство внутри виртуальной машины.
    • На хост-машине вы создаете мост и привязываете к нему виртуальное и физическое устройство. Это действует как коммутатор с физическим устройством в качестве восходящего канала для остальной сети.
    • Как и настоящий коммутатор, мостовое устройство знает, какие IP-адреса подключены к нему, и соответственно доставляет трафик, а не отправляет трафик по проводу, который нацелен на одно из (виртуальных) устройств, подключенных к мосту. В сетевом стеке он расположен на канальном уровне.
  • С NAT вы не можете напрямую связываться с виртуальными машинами и должны использовать хост-машину в качестве маршрутизатора, как и в большинстве домашних сетей.
    • У вас все еще есть виртуальные интерфейсы, подключенные к (виртуальному) коммутатору. Но этот коммутатор не работает как мост и не подключен к физической сети.
    • Сетевой интерфейс хост-машины подключен как к физической, так и к виртуальной сети и действует как маршрутизатор NAT. Вам нужно будет выполнить переадресацию портов, если вы хотите напрямую разговаривать с виртуальной машиной.

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

В случае с вашим примером SSH на самом деле в фоновом режиме происходит довольно много:

  • Если вы сделаете ssh user@localhost -p 5000, сетевой стек определяет, что это локально, и не отправляет трафик по сети. Вместо этого он отправляет его на порт 5000 локальной машины.
  • Сервер пересылки NAT, который прослушивает порт 5000, отправляет трафик на виртуальный интерфейс, где он принимается как обычный трафик на порт 22 от виртуальной машины.