Как настроить OpenVPN и передачу для запуска при загрузке в CentOS 6?

Сервер Apache записывает все входящие запросы и все запросы, обработанные в файл журнала. Формат журнала доступа легко настраивается. Расположение и содержание журнала доступа контролируются директивой CustomLog. Местоположение файла журнала доступа к apache по умолчанию:

RHEL / Red Hat / CentOS / Fedora Linux Расположение файла доступа Apache -

/var/log/httpd/access_log

Местоположение файла журнала доступа Debian / Ubuntu Linux Apache -

/var/log/apache2/access.log

Местоположение файла журнала доступа FreeBSD Apache -

 /var/log/httpd-access.log

Чтобы найти точное местоположение файла журнала apache, вы можете использовать команду grep:

# grep CustomLog /usr/local/etc/apache22/httpd.conf
# grep CustomLog /etc/apache2/apache2.conf
# grep CustomLog /etc/httpd/conf/httpd.conf

Пример вывода:

# a CustomLog directive (see below).
#CustomLog "/var/log/httpd-access.log" common
CustomLog "/var/log/httpd-access.log" combined 
4
03.05.2019, 18:08
2 ответа

Решения

Вот некоторые подробные аспекты и решения по этому вопросу (обратите внимание, что centos 6 не использует systemd, centos переключился на systemd в v7)

Решение для Centos 7

Настройка OpenVPN при загрузке:

Мы можем использовать systemd (для реализации службы ), чтобы запустить openvpn при загрузке, нам нужно создать службу, включить ее, а затем запустить.(после включения службы она будет автоматически запускаться во время загрузки)

1 -Создайте службу:(с корнем)

cd /etc/systemd/system
touch openvpn-custom.service
chmod 644 openvpn-custom.service

2 -Откройте служебный файл:(с правами root)

открыть /etc/systemd/system/openvpn-custom.serviceв текстовом редакторе, которым вы пользуетесь примерnano openvpn-custom.service

3 -Отредактируйте и настройте служебный файл:(с помощью root)

Вставьте и адаптируйте следующий код в/etc/systemd/system/openvpn-custom.service

[Unit]
Description=OpenVPN Custom Setup Script 
After=network.target network-online.target
Wants=network-online.target

[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/full-path-to/your/vpn-script/vpn.sh
ExecStop=/full-path-to/a-scirpt/that-would-stop-openvpn/vpn-stop.sh

[Install]
WantedBy=multi-user.target

4 -Включить и запустить службу:(с правами root)

systemctl enable openvpn-custom.service
systemctl start openvpn-custom.service

вы можете проверить статус услуги с помощьюsystemctl status openvpn-custom.service

Настройка передачи и телеграммы при загрузке (на основе статуса openvpn):

То же, что и решение openvpn, создайте новую службу (, затем включите и запустите ее ), содержащую следующий код

[Unit]
Description=Application Depending on OpenVPN 
After=network.target network-online.target openvpn-custom.service
Wants=network-online.target openvpn-custom.service

[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/full-path-to/your/ovpn-applications.sh
ExecStop=/full-path-to/a-scirpt/that-would-stop-apps/ovpn-applications-stop.sh

[Install]
WantedBy=multi-user.target

Ваш ovpn -application.sh будет выглядеть примерно так

#!/bin/sh
/bin/sed s/IP_ADDRESS/$4/ /var/lib/transmission/.config/transmission/settings_template.json > /var/lib/transmission/.config/transmission/settings.json
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-telegram start

After=openvpn-custom.serviceи Wants=openvpn-custom.serviceсделают эту службу зависимой от openvpn, и, таким образом, если служба openvpn не запущена или не работает, другая служба не запустится

Решение для Centos 6

Настройка OpenVPN при загрузке:

1 -Создайте службу:(с корнем)

cd /etc/rc.d/init.d
touch openvpn-custom
chmod 755 openvpn-custom

2 -Откройте служебный файл:(с правами root)

открыть /etc/rc.d/init.d/openvpn-customв текстовом редакторе, который вы используете примерnano openvpn-custom

3 -Отредактируйте и настройте служебный файл:(с помощью root)

#!/bin/bash
#
# chkconfig: 2345 55 45
# description: Custom openvpn script
# processname: openvpn
#
### BEGIN INIT INFO
# Provides: openvpn
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Short-Description: The openvpn daemon
# Description: The openvpn daemon custom script
### END INIT INFO

#/etc/rc.d/init.d/openvpn-custom
# Source function library.
. /etc/init.d/functions


start() {
        echo -n "Starting custom openvpn... "
        /full-path-to/your/vpn-script/vpn.sh
        return 0
}

stop() {
        echo -n "Shutting down custom openvpn... "
        /full-path-to/a-scirpt/that-would-stop-openvpn/vpn-stop.sh
        return 0
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        ;;
    restart)
        stop
        start
        ;;
    reload)
        ;;
    *)
        echo "Usage: openvpn-custom {start|stop|status|reload|restart}"
 exit 1
        ;;
