Не пропускаем трафик мимо OpenVPN

OpenVPN - относительно безопасный инструмент, но лишь при его правильном использовании.

Дело в том, что запуская OpenVPN он не блокирует (и не шифрует) трафик, который может пройти мимо vpn в случае, если ваш сервер vpn по каким-то причинам стал недоступен, либо у вас временно пропала связь. Для того чтобы обезопасить отправляемую и принимаемую информацию необходимо настроить фаервол на стороне клиента таким образом, дабы ему можно было отправлять и принимать пакеты лишь с одного и на один сервер, то есть лишь на ваш vpn-сервер, все остальные подключения должны отсекаться.

Настраиваем iptables

Cоздаём файл со следующим содержанием:

*filter
:INPUT DROP [145:11482]
:FORWARD DROP [0:0]
:OUTPUT DROP [18518:3426455]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -d XXX.XXX.XXX.XXX/32 -p tcp -j ACCEPT
-A OUTPUT -d XXX.XXX.XXX.XXX/32 -p udp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o tun0 -j ACCEPT
-A OUTPUT -o tun1 -j ACCEPT
COMMIT

Где XXX.XXX.XXX.XXX - адрес VPN-сервера.

Кладём его например в /etc/openvpn/iptables.rules.

NB! обратите внимание на то, нет ли в вашем iptables каких-либо правил по команде iptables-save, если есть - добавьте в конфиг, иначе они затрутся; либо перепишите правила командами iptables

Настраиваем ufw

Если вдруг вы вместо iptables используете ufw, то вам необходимы следующие правила:

# ufw default deny incoming
# ufw default deny outgoing
# ufw allow out on XYZ to XXX.XXX.XXX.XXX
# ufw allow out on tun0
# ufw enable

Где XYZ - виртуальный интерфейс вашей сетевой карты (например wlp3s0, или eth0), а XXX.XXX.XXX.XXX - адрес вашего VPN-сервера.

Пишем удобные скрипты запуска OpenVPN

По тому же адресу создаём скрипт /etc/openvpn/vpn_up.sh:

#!/bin/sh

# подгружаем правила
iptables-restore </etc/openvpn/iptables.rules # если у вас ufw - не пишем эту строчку
# запускаем openvpn в screen (если его нет, то ставим, либо используем nohup)
screen -dmS openvpn --config /etc/openvpn/config.ovpn

Где /etc/openvpn/config.ovpn - путь к вашему конфигу.

Запускаем OpenVPN при загрузке системы

Добавляем в файл /etc/rc.local запуск скрипта:

...
/bin/sh /etc/openvpn/vpn_up.sh
...

Смотрим статус/отключаем OpenVPN

Бывают ситуации когда OpenVPN перестаёт работать и необходимо посмотреть что произошло, либо его вообще необходимо отключить.

Логинимся под root и заходим в screen:

$ sudo su
# screen -x openvpn

Смотрим всё ли в порядке, если что - отключаем по сочетанию Ctrl+C.

Но поскольку фаерволл по-прежнему не пропускает трафик мимо VPN - его необходимо отключить.

Если это iptables, то создаём скрипт ~/.bin/iptables_flush:

#!/bin/sh

echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

и выполняем его.

Если это ufw - выполняем ufw disable.