У меня есть выделенный веб-сервер под управлением 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-соединения необходимо настроить маршрут для той же отметки, но с использованием более низкой метрики.