Развертывание Debian 12 на Windows 11 Pro через WSL2: пошаговое руководство

WSL Debian Windows

Шаг 1: Включение WSL2 (Windows Subsystem for Linux)

  1. Активируйте компоненты WSL и виртуализации. Убедитесь, что в BIOS включена поддержка виртуализации. Затем включите необходимые компоненты Windows. Это можно сделать через графический интерфейс (Панель управления → Программы → Включение или отключение компонентов Windows → отметить пункты «Подсистема Windows для Linux» и «Платформа виртуальной машины» с последующей перезагрузкой) или командой в PowerShell от имени администратора:
   dism /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 
   dism /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

После выполнения команд перезагрузите компьютер. (На Windows 11 эти компоненты обычно включаются автоматически при установке WSL.)

  1. Установите последнюю версию WSL. После перезагрузки откройте PowerShell от администратора и обновите WSL до актуальной версии командой:
   wsl --update

Это установит последнюю версию WSL из Microsoft Store (если она еще не установлена).

  1. Установите WSL2 в качестве версии по умолчанию. Выполните команду:
   wsl --set-default-version 2

Она убедится, что новые дистрибутивы Linux будут разворачиваться на ядре WSL2. (Windows 11 по умолчанию использует WSL2, но эта команда не повредит.)

Шаг 2: Установка Debian 12 в среде WSL2

  1. Установка дистрибутива Debian. Выберите оптимальный способ запуска Debian внутри Windows 11. Рекомендуется использовать WSL2 – встроенную подсистему Windows для Linux (без использования сторонних гипервизоров). Для установки Debian 12 можно воспользоваться Microsoft Store (найти приложение Debian и установить его) либо выполнить команду в PowerShell:
   wsl --install -d Debian

Эта команда автоматически загрузит и установит актуальный образ Debian GNU/Linux для WSL. Примечание: На момент написания Debian в Microsoft Store соответствует актуальной стабильной версии (Bookworm, Debian 12).

  1. Первый запуск и настройка Debian. После установки запустите Debian (через меню «Пуск» или командой wsl -d Debian). При первом запуске будет проведена первоначальная настройка: вас попросят ввести имя нового UNIX-пользователя и пароль для него. Задайте имя пользователя (например, user) и придумайте пароль. Этот пользователь будет иметь права sudo (администратора) по умолчанию. После этого вы окажетесь в командной строке Debian внутри WSL.
  2. Обновление пакетов в Debian. Перед установкой серверных компонентов обновите систему Debian до актуального состояния. Выполните в Linux-оболочке WSL (под своим новым пользователем, используя sudo для повышения прав):
   sudo apt update && sudo apt upgrade -y

Эта команда обновит списки пакетов и установит доступные обновления.

  1. (Опционально) Включение systemd в WSL2. По умолчанию в WSL2 система инициализации systemd может быть отключена, что влияет на автозапуск служб. Для полноценной работы сервиса MySQL/MariaDB, SSH и т.п. рекомендуется включить systemd. Выполните:
   sudo nano /etc/wsl.conf

и добавьте в файл следующие строки:

   [boot]  
   systemd=true

Сохраните файл (Ctrl+O, Enter) и выйдите (Ctrl+X). Затем выйдите из Debian (exit) и в PowerShell выполните команду перезапуска WSL:

   wsl --shutdown

После этого заново запустите Debian (через меню или wsl -d Debian). Теперь WSL загрузит дистрибутив с активированным systemd, и вы сможете использовать systemctl для управления сервисами, а службы смогут автоматически стартовать при запуске WSL.

Шаг 3: Установка и настройка Nginx (веб-сервер)

  1. Установка Nginx. В среде Debian установите веб-сервер Nginx командой:
   sudo apt install nginx -y

Пакет Nginx присутствует в стандартном репозитории Debian 12, поэтому установка произойдет из официальных источников. После завершения установки убедитесь, что служба Nginx запущена и добавлена в автозапуск. Выполните:

   sudo systemctl status nginx

