Как подключиться по SSH к WSL 2 в Windows 10 с внешнего компьютера

Решается задача по передачи определенных файлов с Linux-машины на Windows-машину в одной локальной сети (решение подойдет и для внешнего соединения при условии настройки доступов за NAT). Для того, чтобы все настраивать в одной экосистеме (Linux), на Windows-машине будет использоваться уже установленная WSL 2. Да, да, да, есть портированные версии OpenSSH для версий Windows отличных от 10-ки, а SSH-сервер можно настроить и на самой Windows 10 стандартно без заморочек с WSL, но интереснее поиграться с подсистемой, ведь подобный способ подключения к WSL могут использовать и различные веб-приложения. Вопросы безопасности не поднимаются, рассматривается сам механизм получения доступа по SSH к дистрибутиву WSL 2 внутри локальной сети (LAN).

Шаг 1. Установить сервер OpenSSH в дистрибутиве WSL 2

sudo apt install openssh-server

Шаг 2. Настроить сервер OpenSSH в дистрибутиве WSL 2

Все настройки расположены в конфигурационном файле /etc/ssh/sshd_config. SSH обычно эксплуатирует 22 порт, я предпочитаю использовать 2222, его легко запомнить и он отличается от аналогичного порта на «материнской» Windows-машине. Если указано 0.0.0.0 — то подразумевается подключение с любого IP. Если аутентификация будет проходить по паролю (лично мне не захотелось в этом случае заморачиваться с настройкой пары ключей), тогда нужно указать yes в строке с PasswordAuthentication.

29-04-2021 00-42-25

В итоге сам сервис надо запустить.

service ssh start

Шаг 3. Проброс порта в WSL 2

В WSL 2 имеется виртуализированный адаптер Ethernet с собственным уникальным IP-адресом. Узнать его можно по команде из под WSL — ip addr.

29-04-2021 00-59-35

Ниже приводится пример команды PowerShell (запускать с административными правами), которая добавляет прокси-сервер портов, ожидающий передачи данных на порту узла 2222 и перенаправляющий все подключения на порт 2222 виртуальной машины WSL 2 с IP-адресом 172.25.35.235

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=172.25.35.235 connectport=2222

Все записи прокси-сервера можно посмотреть по команде:

netsh interface portproxy show v4tov4

29-04-2021 01-21-01

Их можно все удалить с помощью:

netsh int portproxy reset all

Шаг 3. Создание правила в брандмауэре Windows 10

В данном случае опять запускать PowerShell от имени администратора.

netsh advfirewall firewall add rule name=”Open Port 2222 for WSL2” dir=in action=allow protocol=TCP localport=2222

Шаг 4. Проверяем SSH-соединение с WSL 2

Сперва пробуем подключиться к WSL 2 из под «материнской» Windows (подразумевается что это 10-ка и стоит SSH-клиент). С WSL у меня уже настроена пара ключей, так что запроса пароля не последует.

ssh -p 2222 ваш_логин_wsl@172.25.35.235

Теперь попробуем подключиться со сторонней Linux-машины, в данном случае я уже обращаюсь не к виртуальному IP-адресу WSL, а к локальному адресу «материнской» Windows-машины, который у меня 192.168.0.4

ssh -p 2222 ваш_логин_wsl@192.168.0.4

Так как для стороннего компьютера у меня не настроен доступ по ключу, поэтому придется ввести пароль от WSL. Сразу оговорюсь, если используется такой метод подключения в Shell-скриптинге, то проще и безопаснее настроить пару ключей, также для ввода ключа можно перейти в интерактивный режим (expect) или использовать утилиту sshpass, что я и сделал.

sudo apt install sshpass

Теперь можно подключиться в одну строчку так:

sshpass -p ваш_пароль_wsl ssh -p 2222 ваш_логин_wsl@192.168.0.4

Далее все, что душе угодно! Можно использовать scp, rsync, скриптинг…

Губарь Маргарита Александровна