НейроАгент

Настройка Kill Switch для Linux с VLESS Nekoray

Полное руководство по настройке Kill Switch для Linux с VLESS через Nekoray. Защитите трафик при переключении между VPN профилями с разными IP и портами. Узнайте как!

Как настроить 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

Когда Nekoray работает в режиме TUN, он создает виртуальный сетевой интерфейс (обычно с именем tun0 или аналогичным). Весь трафик в этом режиме направляется через этот интерфейс, что позволяет контролировать сетевые потоки на уровне ядра Linux.

Важно: TUN интерфейс создается только при активном VPN-соединении. Если Nekoray выйдет из строя, этот интерфейс исчезнет, что автоматически прервет VPN-соединение.

Преимущества подхода с TUN интерфейсом:

  • Не зависит от IP-адресов или портов конкретных VPN-серверов
  • Работает с любым количеством VPN-профилей
  • Автоматически адаптируется к смене подключений

Потенциальные проблемы:

  • Если Nekoray “зависнет” без корректного закрытия интерфейсов
  • При сбоях в работе самого TUN драйвера
  • При конфликтах с другими сетевыми службами

Настройка базового Kill Switch с iptables

Для настройки Kill Switch вам понадобятся права root. Вот пошаговая инструкция:

1. Определите имя TUN интерфейса

bash
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

bash
# Сброс существующих правил (осторожно!)
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:

bash
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

Для CentOS/RHEL:

bash
service iptables save

Работа с несколькими VPN профилями

Поскольку ваш Kill Switch основан на TUN интерфейсе, а не на конкретных IP-адресах, он будет работать с любым количеством VPN-профилей автоматически.

Динамическая настройка для разных VPN

Если у вас возникают проблемы с определением имени TUN интерфейса, можно использовать более универсальный подход:

bash
#!/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 и сделайте исполняемым:

bash
chmod +x /usr/local/bin/vpn-killswitch

Интеграция с Nekoray

Вы можете запускать этот скрипт при каждом подключении к VPN через Nekoray. Для этого:

  1. Откройте Nekoray
  2. Выберите нужный профиль
  3. Нажмите “Подключиться”
  4. В отдельном терминале выполните скрипт

Мониторинг и автоматическое управление правилами

Скрипт для мониторинга VPN соединения

bash
#!/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

Запустите этот скрипт в фоновом режиме:

bash
nohup /usr/local/bin/vpn-monitor > /var/log/vpn-monitor.log 2>&1 &

Отключение Kill Switch

Для безопасного отключения Kill Switch:

bash
# Разрешить весь трафик
iptables -P ACCEPT

# Остановить мониторинг
pkill -f vpn-monitor

Обработка сбоев и крайние случаи

Сценарий 1: Nekoray “завис” без корректного закрытия интерфейсов

В этом случае TUN интерфейс останется активным, но VPN-соединение может быть нерабочим.

Решение:

bash
#!/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 и т.д.), им может потребоваться доступ к сети.

Решение:

bash
# Разрешить 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 следующим образом:

bash
# Установите 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:

bash
#!/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

Перед началом использования тщательно протестируйте настройки:

bash
# Блокируем весь трафик
iptables -P OUTPUT DROP

# Пытаемся выйти в интернет
ping 8.8.8.8  # Должен быть заблокирован

# Подключаем VPN через Nekoray
# Запускаем мониторинг Kill Switch
/usr/local/bin/vpn-monitor &

# Проверяем доступ в интернет
ping 8.8.8.8  # Должен быть разрешен

2. Автоматический запуск при загрузке

Добавьте скрипт мониторинга в автозагрузку:

bash
# Создаем systemd сервис
sudo nano /etc/systemd/system/vpn-killswitch.service

Содержимое файла:

ini
[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

Включаем сервис:

bash
sudo systemctl daemon-reload
sudo systemctl enable vpn-killswitch
sudo systemctl start vpn-killswitch

3. Создание точки восстановления

Прежде чем вносить изменения в правила фаервола, создайте резервную копию:

bash
# Сохраняем текущие правила
iptables-save > /root/iptables-backup-$(date +%Y%m%d-%H%M%S).rules

# Для восстановления
iptables-restore < /root/iptables-backup-20240115-1430.rules

4. Мониторинг состояния

Регулярно проверяйте состояние Kill Switch:

bash
#!/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 профилями требует внимания к деталям, но вполне достижима. Ключевые моменты:

  1. Основывайте правила на TUN интерфейсе, а не на конкретных IP-адресах
  2. Используйте мониторинг для автоматического управления правилами при изменении VPN-соединений
  3. Тестируйте регулярно и создавайте точки восстановления
  4. Учитывайте крайние случаи, такие как зависание Nekoray или сбой сетевых интерфейсов
  5. Используйте systemd для автоматического запуска Kill Switch при загрузке системы

Такой подход обеспечит надежную защиту от утечек трафика при переключении между различными VPN-профилями с разными IP-адресами и портами.

Источники

  1. How To Create A VPN Killswitch Using Iptables on Linux - Подробное руководство по созданию Kill Switch с iptables
  2. Tun mode killswitch · Issue #1605 · MatsuriDayo/nekoray - Обсуждение проблем с Kill Switch в Nekoray
  3. How to Build a VPN Kill Switch with IPTables and UFW - Альтернативные методы реализации Kill Switch
  4. NekoRay split tunneling - Информация о режиме TUN в Nekoray
  5. VPN Kill Switch for Linux and macOS Clients - Руководство по настройке Kill Switch для VPN клиентов