Найти в Дзене
BASH DAYS | Linux Factory

Прокачиваем Win → WSL → Virtualbox

Как из WSL терминала с Linux, подключиться по ssh к виртуальной машине в VirtualBox.

Привет, всех с Новым Годом! Праздники праздниками, но пора уже входить в рабочий поток и разгрести локальный техдолг. На этот раз решаем задачку с тремя известными: 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

То есть цепляемся в виндовой/хостовой машине на 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"

Алиасы подключения без ВПН и с ВПН. Ну ты и так про это знаешь. Если знаешь более красивое решение этой задачи с пробросом, сердечно ждем в комментариях.

-2
-3
-4

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