esac
exit $?

4 -Включить и запустить службу:(с правами root)

chkconfig openvpn-custom on
service openvpn-custom start

вы можете проверить статус услуги с помощьюservice openvpn-custom status

Как убедиться, что openvpn запускается только тогда, когда сеть готова

Определение chkconfig в начале сценария инициализации определяет, какой номер S/K он получает.

Каждый «уровень выполнения» на самом деле представляет собой просто каталог(/etc/rc *..d/)полный символических ссылок на сценарии инициализации(/etc/init.d/)названный с пронумерованными записями S и K.

S означает запуск, а K означает уничтожение. Когда init переходит на уровень выполнения, он начинается с S01 и переходит к S99, запуская каждый сценарий инициализации для запуска службы, которой управляет этот сценарий. Когда init покидает уровень выполнения, он начинается с K01 и переходит к K99, запуская каждый сценарий для остановки службы, которой управляет этот сценарий.

man chkconfig дает пример определения службы в стиле chkconfig -и определения службы в стиле базы стандартов Linux (LSB ).

Если в сценарии инициализации определены оба типа, определение LSB должно иметь приоритет над определением chkconfig.

Если у вас есть служба, которая зависит от сетевого подключения, вы можете либо убедиться, что ваша служба запускается после /etc/rc *.d/S10network, назначив ей начальный номер после 10, либо вы можете увидеть, что /etc /init.d/network имеет определение LSB Предоставляет :$network , поэтому вы можете использовать определение LSB Обязательное -Start :$network в своем скрипте инициализации.

Настройка передачи и телеграммы при загрузке (на основе статуса openvpn):

То же, что и решение openvpn, создайте новую службу (, затем включите и запустите ее ), содержащую следующий код (/etc/rc.d/init.d/openvpn -apps)

#!/bin/bash
#
# chkconfig: 2345 55 45
# description: Custom openvpn-apps script
# processname: openvpn-apps
#
### BEGIN INIT INFO
# Provides: openvpn-apps
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Short-Description: The openvpn-apps daemon
# Description: The openvpn daemon custom script
### END INIT INFO
#/etc/rc.d/init.d/openvpn-apps

# Source function library.
. /etc/init.d/functions


start() {
        echo -n "Starting custom openvpn... "
        /full-path-to/your/apps.sh
        return 0
}

stop() {
        echo -n "Shutting down custom openvpn... "
        /full-path-to/your/stop-apps.sh
        return 0
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        ;;
    restart)
        stop
        start
        ;;
    reload)
        ;;
    *)
        echo "Usage: openvpn-apps {start|stop|status|reload|restart}"
 exit 1
        ;;
esac
exit $?

Ваш файл apps.sh будет выглядеть примерно так