Вы должны увидеть состояние active (running), а строка Loaded должна содержать enabled, что означает, что Nginx будет автоматически запускаться при старте системы. Например, на скриншоте ниже показан вывод статуса Nginx на Debian 12:

Вывод команды systemctl status nginx, подтверждающий, что сервис Nginx активен и включен в автозапуск.

  1. Проверка работы Nginx локально. По умолчанию Nginx слушает порт 80. Чтобы проверить, работает ли веб-сервер, выполните из Windows команду в браузере: http://localhost (или откройте браузер и перейдите на http://localhost). В режиме WSL2 с сетевым NAT вы можете обращаться к сервисам, запущенным в WSL, через локальный адрес Windows (localhost). Должна открыться стандартная стартовая страница Nginx (сообщение «Welcome to nginx»). Если она отображается, значит Nginx успешно обслуживает HTTP-запросы локально.
  2. Настройка виртуального хоста и PHP-интеграции. Для работы PHP через Nginx необходимо настроить обработку PHP-файлов с помощью PHP-FPM. Можно использовать существующий конфиг по умолчанию или создать новый. В данном руководстве создадим новый сайт. Например, если вы планируете размещать сайт example.com:
  • Создайте каталог для сайта и установите права: sudo mkdir -p /var/www/example.com sudo chown -R www-data:www-data /var/www/example.com sudo chmod -R 755 /var/www/example.com (Это создаст каталог и задаст владельцем веб-сервера www-data.)
  • Создайте файл конфигурации сайта для Nginx: sudo nano /etc/nginx/sites-available/example.com.conf Добавьте в него содержимое (замените example.com на ваше доменное имя при необходимости): server { listen 80; server_name example.com www.example.com; root /var/www/example.com; index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } Этот виртуальный хост настроен на обслуживание домена example.com и передает обработку PHP-файлов в PHP-FPM (через сокет php8.3-fpm). Сохраните файл и выйдите из редактора.
  • Активируйте конфигурацию и перезапустите Nginx: sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx Первая команда включает сайт, создавая символическую ссылку, вторая проверяет синтаксис конфигурации и перегружает Nginx. Теперь Nginx будет обслуживать ваш сайт. (При тестировании локально без DNS вы можете временно добавить в файл C:\Windows\System32\drivers\etc\hosts строку 127.0.0.1 example.com чтобы открыть сайт по имени.)

Шаг 4: Установка и настройка СУБД MySQL (MariaDB)

  1. Выбор СУБД и установка. Debian 12 в стандартной поставке использует MariaDB 10.x в качестве заменяемой СУБД MySQL (аналогичной по функционалу). Пакеты Oracle MySQL по умолчанию недоступны в репозиториях Debian 12. Поэтому оптимально установить MariaDB – она полностью совместима с MySQL для большинства задач. Для установки выполните:
   sudo apt install mariadb-server mariadb-client -y

После установки убедитесь, что сервис MariaDB запущен: sudo systemctl status mariadb. При включенном systemd база данных должна автоматически стартовать и быть помеченной как enabled (в автозапуске). Если systemd отключен, MariaDB можно запускать вручную командой sudo service mysql start (но мы включили systemd на шаге 2).

  1. Первоначальная настройка безопасности MariaDB. Запустите скрипт начальной настройки безопасности СУБД:
   sudo mysql_secure_installation

