Я иллюстрирую свой вопрос с помощью контейнеров докера, но этот пример является ортогональным к остальной части проблемы. На самом деле любая программа, которая позволяет использование интерфейсов моста и ssh, сделала бы.
Я использую контейнер Докера, который выполняет a 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 локальной машины.