Как стать автором
Обновить

Дружим WSL и VSCode через Tailscale и упрощаем работу в сети

Время на прочтение4 мин
Количество просмотров12K
Автор оригинала: Scott Hanselman

От переводчика:

Когда-нибудь я подключу к одной сети VPN свою нынешнюю машину в Беларуси и машину в России. Пробовал на зуб ZeroTier, чтобы соединить их вообще, но сервис мне не зашёл, тем более, тогда речь не шла о том, чтобы легко подружить подсистему Linux внутри Windows с любой другой машиной извне. Здесь речь именно об этом. Поэтому, думаю, этот перевод окажется полезным не только мне.


Tailscale – это сеть VPN, которая не нуждается в конфигурировании. Она работает поверх других сетей, «выравнивает» сети и позволяет пользователям и сервисам упростить коммуникацию и сделать её безопаснее. Я подробно писал о том, как подключиться к WSL2 внутри Windows 10 по SSH, с другого компьютера. В инструкции по ссылке не только множество шагов, но и несколько способов подключения.

Кроме того, повторю то, что я говорил в статье об SSH: если вы активный разработчик и хотите поделиться сервисами и сайтами, над которыми работаете, со своими коллегами и соавторами, то придётся разобраться с нетривиально большим объёмом настроек, управления и обслуживания. Другими словами:

Не было бы проще, если бы все были в одной сети и одной подсети?

Поясню. WSL первой версии делит сетевой стек с Windows 10, поэтому «машина» WSL и Windows рассматривается как одна и та же. Выполняемый на порте 5000 сервис, – сервис Windows или работающее в Linux под WSL1 приложение – выполняется на одной и той же машине. Однако в WSL2 Linux находится за хостом Windows.

Хотя WSL2 упрощает доступ к http://localhost:5000 через прозрачную переадресацию портов, ваш Linux на WSL на самом деле не является одноранговым узлом в той же сети, что и другие ваши устройства.

Инструмент вроде Tailscale решает проблему, то есть как будто выравнивает сеть. Надо сказать, что из-за некоторых особенностей WSL2 при работе с ней можно допустить несколько ошибок. Я расскажу, что делал, чтобы всё заработало у меня.

Tailscale на WSL2

Установите WSL2 – следуйте этой инструкции. Установите дистрибутив Linux. Я работал с Ubuntu 20.04. Погрузитесь в процесс, создайте пользователя и т.д. Установите Windows Terminal – работа с командной строкой станет приятнее. Установите Tailscale – я руководствовался инструкцией для Ubuntu 20.04.

Настройка WSL2

Сейчас нельзя запустить Tailscale на WSL2 через IPv6, поэтому я отключил протокол:

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1

Здесь мы запускаем демон. На WSL2 пока нет systemd, но если ваша версия сборки Windows 10 выше 21286, можно выполнять команды при запуске WSL. Лично я прописал всё в bash.

sudo tailscaled

Также у нас нет возможности выполнять интерактивный вход в систему WSL, поэтому, чтобы поднять Tailscale внутри WSL, вам нужно сгенерировать ключ предварительной аутентификации и аутентифицировать одну машину. Пропишите сгенерированный ключ с команде запуска, как это сделал я:

tailscale up --authkey=tskey-9e85d94f237c54253cf0

Мне нравится держать Tailscale открытым в другой вкладке терминала или в другой панели вкладок, так, чтобы смотреть логи. Это интересно и информативно!

В панели администрирования машин Tailscale вы увидите все машины в сети, как показано ниже. Обратите внимание: scottha-proto в списке – это Windows, а scottha-proto-1 – это Linux. Первая машина – это мой хост, вторая – экземпляр Linux WSL2, они теперь в одной сети!

У меня получилось пригласить пользователя вне своей сети при помощи новой функции совместного использования узлов. Мой друг Гленн не работает в моей организации, но так же, как и я, пользуется OneDrive или DropBox, чтобы создать ссылку или по созданной ссылке получить доступ к одной сущности системы, а не ко всей системе. Я могу сделать то же самое в смысле Tailscale:

Можно пригласить Гленна, чтобы он подключился к работающему в WSL2 сервису прямо из дома.

Создаём сервис и привязываем его к сети Tailscale

Я установил .NET 5 в Ubuntu на WSL2, создал папку и запустил команду dotnet new web, чтобы сгенерировать микросервисный Hello World. Когда я запускаю сервис – .NET, Node, или какой-то ещё, – важно, чтобы он прослушивался в сети Tailscale. Linux в WSL2 подключена к нескольким сетям.

По умолчанию мои системы разработчика прослушиваются только локальным хостом; прослушивать сервисы во всех сетях (включая Tailscale) средствами .NET можно по-разному, я запустил прослушивание так:

dotnet run --urls http://*:5100;https://*:5101

Итак, я подключился к IP-адресу в Tailscale, который связан с моим экземпляром WSL2, и постучался к моему сервису внутри Linux:

Что теперь можно сделать? Мы с Гленном находимся в сети Tailscale, кроме того, вся сеть единообразная, а значит, Гленн может легко достучаться до моего сервиса! На скрине ниже я нахожусь в Teams: мой рабочий показывается внизу, а рабочий стол Гленна – наверху.

Добавляем VSCode и расширение SSH для удалённой разработки

Окей, у нас есть безопасная, единообразная сеть и полная свобода! Могу ли я превратить мой экземпляр WSL2 в систему удалённой разработки для Гленна? Конечно, почему бы и нет?

Для ясности: это просто разговоры, эксперимент, но в нём что-то есть. Например, кроссплатформенность: можно работать с Mac, Windows, WSL2 и так далее. Этим разделом можно руководствоваться, чтобы поднять виртуальную машину на любом облачном или обычном хостере, установить Tailscale и больше не думать о перенаправлении портов, пользуясь поднятой машиной как песочницей. Да, можно работать с WSL локально, но установка на хосте – это весело, так появляется много классных вариантов.

Начнём. В WSL2 я запускаю сервис ssh. Можно было поделиться открытыми ключами и войти в систему с их помощью, но здесь залогинюсь по имени пользователя и отредактирую /etc/ssh/sshd_config, установлю порт, ListenAddressи PasswordAuthenticationв Yes:

Port 22
#AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::

PasswordAuthentication yes

glenn – локальный суперпользователь только в моём инстансе WSL2:

sudo adduser glenn
usermoid -aG sudo glenn

Теперь Гленн устанавливает пакет VS Code Remote Development и при помощи Remote via SSH подключается к моему IP в сети Tailscale. Ниже вы видите VS Code на машине Гленна, где ставится VS Code Server [не перепутайте с code-server для развёртывания VSC в вебе] и удалённую разработку вообще.

С точки зрения архитектуры Гленн и код в VS Code поделены пополам между клиентом на его машине Windows и сервером на моём экземпляре WSL2. Обратите внимание: в левом нижнем углу видно, что его VSCode подключён к IP моей WSL2 в сети Tailscale!

Что вы думаете об этом? Можно сравнить Tailscale с инструментами типа ориентированного на разработчиков типа NGrok, который прокладывает туннели к localhost, но есть кое-какие существенные отличия. Проведите расследование! Я никак не отношусь к компании NGrok, разве что я её фанат.

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

Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Рейтинг0
Комментарии7

Публикации