Справочная информация:
Я устанавливаю соединение со сторонней VPN и пакетами NAT, помеченными как часть определенной контрольной группы (чтобы выборочно запускать процессы через VPN или нет), к стороннему устройству Tun VPN (tun2 в этом примере) и использую сценарий маршрутизации устанавливает в качестве шлюза по умолчанию 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
Проблема: s для отдельной таблицы маршрутов с именем 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
Проблема: s для отдельной таблицы маршрутов с именем 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» больше нет маршрута по умолчанию, и весь трафик (даже тот, который выполняется в моей отдельной контрольной группе) маршрутизируется через основную table и через интерфейс eth0 по умолчанию. Поэтому мне нужно установить резервный маршрут либо в iptables, либо в отдельной таблице маршрутов vpn. Если я использую что-то вроде,
iptables -A OUTPUT -m cgroup --cgroup 0x00110011 -o eth0 -j REJECT
, он просто отбрасывает все пакеты, поэтому очевидно, что это обрабатывается до записи nat. Точно так же я не могу найти способ использовать «ip route» для изменения таблицы маршрутов для «vpn», чтобы после удаления записи шлюза по умолчанию после удаления интерфейса tun2 он блокировал весь трафик. Вместо этого нет никакой записи, и кажется, что весь трафик просто идет в следующую таблицу маршрутизации, которая должна быть основной.
ОБНОВЛЕНИЕ: I ' Теперь мы предлагаем полное решение проблемы выборочного запуска процесса через VPN.
Мне удалось заставить это работать, используя параметр метрики с 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
Это отлично работает