Thank you for reading this post, don't forget to subscribe!
1.Первичная настройка
2.Автозапуск джава приложения как сервиса
3.Калибровка тачскрина
4 Настройка модема 2G/3G/4G
5. Watchdog за модемами
6.VPN
6.1 vpnserver
6.2 vpnclient
7 Настройка резервирования
8.Восстановление из бекапа
7-8. Альтернативный вариант бэкапа и восстановления.
9.Доступ к терминалу по rdp через openvpn server
1.Первичная настройка
Появилась задача, создать образ для терминалов оплаты, стоящих в городе, чтобы эникейщики могли легко раскатывать образ без дополнительных донастроек.
За основу был взят образ centos 7, приступим
cat /etc/selinux/config | grep ^SELINUX
SELINUX=disabled
SELINUXTYPE=targeted
systemctl stop firewalld
systemctl disable firewalld
yum install net-tools
yum install libusb*
yum install libusb-0.1.so.4
yum install mc
yum install usbutils
yum install ntp
systemctl start ntpd
systemctl enable ntpd
ln -s /usr/share/zoneinfo/Asia/Bishkek /etc/localtime
--
cat /root/updatetime.sh
#!/bin/bash
systemctl stop ntpd
/usr/sbin/ntpdate -u pool.ntp.org 2>/dev/null
systemctl restart ntpd
--
crontab -l
*/60 * * * * /bin/bash /root/updatetime.sh
yum groupinstall "Development Tools" -y
yum install epel-release -y
yum groupinstall "X Window system" -y
yum groupinstall "MATE Desktop" -y
yum install gtk3-devel -y
yum -y install http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
yum install libdvdcss gstreamer{,1}-plugins-ugly gstreamer-plugins-bad-nonfree gstreamer1-plugins-bad-freeworld libde265 x265 -y
yum install vlc smplayer -y
yum install gstreamer-ffmpeg -y
systemctl set-default graphical.target
rm -rf '/etc/systemd/system/default.target'
ln -s '/usr/lib/systemd/system/graphical.target' '/etc/systemd/system/default.target'
adduser kiosk
passwd kiosk
Настраиваем автовход
cat /usr/share/lightdm/lightdm.conf.d/60-lightdm-gtk-greeter.conf
[SeatDefaults]
greeter-session=lightdm-gtk-greeter
autologin-user=kiosk
reboot
После надо будет произвести единоразовую аутентификацию, чтоб войти под пользователем kiosk. Далее можно ребутать сервак и он автоматически будет заходить под пользователем kiosk
yum groupinstall -y "KDE Plasma Workspaces"
yum remove java*
Установка необходимого нам разрешения через конфиг файл.
начинаем урезать права:
нажимаем ALT+F2 вписываем dconf-editor
Переходим в
org -> mate -> caja -> desktop
Отключаем значки
Отключаем правую кнопку у мыши:
org → mate → Marco → general → mouse-button-modifier
Добавляем в конфиг
cat /etc/profile | grep xmodmap
xmodmap -e 'pointer = 1 2 25 4 5 6 7 8 9'
Закрываем это окно и видим что значков на рабочем столе нету, и правая кнопка мыши не работает
Отключаем дополнительные рабочие области:
org - mate - marco - general - num-workspaces
Отключаем командную строку, блокировку экрана, выход из сеанса пользователя:
org - gnome - desktop - lockdown
тут не факт что 1024*768, зависит от того, с какого дисплея подключаетесь.
Отключаем сочетания клавиш:
В появившемся окне убираем всё сочетание клавиш кроме терминала CTRL+ALT+T
Отключаем панель (меню сверху, где можно вызвать утилиты)
mv /usr/bin/mate-panel /usr/bin/mate-panel.old
2. Автозапуск джава приложения как сервиса
Настраиваем автозапуск для самого приложения, назовём его kiosk
cat /lib/systemd/system/kiosk.service
[Unit]
Description=kiosk
[Service]
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/kiosk/.Xauthority
ExecStart=/usr/bin/bash /home/kiosk/SampleApp/run.sh
Restart=always
RestartSec=20s
KillMode=process
TimeoutSec=infinity
[Install]
WantedBy=graphical.target
chown -R kiosk:kiosk /home/kiosk/SampleApp/
systemctl enable kiosk
cat /home/kiosk/SampleApp/run.sh
#!/bin/sh
cd /home/kiosk/SampleApp/
java -classpath "libs/*" kg.kios.TerminalApp
3 Калибровка тачскрина
Ставим калибратор для тачскрина
yum install libX11.so.6 libXi.so.6 libatkmm-1.6.so.1 libc.so.6 libcairomm-1.0.so.1 libgcc_s.so.1 libgdkmm-2.4.so.1 libglibmm-2.4.so.1 libgtkmm-2.4.so.1 libpthread.so.0 libsigc-2.0.so.0 libstdc++.so.6
wget http://github.com/downloads/tias/xinput_calibrator/xinput_calibrator-0.7.5-1.fc13.i686.rpm
rpm -ivh xinput_calibrator-0.7.5-1.fc13.i686.rpm
Запускаем на экране тачскрина терминал и выполняем
xinput_calibrator
после чего тыкаем по экрану и получаем в терминале результат, который записываем в файл:
cat /etc/X11/xorg.conf.d/99-calibration.conf
1 2 3 4 5 6 7 8 9 10 |
Section "Inputclass" Identifier "calibration" MatchProduct "MASTouch TouchSystems MASTouch USB Touchscreen" Option "Calibration" "20 1060 408 1236" EndSection Section "InputClass" Identifier "calibration" MatchProduct "Premium Touch Co.,Ltd PremiumTouch Touchscreen" Option "Calibration" "53 1097 370 1190" EndSection |
Но мы сделаем автозапуск только при первом запуске образа:
cat /root/calibrator.sh
запускаться калибровка будет 1 раз
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#!/bin/bash #если файл /etc/X11/xorg.conf.d/99-calibration.conf пустой то удаляем проверочный файл /root/result_xinput_calibrator, так как его нет запустится калибровка if [[ ! -s /etc/X11/xorg.conf.d/99-calibration.conf ]]; then rm -rf /root/result_xinput_calibrator fi #проверяем содержимое файла /root/result_xinput_calibrator если в нём нету EndSection (правильный результат работы xinput_calibrator), то удаляем файл /root/result_xinput_calibrator endsection=`cat /root/result_xinput_calibrator | grep EndSection` if [[ "$endsection" != 'EndSection' ]]; then rm -rf /root/result_xinput_calibrator fi #если файл "/root/result_xinput_calibrator" не существует то будет запущено следующее условие: if [ ! -f "/root/result_xinput_calibrator" ]; then #результат выполнения записываем в файл /root/result_xinput_calibrator /usr/bin/xinput_calibrator > /root/result_xinput_calibrator #если файл /root/result_xinput_calibrator НЕ пустой то записываем его в /etc/X11/xorg.conf.d/99-calibration.conf if [[ -s /root/result_xinput_calibrator ]]; then cat /root/result_xinput_calibrator |sed -n '/^Section/,/^EndSection/p;/^EndSection/q' > /etc/X11/xorg.conf.d/99-calibration.conf fi fi echo "" > /var/spool/mail/root |
запускаться калибровка будет 2 раза
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#!/bin/bash #если файл /root/chetchik_of_calibration отсутствует, то создаём его и записываем в него 0 if [[ ! -f /root/chetchik_of_calibration ]]; then echo "0" > /root/chetchik_of_calibration fi #в переменную записываем номер счётчика chetchik_of_calibration=`cat /root/chetchik_of_calibration` #если номер счётчика меньше или равно 2 то обнуляем конфигурационный файл калибратора /etc/X11/xorg.conf.d/99-calibration.conf if [[ "$chetchik_of_calibration" -lt 2 ]]; then rm -rf /etc/X11/xorg.conf.d/99-calibration.conf fi #если файл /etc/X11/xorg.conf.d/99-calibration.conf пустой то удаляем проверочный файл /root/result_xinput_calibrator, так как его нет запустится калибровка if [[ ! -f /etc/X11/xorg.conf.d/99-calibration.conf ]]; then rm -rf /root/result_xinput_calibrator fi #проверяем содержимое файла /root/result_xinput_calibrator если в нём нету EndSection (правильный результат работы xinput_calibrator), то удаляем файл /root/result_xinput_calibrator endsection=`cat /root/result_xinput_calibrator | grep EndSection` if [[ "$endsection" != 'EndSection' ]]; then rm -rf /root/result_xinput_calibrator fi #если файл "/root/result_xinput_calibrator" не существует, то будет запущен процесс калибровки: if [ ! -f "/root/result_xinput_calibrator" ]; then #результат выполнения записываем в файл /root/result_xinput_calibrator /usr/bin/xinput_calibrator > /root/result_xinput_calibrator endsection=`cat /root/result_xinput_calibrator | grep EndSection` #если файл /root/result_xinput_calibrator НЕ пустой то записываем его в /etc/X11/xorg.conf.d/99-calibration.conf if [[ -s /root/result_xinput_calibrator ]] && [[ "$endsection" == 'EndSection' ]]; then cat /root/result_xinput_calibrator |sed -n '/^Section/,/^EndSection/p;/^EndSection/q' > /etc/X11/xorg.conf.d/99-calibration.conf #после того как отрабатывает xinput_calibrator и данные записываются /etc/X11/xorg.conf.d/99-calibration.conf проверяется наличие EndSection и я увеличиваю /root/chetchik_of_calibration на единицу check_conf_calib=`cat /etc/X11/xorg.conf.d/99-calibration.conf| grep EndSection` if [[ "$check_conf_calib" == 'EndSection' ]]; then ((chetchik_of_calibration=chetchik_of_calibration+1)) echo $chetchik_of_calibration > /root/chetchik_of_calibration fi fi fi echo "" > /var/spool/mail/root |
cat /usr/lib/systemd/system/calibrator.service
1 2 3 4 5 6 7 8 9 10 11 12 |
[Unit] Description=calibrator [Service] Environment=DISPLAY=:0 ExecStart=/usr/bin/bash /root/calibrator.sh Restart=always RestartSec=20s KillMode=process TimeoutSec=infinity [Install] WantedBy=graphical.target |
!!!!!!!!!!!!!ПЕРЕД БЭКАПОМ ВСЕЙ СИСТЕМЫ НАДО ОБНУЛИТЬ ФАЙЛ /etc/X11/xorg.conf.d/99-calibration.conf
4 Настройка модема 2G/3G/4G
Настройка usb модема - простейшая, он либо сам устанавливается (после инстала всех утилит в 1м пункте) или вставляем его в систему заходим на флешку ставим драйвера для линукса
-------------------------
Настраиваем com модем,
Снимаем модем и ставим в него нашу симку:
тыкаем иголкой в обведённым красным кружок
в вылезет отдел для симки, пихаем её туда, после чего подключаем его обратно к нашему терминалу.
чтоб узнать к какому порту подключен, ставим утилиту
yum install wvdial
и запускаем команду:
wvdialconf
Результат выполнения
Editing `/etc/wvdial.conf'.
Scanning your serial ports for a modem.
ttyS0<*1>: ATQ0 V1 E1 -- OK
ttyS0<*1>: ATQ0 V1 E1 Z -- OK
ttyS0<*1>: ATQ0 V1 E1 S0=0 -- OK
ttyS0<*1>: ATQ0 V1 E1 S0=0 &C1 -- OK
ttyS0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 -- OK
ttyS0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
ttyS0<*1>: Modem Identifier: ATI -- SIEMENS
ttyS0<*1>: Speed 4800: AT -- OK
ttyS0<*1>: Speed 9600: AT -- OK
ttyS0<*1>: Speed 19200: AT -- OK
ttyS0<*1>: Speed 38400: AT -- OK
ttyS0<*1>: Speed 57600: AT -- OK
ttyS0<*1>: Speed 115200: AT -- OK
ttyS0<*1>: Max speed is 115200; that should be safe.
ttyS0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
ttyS1<*1>: ATQ0 V1 E1 -- failed with 2400 baud, next try: 9600 baud
ttyS1<*1>: ATQ0 V1 E1 -- failed with 9600 baud, next try: 115200 baud
ttyS1<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up.
ttyS2<*1>: ATQ0 V1 E1 -- failed with 2400 baud, next try: 9600 baud
ttyS2<*1>: ATQ0 V1 E1 -- failed with 9600 baud, next try: 115200 baud
ttyS2<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up.
Modem Port Scan<*1>: S3
Found a modem on /dev/ttyS0.
Modem configuration written to /etc/wvdial.conf.
ttyS0<Info>: Speed 115200; init "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"
Будет создан конфиг файл, который далее следует отредактировать, приведя к следующему виду:
cat /etc/wvdial.conf
[Dialer testcom]
Auto Reconnect = on
Init1 = ATZ
;Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 AT+CGDCONT=1,"IP","internet"
Init2 = AT+CGDCONT=1,"IP","internet"
Modem Type = Analog Modem
Phone = *99#
ISDN = 0
Password = Internet
Username = testcom
Modem = /dev/ttyS0
Baud = 115200
настройки Init2 берём с оф сайта провайдера симки
Здесь логин пароль взяты с потолка, так как без них утилита не запускается.
rm -rf /etc/resolv.conf
ln -f -s /var/run/ppp/resolv.conf /etc/resolv.conf
чтобы запустить подключение необходимо выполнить
wvdial testcom
Добавим это в автозапуск:
cat /usr/lib/systemd/system/modem2g.service
[Unit]
Description=modem2g
After=network.target
[Service]
ExecStart=/usr/bin/wvdial testcom
ExecStop=/etc/wvidal-kill-service.sh
Restart=always
RestartSec=10s
TimeoutSec=infinity
[Install]
WantedBy=multi-user.target
cat /etc/wvidal-kill-service.sh
#!/bin/bash
killall wvdial
chmod +x /etc/wvidal-kill-service.sh
5 Watchdog за модемами
Настройка watchdogs за модемом, проверять будем по нескольким атрибутам:
1. Наличие процесса
2. Наличие интерфейса
3. Ping ресурса
Для этого будем использовать скрипт:
cat watchdog-modem.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#!/bin/bash SITE="8.8.8.8" #проверяемый ресурс IF="ppp0" #имя сетевого интерфейса EP="3" #число ошибочных пингов SERVICES="modem2g" # можно указать через пробел несколько сервисов CHECK_NETWORK_INTERFACE=`cat /proc/net/dev | awk '{print $1}' | grep $IF | awk -F ':' '{print $1}'` #проверяем наличие сетевого интерфейса # проверка запущен ли сервис, если нет то запускаем ############################ for SERVICE in ${SERVICES} do systemctl status $SERVICE 2>&1>/dev/null if [ $? -ne 0 ]; then systemctl restart $SERVICE echo -e "Starting $SERVICE" # рестарт сервиса и выход exit 1 else echo -e "$SERVICE OK" fi done # если сетевого интерфейса НЕТ ################################### if [ "$CHECK_NETWORK_INTERFACE" == "" ]; then # если сетевого интерфейса нету, то пинги не проверяются, а сразу рестартуется сервис модема echo "network interfase is missinng, service modem2g will be restart" systemctl stop modem2g sleep 5 systemctl start modem2g echo "" > /root/error_log_modem2g.log # рестарт интерфейса и выход exit 1 fi echo "Start ping…" flag="0" # обнуляем счётчик # PING Cycle START ################################################ for i in {1..5}; do #делаем 5 пингов до сервера timeout -k 2 -s TERM 16 ping -w 10 -s 8 -c 1 -I $IF $SITE || flag=$(($flag+1)) && echo "PING:$i/5 (ERROR.:$flag)" #пинг не прошел - увеличиваем счетчик на 1 if [ "$flag" -ge "$EP" ]; then # данное условие тормозит цикл если счётчик flag становится больше 2х break else sleep 1 fi done # Cycle END ################################################ # информационно сообщение ################################## echo "packets LOST: $flag from $i" # Check error number ####################################### if [ "$flag" -lt "$EP" ]; then echo "" > /root/error_log_modem2g.log # Количество потерь пакетов меньше 3, связь восстановилась или вообще не терялась, обнуление файла и выход exit 1 fi # добавляем error в лог файл ############################### echo "error" >> /root/error_log_modem2g.log # то записываем в файл error # подсчитываем количество error в лог файле ############################## num_error_in_log=`cat /root/error_log_modem2g.log | grep error | wc -l` # если ошибок в файле error_log_modem2g.log больше 2х, рестартуем сервис modem2g ############################## if [ "$num_error_in_log" -ge "$EP" ]; then echo "Number of ping ERROR more than 2, restart service modem2g" systemctl stop modem2g sleep 5 systemctl start modem2g # перезапускаем сервис и обнуляем лог файл ###################################### echo "" > /root/error_log_modem2g.log fi |
Добавляем в cront
crontab -l
* * * * * /bin/bash /root/watchdog-modem.sh
Второй скрипт для проверки USB модема
cat /root/watchdog-usb-modem.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
#!/bin/bash #определяем к какому usb подключен модем usb_network_interface=`ls -lah /sys/class/net/ | grep -i usb | awk '{print $9}'` #определяем id по средствам которого будем выключать и включать usb usb_modem_device_id=`ls -lah /sys/class/net/ | grep -i usb | awk -F 'usb.' '{print $2}' | awk -F '/' '{print $2}'` #проверяем наличие сетевого интерфейса ethernet_interface=`ifconfig -s -a | grep -vE 'lo|Iface' | awk '{print $1}'` check_network_interface=`/usr/sbin/ip a | grep BROADCAST | grep -vE $ethernet_interface` SITE="8.8.8.8" #проверяемый ресурс EP="3" #число ошибочных пингов # очищаем почтовое уведомление, чтобы место не забивалось echo "" > /var/spool/mail/root #в данном условии проверяем если переменная с сетевым интерфейсом не пустая то записываем её в файл if [[ $usb_network_interface != "" ]]; then echo $usb_network_interface > /root/usb_network_interface fi #тут мы в переменную записываем содержимое файла, нужно для того чтобы при отсутвующем интерфейсе переменная не была пустая. usb_network_interface=`cat /root/usb_network_interface` #в данном условии проверяем если переменная с ID USB модема не пустая то записываем её в файл if [[ $usb_modem_device_id != "" ]]; then echo $usb_modem_device_id > /root/usb_modem_device_id fi #тут мы записываем в переменную содержимое файла, опять же нужно чтобы при отвалившемся устройстве переменная не была пустой (если один раз записалось,то сможем использовать её) usb_modem_device_id=`cat /root/usb_modem_device_id` #следующее условие проверяет есть ли сетевой интерфейс и если нет, то перезапускает usb устройство if [[ $check_network_interface == "" ]]; then echo $usb_modem_device_id > /sys/bus/usb/drivers/usb/unbind echo $usb_modem_device_id > /sys/bus/usb/drivers/usb/bind exit 1 fi #=========================================== тут делаем проверку по пингам CHECK_NETWORK_INTERFACE=`cat /proc/net/dev | awk '{print $1}' | grep $usb_network_interface | awk -F ':' '{print $1}'` #проверяем наличие сетевого интерфейса echo "Start ping…" flag="0" # обнуляем счётчик # PING Cycle START ################################################ for i in {1..5}; do #делаем 5 пингов до сервера timeout -k 2 -s TERM 16 ping -w 10 -s 8 -c 1 -I $usb_network_interface $SITE || flag=$(($flag+1)) && echo "PING:$i/5 (ERROR.:$flag)" #пинг не прошел - увеличиваем счетчик на 1 if [ "$flag" -ge "$EP" ]; then # данное условие тормозит цикл если счётчик flag становится больше 2х break else sleep 1 fi done # Cycle END ################################################ # информационно сообщение ################################## echo "packets LOST: $flag from $i" # Check error number ####################################### if [ "$flag" -lt "$EP" ]; then echo "" > /root/error_log_usb_modem.log # Количество потерь пакетов меньше 3, связь восстановилась или вообще не терялась, обнуление файла и выход exit 1 fi # добавляем error в лог файл ############################### echo "error" >> /root/error_log_usb_modem.log # то записываем в файл error # подсчитываем количество error в лог файле ############################## num_error_in_log=`cat /root/error_log_usb_modem.log | grep error | wc -l` # если ошибок в файле error_log_usb_modem.log больше 2х, рестартуем USB устройство ############################## if [ "$num_error_in_log" -ge "$EP" ]; then echo "Number of ping ERROR more than 2, restart usb device" echo $usb_modem_device_id > /sys/bus/usb/drivers/usb/unbind echo $usb_modem_device_id > /sys/bus/usb/drivers/usb/bind # перезапускаем usb устройство и обнуляем лог файл ###################################### echo "" > /root/error_log_usb_modem.log fi |
ЕСЛИ ЕСТЬ ВПН ТО ДЛЯ USB МОДЕМА ИСПОЛЬЗУЕМ СЛЕДУЮЩИЙ СКРИПТ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
[root@terminal ~]# cat watchdog-usb-modem.sh #!/bin/bash #определяем к какому usb подключен модем usb_network_interface=`ls -lah /sys/class/net/ | grep -i usb | awk '{print $9}'` #определяем id по средствам которого будем выключать и включать usb usb_modem_device_id=`ls -lah /sys/class/net/ | grep -i usb | awk -F 'usb.' '{print $2}' | awk -F '/' '{print $2}'` #проверяем наличие сетевого интерфейса #ethernet_interface=`ifconfig -s -a | grep -vE 'lo|Iface' | awk '{print $1}'` # после того как протестится скрипт надо удалить | grep -v ens33 так как ниже не отрабатывает условие check_network_interface=`/usr/sbin/ip a | grep -iE 'BROADCAST' | grep -iv NO-CARRIER` #check_network_interface=`/usr/sbin/ip a | grep BROADCAST | grep -vE $ethernet_interface` SITE="8.8.8.8" #проверяемый ресурс EP="3" #число ошибочных пингов # очищаем почтовое уведомление, чтобы место не забивалось echo "" > /var/spool/mail/root #в данном условии проверяем если переменная с сетевым интерфейсом не пустая то записываем её в файл if [[ $usb_network_interface != "" ]]; then echo $usb_network_interface > /root/usb_network_interface fi #тут мы в переменную записываем содержимое файла, нужно для того чтобы при отсутвующем интерфейсе переменная не была пустая. usb_network_interface=`cat /root/usb_network_interface` #в данном условии проверяем если переменная с ID USB модема не пустая то записываем её в файл if [[ $usb_modem_device_id != "" ]]; then echo $usb_modem_device_id > /root/usb_modem_device_id fi #тут мы записываем в переменную содержимое файла, опять же нужно чтобы при отвалившемся устройстве переменная не была пустой (если один раз записалось,то сможем использовать её) usb_modem_device_id=`cat /root/usb_modem_device_id` #следующее условие проверяет есть ли сетевой интерфейс и если нет, то перезапускает usb устройство if [[ $check_network_interface == "" ]]; then echo $usb_modem_device_id > /sys/bus/usb/drivers/usb/unbind echo $usb_modem_device_id > /sys/bus/usb/drivers/usb/bind exit 1 fi #=========================================== тут делаем проверку по пингам CHECK_NETWORK_INTERFACE=`cat /proc/net/dev | awk '{print $1}' | grep $usb_network_interface | awk -F ':' '{print $1}'` #проверяем наличие сетевого интерфейса echo "Start ping…" flag="0" # обнуляем счётчик # PING Cycle START ################################################ for i in {1..5}; do #делаем 5 пингов до сервера timeout -k 2 -s TERM 16 ping -w 10 -s 8 -c 1 $SITE || flag=$(($flag+1)) && echo "PING:$i/5 (ERROR.:$flag)" #пинг не прошел - увеличиваем счетчик на 1 if [ "$flag" -ge "$EP" ]; then # данное условие тормозит цикл если счётчик flag становится больше 2х break else sleep 1 fi done # Cycle END ################################################ # информационно сообщение ################################## echo "packets LOST: $flag from $i" # Check error number ####################################### if [ "$flag" -lt "$EP" ]; then echo "" > /root/error_log_usb_modem.log # Количество потерь пакетов меньше 3, связь восстановилась или вообще не терялась, обнуление файла и выход exit 1 fi # добавляем error в лог файл ############################### echo "error" >> /root/error_log_usb_modem.log # то записываем в файл error # подсчитываем количество error в лог файле ############################## num_error_in_log=`cat /root/error_log_usb_modem.log | grep error | wc -l` # если ошибок в файле error_log_usb_modem.log больше 2х, рестартуем usb устройство ############################## if [ "$num_error_in_log" -ge "$EP" ]; then echo "Number of ping ERROR more than 2, restart usb device" echo $usb_modem_device_id > /sys/bus/usb/drivers/usb/unbind echo $usb_modem_device_id > /sys/bus/usb/drivers/usb/bind systemctl restart openvpn@client # перезапускаем usb устройство и обнуляем лог файл ###################################### echo "" > /root/error_log_usb_modem.log fi |
И добавляем в cron
crontab -l
* * * * * /bin/bash /root/watchdog-usb-modem.sh
Добавляем все драйвера в initramfs:
dracut -f -N
Правим
/etc/fstab
удаляем UUID и на его место записываем устройство:
cat /etc/fstab
/dev/sda3 / xfs defaults 0 0
/dev/sda1 /boot xfs defaults 0 0
/dev/sda2 swap swap defaults 0 0
6 VPN
Задача доступ до терминалов со стороны openvpn сервера.
Так как не известно сколько будет терминалов генерироваться они будут автоматически при первом включении терминала в сеть, логика такая:
Терминал под отдельным пользователем по ssh ключу скачивает с мастера список с уже имеющимися именами клиентов, прибавляет к последнему единицу и закидывает его на мастер. Мастер видит что у него появился запрос на сертификат, генерирует сертификаты для него, удаляет запрос и назначает статический адрес для этого клиента. Клиент скачивает этот сертификат подключается к серверу по vpn и если соединение нормально установилось то удаляет ssh ключ по которому он мог ходить на сервер.
настраиваться это будет костылями на bash
yum install initscripts
yum install epel-release
yum -y install openvpn easy-rsa
systemctl enable openvpn@server
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/
mkdir -p /etc/openvpn/easy-rsa/keys
mkdir /etc/openvpn/ccd
mkdir /etc/openvpn/easy-rsa/dir_for_client_answer/
cp -r /usr/share/easy-rsa/3.*.*/* /etc/openvpn/easy-rsa/
cat /etc/openvpn/easy-rsa/vars
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 |
export KEY_SIZE=1024 export CA_EXPIRE=36500 export KEY_EXPIRE=36500 export KEY_COUNTRY="KG" export KEY_PROVINCE="Bishkek" export KEY_CITY="Bishkek" export KEY_ORG="Telecom" export KEY_EMAIL="it@telecom.kg" export KEY_OU="ittelecom" export KEY_NAME="EasyRSA" |
[/codesyntax]
cd /etc/openvpn/easy-rsa/
source ./vars
./easyrsa init-pki
./easyrsa build-ca nopass
* после вводим имя сервера. в моём случае это openvpn-server
./easyrsa gen-dh
cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/dh2048.pem
./easyrsa gen-req openvpn-server nopass
* после вводим имя сервера.
./easyrsa sign-req server openvpn-server nopass
* после вводим yes.
после добавления следующей записи необходимо или ребутнуть сервак или выполнить команду sysctl -p
cat /etc/sysctl.conf | grep -v '#'
net.ipv4.ip_forward = 1
sysctl -p
cp -rf /etc/openvpn/easy-rsa/pki/* /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/issued/openvpn-server.crt /etc/openvpn/server.crt
cp /etc/openvpn/easy-rsa/pki/private/openvpn-server.key /etc/openvpn/server.key
chmod 644 /etc/openvpn/ca.crt
chmod 644 /etc/openvpn/dh2048.pem
chmod 644 /etc/openvpn/server.crt
chmod 600 /etc/openvpn/server.key
следующая команда покажет какие параметры я менял в основном конфиге сервера:
cat /etc/openvpn/server.conf| grep -E '^local|^server|^push|^user|^group|^status|^log-append|^;tls-auth|^client-config-dir|^;client-to-client'
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 |
local 192.168.1.170 server 10.8.0.0 255.255.252.0 client-config-dir ccd push "dhcp-option DNS 8.8.4.4" push "dhcp-option DNS 8.8.8.8" ;client-to-client ;tls-auth ta.key 0 # This file is secret user nobody group nobody status /var/log/openvpn-status.log log-append /var/log/openvpn.log |
[/codesyntax]
192.168.1.170 - это мой openvpn сервер
server 10.8.0.0 255.255.252.0 это 22 подсеть для моих терминалов
client-config-dir задаёт директорию для моих клиентов там я буду указывать статические айпишники
создаём пользователя, к нему будут подключаться клиенты
adduser vpn
passwd vpn
su - vpn
mkdir /home/vpn/clients_cert_for_vpn
mkdir /home/vpn/clients_request_for_vpn
touch /home/vpn/clients_request_for_vpn/all_clients
создаём ключ без пароля:
[vpn@openvpn-server ~]$ ssh-keygen
[vpn@openvpn-server ~]$ ssh-copy-id 192.168.1.171 # это наш клиент доступ до него будет сразу в образе
[root@openvpn-server ~]# cat copy_cert_vpn.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
#!/bin/bash p=`pwd` echo "" > /var/spool/mail/root if [ ! -d /home/vpn/clients_request_for_vpn/ ] || [ ! -d /home/vpn/clients_cert_for_vpn/ ]; then mkdir /home/vpn/clients_request_for_vpn/ mkdir /home/vpn/clients_cert_for_vpn/ chown -R vpn:vpn /home/vpn/ fi #если файла не существует то создаём сами и добавляем ему запись client-0 if [ ! -f "/home/vpn/clients_request_for_vpn/all_clients" ]; then echo client-0 > /home/vpn/clients_request_for_vpn/all_clients chown -R vpn:vpn /home/vpn/ fi #если файл пустой добавляем ему запись client-0 if [ ! -s "/home/vpn/clients_request_for_vpn/all_clients" ]; then echo client-0 > /home/vpn/clients_request_for_vpn/all_clients chown -R vpn:vpn /home/vpn/ fi #если есть блокирующий файл и он висит дольше 5 мину это значит что то не так и мы его удаляем if [ ! -f "/home/vpn/clients_request_for_vpn/request_busy" ]; then find /home/vpn/clients_request_for_vpn/request_busy -type f -mmin +5 -exec rm -rf {} \; fi #сортируем список по возрастанию if [ -f "/home/vpn/clients_request_for_vpn/all_clients" ]; then cat /home/vpn/clients_request_for_vpn/all_clients | sort | uniq | sort -t "-" -nk2 > /home/vpn/clients_request_for_vpn/sort_all_clients cat /home/vpn/clients_request_for_vpn/sort_all_clients > /home/vpn/clients_request_for_vpn/all_clients rm -rf /home/vpn/clients_request_for_vpn/sort_all_clients chown -R vpn:vpn /home/vpn/ fi #========================== # тут проверяем удалённых клиентов которые надо взять заново if [ -f "/home/vpn/clients_request_for_vpn/all_clients" ]; then cat /home/vpn/clients_request_for_vpn/all_clients | awk -F '-' '{print $2}' | awk '{for(i=p+1; i<$1; i++) print "client-" i} {p=$1}' > /home/vpn/clients_request_for_vpn/delete_client # если файл не пустой if [ -s "/home/vpn/clients_request_for_vpn/delete_client" ]; then cat /home/vpn/clients_request_for_vpn/delete_client > /home/vpn/clients_request_for_vpn/client_name_use_again chown -R vpn:vpn /home/vpn/ # тут мы удаляем роуты для клиента for i in `cat /home/vpn/clients_request_for_vpn/delete_client`; do if [[ -f "/etc/openvpn/ccd/$i" ]]; then rm -rf /etc/openvpn/ccd/$i; fi; done # тут мы отзываем сертификаы for i in `cat /home/vpn/clients_request_for_vpn/delete_client`; do cd /etc/openvpn/easy-rsa/ && /etc/openvpn/easy-rsa/easyrsa revoke $i < /etc/openvpn/easy-rsa/dir_for_client_answer/yes; done grep -v -f /home/vpn/clients_request_for_vpn/delete_client $p/list_USE_ip_client > $p/list_USE_ip_client2 cat $p/list_USE_ip_client2 > $p/list_USE_ip_client rm -rf /home/vpn/clients_request_for_vpn/delete_client $p/list_USE_ip_client2 else rm -rf /home/vpn/clients_request_for_vpn/delete_client echo "удалённых/отозванных клиентов нет" fi # если файл пустой до удаляем его if [ ! -s "/home/vpn/clients_request_for_vpn/client_name_use_again" ]; then rm -rf /home/vpn/clients_request_for_vpn/client_name_use_again fi fi #========================== #смотрим все пришедшие запросы от клиентов all_request=`ls -l /home/vpn/clients_request_for_vpn/ | awk '{print $9}' | grep -vE 'all_clients|request_busy|client_name_use_again' | grep -v ^$` #тут мы получаем список всех ip адресов из подсети 10.8.0.0/22 и записываем его в файл list_all_ip if [ ! -f "$p/list_all_ip" ]; then cidr=10.8.0.0/22 lo=$(ipcalc -n $cidr |cut -f2 -d=) hi=$(ipcalc -b $cidr |cut -f2 -d=) read a b c d <<< $(echo $lo |tr . ' ') read e f g h <<< $(echo $hi |tr . ' ') eval "echo {$a..$e}.{$b..$f}.{$c..$g}.{$d..$h}" > $p/all_ip cat $p/all_ip | sed -e 's/\s\+/\n/g' | grep -vE '10.8.0.0|10.8.0.1' > $p/list_all_ip rm -rf $p/all_ip fi #тут мы получаем список client IP и записываем его в файл list_all_ip_and_client if [ ! -f "$p/list_all_ip_and_client" ]; then number_all_ip=1 a=1 number_all_ip=`cat list_all_ip | wc -l` while (( a<=$number_all_ip )); do echo client-$a; (( a++ )); done > $p/list_all_client sdiff $p/list_all_client $p/list_all_ip | awk '{print $1, $3}' > $p/list_all_ip_and_client rm -rf $p/list_all_client fi #тут мы генерим сертификаты на основе пришедших запросов if [ -n "$all_request" ]; then cd /etc/openvpn/easy-rsa/ echo yes > /etc/openvpn/easy-rsa/dir_for_client_answer/yes export EASYRSA_CERT_EXPIRE=36500 # на 100 лет сертификаты выпускаем for i in $all_request; do echo $i > /etc/openvpn/easy-rsa/dir_for_client_answer/$i; /etc/openvpn/easy-rsa/easyrsa gen-req $i nopass < /etc/openvpn/easy-rsa/dir_for_client_answer/$i; /etc/openvpn/easy-rsa/easyrsa sign-req client $i nopass < /etc/openvpn/easy-rsa/dir_for_client_answer/yes; cp /etc/openvpn/easy-rsa/pki/private/$i.key /home/vpn/clients_cert_for_vpn/; cp /etc/openvpn/easy-rsa/pki/issued/$i.crt /home/vpn/clients_cert_for_vpn/; rm -rf /home/vpn/clients_request_for_vpn/$i; done cp -rf /etc/openvpn/ca.crt /home/vpn/clients_cert_for_vpn/ chown -R vpn:vpn /home/vpn/* cd /root/ for i in $all_request; do grep "$i " $p/list_all_ip_and_client ; done >> $p/list_USE_ip_client cat $p/list_USE_ip_client| sort | uniq | sort -t "-" -nk2 > $p/sort_list_USE_ip_client cat $p/sort_list_USE_ip_client > $p/list_USE_ip_client rm -rf $p/sort_list_USE_ip_client else echo "запросов на сертификаты не было" fi #тут мы набиваем статические адреса в /etc/openvpn/ccd/ если были запросы и переменная не пустая, а также перезапускаем openvpn сервер if [ -n "$all_request" ]; then if [ -f "$p/list_USE_ip_client" ]; then while read line; do cat << EOF > /etc/openvpn/ccd/$(echo $line | awk -F" " '{print $1}') ifconfig-push $(echo $line | awk -F " " '{print $2}') 10.8.0.1 push "redirect-gateway def1" #весь трафик через openvpn сервер #push "route 8.8.8.8 255.255.255.255" # определённый ip адрес через openvpn сервер EOF done < $p/list_USE_ip_client systemctl restart openvpn@server fi else echo "запросов не было, поэтому в /etc/openvpn/ccd/ ничего не добавляли" fi |
чтобы клиенты НЕ могли общаться между собой добавим правило:
[root@openvpn-server ~]# iptables -I FORWARD --src 10.8.0.0/22 --dst 10.8.0.0/22 -j DROP
так же добавим правило чтобы всё что прилетело на openvpn-server могло пересылаться:
[root@openvpn-server ~]# iptables -t nat -A POSTROUTING -s 10.8.0.0/22 -o enp0s3 -j MASQUERADE
[root@openvpn-server ~]# iptables-save > /etc/sysconfig/iptables
yum -y install openvpn
systemctl enable openvpn@client
cat /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
adduser vpn
passwd vpn
[root@openvpn-client1 ~]# usermod -a -G wheel vpn
[root@openvpn-client1 ~]# cat /etc/sudoers | grep ^%wheel
%wheel ALL=(ALL) NOPASSWD: ALL
su - vpn
ssh-keygen
ssh-copy-id 192.168.1.170 # это наш openvpn сервер доступ с клиента до него будет сразу в образе, после всех манипуляций он будет удалён.
[vpn@openvpn-client1 ~]$ cat requiest_for_vpn_sert.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |
#!/bin/bash #задаём ip нашего опенвпн сервера ip_open_vpn_server='192.168.1.170' #тут будет указан гейтвей нашего openvpn сервера, он нужен тут только чтобы удалить ssh ключи и терминал не мог ходить на сервер gateway_openvpn_server='10.8.0.1' #тут начинается функция которая создаёт запрос на сертификат function requiest() { ssh -t $ip_open_vpn_server "ls -l /home/vpn/clients_request_for_vpn/" 2>/dev/null | awk '{print $9}' | grep request_busy | sed -e "s/\r//g" > /home/vpn/req-busy #sed нужен чтобы из файла удалить символ ^M check_request_busy=`cat /home/vpn/req-busy` rm -rf /home/vpn/req-busy if [[ $check_request_busy == request_busy ]]; then echo "какой-то терминал уже сделал запрос, скрипт завершается, проверим через минуту ещё раз" exit 1; else ssh -t $ip_open_vpn_server "touch /home/vpn/clients_request_for_vpn/request_busy" echo "создан файл на блокировку, теперь пока всё не отработает другие запросы на мастер сервере приниматься не будут" fi #выкачиваем список всех vpn клиентов чтобы вытащить последнее scp $ip_open_vpn_server:/home/vpn/clients_request_for_vpn/all_clients /home/vpn/all_clients ############################################################################################################ #выкачиваем список отозванных клиентов которые надо использовать повторно scp $ip_open_vpn_server:/home/vpn/clients_request_for_vpn/client_name_use_again /home/vpn/client_name_use_again if [ ! -f "/home/vpn/all_clients" ]; then echo "видимо не удалось скачать с сервера файл all_clients поэтому скрипт завершает работу" exit 1; fi if [ ! -f "/home/vpn/client_name_use_again" ]; then touch /home/vpn/client_name_use_again fi #тут запускаем проверку на отозванных клиентов if [ -s /home/vpn/client_name_use_again ]; # если данный файл не пустой(в нём отозванные клиенты) then name=`cat /home/vpn/client_name_use_again | tail -1 | awk -F '-' '{print $1}'` number=`cat /home/vpn/client_name_use_again | tail -1 | awk -F '-' '{print $2}'` # тут в файле на мастер сервере удаляем клиента, который теперь будет использоваться на текущем терминале ssh -t $ip_open_vpn_server "sed -i "/^${name}-${number}$/d" /home/vpn/clients_request_for_vpn/client_name_use_again" echo "на текущем терминале мы будет использовать ранее использованный, но отозванный аккаунт: $name-$number " rm -rf /home/vpn/client_name_use_again else echo "отозванных аккаунтов нет, поэтому запускаем обычную установку" #тут смотрим в общем списке последнее имя клиента cat /home/vpn/all_clients | sort -n |uniq | tail -1 > /home/vpn/last_client #записываем в переменную имя клиента name=`cat /home/vpn/last_client | awk -F '-' '{print $1}'` #записываем в переменную номер клиента number=`cat /home/vpn/last_client | awk -F '-' '{print $2}'` #теперь увеличиваем номер на единицу: number=$(( $number + 1 )) fi #теперь передаём на openvpnserver имя того клиента который нам нужен echo "$name-$number" > /home/vpn/"$name-$number" scp /home/vpn/"$name-$number" $ip_open_vpn_server:/home/vpn/clients_request_for_vpn/ ssh -t $ip_open_vpn_server ""echo "$name-$number"" >> /home/vpn/clients_request_for_vpn/all_clients" rm -rf /home/vpn/last_client ssh -t $ip_open_vpn_server "rm -rf /home/vpn/clients_request_for_vpn/request_busy" } #тут начинается функция которая копирует сертификаты сгенерированные мастер сервером function copy_cert() { client=`ls /home/vpn/| grep client | grep -vE 'all_clients|client_name_use_again' | grep -v '\.'` #если в домашней директории есть файл с именем client-* он будет назначен переменной "client" и если переменная не пустая то отработает нижнее условие if [ -n "$client" ]; then #выкачиваем сертификаты в домашнюю директорию если их нет в корне /etc/openvpn/ if [ ! -f /etc/openvpn/ca.crt ] || [ ! -f /etc/openvpn/$client.crt ] || [ ! -f /etc/openvpn/$client.key ]; then scp $ip_open_vpn_server:/home/vpn/clients_cert_for_vpn/$client.crt /home/vpn/ scp $ip_open_vpn_server:/home/vpn/clients_cert_for_vpn/$client.key /home/vpn/ scp $ip_open_vpn_server:/home/vpn/clients_cert_for_vpn/ca.crt /home/vpn/ fi fi #если сертификаты скачаны то мы удаляем их с openvpn сервера if [ -f /home/vpn/ca.crt ] && [ -f /home/vpn/$client.crt ] && [ -f /home/vpn/$client.key ]; then ssh -t $ip_open_vpn_server "rm -rf /home/vpn/clients_cert_for_vpn/$client.crt" ssh -t $ip_open_vpn_server "rm -rf /home/vpn/clients_cert_for_vpn/$client.key" fi #если сертификатов нет в директории openvpn то мы их перемещаем из домашней if [ ! -f /etc/openvpn/ca.crt ]; then sudo mv /home/vpn/ca.crt /etc/openvpn/ca.crt fi if [ ! -f /etc/openvpn/$client.crt ]; then sudo mv /home/vpn/$client.crt /etc/openvpn/$client.crt fi if [ ! -f /etc/openvpn/$client.key ]; then sudo mv /home/vpn/$client.key /etc/openvpn/$client.key fi } # тут начинается функция которая формирует клиентский конфигурационный файл и перезапускает openvpn@client function add_config_openvpn_client() { if [ ! -f /etc/openvpn/client.conf ]; then client=`ls /home/vpn/| grep client | grep -vE 'all_clients|client_name_use_again' | grep -v '\.'` if [ -n "$client" ]; then echo "dev tun proto udp remote $ip_open_vpn_server 1194 client resolv-retry infinite ca /etc/openvpn/ca.crt cert /etc/openvpn/$client.crt key /etc/openvpn/$client.key persist-key persist-tun verb 3 status-version 3 status /var/log/openvpn-status.log 1 log-append /var/log/openvpn-client.log" > /home/vpn/client.conf sudo mv /home/vpn/client.conf /etc/openvpn/client.conf fi else echo "/etc/openvpn/client.conf уже набит" fi } # тут проверяем наличие всех конфигов и пинг до openvpn гейтвея function check_connect(){ check_gateway_openvpn=`ping -c5 $gateway_openvpn_server 2>/dev/null | grep loss | awk '{print $6,$7,$8}' | awk -F ',' '{print $1}'` rm -rf /home/vpn/check_connect if [[ "$check_gateway_openvpn" == '0% packet loss' ]]; then echo 1 > /home/vpn/check_connect fi if [ -f /etc/openvpn/ca.crt ]; then echo 1 >> /home/vpn/check_connect fi if [ -f /etc/openvpn/$client.crt ]; then echo 1 >> /home/vpn/check_connect fi if [ -f /etc/openvpn/$client.key ]; then echo 1 >> /home/vpn/check_connect fi if [ -f /etc/openvpn/client.conf ]; then echo 1 >> /home/vpn/check_connect fi check_result=`cat /home/vpn/check_connect | wc -l` if [[ "$check_result" == '5' ]]; then echo "всё ок, пинги прошли конфиг и сертификаты на месте" else sudo systemctl restart openvpn@client fi if [ -f /var/spool/mail/vpn ]; then sudo echo "" > /var/spool/mail/vpn fi } #тут начинается функция которая основываясь на результатах проверки в функции check_connect если всё ок, то удаляет ssh кючи и с терминала до сервера мы подключиться не сможем function delete_ssh_key_if_ping_to_master_work() { check_result=`cat /home/vpn/check_connect | wc -l` if [[ "$check_result" == '5' ]]; then if [ -f "/home/vpn/.ssh/id_rsa" ]; then rm -rf /home/vpn/.ssh/id_rsa fi if [ -f "/home/vpn/.ssh/id_rsa.pub" ]; then rm -rf /home/vpn/.ssh/id_rsa.pub fi fi } ################ run functions ####################### #req_client=`ls -l /home/vpn/ | awk '{print $9}' | grep client | grep -v '\.'` client=`ls /home/vpn/| grep client | grep -vE 'all_clients|client_name_use_again' | grep -v '\.'` check_openvpn_server=`ping -c5 $ip_open_vpn_server 2>/dev/null | grep loss | awk '{print $6,$7,$8}' | awk -F ',' '{print $1}'` if [[ "$check_openvpn_server" == '0% packet loss' ]]; then #тут запускается функция на генерацию запроса, она не будет запускаться если в домашней директории есть файл вида client-* if [ ! -f "/home/vpn/$client" ]; then requiest else echo "запрос уже был вот имя клиента: $client" fi #тут запускаются 2 функции: 1)на копирование сертификатов и удаление их с мастер сервера, если их нету в /etc/openvpn/ # 2)на формирование клиентского конфигурационного файла /etc/openvpn/client.conf if [ ! -f /etc/openvpn/ca.crt ] || [ ! -f /etc/openvpn/$client.crt ] || [ ! -f /etc/openvpn/$client.key ]; then copy_cert add_config_openvpn_client else echo "сертификаты с мастер сервера скачаны и перемещены в директорию /etc/openvpn/" fi #тут запускается функция на проверку пингов до гейтвея openvpn сервера, на наличие конфига и сертификатов check_connect #тут запускается функция на удаление ключей, чтобы теперь мастер мог подключаться а клиент нет delete_ssh_key_if_ping_to_master_work else echo "openvpn сервер $ip_open_vpn_server недоступен" fi |
[vpn@openvpn-client1 ~]$ chmod +x requiest_for_vpn_sert.sh
[vpn@openvpn-client1 ~]$ crontab -l
* * * * * /bin/bash /home/vpn/requiest_for_vpn_sert.sh
===
настраиваем ротацию логов openvpn клиента
[root@openvpn-client1 ~]# cat /etc/logrotate.d/openvpn
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/var/log/openvpn-client.log { daily missingok copytruncate rotate 10 compress delaycompress } /var/log/openvpn-status.log { daily missingok copytruncate rotate 10 compress delaycompress } |
[vpn@openvpn-client ~]$ crontab -l
* * * * * /bin/bash /home/vpn/requiest_for_vpn_sert.sh
ПЕРЕД НАЧАЛОМ БЕКАПА НЕОБХОДИМО ВЫКЛЮЧИТЬ OPENVPN СЕРВЕР ЧТОБЫ ОБРАЗ БЫЛ СЕРТИФИКАТОВ
7 Настройка резервирования
Бекапиться будем через veeam
Тут нажимаем С
всё бекап готов
8 Восстановление созданного бекапа на новые терминалы:
чтоб его развернуть
Закатываем всё это на флешку. Качаем утилиту Rufus
https://rufus.ie/ru_RU.html
пишем на неё загрузочный диск veeam
далее качаем утилиту
MiniTool Partition Wizard
https://www.softportal.com/software-16599-partition-wizard.html
и ей отрезаем раздел по максимуму, и ставим файловую систему NTFS, на этот раздел мы закидываем то что у нас забекапилось.
Для восстановления грузимся с флешки и восстанавливаем разделы на новый терминал
в приведённом ниже примере я восстанавливаюсь с того же NFS сервера, но восстановление с флешки особо не отличается
7-8 Альтернативный вариант бэкапа и восстановления через clonezilla
- Необходимо подключить загрузочную флешку с CloneZilla. Важно, чтобы это был полнофункциональный образ CloneZilla, в котором не были изменены файлы отвечающие за загрузку.
- Перезагрузить терминал и загрузится с CloneZilla. Возможно вам понадобится изменить порядок загрузочных дисков в BIOS или UEFI.
После того, как загрузиться CloneZillf необходимо выбрать дефолтный профиль загрузки:
Выбрать способ работы с образами «device-image»
Выбрать локальное устройство для работы с образами
- После чего CloneZilla попоросить вставить накопитель USB для сохранения образа. Важно – это должна быть отдельная флешка, не та с которой загружается CloneZilla. Вынимать загрузочную флешку нельзя. Вставьте накопитель USB и нажмите «Enter»
- Подождите пока в списке не появится ваш накопитель. Нажмите Ctrl+C
В списке нужно выбрать ваш накопитель. Скорее всего он должен быть sdb или sdc
Выберите корневую папку для сохранения образов
В списке способов работы с образами выберите «Beginner»
Подтвердите имя сохраняемого образа
Выберите диск, с которого нужно снять образ, это должен быть sda
Выберите способ сжатия образа
Выберите пропуск проверки диска
Выберите проверку сохраняемого образа
Выберите опцию «не шифровать» образ
В меню действия после снятия образа выберите «спросить пользователя
Подтвердите сохранения образа
После 2-10 минут, после того, как образ будет создан, появится меню с просьбой указать дальнейшие действия. Выберите «выключить
После выключения, вынуть оба USB накопителя
Компоновка установочного USB диска
Вам понадобятся
- Установочный USB накопитель с CloneZillа. Общий размер диска должен быть 8Gb. Можно использовать диск с прошлого шага. Учтите, что после модификации данный накопитель нельзя будет использовать для снятия образа.
- Снятый ранее образ диска эталонного терминала.
Шаги
- Скомпоновать загрузочную флешку CloneZillа с образом. Данные шаги можно производить на компьютере или ноутбуке.
- Подключить флеш накопитель со снятым образом терминала
- Подключить флеш накопитель с дефолтным диструбутивом CloneZilla, загрузочным (см. соответствующий раздел)
- Скопировать образ терминала (папка с файлами) в корень USB накопителя с дистрибутивом CloneZilla.
- Изменить файлы CloneZilla отвечающие за меню.
- Скопировать файл_1 по пути_1.
т.е. меняем содержимое boot/grub/grub.cfg на следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# set pref=/boot/grub set default="0" # Load graphics (only corresponding ones will be found) # (U)EFI insmod efi_gop insmod efi_uga # legacy BIOS # insmod vbe if loadfont $pref/unicode.pf2; then set gfxmode=auto insmod gfxterm terminal_output gfxterm fi set timeout="10" set hidden_timeout_quiet=false insmod png if background_image $pref/ocswp-grub2.png; then set color_normal=black/black set color_highlight=magenta/black else set color_normal=cyan/blue set color_highlight=white/blue fi # Uncomment the following for serial console # The command serial initializes the serial unit 0 with the speed 38400bps. # The serial unit 0 is usually called ‘COM1’. If COM2, use ‘--unit=1’ instead. #serial --unit=0 --speed=38400 #terminal_input serial #terminal_output serial # Decide if the commands: linux/initrd (default) or linuxefi/initrdefi set linux_cmd=linux set initrd_cmd=initrd export linux_cmd initrd_cmd if [ "${grub_platform}" = "efi" -a -e "/amd64-release.txt" ]; then # Only amd64 release we switch to linuxefi/initrdefi since it works better with security boot (shim) set linux_cmd=linuxefi set initrd_cmd=initrdefi fi insmod play play 960 440 1 0 4 440 1 # Since no network setting in the squashfs image, therefore if ip=, the network is disabled. menuentry "Clonezilla live (Default settings, VGA 800x600)" --id live-default { search --set -f /live/vmlinuz $linux_cmd /live/vmlinuz boot=live union=overlay username=user config components quiet noswap edd=on nomodeset enforcing=0 locales=en_US.UTF-8 keyboard-layouts=NONE ocs_prerun1="mount /dev/sdb1 /home/partimag/" ocs_live_run="ocs-sr -g auto -e1 auto -e2 -r -j2 -k1 -p true restoredisk ask_user sda" ocs_live_extra_param="" ocs_live_batch="no" vga=788 ip= net.ifnames=0 splash i915.blacklist=yes radeonhd.blacklist=yes nouveau.blacklist=yes vmwgfx.enable_fbdev=1 $initrd_cmd /live/initrd.img } |
следующий вариант файла нужен если объём диска НА который ты восстанавливаешь, меньше того объёма с которого был снят образ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# set pref=/boot/grub set default="0" # Load graphics (only corresponding ones will be found) # (U)EFI insmod efi_gop insmod efi_uga # legacy BIOS # insmod vbe if loadfont $pref/unicode.pf2; then set gfxmode=auto insmod gfxterm terminal_output gfxterm fi set timeout="10" set hidden_timeout_quiet=false insmod png if background_image $pref/ocswp-grub2.png; then set color_normal=black/black set color_highlight=magenta/black else set color_normal=cyan/blue set color_highlight=white/blue fi # Uncomment the following for serial console # The command serial initializes the serial unit 0 with the speed 38400bps. # The serial unit 0 is usually called ‘COM1’. If COM2, use ‘--unit=1’ instead. #serial --unit=0 --speed=38400 #terminal_input serial #terminal_output serial # Decide if the commands: linux/initrd (default) or linuxefi/initrdefi set linux_cmd=linux set initrd_cmd=initrd export linux_cmd initrd_cmd if [ "${grub_platform}" = "efi" -a -e "/amd64-release.txt" ]; then # Only amd64 release we switch to linuxefi/initrdefi since it works better with security boot (shim) set linux_cmd=linuxefi set initrd_cmd=initrdefi fi insmod play play 960 440 1 0 4 440 1 # Since no network setting in the squashfs image, therefore if ip=, the network is disabled. menuentry "Clonezilla live (Default settings, VGA 800x600)" --id live-default { search --set -f /live/vmlinuz $linux_cmd /live/vmlinuz boot=live union=overlay username=user config components quiet noswap edd=on nomodeset enforcing=0 locales=en_US.UTF-8 keyboard-layouts=NONE ocs_prerun1="mount /dev/sdb1 /home/partimag/" ocs_live_run="ocs-sr -g auto -e1 auto -e2 -r -j2 -icds -p true restoredisk ask_user sda" ocs_live_extra_param="" ocs_live_batch="no" vga=788 ip= net.ifnames=0 splash i915.blacklist=yes radeonhd.blacklist=yes nouveau.blacklist=yes vmwgfx.enable_fbdev=1 $initrd_cmd /live/initrd.img } |
· Данный файл отвечает за загрузку через BIOS. В данном файле удаляются стандартное меню с опциями CloneZilla и добавляется один новый пункт меню, который запускает установку одного из доступных образов на диск sda пропуская все пункты. Примечание: на данный диск можно записать более одного образа. Тогда при установке можно будет выбрать конкретный образ для установки.
Скопировать файл_2 по пути_2. Даннй файл отвечает за загрузку через UEFI . Назначение файла такое же как для файла выше.
· т.е. содержимое файла syslinux/syslinux.cfg меняем на
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# Created by generate-pxe-menu! Do NOT edit unless you know what you are doing! # Keep those comment "MENU DEFAULT" and "MENU HIDE"! Do NOT remove them. # Note!!! If "serial" directive exists, it must be the first directive default vesamenu.c32 timeout 300 prompt 0 noescape 1 MENU MARGIN 5 MENU BACKGROUND ocswp.png # Set the color for unselected menu item and timout message MENU COLOR UNSEL 7;32;41 #c0000090 #00000000 MENU COLOR TIMEOUT_MSG 7;32;41 #c0000090 #00000000 MENU COLOR TIMEOUT 7;32;41 #c0000090 #00000000 MENU COLOR HELP 7;32;41 #c0000090 #00000000 # MENU MASTER PASSWD say ********************************************************************** say Clonezilla, the OpenSource Clone System. say NCHC Free Software Labs, Taiwan. say clonezilla.org, clonezilla.nchc.org.tw say THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK! say ********************************************************************** # Allow client to edit the parameters ALLOWOPTIONS 1 # simple menu title MENU TITLE clonezilla.org, clonezilla.nchc.org.tw # Since no network setting in the squashfs image, therefore if ip=, the network is disabled. That's what we want. label KMK Kiosk MENU DEFAULT # MENU HIDE MENU LABEL KMK Kiosk Install # MENU PASSWD kernel /live/vmlinuz append initrd=/live/initrd.img boot=live union=overlay username=user config components quiet noswap edd=on nomodeset enforcing=0 noeject locales=en_US.UTF-8 keyboard-layouts=NONE ocs_prerun1="mount /dev/sdb1 /home/partimag/" ocs_live_run="ocs-sr -g auto -e1 auto -e2 -r -j2 -k1 -p true restoredisk ask_user sda" ocs_live_extra_param="" ocs_live_batch="no" vga=788 ip= net.ifnames=0 splash i915.blacklist=yes radeonhd.blacklist=yes nouveau.blacklist=yes vmwgfx.enable_fbdev=1 TEXT HELP * Boot menu for BIOS machine * Clonezilla live version: 2.7.0-10-amd64. © 2003-2020, NCHC, Taiwan * Disclaimer: Clonezilla comes with ABSOLUTELY NO WARRANTY ENDTEXT MENU END label local # MENU DEFAULT # MENU HIDE MENU LABEL Local operating system in harddrive (if available) # MENU PASSWD # 2 method to boot local device: # (1) For localboot 0, it is decided by boot order in BIOS, so uncomment the follow 1 line if you want this method: # localboot 0 # (2) For chain.c32, you can assign the boot device. # Ref: extlinux.doc from syslinux # Syntax: APPEND [hd|fd]<number> [<partition>] # [<partition>] is optional. # Ex: # Second partition (2) on the first hard disk (hd0); # Linux would *typically* call this /dev/hda2 or /dev/sda2, then it's "APPEND hd0 2" # kernel chain.c32 append hd0 TEXT HELP Boot local OS from first hard disk if it's available ENDTEXT |
следующий вариант файла нужен если объём диска НА который ты восстанавливаешь, меньше того объёма с которого был снят образ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# Created by generate-pxe-menu! Do NOT edit unless you know what you are doing! # Keep those comment "MENU DEFAULT" and "MENU HIDE"! Do NOT remove them. # Note!!! If "serial" directive exists, it must be the first directive default vesamenu.c32 timeout 300 prompt 0 noescape 1 MENU MARGIN 5 MENU BACKGROUND ocswp.png # Set the color for unselected menu item and timout message MENU COLOR UNSEL 7;32;41 #c0000090 #00000000 MENU COLOR TIMEOUT_MSG 7;32;41 #c0000090 #00000000 MENU COLOR TIMEOUT 7;32;41 #c0000090 #00000000 MENU COLOR HELP 7;32;41 #c0000090 #00000000 # MENU MASTER PASSWD say ********************************************************************** say Clonezilla, the OpenSource Clone System. say NCHC Free Software Labs, Taiwan. say clonezilla.org, clonezilla.nchc.org.tw say THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK! say ********************************************************************** # Allow client to edit the parameters ALLOWOPTIONS 1 # simple menu title MENU TITLE clonezilla.org, clonezilla.nchc.org.tw # Since no network setting in the squashfs image, therefore if ip=, the network is disabled. That's what we want. label KMK Kiosk MENU DEFAULT # MENU HIDE MENU LABEL KMK Kiosk Install # MENU PASSWD kernel /live/vmlinuz append initrd=/live/initrd.img boot=live union=overlay username=user config components quiet noswap edd=on nomodeset enforcing=0 noeject locales=en_US.UTF-8 keyboard-layouts=NONE ocs_prerun1="mount /dev/sdb1 /home/partimag/" ocs_live_run="ocs-sr -g auto -e1 auto -e2 -r -j2 -icds -p true restoredisk ask_user sda" ocs_live_extra_param="" ocs_live_batch="no" vga=788 ip= net.ifnames=0 splash i915.blacklist=yes radeonhd.blacklist=yes nouveau.blacklist=yes vmwgfx.enable_fbdev=1 TEXT HELP * Boot menu for BIOS machine * Clonezilla live version: 2.7.0-10-amd64. © 2003-2020, NCHC, Taiwan * Disclaimer: Clonezilla comes with ABSOLUTELY NO WARRANTY ENDTEXT MENU END label local # MENU DEFAULT # MENU HIDE MENU LABEL Local operating system in harddrive (if available) # MENU PASSWD # 2 method to boot local device: # (1) For localboot 0, it is decided by boot order in BIOS, so uncomment the follow 1 line if you want this method: # localboot 0 # (2) For chain.c32, you can assign the boot device. # Ref: extlinux.doc from syslinux # Syntax: APPEND [hd|fd]<number> [<partition>] # [<partition>] is optional. # Ex: # Second partition (2) on the first hard disk (hd0); # Linux would *typically* call this /dev/hda2 or /dev/sda2, then it's "APPEND hd0 2" # kernel chain.c32 append hd0 TEXT HELP Boot local OS from first hard disk if it's available ENDTEXT |
· Загрузочный USB диск готов.
· Желательно проверить установку с данного диска.
Далее можно писать образ на терминал
9.Доступ к терминалу по rdp через openvpn server
Для начала надо поставить xrpd на наш терминал.
yum -y install xrdp
или скачиваем rmp пакет
стартуем:
systemctl start xrdp
проверяем что порт активен:
1 2 3 |
netstat -ntpl | grep 3389 tcp 0 0 0.0.0.0:3389 0.0.0.0:* LISTEN 1690/xrdp |
теперь настроим тунелирование через putty.
наш VPN сервер будет иметь айпиадрес:
192.168.1.171
целевой терминал:
192.168.1.170
ШАГ №1 СОЗДАНИЕ SSH - ШЛЮЗА
Первое, что необходимо сделать, это создать SSH – шлюз. Для этого, откроем Putty и создадим подключение к шлюзу
ШАГ №2: ДЕЛАЕМ ТУННЕЛЬ
В левом меню навигации, переходим в раздел Connection → SSH → Tunnels. В данном меню настройки укажите параметр Source Port - это порт, к которому вы будете подключаться локально, чтобы отправить трафик через SSH – туннель. В поле Destination укажите адрес назначения, к которому вы будете подключаться:
Данная запись означает то, что при подключении к локальному порту 37662 (127.0.0.1:37662), вы будете перенаправлены через SSH туннель до SSH – шлюза, а затем уйдете на адрес назначения 192.168.1.170:3389 – то есть RDP.
Нажимаем Add после Open
туннель готов к использованию.
ШАГ №3: ПРОВЕРЯЕМ
Вызываем утилиту подключения к удаленному рабочему столу командой mstsc
и указываем требуемые для нас реквизиты подключения – локалхост и созданный ранее RDP порт:
далее откроется наш xrdp
Важно: подключение через SSH – туннель будет активно до тех пор, пока открыта утилита Putty и существует коннект с SSH – шлюзом