#!/bin/sh
/bin/sed s/IP_ADDRESS/$4/ /var/lib/transmission/.config/transmission/settings_template.json > /var/lib/transmission/.config/transmission/settings.json
/etc/init.d/transmission-daemon start
/etc/init.d/transmission-telegram start

Чтобы сделать ваш apps.sh зависимым от статуса openvpn, вы можете сначала отложить запуск apps.sh с помощьюsleepили написать цикл bash, который проверяет openvpn с помощью ps или проверить результат пинга к вашему шлюзу openvn (в apps.sh)или вы можете просто проверить результатservice openvpn-custom status(в apps.sh)

Решения (6 и 7 )примечания:

Отказоустойчивый openvpn:

Вы можете настроить «отказоустойчивость», чтобы сеть отключилась, если openvpn не работает, и, таким образом, предотвратить утечку соединений, когда vpn не работает. Для этого вы можете использовать это или это решение

Заставить приложение использовать определенный интерфейс:

Если ваша установка openvpn туннелирует/маршрутизирует всю систему; в этом нет необходимости, но если вы не направляете весь трафик через интерфейс openvpn, вы можете проксировать/привязать/заставить свои приложения (передачи/телеграммы )использовать vpn; В Linux существует несколько решений для привязки приложения к определенному интерфейсу, у каждого из которых есть свои плюсы и минусы. Этот ответ unix stackexchange подробно объясняет большинство доступных возможностей

2
27.01.2020, 20:57

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

Начиная с нетронутой CentOS 6.10 минимальной установки ISO, я бы действовал следующим образом:

Во-первых, включить неограниченный OpenVPN :CentoOS 6 поставляется со стандартной политикой SELinux, которая по умолчанию запускает /usr/sbin/openvpnдвоичный файл в ограниченном режиме, который в основном разрешает только сетевые настройки, тем самым предотвращая любой вспомогательный скрипт. чтобы можно было сделать что-нибудь полезное. Однако CentOS 6 также предоставляет один простой параметр для включения неограниченного OpenVPN. Как суперпользователь запустите:

setsebool -P openvpn_run_unconfined on

Подождите несколько секунд, так как это может занять некоторое время.

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

Затем, чтобы продолжить базовую настройку, установите репозиторий EPEL в yum вашей системы:

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

Это дает yum вашей системы репозиторий, который предоставляет пакеты RPM для openvpn и передачи, упакованные для CentOS 6.

После этого вы можете сделать:

yum install openvpn transmission-daemon

Затем установите бота transmission-telegram, как вы уже сделали. Просто не забудьте поместить его в каталог, указанный в $PATH. Принимая во внимание политику CentOS 6 SELinux, /usr/local/binможет быть хорошим выбором.

(Пожалуйста, обратите внимание , что я не могу подробно рассказать о ботах Telegram, потому что я ничего о нем не знаю и даже не могу его протестировать, потому что вообще не пользуюсь Telegram.)

Затем создайте скрипт openvpn-transmission-up.shнаподобие:

#!/bin/bash

PATH+=":/sbin:/usr/sbin"
service transmission-daemon start
service transmission-daemon status && telegram-bot-start.sh

telegram-bot-start.sh— это просто гипотетическая оболочка для запуска фактической команды, которая запускает бота Telegram, и выполняется только в случае успешного запуска демона передачи -. Вы также можете использовать прямую команду вместо сценария-оболочки, если прямую команду можно сделать одной строкой -, которая будет помещена после &&.

Затем также сделайте скрипт openvpn-transmission-down.shнаподобие:

#!/bin/bash

PATH+=":/sbin:/usr/sbin"
telegram-bot-stop.sh
service transmission-daemon stop || true

Здесь вы также можете использовать прямые команды для остановки бота Telegram вместо обёртки telegram-bot-stop.sh, даже если они на самом деле представляют собой последовательность команд.

Затем сделайте два вышеуказанных сценария работоспособными:

