Как работает SSH, когда клиент и хост находятся на одной машине?

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

Я использую контейнер Docker, который запускает sshd демон на заднем плане, который порожден supervisord который работает на переднем плане. Я в основном использую ssh, чтобы иметь безопасный способ пересылки X11 без привязки mount /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, когда клиент и хост - это разные компьютеры и в разных сетях, но у меня есть некоторые вопросы, когда клиент и хост - это один и тот же компьютер (в моем случае клиент - моя обычная машина, а хост - контейнер на моей обычной машине). Я знаю, что Docker устанавливает мост между физическим сетевым устройством на моем обычном компьютере и виртуальным сетевым устройством на моем компьютере.

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

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

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

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

1 ответ

Решение

Как работает локальное общение? Все просто: точно так же, как при обычной нелокальной связи, за исключением того, что сетевой стек обнаруживает, что адресат связи находится на той же машине, поэтому ему не нужно передавать трафик вниз по стеку на физический уровень, а вместо этого передает его на приемную часть уровня 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 от виртуальной машины.
Другие вопросы по тегам