Назад | Перейти на главную страницу

iptables для блокировки VPN-трафика, если не через tun0

У меня есть выделенный веб-сервер под управлением Debian 6 и некоторых Apache, Tomcat, Asterisk и почтовых программ. Теперь нам нужно было добавить поддержку VPN для специальной программы. Мы установили OpenVPN и зарегистрировались у провайдера VPN. Соединение работает хорошо, и у нас есть виртуальный интерфейс tun0 для туннелирования.

Чтобы заархивировать цель туннелирования только одной программы через VPN, мы запускаем программу с

sudo -u имя пользователя -g команда имя группы

и добавил правило iptables, чтобы отмечать весь трафик, исходящий от имени группы

iptables -t mangle -A OUTPUT -m owner --gid-owner имя группы -j MARK --set-mark 42

После этого мы сообщаем iptables некоторому SNAT и указываем ip route использовать специальную таблицу маршрутизации для помеченных пакетов трафика.

Проблема: если VPN выходит из строя, есть вероятность, что специальная программа для туннелирования взаимодействует через обычный интерфейс eth0.

Желаемое решение: весь отмеченный трафик не должен проходить напрямую через eth0, он должен сначала пройти через tun0.

Я пробовал следующие команды, которые не сработали:

iptables -A OUTPUT -m owner --gid-owner имя группы! -o tun0 -j ОТКАЗАТЬ

iptables -A ВЫХОД -m владелец --gid-owner имя группы -o eth0 -j ОТКАЗАТЬ

Возможно, проблема в том, что приведенные выше правила iptable не работали из-за того, что пакеты сначала помечаются, затем помещаются в tun0, а затем передаются через eth0, пока они все еще помечены .. Я не знаю, как чтобы пометить их после в tun0 или сообщить iptables, что все отмеченные пакеты могут пройти eth0, если они были в tun0 раньше или если они идут на шлюз моего VPN-провайдера.

Есть ли у кого-нибудь идеи решения?

Некоторая информация о конфигурации:

iptables -nL -v --line-numbers -t mangle

Chain OUTPUT (policy ACCEPT 11M packets, 9798M bytes) 
num   pkts  bytes target     prot opt in     out     source       destination 
1     591K   50M   MARK       all  --  *      *       0.0.0.0/0    0.0.0.0/0   owner GID match 1005 MARK set 0x2a 
2    82812 6938K CONNMARK   all  --  *      *         0.0.0.0/0    0.0.0.0/0   owner GID match 1005 CONNMARK save

iptables -nL -v - номера строк -t нат

Chain POSTROUTING (policy ACCEPT 393 packets, 23908 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       15  1052 SNAT       all  --  *      tun0    0.0.0.0/0            0.0.0.0/0           mark match 0x2a to:VPN_IP

ip rule add from all fwmark 42 lookup 42


ip route показать таблицу 42

по умолчанию через VPN_IP dev tun0

Просто добавьте маршрут с низким приоритетом по умолчанию для отмеченных пакетов

ip rule add fwmark 42 table no.out
ip route add blackhole 0.0.0.0 metric 100 table no.out

а затем при установлении нового VPN-соединения необходимо настроить маршрут для той же отметки, но с использованием более низкой метрики.