файл конфигурации сервера:
topology net30
mode server
tls-server
push "route-gateway 192.168.0.1"
ifconfig 192.168.0.1 192.168.0.2
ifconfig-pool 192.168.0.5 192.168.0.9
port 1196
proto udp
dev tun
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/devops.log 1
syslog vpn-devops
verb 15
writepid /var/run/openvpn/devops.pid
ca /etc/openvpn/devops/ca.crt
cert /etc/openvpn/devops/server.crt
key /etc/openvpn/devops/server.key
dh /etc/openvpn/dh.pem
ifconfig-pool-persist /var/lib/openvpn/devops.ipp
client-config-dir /etc/openvpn/devops/ccd
crl-verify /etc/openvpn/devops/crl.pem
client-to-client
Проблема: при перезапуске службы я видел это в файле журнала:
May 17 14:32:08 t-xhyve vpn-devops[21013]: TCP/UDP: Closing socket
May 17 14:32:08 t-xhyve vpn-devops[21013]: Closing TUN/TAP interface
May 17 14:32:08 t-xhyve vpn-devops[21013]: /sbin/ip addr del dev tun1 local 192.168.0.1 peer 192.168.0.2
May 17 14:32:08 t-xhyve vpn-devops[21013]: Linux ip addr del failed: external program exited with error status: 2
Причина в том, что OpenVPN работает как nobody
пользователь, у которого нет разрешения на удаление туннельного интерфейса. Итак, я хотел бы использовать корень плагин для вызова сценария отключения с правами root.
plugin /usr/lib/openvpn/openvpn-plugin-down-root.so /usr/share/openvpn/down.sh
/usr/share/openvpn/down.sh
#!/bin/sh
/sbin/ip addr del dev $1 local $4 peer $5
затем попробуйте перезапустить, но я получил следующее:
May 17 14:49:47 t-xhyve vpn-devops[23001]: /sbin/ip addr del dev tun1 local 192.168.0.1 peer 192.168.0.2
May 17 14:49:47 t-xhyve vpn-devops[23228]: PKCS#11: __pkcs11h_forkFixup entry pid=23228, activate_slotevent=1
May 17 14:49:47 t-xhyve vpn-devops[23228]: PKCS#11: __pkcs11h_forkFixup return
May 17 14:49:47 t-xhyve vpn-devops[23001]: Linux ip addr del failed: external program exited with error status: 2
May 17 14:49:47 t-xhyve vpn-devops[23001]: PLUGIN_CALL: PRE type=PLUGIN_DOWN
May 17 14:49:47 t-xhyve vpn-devops[23001]: ARGV[0] = '/usr/lib/openvpn/openvpn-plugin-down-root.so'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ARGV[1] = 'tun1'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ARGV[2] = '1500'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ARGV[3] = '1542'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ARGV[4] = '192.168.0.1'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ARGV[5] = '192.168.0.2'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ARGV[6] = 'init'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[0] = 'dev=tun1'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[1] = 'link_mtu=1542'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[2] = 'tun_mtu=1500'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[3] = 'script_context=init'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[4] = 'signal=sigterm'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[5] = 'redirect_gateway=0'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[6] = 'dev_type=tun'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[7] = 'ifconfig_remote=192.168.0.2'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[8] = 'ifconfig_local=192.168.0.1'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[9] = 'config=/etc/openvpn/devops/config'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[10] = 'verb=15'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[11] = 'daemon=0'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[12] = 'daemon_log_redirect=0'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[13] = 'daemon_start_time=1463471367'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[14] = 'daemon_pid=23001'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[15] = 'proto_1=udp'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[16] = 'local_port_1=1196'
May 17 14:49:47 t-xhyve vpn-devops[23001]: ENVP[17] = 'remote_port_1=1196'
May 17 14:49:47 t-xhyve vpn-devops[23001]: PLUGIN_CALL: POST /usr/lib/openvpn/openvpn-plugin-down-root.so/PLUGIN_DOWN status=1
May 17 14:49:47 t-xhyve vpn-devops[23001]: PLUGIN_CALL: plugin function PLUGIN_DOWN failed with status 1: /usr/lib/openvpn/openvpn-plugin-down-root.so
May 17 14:49:47 t-xhyve vpn-devops[23001]: ERROR: up/down plugin call failed
May 17 14:49:47 t-xhyve vpn-devops[23001]: Exiting due to fatal error
May 17 14:49:50 t-xhyve openvpn-devops-upstart: RTNETLINK answers: Operation not permitted
May 17 14:49:50 t-xhyve openvpn-devops-upstart: DOWN-ROOT: Error sending script execution signal to background process
У меня есть несколько вопросов:
Почему OpenVPN до сих пор так называют?
/sbin/ip addr del dev tun1 local 192.168.0.1 peer 192.168.0.2
Зачем мне это?
May 17 14:49:47 t-xhyve vpn-devops[23001]: ERROR: up/down plugin call failed
May 17 14:49:47 t-xhyve vpn-devops[23001]: Exiting due to fatal error
May 17 14:49:50 t-xhyve openvpn-devops-upstart: RTNETLINK answers: Operation not permitted
May 17 14:49:50 t-xhyve openvpn-devops-upstart: DOWN-ROOT: Error sending script execution signal to background process
Как это решить?
Есть ли профили для брони приложений?
Нет.
Попробуйте изменить сценарий оболочки так, чтобы он выполнял cat / proc / self / status> /tmp/temp.txt и распечатал результат здесь.
/usr/share/openvpn/down.sh
#!/bin/sh
cat /proc/self/status >/tmp/temp.txt
#/sbin/ip addr del dev $1 local $4 peer $5
при перезапуске:
May 18 16:51:00 t-xhyve vpn-devops[17930]: TCP/UDP: Closing socket
May 18 16:51:00 t-xhyve vpn-devops[17930]: Closing TUN/TAP interface
May 18 16:51:00 t-xhyve vpn-devops[17930]: /sbin/ip addr del dev tun1 local 192.168.0.1 peer 192.168.0.2
May 18 16:51:00 t-xhyve vpn-devops[18520]: PKCS#11: __pkcs11h_forkFixup entry pid=18520, activate_slotevent=1
May 18 16:51:00 t-xhyve vpn-devops[18520]: PKCS#11: __pkcs11h_forkFixup return
May 18 16:51:00 t-xhyve vpn-devops[17930]: Linux ip addr del failed: external program exited with error status: 2
May 18 16:51:00 t-xhyve vpn-devops[17930]: PLUGIN_CALL: PRE type=PLUGIN_DOWN
May 18 16:51:00 t-xhyve vpn-devops[17930]: ARGV[0] = '/usr/lib/openvpn/openvpn-plugin-down-root.so'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ARGV[1] = 'tun1'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ARGV[2] = '1500'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ARGV[3] = '1542'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ARGV[4] = '192.168.0.1'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ARGV[5] = '192.168.0.2'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ARGV[6] = 'init'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[0] = 'dev=tun1'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[1] = 'link_mtu=1542'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[2] = 'tun_mtu=1500'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[3] = 'script_context=init'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[4] = 'signal=sigterm'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[5] = 'redirect_gateway=0'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[6] = 'dev_type=tun'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[7] = 'ifconfig_remote=192.168.0.2'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[8] = 'ifconfig_local=192.168.0.1'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[9] = 'config=/etc/openvpn/devops/config'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[10] = 'verb=15'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[11] = 'daemon=0'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[12] = 'daemon_log_redirect=0'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[13] = 'daemon_start_time=1463564660'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[14] = 'daemon_pid=17930'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[15] = 'proto_1=udp'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[16] = 'local_port_1=1196'
May 18 16:51:00 t-xhyve vpn-devops[17930]: ENVP[17] = 'remote_port_1=1196'
May 18 16:51:00 t-xhyve vpn-devops[17930]: PLUGIN_CALL: POST /usr/lib/openvpn/openvpn-plugin-down-root.so/PLUGIN_DOWN status=1
May 18 16:51:00 t-xhyve vpn-devops[17930]: PLUGIN_CALL: plugin function PLUGIN_DOWN failed with status 1: /usr/lib/openvpn/openvpn-plugin-down-root.so
May 18 16:51:00 t-xhyve vpn-devops[17930]: ERROR: up/down plugin call failed
May 18 16:51:00 t-xhyve vpn-devops[17930]: Exiting due to fatal error
May 18 16:51:00 t-xhyve [2016-05-18 16:51:00,738][WARN ]May 18 16:51:01 t-xhyve openvpn-devops-upstart: RTNETLINK answers: Operation not permitted
May 18 16:51:01 t-xhyve openvpn-devops-upstart: DOWN-ROOT: Error sending script execution signal to background process
Процесс перезапущен, но файл журнала (/tmp/temp.txt
) не был создан.
Конечно, запуск этого скрипта вручную работал нормально:
bash -x /usr/share/openvpn/down.sh
+ cat /proc/self/status
+
cat /tmp/temp.txt
Name: cat
State: R (running)
Tgid: 19246
Ngid: 0
Pid: 19246
PPid: 19245
...
Указание полного пути не помогло:
May 19 03:52:11 t-xhyve openvpn-devops-upstart: RTNETLINK answers: Operation not permitted
May 19 03:52:11 t-xhyve openvpn-devops-upstart: DOWN-ROOT: Error sending script execution signal to background process
May 19 03:52:11 t-xhyve openvpn-devops-upstart: DOWN-ROOT: BACKGROUND: INIT command='/bin/cat /proc/self/status > /tmp/temp.txt'
Как вы запускаете / останавливаете сервис?
@rda: вот файл выскочки:
start on (net-device-up
and local-filesystems
and runlevel [2345]
and started rsyslog)
stop on runlevel [!2345]
respawn
respawn limit 6 60
pre-start script
if [ ! -e /var/run/openvpn ]; then
mkdir -m 0770 /var/run/openvpn
chown nobody:nogroup /var/run/openvpn
fi
end script
exec /usr/sbin/openvpn --config /etc/openvpn/devops/config
post-stop exec sleep 5
Альтернативный сценарий без использования
start-stop-daemon
, который отправляетSIGTERM
к основному процессу вpre-stop
строфа скрипта может выглядеть следующим образом:
Я добавил pre-stop
сценарий, как вы предложили:
start on (net-device-up
and local-filesystems
and runlevel [2345]
and started rsyslog)
stop on runlevel [!2345]
respawn
respawn limit 6 60
env PIDFILE="/var/run/openvpn/devops.pid"
pre-start script
if [ ! -e /var/run/openvpn ]; then
mkdir -m 0770 /var/run/openvpn
chown nobody:nogroup /var/run/openvpn
fi
end script
exec /usr/sbin/openvpn --config /etc/openvpn/devops/config
pre-stop script
PID=`cat $PIDFILE`
kill -15 $PID
sleep 1
if [ "$?" -eq 0 ]; then
rm -f $PIDFILE
else
echo "Unable to stop VPN '$NAME'"
fi
end script
post-stop exec sleep 5
затем я попытался перезапустить, используя restart openvpn-devops
и все еще получил это:
May 25 02:41:54 t-xhyve openvpn-devops-upstart: RTNETLINK answers: Operation not permitted
May 25 02:41:54 t-xhyve openvpn-devops-upstart: DOWN-ROOT: Error sending script execution signal to background process
May 25 02:41:54 t-xhyve openvpn-devops-upstart: DOWN-ROOT: BACKGROUND: INIT command='/bin/cat /proc/self/status > /tmp/temp.txt'
Я стараюсь отвечать на вопросы в обратном порядке:
DOWN-ROOT: Error sending script execution signal to background process
Когда down-root
плагин, основной процесс будет fork()
прежде, чем он потеряет привилегии root. После этого модуль останется в состоянии ожидания, пока он не получит сообщение от основного процесса по конвейеру для выполнения сценария отключения (см. Прочти меня). Основной процесс отправит это сообщение в down-root
процесс модуля, когда он получает SIGTERM
.
Как упоминалось в этом OpenVPN ошибка с systemd
файл конфигурации службы, эта ошибка, скорее всего, вызвана upstart
(демон инициализации по умолчанию, используемый ubuntu 14.04), который отправит SIGTERM
к обоим процессам. В down-root
Процесс модуля завершится до того, как он успеет выполнить свою работу, вызывая down-скрипт.
Использовать /etc/init.d/openvpn
поставляется с Ubuntu для запуска и остановки службы или исправления в upstart
сценарий. Очень простой рабочий сценарий выскочки может выглядеть следующим образом. Обратите внимание, что он использует start-stop-daemon
посылать правильные сигналы.
Создать файл /etc/init/openvpn.conf
start on (net-device-up
and local-filesystems
and runlevel [2345]
and started rsyslog)
stop on runlevel [!2345]
respawn
respawn limit 6 60
env PIDFILE="/var/run/openvpn/devops.pid"
pre-start script
if [ ! -e /var/run/openvpn ]; then
mkdir -m 0770 /var/run/openvpn
chown nobody:nogroup /var/run/openvpn
fi
end script
exec start-stop-daemon --start --quiet --oknodo \
--pidfile /var/run/openvpn/devops.pid \
--exec /usr/sbin/openvpn -- --config /etc/openvpn/devops/config < /dev/null
pre-stop script
exec start-stop-daemon --stop --quiet --oknodo \
--pidfile $PIDFILE --exec /usr/sbin/openvpn --retry 5
if [ "$?" -eq 0 ]; then
rm -f $PIDFILE
else
echo "Unable to stop VPN"
fi
end script
post-stop exec sleep 5
An альтернатива сценарий без использования start-stop-daemon
, который отправляет SIGTERM
к основному процессу в pre-stop
строфа скрипта может выглядеть следующим образом:
start on (net-device-up
and local-filesystems
and runlevel [2345]
and started rsyslog)
stop on runlevel [!2345]
respawn
respawn limit 6 60
env PIDFILE="/var/run/openvpn/devops.pid"
pre-start script
if [ ! -e /var/run/openvpn ]; then
mkdir -m 0770 /var/run/openvpn
chown nobody:nogroup /var/run/openvpn
fi
end script
exec /usr/sbin/openvpn --config /etc/openvpn/devops/config
pre-stop script
PID=`cat $PIDFILE`
kill -15 $PID
sleep 1
if [ "$?" -eq 0 ]; then
rm -f $PIDFILE
else
echo "Unable to stop VPN"
fi
end script
post-stop exec sleep 5
Контроль над upstart
работа:
initctl <command> openvpn
<command>
: start
, stop
, restart
Это должно устранить ошибку выше и запустить down.sh
скрипт правильно, но по-прежнему будет отображаться следующая ошибка:
Linux ip addr del failed: external program exited with error status: 2
Эта ошибка возникает в первую очередь потому, что ip addr del
выполняется после того, как интерфейс TUN / TAP уже был закрыт.
Подробнее об этом ниже.
/sbin/ip addr del dev tun1 local 192.168.0.1 peer 192.168.0.2
Это вызвано директивой ifconfig
, который добавит / удалит IP-адрес интерфейса TUN / TAP при запуске / остановке службы. (Видеть справочная страница)
Чтобы обойти это поведение, измените конфигурацию следующим образом.
Конфигурация OpenVPN сервера файл:
topology net30
mode server
tls-server
push "route-gateway 192.168.0.1"
ifconfig 192.168.0.1 192.168.0.2
ifconfig-pool 192.168.0.5 192.168.0.9
ifconfig-noexec
up /usr/share/openvpn/up.sh
down-pre
plugin /usr/lib/openvpn/openvpn-plugin-down-root.so /usr/share/openvpn/down.sh
script-security 2
port 1196
proto udp
dev tun
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/devops.log 1
syslog vpn-devops
verb 15
writepid /var/run/openvpn/devops.pid
ca /etc/openvpn/devops/ca.crt
cert /etc/openvpn/devops/server.crt
key /etc/openvpn/devops/server.key
dh /etc/openvpn/dh.pem
ifconfig-pool-persist /var/lib/openvpn/devops.ipp
client-config-dir /etc/openvpn/devops/ccd
crl-verify /etc/openvpn/devops/crl.pem
client-to-client
ifconfig-noexec
: Не выполнять команды ifconfig, передать --ifconfig
параметры в скрипты.up
: Запуск сценария установки IP-адреса необходим из-за ifconfig-noexec
down-pre
: Вызов --down
сценарий до, а не после закрытия TUN / TAP.script-security 2
: Разрешить вызов встроенных исполняемых файлов и пользовательских сценариев.UP скрипт /usr/share/openvpn/up.sh
:
#!/bin/sh
/sbin/ip addr add dev $1 local $4 peer $5
/sbin/ip link set dev $1 up
DOWN скрипт /usr/share/openvpn/down.sh
:
#!/bin/sh
/sbin/ip addr del dev $1 local $4 peer $5
/sbin/ip link set dev $1 down
Сценарии UP / DOWN также поднимают и опускают интерфейс (хотя это и не обязательно).
Убедитесь, что они исполняемые:
chmod +x /usr/share/openvpn/up.sh
chmod +x /usr/share/openvpn/down.sh
Конфигурация OpenVPN сервера файл (отредактируйте / добавьте эти строки):
dev tun1
# down-pre
dev tun1
: Мы будем использовать постоянный интерфейс TUN# down-pre
: Не требуется при использовании постоянного интерфейсаНаконец создайте постоянный интерфейс TUN:
openvpn --mktun --dev tun1
Это создает постоянный туннель tun1
который переживает несколько экземпляров OpenVPN и умирает только при удалении с помощью openvpn --rmtun --dev tun1
или машина перезагружается.
Вот несколько дополнительных шагов по устранению неполадок, если конфигурация верна, как показано выше, и следующая ошибка все еще появляется:
DOWN-ROOT: Error sending script execution signal to background process
Запустите экземпляр OpenVPN, т.е. с upstart
:
initctl start openvpn
Проверить что PID
в процессах есть:
ps -ef | grep "[o]penvpn"
# or more specific for our devops server example
ps -ef | grep "[o]penvpn/devops"
# this should show 2 openvpn processes
UID PID PPID C STIME TTY TIME CMD
nobody 3590 1 0 21:49 ? 00:00:00 /usr/sbin/openvpn --config /etc/openvpn/devops/config
root 3593 3590 0 21:49 ? 00:00:00 /usr/sbin/openvpn --config /etc/openvpn/devops/config
Пока бревна копаются, убийство основной процесс openvpn (выполняется как пользователь nobody
) вручную с помощью SIGTERM
используя свой PID
kill -15 3590
Или альтернативно в одной строке:
kill -15 `ps -ef | grep "^[n]obody .* /usr/sbin/openvpn --config /etc/openvpn/devops/config$" | awk '{print $2}'`
Вывод сжатого журнала должен выглядеть следующим образом (без DOWN-ROOT: Error ...
):
vpn-devops[3590]: TCP/UDP: Closing socket
vpn-devops[3590]: PLUGIN_CALL: PRE type=PLUGIN_DOWN
upstart-devops : DOWN-ROOT: BACKGROUND: received command code: 0
vpn-devops[3590]: PLUGIN_CALL: POST /usr/lib/openvpn/openvpn-plugin-down-root.so/PLUGIN_DOWN status=0
vpn-devops[3590]: Closing TUN/TAP interface
vpn-devops[3590]: PLUGIN_CLOSE: /usr/lib/openvpn/openvpn-plugin-down-root.so
vpn-devops[3590]: PID packet_id_free
vpn-devops[3590]: SIGTERM[hard,] received, process exiting
upstart-devops : DOWN-ROOT: close
upstart-devops : DOWN-ROOT: BACKGROUND: received command code: 1
upstart-devops : DOWN-ROOT: BACKGROUND: EXIT
kernel: init : ovpn-devops main process ended, respawning