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

Маршрутизация перенаправленного трафика через eth0, но локальный трафик через tun0

У меня есть сервер Ubuntu 12.04 / Zentyal 2.3, настроенный с WAN NATed на eth0, локальные интерфейсы eth1 и wlan0 мост на br1 на котором работает DHCP, и соединение OpenVPN на tun0. Мне нужен VPN только для некоторых вещей, работающих на самом шлюзе, и мне нужно убедиться, что все, что работает на шлюзе, проходит через VPN. tun0.

root:~# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gw...           0.0.0.0         UG    100    0        0 eth0
link-local      *               255.255.0.0     U     1000   0        0 br1
192.168.1.0     *               255.255.255.0   U     0      0        0 br1
A.B.C.0         *               255.255.255.0   U     0      0        0 eth0

root:~# ip route
169.254.0.0/16 dev br1  scope link  metric 1000
192.168.1.0/24 dev br1  proto kernel  scope link  src 192.168.1.1
A.B.C.0/24 dev eth0  proto kernel  scope link  src A.B.C.186

root:~# ip route show table main
169.254.0.0/16 dev br1  scope link  metric 1000
192.168.1.0/24 dev br1  proto kernel  scope link  src 192.168.1.1
A.B.C.0/24 dev eth0  proto kernel  scope link  src A.B.C.D

root:~# ip route show table default
default via A.B.C.1 dev eth0 

Как я могу настроить маршрутизацию (или иначе) так, чтобы весь перенаправленный трафик для других хостов в локальной сети проходил через eth0 но весь трафик для самого шлюза проходит через VPN на tun0? Кроме того, поскольку клиент OpenVPN меняет маршрутизацию при запуске / завершении работы, как я могу убедиться, что все, что работает на самом шлюзе, теряет весь доступ к сети, если VPN выходит из строя и никогда не выходит eth0.

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

Сначала отметьте новую таблицу маршрутизации для VPN-подключения. Это нужно сделать только один раз.

echo 10 vpn >> /etc/iproute2/rt_tables

Заполните новую таблицу маршрутизации правилами для отправки трафика через VPN (предполагая, что 1.0.0.10/24 - это адрес eth0, а VPN-шлюз - 10.8.0.1).

ip route add 169.254.0.0/16 dev br1 table vpn
ip route add 192.168.1.0/24 dev br1 table vpn
ip route add 1.0.0.0/24 dev eth0 table vpn
ip route add default via 18.8.0.1 table vpn

Затем добавьте правило для использования этой новой таблицы для трафика от самого хоста.

ip rule add from 1.0.0.10/32 lookup vpn

Если это не сработает, вам придется использовать маркировка межсетевого экрана чтобы вместо этого выбрать правильные пакеты.

Я смог добиться этого, используя iif lo следующим образом.

Переместите маршрут по умолчанию в отдельную таблицу, чтобы локальное правило могло его переопределить:

default_route=$(ip route list | grep -m 1 "default via")
ip route add $default_route table default
ip route delete $default_route

Измените приоритет основного правила так, чтобы между ним и правилом по умолчанию можно было разместить локальную роль.

main=$(ip rule list | grep -m 1 "lookup main $")
main_rule=$(echo $main | cut -d ":" -f 2)
main_priority=$(echo $main | cut -d ":" -f 1)
ip rule add $main_rule priority 16384
ip rule delete $main_rule priority $main_priority

Добавьте маршрут шлюза VPN по умолчанию в отдельную таблицу и добавьте правило.

echo "10 vpn" >> /etc/iproute2/rt_tables
ip rule add priority 24576 iif lo lookup vpn

Скажите клиенту OpenVPN, чтобы он поместил маршрут по умолчанию в таблицу vpn, добавив следующее в /etc/openvpn/* файл конфигурации:

script-security 2
route-up "/bin/sh -x -c 'route_net_gateway=$(ip route ls table default | cut -d \" \" -f 3) && ip route add $trusted_ip via $route_net_gateway table vpn && /sbin/ip route add default via $ifconfig_remote table vpn' route-up"