Практическое руководство с разбором реальных кейсов
Автор: Твой братишка-админ
Дата: Февраль 2026
Версия: 1.0
Теги: vds ubuntu vpn docker gitea iptables postgresql сеть безопасность
📚 Оглавление
- Введение
- Глава 1: Первые шаги с VDS
- Глава 2: Основы сетевой диагностики
- Глава 3: Настройка VPN (Amnezia/XRay)
- Глава 4: Защита сервера (iptables, блокировка атак)
- Глава 5: Docker-инфраструктура
- Глава 6: Развёртывание Gitea и PostgreSQL
- Глава 7: Настройка домена и HTTPS (Caddy)
- Глава 8: Диагностика Windows-клиента
- Глава 9: Чек-листы и шпаргалки
📖 Введение
Этот документ родился из реального опыта настройки сервера с нуля. Мы прошли через всё: от подключения по SSH до полноценного Git-сервера с защитой от атак. Здесь собраны не просто сухие команды, а живые ситуации и их решения.
🎯 Для кого эта статья
- Для тех, кто хочет понять, а не просто скопировать
- Для начинающих администраторов
- Для тех, кто ценит безопасность и контроль
🚀 Глава 1: Первые шаги с VDS
1.1 Подключение по SSH
bash
# Из Windows (PuTTY)
# Просто вводим IP и порт 22
# Из Linux/Mac
ssh root@71.109.135.24
Важно: При первом подключении PuTTY спросит про ключ — это нормально. Нажимай Accept.
1.2 Базовая настройка сервера
bash
# Обновление пакетов apt update && apt upgrade -y # Создание пользователя (не сиди под root!) adduser bro usermod -aG sudo bro su - bro
1.3 Полезные команды для ориентации
bash
whoami # кто я? pwd # где я? ls -la # что тут есть? df -h # место на диске free -h # память
🌐 Глава 2: Основы сетевой диагностики
2.1 Инструменты диагностики
| Команда | Что делает | Пример |
|---|---|---|
ping | Проверка доступности узла | ping 8.8.8.8 |
curl -I | Проверка HTTP-ответа | curl -I https://git.vatoko.ru |
nslookup | Проверка DNS | nslookup google.com 8.8.8.8 |
tcpdump | Просмотр трафика | tcpdump -i amn0 -n |
ss -tulpn | Слушающие порты | ss -tulpn | grep 443 |
iptables -L -v -n | Правила фаервола | iptables -L INPUT -v -n |
2.2 Как читать ответы
Пример ping:
text
64 bytes from 8.8.8.8: icmp_seq=1 ttl=106 time=48ms
ttl=106— количество прыжков (чем меньше, тем ближе сервер)time=48ms— задержка (хорошо до 100ms)
Пример curl:
text
HTTP/2 200 # ✅ всё ок HTTP/4xx # ❌ ошибка клиента HTTP/5xx # ❌ ошибка сервера
🔒 Глава 3: Настройка VPN (Amnezia/XRay)
3.1 Базовая архитектура
- Сервер: VDS с Ubuntu
- VPN-протокол: XRay (маскируется под HTTPS)
- Порт: 443 (TCP для XRay, UDP для AmneziaWG)
3.2 Типичные проблемы VPN
Проблема: VPN подключен, но сайты не грузятся
Диагностика:
bash
# На сервере
tcpdump -i amn0 -n # смотрим, идёт ли трафик от клиента
ping 127.29.127.2 # пингуем клиента
Решение: Проверяем маршруты и MTU
bash
# Добавляем MSS clamping (важно для WireGuard!) iptables -t mangle -A FORWARD -o amn0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
3.3 Работа с портом 443 (особый случай)
На сервере могут одновременно работать:
- UDP 443 — AmneziaWG (VPN)
- TCP 443 — Caddy (веб-сервер)
Это нормально! TCP и UDP не конфликтуют.
🛡️ Глава 4: Защита сервера (iptables)
4.1 Базовая защита от атак
bash
# Блокировка целой подсети (например, бразильские боты) iptables -I INPUT -s 177.36.0.0/16 -j DROP iptables -I FORWARD -s 177.36.0.0/16 -j DROP # Просмотр заблокированных пакетов iptables -L INPUT -v -n | grep DROP
4.2 Сохранение правил
bash
# Установка пакета для сохранения apt install iptables-persistent -y # Сохранение текущих правил iptables-save > /etc/iptables/rules.v4 netfilter-persistent save
4.3 Проверка активных правил
bash
iptables -L INPUT -v -n | head -20 iptables -t nat -L POSTROUTING -v -n iptables -t mangle -L FORWARD -v -n
🐳 Глава 5: Docker-инфраструктура
5.1 Установка Docker
bash
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER # Выйти и зайти заново
5.2 Основные команды Docker
bash
docker ps # запущенные контейнеры docker ps -a # все контейнеры docker logs <контейнер> # логи docker exec -it <контейнер> /bin/bash # войти в контейнер docker restart <контейнер> # перезапустить docker compose up -d # запустить из docker-compose.yml docker compose down # остановить
5.3 Структура docker-compose.yml
yaml
version: '3.8'
services:
имя_сервиса:
image: образ
container_name: имя
restart: unless-stopped
ports:
- "внешний:внутренний"
volumes:
- том:/путь/в/контейнере
environment:
- ПЕРЕМЕННАЯ=значение
networks:
- сеть
🗄️ Глава 6: Развёртывание Gitea и PostgreSQL
6.1 Запуск PostgreSQL
yaml
postgres:
image: postgres:16
environment:
POSTGRES_USER: gitea
POSTGRES_PASSWORD: gitea123
POSTGRES_DB: gitea
volumes:
- postgres_data:/var/lib/postgresql/data
6.2 Работа с PostgreSQL
bash
# Вход в консоль docker exec -it postgres psql -U gitea # Полезные SQL-команды \l # список баз \du # список пользователей CREATE DATABASE mydb OWNER myuser; # создать базу CREATE USER myuser WITH PASSWORD 'pass'; # создать пользователя \q # выход
6.3 Строка подключения к БД
text
postgresql://пользователь:пароль@postgres:5432/имя_базы
🌍 Глава 7: Настройка домена и HTTPS (Caddy)
7.1 Caddyfile (конфиг)
text
git.твой-домен.ru {
reverse_proxy gitea:3000
}
*.твой-домен.ru {
respond "Скоро тут будет проект!"
}
7.2 DNS-записи
| Тип | Имя | Значение |
|---|---|---|
| A | git | IP сервера |
| A | @ | IP сервера (если нужно) |
7.3 Проверка SSL-сертификата
bash
curl -I https://git.твой-домен.ru # Должен быть ответ HTTP/2 200
💻 Глава 8: Диагностика Windows-клиента
8.1 Таблица маршрутизации
cmd
route print -4
На что смотреть:
- Есть ли маршрут по умолчанию (
0.0.0.0) через VPN? - Метрика (чем меньше, тем приоритетнее)
Исправление:
cmd
# Удалить лишние маршруты route delete 0.0.0.0 mask 0.0.0.0 192.168.1.1 # Добавить правильный route add 0.0.0.0 mask 0.0.0.0 10.33.0.2 metric 5
8.2 DNS
cmd
# Проверка nslookup google.com # Если не работает — меняем DNS в свойствах адаптера на 8.8.8.8
8.3 Сброс сетевых настроек
cmd
netsh int ip reset netsh winsock reset ipconfig /flushdns # Перезагрузка
📋 Глава 9: Чек-листы и шпаргалки
9.1 Чек-лист при проблемах с VPN
На сервере:
ping 127.29.127.2— клиент отвечает?tcpdump -i amn0 -n— трафик идёт?ss -tulpn | grep 443— порт слушается?iptables -L FORWARD -v -n— правила не сбросились?cat /proc/sys/net/ipv4/ip_forward— должно быть 1
На клиенте:
ipconfig /all— есть IP из VPN-сети?route print -4— правильные маршруты?ping 127.29.127.1— сервер отвечает?nslookup google.com— DNS работает?- Брандмауэр не блокирует?
9.2 Шпаргалка по iptables
| Действие | Команда |
|---|---|
| Посмотреть правила INPUT | iptables -L INPUT -v -n |
| Заблокировать IP | iptables -I INPUT -s IP -j DROP |
| Заблокировать подсеть | iptables -I INPUT -s 177.36.0.0/16 -j DROP |
| Удалить правило | iptables -D INPUT номер |
| Сохранить правила | iptables-save > /etc/iptables/rules.v4 |
| Восстановить правила | iptables-restore < /etc/iptables/rules.v4 |
9.3 Шпаргалка по Docker
| Действие | Команда |
|---|---|
| Запустить контейнеры | docker compose up -d |
| Остановить контейнеры | docker compose down |
| Посмотреть логи | docker logs имя_контейнера |
| Зайти в контейнер | docker exec -it имя_контейнера /bin/bash |
| Перезапустить | docker restart имя_контейнера |
| Удалить всё | docker system prune -a --volumes |
9.4 Шпаргалка по PostgreSQL
| Действие | Команда (внутри psql) |
|---|---|
| Войти в консоль | docker exec -it postgres psql -U gitea |
| Список баз | \l |
| Список пользователей | \du |
| Создать базу | CREATE DATABASE имя OWNER владелец; |
| Создать пользователя | CREATE USER имя WITH PASSWORD 'пароль'; |
| Выйти | \q |
9.5 Шпаргалка по диагностике сети
| Вопрос | Команда |
|---|---|
| Доступен ли узел? | ping 8.8.8.8 |
| Какой у меня IP? | curl ifconfig.me |
| Работает ли DNS? | nslookup google.com 8.8.8.8 |
| Открыт ли порт? | nc -zv IP порт |
| Какие порты слушаются? | ss -tulpn |
| Кто занял порт? | lsof -i :443 |
🎯 Заключение
Эта статья — твой личный навигатор в мире серверного администрирования. Сохрани её, добавляй свои заметки, возвращайся к ней, когда сталкиваешься с проблемой.
🔥 Главные уроки, которые мы вынесли:
- Любая проблема решаема, если разбить её на маленькие шаги
- Логи и диагностика — твои лучшие друзья
- Не бойся ошибок — каждая ошибка делает тебя сильнее
- Документируй всё — через месяц забудешь, что делал
- Безопасность — это не опция, а необходимость