chmod +x openvpn-transmission-up.sh openvpn-transmission-down.sh

и снова поместите их в каталог /etc/openvpn/scripts(, чтобы соответствовать политике CentoOS SELinux ). Создайте этот каталог, если у вас его еще нет.

Затем поместите свой собственный конфиг для OpenVPN в /etc/openvpn. Такой файл можно назвать как угодно, но он должен иметь суффикс .conf.

Убедитесь, что в этом файле .confесть следующие строки:

script-security 2
route-up scripts/openvpn-transmission-up.sh
route-pre-down scripts/openvpn-transmission-down.sh

Если у вас уже есть скрипты route-upили route-pre-down, просто объедините существующие скрипты до -с указанными выше соответственно, но обязательно поместите их в /etc/openvpn/scripts.

Приведенная выше настройка гарантирует, что ваш бот Transmission и Telegram всегда будут следовать судьбе VPN-туннеля.

Наконец, установите openvpn для запуска при загрузке:

chkconfig openvpn on

Этот последний параметр зависит от установки, поставляемой с пакетом RPM для OpenVPN, что позволяет запускать его только после успешного запуска общей сети.

Обратите внимание: я думаю, вам не нужно настраивать Transmission, потому что конфигурации по умолчанию, поставляемой с пакетом RPM, должно быть достаточно. Однако, если вы хотите повторно использовать команду sedдля установки IP-АДРЕСА _, поместите эту команду sedв сценарий openvpn-transmission-up.shперед запуском демона передачи -. В любом случае, обычно лучше использовать $ifconfig_localвместо $4.

К этому моменту все должно быть готово. Вы можете проверить это с помощью простого service openvpn, за которым следует start, или stop, или restart и т. д. Или просто перезагрузив безголовый сервер.

ПРИМЕЧАНИЕ : если ваш провайдер VPN требует аутентификации с помощью имени пользователя и пароля, вам нужно будет поместить их в файл в две отдельные строки. Этот файл должен находиться в папке /etc/openvpnв соответствии с политикой SELinux. Затем включите auth-user-pass /etc/openvpn/credentials-fileв ваш файл openvpn .conf. Если вы этого не сделаете, CentOS остановится во время загрузки, ожидая интерактивного ввода учетных данных, или просто OpenVPN может просто отказаться запускаться.


Что касается (повторного -)усиления вышеуказанной настройки, в зависимости от ваших предпочтений вы можете быть довольны тем, как есть :установка на данный момент использует допустимые настройки, предварительно -установленные CentOS, в том числе тот, который позволяет OpenVPN работать с меньшими ограничениями, что в основном позволяет вспомогательным сценариям свободно выполнять двоичные файлы, доступные в системе. Как бы расплывчато это ни звучало, он по-прежнему более ограничен, чем полное отсутствие SELinux, и, оставив все таким образом, и Transmission, и Telegram-бот работают с немного большими ограничениями, чем их стандартная (или ручная )установка. разрешать.

Если вы хотите вернуть OpenVPN в режим ограниченной работы, это все равно может быть довольно легко сделать, воспользовавшись тем фактом, что CentOS 6 фактически использует Upstart в качестве своего /sbin/init, даже несмотря на то, что большая часть операций загрузки зависит от устаревшего Скрипты в стиле SysVinit -. Однако вам потребуются дополнительные шаги:

  1. (к счастью, простая )пользовательская политика SELinux, по крайней мере, позволяющая OpenVPN общаться с Upstart, чтобы он запрашивал у последнего запуск Transmission и бота Telegram
  2. пара (простых )заданий Upstart для запуска Transmission через его унаследованные скрипты и для бота Telegram

Для начала переведите OpenVPN обратно в ограниченный режим:

setsebool -P openvpn_run_unconfined off

Теперь, если вы запустите OpenVPN, вспомогательные скрипты не смогут запустить бота Transmission и Telegram.

