Может ли OpenVPN создать маршрут по умолчанию, если он не существует?

Заметка

Первоначально этот вопрос задавали вопрос о том, что OpenVPN не устанавливает шлюз по умолчанию, если он еще не существует, даже если вы укажете --redirect-gateway local или --redirect-gateway def1 . Начиная с версии 2.4.1 , OpenVPN устанавливает шлюз по умолчанию с этой опцией, независимо от того, существует ли она или нет, поэтому она устарела, если вы используете эту версию.

Обратите внимание, что версия OpenVPN в Ubuntu Zesty – 2.4.0 и не имеет этого изменения. Но версия от Artful устанавливается без проблем на Zesty.


Я создал пространство имен в сети под Ubuntu 14.04.5 с планом запуска VPN внутри этого (используя OpenVPN 2.3.2 и файл конфигурации). Идея заключается в том, что ни один трафик не может быть удален из пространства имен до тех пор, пока VPN не будет запущен.

Я реализовал это, не создавая маршрут по умолчанию, а вместо этого переименовывая IP-адрес сервера VPN. Поэтому моя таблица маршрутизации выглядит так:

 # ip netns exec testns ip route add ABCD/32 via 10.200.200.1 dev veth1 # ip netns exec testns ip route show 10.200.200.0/24 dev veth1 proto kernel scope link src 10.200.200.2 ABCD via 10.200.200.1 dev veth1 

Обратите внимание, что 10.200.200.1 – это адрес veth0 , другой конец виртуального интерфейса veth1 ( 10.200.200.2 ). Я подтвердил, что мои правила iptables и пересылка IP в корневом пространстве имен работают, чтобы получить трафик в пространстве имен testns и из testns когда есть маршрут для него. ABCD – это адрес сервера VPN.

Чтобы подключить VPN, я запускаю ip netns exec testns openvpn abcd.ovpn . Этот файл конфигурации содержит директиву pull , а push config с сервера содержит:

 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1,dhcp-option[...] 

Но потом, немного позже, я вижу:

 NOTE: unable to redirect default gateway -- Cannot read current default gateway from system 

И, соответственно, в моем пространстве имен testns нет маршрута по умолчанию.

Согласно руководству, redirect-gateway def1 не пытается заменить маршрут по умолчанию, он просто создает два новых 0.0.0.0/1 и 128.0.0.0/1 . Как не удается создать маршрут по умолчанию? И как я могу заставить OpenVPN автоматически маршрутизировать весь трафик через VPN, когда маршрут по умолчанию изначально не существует?

Согласно руководству, redirect-gateway def1 не пытается заменить маршрут по умолчанию, он просто создает два новых 0.0.0.0/1 и 128.0.0.0/1. Как не удается создать маршрут по умолчанию?

Если OpenVPN должен был только переопределить шлюз по умолчанию, он больше не сможет добраться до конечной точки партнера через этот исходный шлюз. Итак, прежде всего, это посмотреть на шлюз по умолчанию и установить явный маршрут хоста для своей конечной точки через этот шлюз.

Страница man для OpenVPN довольно подробно говорит об этом:

–redirect-gateway flags …

Автоматически выполнять команды маршрутизации, чтобы перенаправить весь исходящий IP-трафик через VPN. Это вариант на стороне клиента.

Эта опция выполняет три шага:

(1) Создайте статический маршрут для адреса -remote, который пересылается к ранее существующему шлюзу по умолчанию. Это делается для того, чтобы (3) не создавал петлю маршрутизации.

(2) Удалите маршрут шлюза по умолчанию.

(3) Установите новый шлюз по умолчанию как адрес конечной точки VPN (полученный либо из -route-gateway, либо из второго параметра в -ifconfig, когда указан –dev tun).

Когда туннель срывается, все вышеперечисленные шаги меняются на противоположные, так что исходный маршрут по умолчанию восстанавливается.

Затем вы спрашиваете

как я могу заставить OpenVPN автоматически маршрутизировать весь трафик через VPN, когда по умолчанию маршрут по умолчанию не существует?

Маршрут должен существовать (где-то) для клиента OpenVPN для доступа к его одноранговой точке (то есть к серверу). Таким образом, --up бы ни был этот маршрут, вам необходимо реализовать три задачи, описанные выше в сценарии --up . Конечно, вам нужно будет написать этот скрипт.

Два варианта работы:

  • Установите фальшивый шлюз по умолчанию (например, 127.0.0.1) и разрешите OpenVPN перезаписать его.
  • Используйте сценарий post run для установки шлюза с использованием IP-маршрута