У меня есть сервер 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"