Этот скрипт предложит ряд шагов для повышения безопасности базы данных. В процессе рекомендуется:

  • Установить пароль для пользователя root базы данных (если еще не задан). Введите новый надежный пароль для root-MariaDB.
  • Удалить анонимных пользователей – ответьте Y (Yes), чтобы закрыть доступ без имени пользователя.
  • Запретить удаленный вход root – ответьте Y, чтобы аккаунт root СУБД не мог подключаться удаленно (только локально).
  • Удалить тестовую базу данных – она не нужна в боевой среде, согласитесь на удаление.
  • Перезагрузить таблицы привилегий – подтвердите для применения изменений. Скрипт последовательно задаст эти вопросы – нажимайте Y (или Enter, если значение по умолчанию «Yes») для соглашения со всеми перечисленными мерами безопасности.
  1. Проверка работы базы данных. После выполнения mysql_secure_installation можно проверить доступ к СУБД. Выполните команду:
   sudo mariadb

(или sudo mysql – алиас). Это откроет консоль СУБД под пользователем root (так как мы запускаем с sudo). Введите запрос SELECT VERSION(); чтобы убедиться, что сервер отвечает и узнать версию MariaDB/MySQL. Для выхода наберите EXIT;.

Примечание: Если требуется именно Oracle MySQL, его можно установить из официального репозитория Oracle. Для этого скачайте деб-пакет конфигурации mysql-apt-config с сайта dev.mysql.com и запустите его (sudo dpkg -i mysql-apt-config_*all.deb), выберите версию MySQL (например, 8.0 или 8.4) в меню и затем установите пакет mysql-server. Однако для большинства задач достаточно использования MariaDB, поставляемой с Debian.

Шаг 5: Установка PHP 8.3 и настройка PHP-FPM

  1. Подключение репозитория с PHP 8.3. Стандартные репозитории Debian 12 (Bookworm) содержат PHP версии 8.2 на момент выпуска. PHP 8.3 отсутствует в штатных репозиториях Debian, поэтому используем репозиторий deb.sury.org от разработчика Ondřej Surý, который предоставляет актуальные сборки PHP для Debian. Чтобы добавить этот репозиторий, выполните следующие команды в Debian WSL:
   sudo apt install -y ca-certificates apt-transport-https curl gnupg2 lsb-release
   sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
   echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
   sudo apt update

Первая команда установит инструменты, необходимые для https-репозиториев. Далее скачивается и добавляется ключ подписи репозитория, затем добавляется новый источник пакетов (для текущего выпуска Debian, $(lsb_release -sc) подставит bookworm). После обновления списков пакетов можно устанавливать PHP 8.3.

  1. Установка PHP 8.3 и необходимых модулей. Выполните установку PHP и компонентов:
   sudo apt install -y php8.3 php8.3-fpm php8.3-mysql php8.3-cli php8.3-curl php8.3-mbstring php8.3-xml php8.3-zip

Здесь:

  • php8.3-fpm – пакет менеджера процессов PHP (FastCGI Process Manager) для работы с Nginx.
  • php8.3-mysql – модуль PHP для подключения к MySQL/MariaDB.
  • Также устанавливаем распространенные модули: cURL, Mbstring, XML, Zip (при необходимости можно добавить и другие, например php8.3-gd для обработки изображений и т.д.).
    После установки, включите и запустите PHP-FPM:
   sudo systemctl enable php8.3-fpm
   sudo systemctl start php8.3-fpm

Убедитесь, что сервис PHP-FPM запущен (active (running)). Теперь PHP-FPM будет автоматически запускаться при старте (если включен systemd).

  1. Интеграция PHP с Nginx. Мы уже добавили в конфигурацию Nginx блок location ~ \.php$ { ... }, указывающий Nginx передавать обработку PHP-файлов на сокет PHP 8.3 FPM (fastcgi_pass unix:/run/php/php8.3-fpm.sock;). Убедитесь, что путь сокета совпадает с путем, прописанным в конфигурации PHP-FPM. По умолчанию PHP 8.3 FPM в Debian создаёт сокет /run/php/php8.3-fpm.sock – это соответствует тому, что мы указали. Если вы изменяли название сокета или хотите использовать TCP-порт, скорректируйте настройки Nginx соответственно.
  2. Тестирование PHP. Для проверки создайте простой PHP-скрипт. Например:
   echo "<?php phpinfo();" | sudo tee /var/www/example.com/info.php

