Я проиллюстрирую свой вопрос с помощью контейнеров докеров, но этот пример ортогонален остальной части проблемы. Фактически подойдет любая программа, которая позволяет использовать мостовые интерфейсы и 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, когда клиент и хост - это разные компьютеры и в разных сетях, но у меня есть некоторые вопросы, когда клиент и хост - это один и тот же компьютер (в моем случае клиент - это моя обычная машина, а хост - это контейнер на моем обычном компьютере). Я знаю, что докер устанавливает мост между физическим сетевым устройством на моем обычном компьютере и виртуальным сетевым устройством на моем компьютере.
Но как именно моя обычная машина и контейнер взаимодействуют друг с другом? Используют ли они IP-адреса, назначенные им устройством моста, и общаются ли через них?
Как порты задействованы в этом процессе, избавляют ли они от необходимости использовать IP-адреса?
Есть ли наиболее эффективный / рекомендуемый способ использования ssh, когда клиент и хост находятся на одном компьютере и настроены так, как я только что обрисовал.
Обширный поиск в Интернете не дал достаточных ответов. При этом я, конечно, не стал бы утверждать, что такого сайта не существует!
Как работает только местная связь? Это просто: точно так же, как и обычная нелокальная связь, за исключением того, что сетевой стек определяет, что место назначения связи находится на том же компьютере, поэтому ему не нужно передавать трафик вниз по стеку на физический уровень, а вместо этого передает его. к принимающей части уровня IP.
В частности, это означает, что IP-адреса по-прежнему необходимы в качестве сетевых IP-соединений. всегда нужен исходный порт и адрес, а также порт и адрес назначения - «особая» часть - это просто то, что исходный и целевой адрес совпадают, в данном случае 127.0.0.1/localhost
.
С точки зрения SSH или любого другого сетевого протокола вообще ничего не меняется.
Что касается виртуализации, существует два подхода: мостовая сеть и NAT.
Я не уверен, как именно работает Docker, возможно, он использует еще один подход и просто напрямую подключает порты физического хоста к портам виртуальной машины без всего NAT.
В случае с вашим примером SSH на самом деле в фоновом режиме происходит довольно много:
ssh user@localhost -p 5000
, сетевой стек определяет, что это локально, и не отправляет трафик по сети. Вместо этого он отправляет его на порт 5000 локальной машины.