Итоговая памятка по iptables на Ubuntu для VPN
1. Введение
iptables — инструмент для фильтрации и маршрутизации пакетов в Linux. Используется для:
- Безопасного открытия портов для VPN
- Пропуска VPN-трафика и форвардинга
- Предотвращения утечек IP и DNS
- Настройки NAT для выхода клиентов в интернет
Поддерживаемые VPN: Ocserv (OpenConnect), AmneziaWG (WireGuard), VLESS (Xray/VMess).
2. Основы iptables
2.1 Цепочки и таблицы
| Тип | Цепочка | Назначение |
|---|---|---|
| Фильтрация | INPUT | Входящие пакеты |
| Фильтрация | OUTPUT | Исходящие пакеты |
| Фильтрация | FORWARD | Пересылаемые пакеты |
| NAT | PREROUTING | Изменение пакетов до маршрутизации |
| NAT | POSTROUTING | Маскарадинг исходящих пакетов |
Таблицы: filter (по умолчанию), nat, mangle, raw, security.
2.2 Политики по умолчанию
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
Блокируем всё входящее по умолчанию, разрешаем локальный трафик и исходящий.
2.3 Основные операторы
| Оператор | Описание |
|---|---|
| -A <цепочка> | Добавить правило в конец |
| -I <цепочка> [номер] | Вставить правило на позицию (по умолчанию начало) |
| -R <цепочка> <номер> | Заменить правило по номеру |
| -D <цепочка> [номер/условия] | Удалить правило по номеру или точному совпадению |
| -F <цепочка> | Очистить цепочку |
| -X <цепочка> | Удалить пользовательскую цепочку |
| -L [опции] | Просмотр правил |
| -t <table> | Указать таблицу (nat, mangle) |
2.4 Фильтры и цели
| Параметр | Назначение |
|---|---|
| -p tcp|udp|icmp | Протокол |
| –dport <port> | Порт назначения |
| –sport <port> | Порт источника |
| -s <IP/подсеть> | IP источника |
| -d <IP/подсеть> | IP назначения |
| -i <interface> | Входящий интерфейс |
| -o <interface> | Исходящий интерфейс |
| -m state –state <states> | Состояние соединения (NEW, ESTABLISHED, RELATED) |
| -j ACCEPT|DROP|REJECT|MASQUERADE|LOG | Действие |
3. Настройка VPN-трафика
3.1 Ocserv (OpenConnect)
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -s 10.10.0.0/24 -j ACCEPT
sudo iptables -A FORWARD -d 10.10.0.0/24 -j ACCEPT
3.2 AmneziaWG (WireGuard)
sudo iptables -A INPUT -p udp --dport 51820 -j ACCEPT
sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -A FORWARD -o wg0 -j ACCEPT
3.3 VLESS (Xray)
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 443 -j ACCEPT
sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
4. NAT / Маскарадинг
# Ocserv
sudo iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth0 -j MASQUERADE
# WireGuard
sudo iptables -t nat -A POSTROUTING -s 10.13.0.0/24 -o eth0 -j MASQUERADE
5. Защита от утечек DNS
# Разрешаем DNS только через VPN
sudo iptables -A OUTPUT -p udp --dport 53 -o tun0 -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -o wg0 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 53 -o tun0 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 53 -o wg0 -j ACCEPT
# Блокируем DNS через основной интерфейс
sudo iptables -A OUTPUT -p udp --dport 53 -o eth0 -j DROP
sudo iptables -A OUTPUT -p tcp --dport 53 -o eth0 -j DROP
6. Логирование
sudo iptables -A INPUT -j LOG --log-prefix "iptables-drop: " --log-level 4
sudo iptables -A FORWARD -j LOG --log-prefix "iptables-forward-drop: " --log-level 4
7. Управление правилами (удаление и очистка)
7.1 Просмотр с номерами
sudo iptables -L -v -n --line-numbers
7.2 Удаление правил
- По номеру:
sudo iptables -D INPUT 3 - По точному совпадению:
sudo iptables -D INPUT -p tcp --dport 443 -j ACCEPT - Очистка цепочки:
sudo iptables -F INPUT,sudo iptables -F FORWARD - Удаление пользовательской цепочки:
sudo iptables -X MYCHAIN
8. Сохранение правил
sudo apt install iptables-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload
9. Примеры использования операторов
| Команда | Действие |
|---|---|
| iptables -A INPUT -p tcp –dport 443 -j ACCEPT | Добавить правило в конец INPUT |
| iptables -I INPUT 1 -p tcp –dport 22 -j ACCEPT | Вставить правило в начало INPUT |
| iptables -R INPUT 3 -p tcp –dport 80 -j DROP | Заменить 3-е правило |
| iptables -D INPUT 2 | Удалить 2-е правило |
| iptables -F FORWARD | Очистить цепочку FORWARD |
10. Рекомендации
- Тестируйте правила через отдельную SSH-сессию
- Используйте отдельные цепочки и подсети для разных VPN
- Всегда указывайте правильные интерфейсы (tun0, wg0, eth0)
- Используйте состояние соединения (ESTABLISHED,RELATED)
- Логирование полезно на этапе отладки