Как настроить Kill Switch для Linux Firewall с VLESS (Nekoray) и различными VPN профилями (разные IP и порты)?
Здравствуйте уважаемые знатоки!
Ситуация:
- Машина Linux, на которой работает VPN VLESS через клиент Nekoray
- Имею множество профилей VPN с различными IP и портами для подключения
- Задача: настроить Kill Switch, чтобы при переключении между VPN профилями не приходилось перенастраивать Firewall и чтобы трафик не шел в обход VPN
Я не сильный сетевик, но кажется, что решение может быть в том, чтобы завернуть трафик на виртуальный интерфейс, который создает Nekoray в режиме “TUN” (виден при команде ip a).
Однако возникают вопросы:
- Что произойдет, если Nekoray выйдет из строя, интерфейсы останутся, а трафик пойдет в обход отвалившегося VPN?
- Какие еще возможные сбои могут возникнуть, которые трудно предвидеть?
- Если жестко привязать Kill Switch к IP или порту, то придется при каждом переключении профиля VPN перенастраивать Firewall.
Подскажите, как правильно реализовать Kill Switch в данной ситуации?
Всем добра!
Чтобы настроить Kill Switch для Linux Firewall с VLESS (Nekoray) и различными VPN профилями, вам нужно создать правила, которые блокируют весь трафик за исключением трафика через виртуальный TUN интерфейс, создаваемый Nekoray, независимо от IP-адреса или порта VPN-сервера.
Содержание
- Понимание работы TUN интерфейса и Kill Switch
- Настройка базового Kill Switch с iptables
- Работа с несколькими VPN профилями
- Мониторинг и автоматическое управление правилами
- Обработка сбоев и крайние случаи
- Альтернативные решения с UFW
- Рекомендации и лучшие практики
Понимание работы TUN интерфейса и Kill Switch
Когда Nekoray работает в режиме TUN, он создает виртуальный сетевой интерфейс (обычно с именем tun0 или аналогичным). Весь трафик в этом режиме направляется через этот интерфейс, что позволяет контролировать сетевые потоки на уровне ядра Linux.
Важно: TUN интерфейс создается только при активном VPN-соединении. Если Nekoray выйдет из строя, этот интерфейс исчезнет, что автоматически прервет VPN-соединение.
Преимущества подхода с TUN интерфейсом:
- Не зависит от IP-адресов или портов конкретных VPN-серверов
- Работает с любым количеством VPN-профилей
- Автоматически адаптируется к смене подключений
Потенциальные проблемы:
- Если Nekoray “зависнет” без корректного закрытия интерфейсов
- При сбоях в работе самого TUN драйвера
- При конфликтах с другими сетевыми службами
Настройка базового Kill Switch с iptables
Для настройки Kill Switch вам понадобятся права root. Вот пошаговая инструкция:
1. Определите имя TUN интерфейса
ip a
Вы увидите что-то вроде:
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
2. Настройте базовые правила iptables
# Сброс существующих правил (осторожно!)
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
# Политика по умолчанию - блокировать весь трафик
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# Разрешить локальный трафик
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Разрешить трафик через TUN интерфейс
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A INPUT -i tun0 -j ACCEPT
# Разрешить установку новых соединений
iptables -A OUTPUT -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
3. Сделайте правила постоянными
Для Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6
Для CentOS/RHEL:
service iptables save
Работа с несколькими VPN профилями
Поскольку ваш Kill Switch основан на TUN интерфейсе, а не на конкретных IP-адресах, он будет работать с любым количеством VPN-профилей автоматически.
Динамическая настройка для разных VPN
Если у вас возникают проблемы с определением имени TUN интерфейса, можно использовать более универсальный подход:
#!/bin/bash
# Скрипт для динамического Kill Switch
VPN_INTERFACE=$(ip a | grep -o 'tun[0-9]\+' | head -1)
if [ -n "$VPN_INTERFACE" ]; then
# Разрешить трафик только через VPN интерфейс
iptables -P OUTPUT DROP
iptables -A OUTPUT -o "$VPN_INTERFACE" -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
echo "Kill Switch активирован для интерфейса: $VPN_INTERFACE"
else
echo "VPN интерфейс не найден! Трафик заблокирован."
iptables -P OUTPUT DROP
fi
Сохраните этот скрипт как /usr/local/bin/vpn-killswitch и сделайте исполняемым:
chmod +x /usr/local/bin/vpn-killswitch
Интеграция с Nekoray
Вы можете запускать этот скрипт при каждом подключении к VPN через Nekoray. Для этого:
- Откройте Nekoray
- Выберите нужный профиль
- Нажмите “Подключиться”
- В отдельном терминале выполните скрипт
Мониторинг и автоматическое управление правилами
Скрипт для мониторинга VPN соединения
#!/bin/bash
# Мониторинг VPN соединения и автоматический Kill Switch
VPN_INTERFACE="tun0"
CHECK_INTERVAL=5
while true; do
if ip a show "$VPN_INTERFACE" up &>/dev/null; then
# VPN подключен, разрешаем трафик через интерфейс
iptables -P OUTPUT DROP
iptables -A OUTPUT -o "$VPN_INTERFACE" -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
echo "VPN активен, трафик направлен через $VPN_INTERFACE"
else
# VPN отключен, блокируем весь трафик
iptables -P OUTPUT DROP
echo "VPN отключен, весь трафик заблокирован!"
fi
sleep "$CHECK_INTERVAL"
done
Запустите этот скрипт в фоновом режиме:
nohup /usr/local/bin/vpn-monitor > /var/log/vpn-monitor.log 2>&1 &
Отключение Kill Switch
Для безопасного отключения Kill Switch:
# Разрешить весь трафик
iptables -P ACCEPT
# Остановить мониторинг
pkill -f vpn-monitor
Обработка сбоев и крайние случаи
Сценарий 1: Nekoray “завис” без корректного закрытия интерфейсов
В этом случае TUN интерфейс останется активным, но VPN-соединение может быть нерабочим.
Решение:
#!/bin/bash
# Проверка активности VPN через ping до DNS сервера
VPN_INTERFACE="tun0"
DNS_SERVER="8.8.8.8"
if ip a show "$VPN_INTERFACE" up &>/dev/null; then
if ping -c 1 -W 2 -I "$VPN_INTERFACE" "$DNS_SERVER" &>/dev/null; then
echo "VPN активен и работает"
else
echo "VPN интерфейс активен, но соединение нерабочее!"
# Блокируем трафик
iptables -P OUTPUT DROP
fi
else
echo "VPN интерфейс не обнаружен"
iptables -P OUTPUT DROP
fi
Сценарий 2: Конфликты с другими сетевыми службами
Если у вас работают другие сетевые службы (DHCP, DNS и т.д.), им может потребоваться доступ к сети.
Решение:
# Разрешить DNS запросы (для разрешения доменов)
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
# Разрешить NTP синхронизацию времени
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
# Разрешить доступ к внутренним сетям (если нужно)
iptables -A OUTPUT -d 192.168.0.0/16 -j ACCEPT
iptables -A OUTPUT -d 10.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -d 172.16.0.0/12 -j ACCEPT
Альтернативные решения с UFW
Если вы предпочитаете использовать UFW (Uncomplicated Firewall), можно настроить Kill Switch следующим образом:
# Установите UFW если не установлен
sudo apt install ufw
# Разрешить весь трафик через TUN интерфейс
sudo ufw allow in on tun0
sudo ufw allow out on tun0
# Разрешить локальный трафик
sudo ufw allow from any to any
# Разрешить установленные соединения
sudo ufw allow out from any to any established
# Установить политику по умолчанию - блокировать
sudo ufw default deny incoming
sudo ufw default deny outgoing
# Включить UFW
sudo ufw enable
Для мониторинга с UFW можно использовать тот же подход, но с командами ufw:
#!/bin/bash
VPN_INTERFACE="tun0"
while true; do
if ip a show "$VPN_INTERFACE" up &>/dev/null; then
# VPN активен, разрешаем трафик
sudo ufw default deny outgoing
sudo ufw allow out on "$VPN_INTERFACE"
sudo ufw allow out from any to any established
else
# VPN отключен, блокируем весь трафик
sudo ufw default deny outgoing
fi
sleep 5
done
Рекомендации и лучшие практики
1. Тестирование Kill Switch
Перед началом использования тщательно протестируйте настройки:
# Блокируем весь трафик
iptables -P OUTPUT DROP
# Пытаемся выйти в интернет
ping 8.8.8.8 # Должен быть заблокирован
# Подключаем VPN через Nekoray
# Запускаем мониторинг Kill Switch
/usr/local/bin/vpn-monitor &
# Проверяем доступ в интернет
ping 8.8.8.8 # Должен быть разрешен
2. Автоматический запуск при загрузке
Добавьте скрипт мониторинга в автозагрузку:
# Создаем systemd сервис
sudo nano /etc/systemd/system/vpn-killswitch.service
Содержимое файла:
[Unit]
Description=VPN Kill Switch Monitor
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/vpn-monitor
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Включаем сервис:
sudo systemctl daemon-reload
sudo systemctl enable vpn-killswitch
sudo systemctl start vpn-killswitch
3. Создание точки восстановления
Прежде чем вносить изменения в правила фаервола, создайте резервную копию:
# Сохраняем текущие правила
iptables-save > /root/iptables-backup-$(date +%Y%m%d-%H%M%S).rules
# Для восстановления
iptables-restore < /root/iptables-backup-20240115-1430.rules
4. Мониторинг состояния
Регулярно проверяйте состояние Kill Switch:
#!/bin/bash
# Скрипт проверки состояния Kill Switch
check_killswitch() {
VPN_INTERFACE=$(ip a | grep -o 'tun[0-9]\+' | head -1)
if [ -z "$VPN_INTERFACE" ]; then
echo "⚠️ VPN интерфейс не найден!"
echo "📊 Статус трафика:"
iptables -L OUTPUT -n -v | grep -E "(ACCEPT|DROP)"
return 1
fi
if ping -c 1 -W 2 -I "$VPN_INTERFACE" 8.8.8.8 &>/dev/null; then
echo "✅ VPN активен: $VPN_INTERFACE"
echo "📊 Статус трафика:"
iptables -L OUTPUT -n -v | grep -E "(ACCEPT|DROP)"
return 0
else
echo "❌ VPN интерфейс $VPN_INTERFACE найден, но соединение нерабочее!"
echo "📊 Статус трафика:"
iptables -L OUTPUT -n -v | grep -E "(ACCEPT|DROP)"
return 1
fi
}
check_killswitch
Заключение
Настройка Kill Switch для Linux с VLESS (Nekoray) и различными VPN профилями требует внимания к деталям, но вполне достижима. Ключевые моменты:
- Основывайте правила на TUN интерфейсе, а не на конкретных IP-адресах
- Используйте мониторинг для автоматического управления правилами при изменении VPN-соединений
- Тестируйте регулярно и создавайте точки восстановления
- Учитывайте крайние случаи, такие как зависание Nekoray или сбой сетевых интерфейсов
- Используйте systemd для автоматического запуска Kill Switch при загрузке системы
Такой подход обеспечит надежную защиту от утечек трафика при переключении между различными VPN-профилями с разными IP-адресами и портами.
Источники
- How To Create A VPN Killswitch Using Iptables on Linux - Подробное руководство по созданию Kill Switch с iptables
- Tun mode killswitch · Issue #1605 · MatsuriDayo/nekoray - Обсуждение проблем с Kill Switch в Nekoray
- How to Build a VPN Kill Switch with IPTables and UFW - Альтернативные методы реализации Kill Switch
- NekoRay split tunneling - Информация о режиме TUN в Nekoray
- VPN Kill Switch for Linux and macOS Clients - Руководство по настройке Kill Switch для VPN клиентов