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

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

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

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

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

Обширный поиск в Интернете не показал достаточные ответы. Это сказанное я, конечно, не утверждал бы, что такой сайт не существует!

0
задан 15 August 2014 в 11:48
1 ответ

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

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

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

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

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

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

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

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

Теги

Похожие вопросы