(предполагается, что корень сайта – /var/www/example.com). Затем в браузере на Windows откройте http://localhost/info.php (или http://example.com/info.php, если настроили hosts для имени). Должна отобразиться страница с информацией о PHP (phpinfo), включая версию 8.3, загруженные модули и настройки. Если она отображается – связка Nginx + PHP 8.3-FPM работает корректно.

Шаг 6: Проброс портов для доступа извне (port forwarding)

Теперь настроим доступ к запущенному в WSL Debian веб-серверу из интернета через Windows 11, учитывая, что у вас есть статический внешний IP-адрес.

По умолчанию WSL2 использует NAT-сеть, и его сетевой интерфейс (виртуальный адаптер) отделен от хоста Windows. Внешние подключения напрямую в WSL2 по его IP невозможны без настройки проксирования или проброса портов. Мы организуем перенаправление портов 80 (HTTP) и 443 (HTTPS) с хоста Windows на ВМ Debian (WSL).

  1. Узнайте IP-адрес WSL Debian. Выполните в PowerShell:
   wsl -d Debian hostname -I

Эта команда выведет текущий внутренний адрес WSL Debian (например, 172.25.35.235). Запомните или скопируйте его.

  1. Настройте перенаправление портов Windows→WSL. В PowerShell от имени администратора выполните команду для каждого порта:
  • Для HTTP (порт 80): netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=80 connectaddress=<WSL_IP> connectport=80
  • Для HTTPS (порт 443): netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=443 connectaddress=<WSL_IP> connectport=443 Замените <WSL_IP> на IP-адрес, полученный на предыдущем шаге. Параметр listenaddress=0.0.0.0 означает, что Windows будет принимать подключения на порт на всех своих интерфейсах (включая внешний статический IP) и перенаправлять их на указанный адрес и порт внутри WSL. Команда настроит постоянный прокси (портфорвардинг) на уровне Windows.

Примечание: Если вы хотите ограничить прослушивание только конкретным интерфейсом/адресом (например, только статическим внешним IP, либо только локальной сетью), укажите в listenaddress= конкретный адрес Windows. Например, listenaddress=192.168.1.100 будет слушать только на этом локальном IP. 0.0.0.0 слушает на всех IPv4-интерфейсах.

  1. Настройте брандмауэр Windows. После добавления правил порт-прокси, откройте соответствующие порты в брандмауэре Windows для входящих подключений. В PowerShell (администратор) выполните:
   netsh advfirewall firewall add rule name="WSL2 Nginx HTTP" dir=in action=allow protocol=TCP localport=80
   netsh advfirewall firewall add rule name="WSL2 Nginx HTTPS" dir=in action=allow protocol=TCP localport=443

Эти команды создадут правила брендмауэра, разрешающие входящие соединения на портах 80 и 443. (Альтернатива – настроить правила через графический интерфейс «Защитника Windows с расширенной безопасностью».) Убедитесь, что на уровне маршрутизатора/провайдера данные порты также не блокируются и что внешний статический IP адресован вашему ПК.

  1. Проверка доступа из интернета. Теперь ваш веб-сервер, работающий в Debian (WSL2), должен быть доступен снаружи. Попробуйте зайти на свой веб-сайт через интернет, используя ваш внешним IP или доменное имя, привязанное к нему. Например, http://<ваш-статический-IP>/ или https://<домен> (если настроен SSL). Windows примет входящее соединение на указанных портах и перенаправит его в WSL2 на Nginx. Примечание по HTTPS: Для работы HTTPS вам понадобится установить сертификат. Можно либо настроить Nginx на прием HTTPS (слушать 443 и указать пути к сертификату), либо терминировать SSL на стороне Windows (например, с помощью IIS или стороннего прокси) и передавать в WSL по HTTP. Проще реализовать полный цикл на Nginx в WSL: скопируйте сертификаты в WSL и добавьте в конфиг listen 443 ssl; и пути к ssl_certificate и ssl_certificate_key. Не забудьте также открыть порт 443, как показано выше.
  2. Динамический IP WSL. Учтите, что IP-адрес WSL Debian может меняться при перезапуске WSL или системы. В этом случае правила portproxy нужно обновлять. Вы можете создать скрипт PowerShell, который при запуске системы будет заново добавлять правила с актуальным IP WSL. Например:
   $wsl_ip = wsl hostname -I
   netsh interface portproxy set v4tov4 listenaddress=0.0.0.0 listenport=80 connectaddress=$wsl_ip connectport=80
   netsh interface portproxy set v4tov4 listenaddress=0.0.0.0 listenport=443 connectaddress=$wsl_ip connectport=443

