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

резервный маршрут для отбрасывания пакетов, если выходной интерфейс, подключенный к NAT, не работает?

Задний план:

Я устанавливаю соединение со сторонней VPN и пакетами NAT, отмеченными как часть определенной контрольной группы (для того, чтобы выборочно запускать процессы через VPN или нет), к стороннему устройству туннеля VPN (tun2 в этом примере) и используя маршрут: Сценарий up устанавливает в качестве шлюза по умолчанию VPN для отдельной таблицы маршрутов, называемой vpn. Все это работает со следующим (некоторые мелкие детали опущены).

запустить при загрузке:

iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 -j MARK --set-mark 11
iptables -t nat -A POSTROUTING -m cgroup --cgroup 0x00110011 -o tun2 -j MASQUERADE
ip rule add fwmark 11 table vpn

содержится в openvpn client.conf:

route-noexec
route-up /etc/openvpn/3rdparty/routeup.sh

и routeup.sh, чтобы установить шлюз по умолчанию для таблицы маршрутизации vpn

#!/bin/bash

/sbin/ip route replace default via $route_vpn_gateway dev $dev table vpn

Проблема: Если интерфейс стороннего VPN (tun2) выходит из строя (например, происходит сбой openvpn), в таблице маршрутов vpn больше нет маршрута по умолчанию, и весь трафик (даже тот, который выполняется в моей отдельной cgroup) направляется через основную table и через интерфейс eth0 по умолчанию. Поэтому мне нужно установить резервный маршрут либо в iptables, либо в отдельной таблице маршрутов vpn. Если я использую что-то вроде,

iptables -A OUTPUT -m cgroup --cgroup 0x00110011 -o eth0 -j REJECT

он просто отбрасывает все пакеты, поэтому очевидно, что это обрабатывается до записи nat. Точно так же я не могу найти способ использовать ip route для изменения таблицы маршрутов для vpn, чтобы после удаления записи шлюза по умолчанию после удаления интерфейса tun2 он блокировал весь трафик. Вместо этого нет никакой записи, и кажется, что весь трафик просто попадает в следующую таблицу маршрутизации, которая должна быть основной.

ОБНОВЛЕНИЕ: теперь я придумал полное решение проблемы выборочного запуска процесса через VPN.

https://serverfault.com/a/766290/345463

Мне удалось заставить это работать, используя параметр метрики с iproute2. Итак, мой сценарий маршрутизации был изменен на следующий

#!/bin/bash

/sbin/ip route add default via $route_vpn_gateway dev $dev metric 1 table vpn

и я обязательно включаю резервную запись черной дыры с более высоким значением метрики (более низкие значения имеют приоритет), чтобы заблокировать весь трафик. Это может быть выполнено при загрузке с другими строками, которые я указал в моем вопросе.

ip route add blackhole default metric 2 table vpn

Это отлично работает