Как автоматически отключить интернет при обрыве VPN/OpenVPN в Linux

  • 02.10.2018
  • 9 467
  • 11
  • 30.01.2021
  • 4
  • 4
  • 0
Как автоматически отключить интернет при обрыве VPN/OpenVPN в Linux

Существует огромное количество ситуаций, в которых может потребоваться блокировать исходящий трафик при разрыве VPN/OpenVPN соединения для сохранения собственной анонимности/приватности.

Информация в данной статье не является истиной в последней инстанции и может быть неверной/некорректной, поэтому пользуйтесь данными рекомендациями на свой страх и риск.

Описание

Технически, мы просто будем блокировать весь трафик, который идет не через VPN/OpenVPN с помощью фаервола iptables. В таком случае, даже если в какой то момент времени будет разорвано ваше VPN соединение, никто не сможет увидеть ваш IP, который выдал провайдер. Подразумевается, что у вас уже настроено рабочее VPN соединение, через которое можно получить доступ к сайтам и к DNS серверам. Первым делом устанавливаем пакет iptables-persistent, он позволяет автоматически применять правила iptables при загрузке вашего компьютера.

Можно конечно загружать эти правила и любым другим удобным для вас способом, не используя пакет iptables-persistent
apt update
sudo apt install iptables-persistent

На вопрос о сохранении правил для IPv4 - отвечаем утвердительно, в результате в файле /etc/iptables/rules.v4 будут сохранены текущие правила.

Переименовываем файл /etc/iptables/rules.v4 в /etc/iptables/rules_old.v4 (он понадобится в случае, если мы захотим вернуть изначальные настройки фаервола). Создаем файл /etc/iptables/rules.v4 и открываем для редактирования любым удобным текстовым редактором (я пользую nano для этих целей):

sudo nano /etc/iptables/rules.v4

Вставляем в этот файл следующее содержимое:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

-A INPUT -s x.x.x.x -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -d x.x.x.x -p tcp --dport 443 -j ACCEPT

-A INPUT -i tun0 -j ACCEPT
-A OUTPUT -o tun0 -j ACCEPT

COMMIT
  • x.x.x.x - это IP адрес VPN/OpenVPN сервера к которому вы будете подключаться.
  • tcp - это протокол, который используется при подключении к VPN, если будет использоваться udp, то надо заменить tcp на udp. Данная строка будет тогда выглядеть так:
    -A OUTPUT -d x.x.x.x -p udp --dport 443 -j ACCEPT
  • 443 - это порт, к которому происходит подключении. Если используется отличный от 443, то надо его заменить на актуальный.
  • tun0 - название вашего интерфейса, который появляется при создании VPN-тоннеля. Если используется отличный от tun0, то надо его заменить на актуальный.

Теперь пытаемся применить наши правила:

sudo iptables-restore < /etc/iptables/rules.v4

Если после ввода команды не вылезло никаких предупреждений, то значит правила применились, а после перезагрузки, они должны будут применяться автоматически при старте ОС.

Теперь, без активного VPN/OpenVPN соединения не должно быть доступа к сайтам и даже DNS серверам. А после установки VPN соединения - все должно работать как обычно, т.к. весь исходящий трафик будет идти через VPN.

Если мы захотим вернуть старые правила (которые были активны на ПК в момент установки iptables-persistent), то можно применить их следующей командой:

sudo iptables-restore < /etc/iptables/rules_old.v4
Только не забываем, что автоматически при старте системы будут применяться правила, которые находятся в файле /etc/iptables/rules.v4
Была ли эта статья Вам полезна?

Комментарии к статье (11)

    • Юрий

    -A INPUT -s x.x.x.x -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A OUTPUT -d x.x.x.x -p tcp --dport 443 -j ACCEPT
    у меня это не работало, я не понял, почему именно так. Исправил на это:
    -A INPUT -s x.x.x.x -j ACCEPT
    -A OUTPUT -d x.x.x.x -j ACCEPT

    получается, что только один ip на прием и передачу на всем портам и протоколам.

    P.S. после установки файл rules.v4 пустой, создал файл rules_old.v4 такой:
    *filter

    :INPUT ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]

    COMMIT

    • Linux

    Все работает как надо, единственное после перезагрузки правило не применяется. Приходится вручную вводить "sudo iptables-restore < /etc/iptables/rules.v4"
    Подскажите, как сделать чтобы после перезагрузки правило сохранялось?

      • AJIekceu4

      При установке пакета iptables-persistent, при загрузке ОС автоматически применяются правила из файла /etc/iptables/rules.v4 (если таковой имеется, на Ubuntu и Linux Mint по крайней мере), проверено на десятках разных конфигураций. Если у вас этого не происходит автоматически, то надо перезагрузить ПК и сразу после его загрузки, посмотреть последние логи системы, чтобы понять, почему правила не применились. Возможно, у вас там что то с правами на данный файл и система не может получить к нему доступ в автоматическом режиме. Либо в вашем дистрибутиве используются какие то специфические пути для сохранения и загрузки правил.

        • Linux

        А есть вариант поместить строку "sudo iptables-restore < /etc/iptables/rules.v4" в загрузку системы? Пользуюсь Kali Linux основанный на Debian.

        • Аноним

        После всех манипуляций нужно прописать команду:
        sudo dpkg-reconfigure iptables-persistent

        • Сергей

        "надо перезагрузить ПК и сразу после его загрузки, посмотреть последние логи системы, чтобы понять, почему правила не применились"

        Пожалуйста напишите как это сделать, где эти логи смотреть

          • AJIekceu4

          1) Можно попробовать выполнить команду

          sudo journalctl -e -u netfilter-persistent.service

          2) Можно посмотреть системный лог на наличие ошибок. Обычно он находится по следующему пути:

          /var/log/syslog

          3) А также лог загрузки:

          /var/log/boot.log
      • Иван

      2024 год, тоже самое.
      Глянул systemctl status netfilter-persistent.service - показал, что служба отключена
      Решаем проблема так:
      systemctl enable netfilter-persistent.service - включаем службу
      systemctl start netfilter-persistent.service - стартуем службу

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

    • Артем

    Привет.
    Сделал все как в статье, но не выходит теперь подключиться к ВПН
    Пишет:
    write UDPv4: Operation not permitted (code=1)

      • AJIekceu4

      Я с такой ошибкой не сталкивался, поэтому наверняка не подскажу, но Вы точно, при прописывании правил для iptables указали udp протокол (в статье используется tcp и есть сноска):
      tcp - это протокол, который используется при подключении к VPN, если будет использоваться udp, то надо заменить tcp на udp. Данная строка будет тогда выглядеть так:

      -A OUTPUT -d x.x.x.x -p udp --dport 443 -j ACCEPT

      И, если, подключение к VPN происходит не по 443 порту, то порт надо тоже заменить на тот, который используется у вас.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Напоминаем Вам, что Ваше сообщение будет опубликовано только после проверки администратором сайта. Обычно это занимает 1-2 рабочих дня.