Этот скрипт можно сохранить и добавить в «Планировщик заданий» Windows с триггером «При входе в систему» от имени Администратора, чтобы правила обновлялись автоматически после каждого запуска. (Либо можно прописать netsh interface portproxy add с ключом listenaddress=<ваш-статический-IP> как в примере выше – тогда при изменении IP WSL достаточно сбросить старые правила netsh interface portproxy reset и выполнить новые.)

Шаг 7: Обеспечение безопасности системы

Наконец, важно настроить базовые меры безопасности как в Windows, так и внутри Debian.

1. Брандмауэр и ограничение портов. Мы уже настроили брандмауэр Windows для нужных портов. Рекомендуется закрыть все прочие неиспользуемые порты на Windows и разрешить только те, которые необходимы (80, 443, возможно 22 для SSH). По умолчанию Windows Firewall блокирует входящие соединения, кроме разрешенных правил, поэтому дополнительных действий может не требоваться.

На стороне Debian вы также можете настроить внутренний брандмауэр (iptables/ufw) на случай, если каким-то образом посторонний трафик достигнет WSL. Например, установите ufw и разрешите только нужные порты:

sudo apt install ufw -y
sudo ufw allow 22/tcp    # разрешить SSH
sudo ufw allow 80/tcp    # разрешить HTTP
sudo ufw allow 443/tcp   # разрешить HTTPS
sudo ufw enable

Это включит брандмауэр UFW внутри Debian и будет блокировать любые лишние соединения. Однако учитывайте, что при использовании portproxy все подключения выглядят для WSL как исходящие от хоста (обычно с IP адресом шлюза 172.x.x.1). Поэтому внутренний firewall пригодится в основном если вы в будущем настроите «просвет» (bridge) или прямое соединение к WSL-интерфейсу. В нашей схеме NAT+portproxy безопасность в основном обеспечивается брандмауэром Windows.

2. Fail2Ban для защиты от брутфорса. Для защиты от подборов паролей и других атак рекомендуется установить Fail2Ban внутри Debian. Fail2Ban следит за журналами (например, попытки входа по SSH, ошибки веб-сервера) и при обнаружении множества неудачных попыток блокирует (банит) IP-адрес нарушителя на уровне брандмауэра. Установите fail2ban командой:

sudo apt install fail2ban -y

При наличии systemd запустите и добавьте в автозапуск: sudo systemctl enable --now fail2ban.

По умолчанию Fail2Ban на Debian содержит фильтр для SSH. Можно настроить его параметры в файле /etc/fail2ban/jail.local. Для начала скопируйте дефолтный конфиг: sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local и отредактируйте jail.local, убедившись, что в секции [sshd] стоит enabled = true (в некоторых дистрибутивах по умолчанию уже включено). Также можно настроить maxretry (число попыток до бана, например 3) и время бана. Затем перезапустите Fail2Ban: sudo systemctl restart fail2ban.