Итак, пользовательская политика SELinux:

Создайте файл с именемopenvpn-talk-upstart.teточно следующим образом:

module openvpn-talk-upstart.mod 1.0;

require {
        type openvpn_t;
        type init_t;
        class unix_stream_socket connectto;
}

allow openvpn_t init_t:unix_stream_socket connectto;

Затем выполните следующие команды:

checkmodule -m -M -o openvpn-talk-upstart.mod openvpn-talk-upstart.te
semodule_package -o openvpn-talk-upstart.pp -m openvpn-talk-upstart.mod
semodule -i openvpn-talk-upstart.pp

последняя команда может занять некоторое время.

Затем задания Upstart:

Создайте файл /etc/init/transmission-up.confследующим образом:

task

exec service transmission-daemon start

и файл /etc/init/transmission-down.confследующим образом:

task

exec service transmission-daemon stop

Тогда вам нужны задания Upstart для бота Telegram.

Для согласованности с моим примером я придерживаюсь своего гипотетического подхода к сценариям, поэтому файлы заданий, названные, например, /etc/init/telegram-bot-up.confи /etc/init/telegram-bot-down.conf, будут такими же, как файлы Transmission, только с командами execed, преобразованными в (соответственно)/usr/local/bin/telegram-bot-start.shи /usr/local/bin/telegram-bot-stop.sh.

Обратите внимание, что здесь, в зависимости от вашего доверия к Upstart, вы также можете поместить соответствующие команды непосредственно в файлы заданий, в ключевые слова script... end-scriptвместо ключевого слова exec,или вы даже можете создать демона, полностью контролируемого Upstart -, с помощью одного единственного файла задания Upstart (, но не типа task), если вам так хочется.

После этого сделайте вспомогательный сценарий OpenVPN openvpn-transmission-up.shв /etc/openvpn/scriptsследующим:

#!/bin/sh

/sbin/start transmission-up && /sbin/start telegram-bot-up

и сценарий openvpn-transmission-down.sh:

#!/bin/sh

/sbin/start telegram-bot-down
/sbin/start transmission-down || true

Обратите внимание на использование команды /sbin/start, хотя на самом деле это операция «вниз».

Теперь все должно работать с OpenVPN в исходном ограниченном (, т.е. более безопасном )режиме, но и с Transmission, и с ботом Telegram в их стандартном «бесплатном» (, т.е. менее безопасном )режиме.


Если вы хотите еще больше усилить защиту этих двух последних, вам нужно будет запустить их в ограниченном контексте SELinux, например, для OpenVPN, а затем провести тщательный анализ файла /var/log/audit/audit.log, чтобы точно настроить политику SELinux. В этом вам могут помочь инструменты, а именно команда audit2allow, доступная в пакете policycoreutils-python.

Вы можете запустить эту команду поверх audit.log, полученного из SELinux в разрешительном режиме (, см. файл /etc/sysconfig/selinux), но это может привести к слишком большому разрешению. В противном случае вы можете запустить его поверх audit.log, который исходит от обычного принудительного SELinux, выполняя его шаг -за шагом -, пока вы, наконец, не доберетесь до рабочей настройки. В последнем случае вы можете быть уверены, что разрешаете только то, что действительно необходимо.

Вывод из audit2allow -a -m...должен быть передан в checkmodule -m -M -o..., затем вывод этого последнего в semodule_package -o... -m...и, наконец, semodule -iфайла, сгенерированного semodule_package. Эта итерация на каждом шаге анализа.

Это может быть очень долгой задачей, и даже когда вы доберетесь до рабочей установки, это может быть так только вначале :в какой-то момент вы можете столкнуться с неожиданными проблемами "отказ в доступе" позже на, например в первый раз, когда ваша передача или бот Telegram,пытается получить доступ к чему-то, чего раньше не пробовал.

1
27.01.2020, 20:57

Теги

Похожие вопросы