Привет, всех с Новым Годом! Праздники праздниками, но пора уже входить в рабочий поток и разгрести локальный техдолг. На этот раз решаем задачку с тремя известными: Windows + WSL + VirtualBox.

Суть такая. Понадобилось мне вхреначить на локальную машину VirtualBox с убунтой, для тестирования фичи, которую писал в этом посте. Фича не хотела заводиться на виртуальных серверах Селектела, хотя и должна была. Потребовалось убедиться, что дело не в моих кривых руках. Ладно, лирика…

Короче цепануться к убунте из wsl по ssh к VirtualBox из коробки не получилось. Да и понятно, подсети разные. Пришлось временно воспользоваться powershell и через ssh проверить гипотезу с cgroup. Винда видит подсеть виртуалки и с этим проблем нет. Проверил, забыл.

Но вопрос остался открытым: как блять/дь малой кровью из WSL (с ubuntu 22.04) подключиться напрямую к виртуалке c ubuntu 22.04 по ssh? И не задрачиваться с таблицами роутинга? Рассказываю!

Чтобы не лезть в маршрутизацию, пришлось воспользоваться стандартным функционалом проброса портов в самом VirtualBox. Жопа конечно знатно сгорела, но желаемого добился.

В общем, пиздуем в настройки VirtualBox: Сеть, Адаптер1. В нем по умолчанию включен NAT. Открываем пункт - Дополнительно, видим кнопку: Проброс портов. Заходим и начинаем заниматься очередной хуитой магией.

Сначала роутим на виндовую машину:

Имя: ssh_win
Протокол: tcp
Адрес хоста: 127.0.0.1
Порт хоста: 2222
Адрес гостя: пусто
Порт гостя: 22

Так, теперь в powershell я могу цепануться к виртуалке так:

ssh -p2222 user@127.0.0.1

Оно и ежу понятно, теперь усложняем задачу:

Имя: ssh_win_host
Протокол: tcp
Адрес хоста: 192.168.31.100
Порт хоста: 22
Адрес гостя: пусто
Порт гостя: 22

Этой хернёй разрешаем подключение из powershell по такому принципу:

ssh user@192.168.31.100

Ага, айпишник 192.168.31.100 это адрес, который выдал роутер моей виндовой машине. Как видим уже используется 22 порт. Посмотреть айпишник можно командой ipconfig в терминале powershell. Да простят меня адепты линукса.

Ну и теперь финальный штрих, прикручиваем WSL:

Имя: ssh_wsl
Протокол: tcp
Адрес хоста: 172.21.20.123
Порт хоста: 2222
Адрес гостя: пусто
Порт гостя: 22

Айпишник 172.21.20.123 выдан убунте в WSL, смотрим его через ifconfig. А дальше заходим в сам WSL и подключаемся к VirtualBox как к обычному серверу:

ssh user@192.168.31.100
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
То есть цепляемся в виндовой/хостовой машине на 22 порт, который уже проброшен. Закидываем public ключи, делаем алиасы для быстрого коннекта. Всё! Дело в шляпе! Мы подключились из WSL (ubuntu) по ssh к виртуальной машине в VirtualBox.

Есть нюанс, у меня дополнительно поднят VPN через wireguard, там еще один фактор с подсетью. Поэтому я добавил еще мусора:

Имя: ssh_vpn
Протокол: tcp
Адрес хоста: 10.66.64.55
Порт хоста: 22
Адрес гостя: пусто
Порт гостя: 22

Теперь при активации VPN, подключение к VirtualBox через WSL будет выглядеть так:

ssh user@10.66.64.55

Логично, адрес виндовой/хостовой машины меняется с 192.168.31.100 на 10.66.64.55. Но это детали. Еще есть тема, что при включении/выключении VPN вся эта тягомотина с пробросом портов подхватывается не сразу. Имей это в виду.

Я себе сделал 2 алиаса в wsl ~/.zshrc:

alias box1="ssh user@192.168.31.100"
alias box2="ssh user@10.66.64.55"

Алиасы подключения без ВПН и с ВПН. Ну ты и так про это знаешь. Картинки с настройками залил сюда (открываются нативно в телеграфе), заскриншотил свои поделки. Визуальнее всегда понятнее. Но у меня там дэцл хосты и айпишники по-другому обзываются. Не обессудь.

Если знаешь более красивое решение этой задачи с пробросом, сердечно ждем в комментариях.

Ладно, самое время включить режим «День-Тюлень». Еще раз всех с НГ. Увидимся!