Важно: В условиях WSL2 с portproxy все внешние SSH-подключения могут логироваться как исходящие от одного адреса (адреса хоста Windows). Это означает, что Fail2Ban в случае многократных попыток может забанить ваш Windows-хост, что разом отрежет все подключения (поскольку все идут через хост). Будьте осторожны с этой настройкой: возможно, имеет смысл не включать автоматический бан в WSL, а полагаться на сложные пароли/ключи и брандмауэр Windows. Либо, как вариант, использовать Fail2Ban на стороне Windows (например, с помощью встроенного механизма ограничений Windows или сторонних утилит).

3. Безопасный SSH-доступ. Если вы планируете подключаться к своему Debian по SSH (например, для администрирования удаленно), необходимо укрепить безопасность SSH:

  • Установите и запустите SSH-сервер: sudo apt install openssh-server -y && sudo systemctl enable --now ssh.
  • Отредактируйте конфигурацию /etc/ssh/sshd_config: отключите вход под root (PermitRootLogin no), при необходимости поменяйте порт на нестандартный, например 2222 (Port 2222), разрешите аутентификацию по ключам (PubkeyAuthentication yes) и отключите парольную аутентификацию (PasswordAuthentication no) для более высокой безопасности – либо оставьте yes для паролей, если ключи не используются. Также можно ограничить круг пользователей, которым разрешен доступ, добавив AllowUsers <ваш_user>.
  • После изменений перезапустите SSH: sudo systemctl restart ssh. Убедитесь, что SSH работает: sudo systemctl status ssh (должно быть active).
  • Настройте на Windows проброс порта 22 (или выбранного) по аналогии с шагом 6, если планируете входить извне. Например, netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=<WSL_IP> connectport=2222 и откройте порт 2222 в брандмауэре Windows. После этого вы сможете подключаться по SSH извне, указав IP Windows и порт 2222 (например, ssh user@<ваш-IP> -p 2222).

Совет: Настройте вход по ключу SSH для удобства и безопасности. Сгенерируйте ключи (ssh-keygen на клиенте), добавьте содержимое вашего id_rsa.pub в файл ~/.ssh/authorized_keys на Debian WSL (создав его через nano), и установите права chmod 600 ~/.ssh/authorized_keys. После этого сможете входить без пароля. Не забудьте очень надежный пароль для учетной записи, если сохраняете возможность входа по паролю, или вовсе отключите парольный вход как упомянуто выше.

4. Обновления и мониторинг. Регулярно обновляйте систему Debian внутри WSL командой sudo apt update && sudo apt upgrade (или настроив unattended-upgrades), чтобы получать последние патчи безопасности. Следите за логами Nginx, PHP и системой (файлы в /var/log/), чтобы выявлять подозрительную активность. Инструмент Fail2Ban поможет автоматически реагировать на некоторые типы атак, но ручной аудит тоже важен.


Следуя этому руководству, вы развернули Debian 12 на Windows 11 Pro с помощью WSL2, установили стек веб-сервера (Nginx + PHP 8.3 + MySQL/MariaDB) и настроили доступ к нему через интернет с учетом статического IP, а также реализовали базовые меры безопасности для защиты сервера. Теперь ваш Debian-хост в WSL2 функционирует как полноценный веб-сервер, доступный извне, но управляемый из Windows. Успешной работы!

Источники:

  • Официальная документация Microsoft: настройка WSL2 и установка Debian, рекомендации по сети WSL2.
  • Опыт сообщества: Horus_Sirius, “WSL2 Debian & Nginx & PHP 8.3 & MariaDB” – пошаговый пример установки стек LEMP на WSL2.
  • Блог UltraVDS: установка LEMP на Debian 12 (Nginx, MariaDB, PHP) и советы по безопасности MariaDB.
  • Справочник CrownCloud: защита SSH с Fail2Ban на Debian 12.
  • База знаний купереал.ком: подключение к WSL2 по SSH и проброс портов (пример команды netsh portproxy и правило брандмауэра).
Разработка и продвижение сайтов webseed.ru
Прокрутить вверх