Свежий VDS из панели провайдера часто торчит всем подряд: SSH, иногда MySQL, панель на странном порту. Firewall — первое, что настраиваете до выкладки скрипта с реальными данными. Не после взлома.
Цель простая: снаружи только то, что нужно людям и вам. PHP-сайт обычно хочет 80/443, админ — SSH. MySQL с интернета не нужен.
Минимум портов
- 22/tcp (или ваш нестандартный SSH) — только для админов, лучше с ограничением по IP если IP стабильный.
- 80/tcp — HTTP (редирект, выпуск Let’s Encrypt).
- 443/tcp — HTTPS.
- 3306/tcp снаружи — закрыть. Слушать 127.0.0.1.
Панель ISPmanager/другое — отдельный порт; либо закрыть снаружи и ходить через SSH-туннель, либо жёстко ограничить IP. Оставлять панель миру с паролем «из письма» нельзя.
UFW (Ubuntu) — типичный каркас
ufw default deny incoming
ufw default allow outgoing
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
Перед enable убедитесь, что SSH-правило есть. Иначе отрежете себя. Консоль провайдера (KVM/VNC) должна быть под рукой.
firewalld на CentOS/RHEL — та же идея другими командами: ssh, http, https в zone public; mysql не открывать.
MySQL только локально
В bind-address = 127.0.0.1 (или аналог для MariaDB). Скрипт на этой же машине коннектится к localhost — этого достаточно. Удалённый доступ к БД с домашнего ПК — через SSH-туннель, не через открытый 3306.
Открытый MySQL с паролем root/root на свежем VDS — классика сканеров. Даже с «сложным» паролем лишняя поверхность.
SSH
- Ключи вместо пароля.
- fail2ban или аналог.
- По возможности другой порт + запрет root-login по паролю.
Не путайте «закрыть 22» с «оставить только ключи на 22». Если закроете SSH неверно — только консоль провайдера спасёт.
Let’s Encrypt
HTTP-01 challenge требует доступность 80 снаружи (или DNS-challenge). Не закрывайте 80 насовсем, если пользуетесь http-проверкой. После выпуска редирект на 443 — норма. SSL: мануал.
Связка со стеком
Nginx/FPM: настройка. Выбор VDS: VDS для PHP. Root-доступ: VPS с root. Установка скрипта после базовой безопасности: установка.
Проверка
С другой машины:
nmap -p 22,80,443,3306 YOUR_IP
3306 не должен светиться open для мира. С самого сервера mysql на 127.0.0.1 работает.
Если после firewall сайт не открывается — смотрите ufw status и что nginx слушает 0.0.0.0:80/443. Connection refused к сайту ≠ ошибка PHP.
Бэкапы и мониторинг
Firewall не заменяет бэкапы и не ловит дыру в самом PHP-скрипте. Копии: бэкап. Доступность: мониторинг. Инциденты по продукту: поддержка.
На локальном Windows MicroServer домашний firewall обычно не трогаете ради *.loc — это другой контур: локальный сервер.
Порядок правил важен
В iptables/ufw сначала разрешаете SSH, потом остальное, потом включаете политику deny. Обратный порядок на удалённой машине без KVM — классический способ закрыть себе доступ. Перед экспериментом откройте веб-консоль провайдера и проверьте, что она жива.
Если сменили порт SSH на 2222 — правило ufw должно разрешать 2222, а не только OpenSSH-профиль на 22. Иначе после reload сессия ещё жива, а новый логин уже нет.
Панели и дополнительные порты
ISPmanager, phpMyAdmin, RabbitMQ, Redis UI — всё это часто слушает порты. Либо закрываете снаружи, либо ограничиваете IP. Redis и MySQL на 0.0.0.0 с паролем «1» — готовый инцидент. Для PHP-скрипта Microscript снаружи достаточно веба и SSH.
Если нужен доступ к MySQL с рабочего ноутбука — SSH-туннель:
ssh -L 3307:127.0.0.1:3306 user@vds
Локально подключаетесь к 127.0.0.1:3307. Порт 3306 на публичном интерфейсе не открываете.
Провайдерский firewall и ufw вместе
У многих VDS есть security groups / firewall в личном кабинете. Правила там и на машине должны согласовываться. Открыли 443 в ufw, забыли в панели провайдера — снаружи порт закрыт. Наоборот тоже бывает. При «сайт не открывается» проверяйте оба слоя, потом уже Nginx.
Гео и сканеры
После старта VDS в логах auth сразу чужие логины. Это нормальный фон интернета. fail2ban на sshd снижает шум. Не подставляйте пароль root из письма дольше первого часа. Ключи SSH — база. Про общий hardening после покупки: VPS с root, выбор VDS.
Что сделать после настройки веба
- Проверить с телефона на LTE (не тот же Wi‑Fi/VPN), что сайт открывается.
- Проверить, что
nmapснаружи не показывает 3306. - Выпустить SSL — SSL.
- Поставить скрипт — установка.
- Включить мониторинг uptime — мониторинг.
Если после ufw enable пропал сайт, а SSH жив — скорее забыли allow 80/443. Если пропало всё — консоль провайдера и ufw disable / правка правил.
Docker и firewall
Docker любит вставлять свои цепочки iptables. Правила ufw иногда неожиданно обходятся пробросом портов контейнера. Если поднимаете MySQL в Docker с publish 3306:3306 на 0.0.0.0 — получите дыру мимо «логической» политики. Публикуйте на 127.0.0.1:3306 или не публикуйте вовсе, оставьте docker network.
Для классического стека Nginx+PHP-FPM+MariaDB на хосте без Docker таких сюрпризов меньше: Nginx + PHP-FPM. Бэкапы и переносы после того, как периметр закрыт: бэкап, перенос.
Не открывайте «временно всем всё» через ufw allow 3306 на ночь ради удобства коллеги — утром забудете закрыть. Туннель быстрее настроить один раз, чем разбирать взломанную БД. То же про панель на 8080/1500: либо VPN, либо allow с конкретного IP. После любых правок firewall проверьте сайт с мобильного интернета и SSH новым окном терминала, не полагаясь на уже открытую сессию. Если отрезали себя — консоль провайдера, не «переустановка VDS с нуля» сразу. Выбор машины и root: VDS, VPS с root. Установка скрипта уже за закрытым периметром: установка.
Частые вопросы
Firewall на vds для php сайта?
Открытый MySQL снаружи — частая дыра на свежем VDS.
Сколько времени занимает «Firewall на VDS для PHP-сайта»?
Ориентир по тексту мануала — около 5 мин. На практике зависит от хостинга и подготовки базы.
Нужен ли отдельный сервер?
Для большинства скриптов достаточно хостинга или VDS с PHP и MySQL. Подбор сервера — в разделе VDS и требованиях к PHP/MySQL.
Какой vds для скрипта доски объявлений?
Разбор рядом в мануале по этому запросу. какой vds для скрипта доски объявлений
Vps с root для php скрипта?
Разбор рядом в мануале по этому запросу. vps с root для php скрипта