Вопрос или проблема
Я погружаюсь в величие OpenVPN и у меня возникли некоторые проблемы с ручной настройкой таблиц маршрутизации. Я на Arch Linux.
Я знаю, что OpenVPN автоматически обновляет таблицы маршрутизации при подключении, но я хочу написать скрипт, чтобы обновлять их самостоятельно. Я узнал об аргументе OpenVPN “–route-noexec”, чтобы предотвратить автоматические обновления, и аргументе “–route-up”, чтобы передавать соответствующую информацию через переменные окружения в скрипт на мой выбор.
Вот тут я и сталкиваюсь с проблемой. Я ожидаю, что переменные окружения будут переданы в скрипт, что и происходит, но, похоже, я упускаю несколько из них. Особенно ту, которая перечисляет мой удаленный IP-адрес (untrusted/trusted_ip, как я полагаю), из-за чего трудно установить iproute.
Переменные окружения, которые мой скрипт получает, выглядят следующим образом:
dev_type=tun
proto_1=udp
tun_mtu=1500
script_type=route-up
verb=1
local_port_1=1194
dev=tun0
remote_port_1=1194
PWD=/tmp
daemon=0
SHLVL=1
script_context=init
daemon_start_time=1409367799
daemon_pid=927
daemon_log_redirect=0
link_mtu=1500
_=/usr/bin/printenv
Команда, которую я использую для запуска моего VPN, выглядит следующим образом:
sudo openvpn --dev tun --route-noexec --script-security 2 --route-up /tmp/print.sh
И, наконец, скрипт, который я передаю, выглядит следующим образом:
#!/bin/bash
printenv
Кто-нибудь знает, почему мне не хватает переменных? Любая помощь была бы оценена!
Может быть, вам следует также передать опцию “–config”? Например.
openvpn --config /etc/openvpn/vpn.conf --script-security 2 --ifconfig-noexec --route-noexec --up ./netnsvpn-up --route-up ./netnsvpn-up
А netnsvpn-up будет что-то вроде:
case $script_type in
up)
ip netns add vpntun0
ip netns exec vpntun0 ip link set dev lo up
ip link set dev "$1" up netns vpntun0 mtu "$2"
env
ip netns exec vpntun0 ip addr add dev "$1" "${ifconfig_local}"https://serverfault.com/"${ifconfig_netmask:-30}"
;;
route-up)
ip netns exec vpntun0 ip route add default via "$route_vpn_gateway"
;;
down)
ip netns delete vpntun0
;;
esac
vpntun0 — это пространство имен.
Ответ или решение
При настройке маршрутизации в OpenVPN на Arch Linux существует возможность использования аргументов --route-noexec
и --route-up
для запуска собственного скрипта, который будет обновлять таблицы маршрутизации. Однако, как показывает ваш опыт, не все переменные окружения передаются в скрипт, что создает сложности при получении удаленного IP-адреса, необходимого для настройки маршрутизации.
Проблема: Недостаток переменных окружения
При использовании команды, которую вы предоставили для запуска OpenVPN:
sudo openvpn --dev tun --route-noexec --script-security 2 --route-up /tmp/print.sh
вы получаете следующие переменные окружения в вашем скрипте:
dev_type=tun
proto_1=udp
tun_mtu=1500
script_type=route-up
verb=1
local_port_1=1194
dev=tun0
remote_port_1=1194
PWD=/tmp
daemon=0
SHLVL=1
script_context=init
daemon_start_time=1409367799
daemon_pid=927
daemon_log_redirect=0
link_mtu=1500
_=/usr/bin/printenv
Однако переменная, содержащая удаленный IP-адрес (или другие важные параметры), отсутствует.
Причины отсутствия переменных
Данная ситуация может быть вызвана несколькими факторами:
-
Неправильное использование конфигурационного файла: Как было предложено, использование опции
--config
может быть необходимым. Убедитесь, что у вас есть конфигурационный файл, который OpenVPN может обработать, и что он содержит все нужные параметры.sudo openvpn --config /etc/openvpn/vpn.conf --script-security 2 --route-noexec --route-up /tmp/print.sh
-
Права на исполнение скрипта: Убедитесь, что ваш скрипт имеет необходимые права на исполнение:
chmod +x /tmp/print.sh
-
Настройки безопасности скриптов: Настройка
--script-security
должна быть достаточной, чтобы разрешить выполнение скриптов, но не стоит забывать, что уровень2
допускает выполнение скриптов, но может ограничивать доступ к некоторым переменным. Попробуйте временно установить уровень безопасности на3
, чтобы проверить, будет ли это иметь значение:sudo openvpn --config /etc/openvpn/vpn.conf --script-security 3 --route-noexec --route-up /tmp/print.sh
Возможное решение
Согласно вашему фрагменту скрипта, вам нужно немного адаптировать его для получения переменной, содержащей информацию о маршруте. Вот пример того, как можно обработать различные типы сценариев:
#!/bin/bash
case $script_type in
route-up)
echo "Remote IP: $untrusted_ip"
echo "VPN Gateway: $route_vpn_gateway"
# Ваши команды маршрутизации здесь
;;
up)
# Обработка скрипта up
;;
down)
# Обработка скрипта down
;;
esac
Заключение
Проблема с отсутствием некоторых переменных окружения при использовании --route-up
в OpenVPN может быть решена с помощью тщательной настройки команд и прав. Не забудьте проверить конфигурационный файл, права на исполнение скрипта, и при необходимости измените уровень безопасности. Это поможет вам получить доступ к необходимым переменным, включая удаленный IP-адрес и другие параметры для успешного обновления таблицы маршрутизации.