ИТ-заметки: субъективно
56 subscribers
23 photos
203 links
ИТ заметки по Network, Ops, DevOps

🔗 it.mxav.ru
Download Telegram
Видео "Простая установка Linux Mint Mate"

#linux@itmxav
#fasthowto@itmxav

🎬 На Youtube

😉 На сайте
Видео "Не работает переключение раскладки клавиатуры на Linux Mint Mate"

#linux@itmxav
#fasthowto@itmxav

🎬 На Youtube

😉 На сайте
Как обновить Proxmox с 7.4 на 8.1?

Если используется Ceph, то читайте процесс обновления здесь. Желательно выключить все машины перед обновлением, на всякий случай.

1. Выключаем pve-enterprise.list через комментирование
# nano /etc/apt/sources.list.d/pve-enterprise.list
#deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise

2. Обновляем нашу ветку
# apt update; apt dist-upgrade

3. Добавляем репозиторий pve-no-subscription
deb http://download.proxmox.com/debian bullseye pve-no-subscription

4. Прогоняем
# apt update

5. Проверяем всё ли нормально для перехода на 8 версию через запуск специального скрипта.
# pve7to8

6. Если есть ошибки, то исправляем. Если нет, то бэкапил sources.list и меняем на новую версию репозитории Debian 12 bookworm, т.к. 8 версия на её основе сделана.
# cp /etc/apt/sources.list /etc/apt/sources.list.bak
# sed -i 's/bullseye/bookworm/g' /etc/apt/sources.list

7. Смотрим список обновления
# apt list --upgradable

8. Обновляемся и смотрим, что получилось.
# apt dist-upgrade


#proxmox@itmxav
#fasthowto@itmxav

🎬 На Youtube

😉 На сайте

📝 Ещё:
- Как обновить Proxmox с 7.2 на 7.3?
- Как перенести виртуальную машину (контейнер) на другой сервер Proxmox VE?
Новости
Появился канал на Rutube, на всякий случай. Если кому-то удобней там смотреть, то теперь есть такая возможность.

🎬 Смотреть видео на Rutube
Как установить шрифты в Linux?

1. Создаем папку ~/.fonts:
$ mkdir ~/.fonts

2. Копируем нужный шрифт:
$ cp OpenSans.ttf ~/.fonts

3. Обновляем кэш шрифтов и перезапускаем программы для работы со шрифтами.
$ fc-cache -f -v

или просто перезагружаем компьютер.

#linux@itmxav

😉 На сайте
Проблема "state manager: reset session failed on NFSv4 server with error 1"

Иногда при работе с NFS в Proxmox может быть ошибка:
NFS: state manager: reset session failed on NFSv4 server 192.168.2.2 with error 1

Можно её исправить так:
1. Отключим хранилище в "Датацентр" -> "Хранилище" -> Выключаем NFS через редактирование
2. На узлах смотрим папку монитирования
# mount

3. Отмонтирем её вручную. Например, интересует папка ISONFS
# umount /mnt/pve/ISONFS

4. Подключаем хранилище (см. п.1)

#linux@itmxav
#proxmox@itmxav

😉 На сайте
Как создать установочную флешку через Rufus?

#разное@itmxav
#windows@itmxav
#fasthowto@itmxav

🎬 Смотреть на Youtube

😉 На сайте
Как обновить Gitlab?

Заранее сделайте бэкап данных.

1. Смотрим, что доступно:
# apt list gitlab-ce -a

2. Обновляем по последним версиям gitlab.
Т.е. 16.2.3(текущая)->16.2.9(последняя в 16.2)->16.3.7(последняя в 16.3)->16.4.5(последняя в 16.4)->и т.д. Обновляемся следующим образом:
# apt install gitlab-ce=16.2.9-ce.0

3. После установок можно почистить кэш от пакетов:
# apt clean

#devops@itmxav

😉 На сайте
Как установить WordPress на Debian?

Чтобы установить WordPress (в качестве примера используется домен wp-site.test) на Linux Debian с самоподписанным сертификатом необходимо:
1. Обновить систему
apt update; apt upgrade

2. Устанавливаем необходимые пакеты
apt install nginx apache2 htop curl wget mariadb-server php php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip unzip php-mysql

3. Временно выключим и добавим в автозапуск сервисы
systemctl enable nginx apache2 mariadb; systemctl stop nginx apache2

4. Поправим порт в ports.conf на 8080, т.к. делаем связку nginx+apache2+php+mariadb и создадим виртуальный хост на apache2
nano /etc/apache2/ports.conf; nano /etc/apache2/sites-available/wp-site.test.conf
<VirtualHost 127.0.0.1:8080>
ServerName wp-site.test
ServerAlias www.wp-site.test
DocumentRoot "/var/www/wp-site.test"

<Directory "/var/www/wp-site.test/">
AllowOverride All
allow from all
Options -Indexes
#Options FollowSymLinks
</Directory>

<FilesMatch "\.ph(p[3-8]?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>

ErrorLog /var/www/log/apache2/wp-site.test-error.log
CustomLog /var/www/log/apache2/wp-site.test-access.log combined
<ifModule mod_headers.c>
Header set X-XSS-Protection "1; mode=block"
</IfModule>

<IfModule php8_module>
php_flag session.cookie_httponly 1
php_flag session.cookie_secure 1
</IfModule>
</VirtualHost>

5. Создаем папки для логов
mkdir  /var/www/log/; mkdir  /var/www/log/apache2/; mkdir  /var/www/log/nginx/

6. Создаем папку для сайта и тестовый php-файл
 mkdir /var/www/wp-site.test/; echo '<?php phpinfo(); ?>' > /var/www/wp-site.test/index.php

7. Включаем редиректы на apache2 и проверяем конфигурацию
a2enmod rewrite; apache2ctl configtest

8. Включаем сайт
a2ensite wp-site.test.conf

9. Создаем сертификат и ключ для https-соединения
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/wp-site.test-selfsigned.key -out /etc/ssl/certs/wp-site.test-selfsigned.crt

Продолжение в следующем посте⤵️
#devops@itmxav
#linux@itmxav
10. Создаем виртуальный хост для nginx и прописываем конфиг
nano /etc/nginx/sites-available/wp-site.test
server {
listen 80;
server_name wp-site.test www.wp-site.test;
add_header Content-Security-Policy upgrade-insecure-requests;

return 302 https://wp-site.test$request_uri;
}

server {
listen 443 ssl;
server_name wp-site.test www.wp-site.test;
access_log /var/www/log/nginx/wp-site.test-access.log;
error_log /var/www/log/nginx/wp-site.test-error.log;

ssl_certificate /etc/ssl/certs/wp-site.test-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/wp-site.test-selfsigned.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
add_header Strict-Transport-Security 'max-age=15552000; includeSubDomains';
add_header Content-Security-Policy upgrade-insecure-requests;
ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:"убрать перенос"
EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:EDH+aRSA:HIGH:!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!SEED:!DSS:!CAMELLIA;
ssl_prefer_server_ciphers on;

client_max_body_size 200M;
keepalive_requests 100;
keepalive_timeout 30;

reset_timedout_connection on;
client_body_timeout 10;
send_timeout 2;
fastcgi_ignore_client_abort on;

location / {
fastcgi_ignore_client_abort on;
proxy_ignore_client_abort on;

proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#proxy_set_header Connection "";
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 180;
}

location ~* \.(woff2|svg|png|jpg|jpeg|gif|css|js|pdf|doc|zip|rar|docx|avi|tiff|rtf|gz|gzip|mpg|mpeg|mp3|mp4|tgz|wav|wmv|wma|xls|xlsx|xml|bmp|ico||psd)$ {
root /var/www/wp-site.test/;
}
}

11. Включаем хост на nginx
ln -s "/etc/nginx/sites-available/wp-site.test" /etc/nginx/sites-enabled/wp-site.test

12. Проверяем конфиг
nginx -t

13. Задаем пароль root для mariadb
mysqladmin -u root password newpasstest

14. Заходим в СУБД
mysql -uroot -p

15. Создаем пользователя с паролем и базу данных для WordPress
CREATE DATABASE wptestdb;
CREATE USER 'wpuzer'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON wptestdb.* TO 'wpuzer'@'localhost';
FLUSH PRIVILEGES;
quit;

16. Перезапускаем сервисы и проверяем работу сайта (надо в браузере зайти на URL)
systemctl restart apache2 nginx mariadb

17. Переходим в папку сайта и удаляем ненужное.
cd /var/www/wp-site.test/; rm index.php

18. Качаем сам WordPress
wget https://ru.wordpress.org/latest-ru_RU.zip;

19. Распаковываем скаченное и перемещаем в корень сайта
unzip latest-ru_RU.zip;mv wordpress/* ./

20. Удаляем ненужное
rm -r wordpress/; rm latest-ru_RU.zip

21. Ставим права на папку с файлами сайта
cd ..; chown www-data:www-data -R wp-site.test/; chmod g+s wp-site.test/

22. Переходим в браузере по URL домена и настраиваем WordPress. Например:
Имя - Тестовый сайт
Логин с паролем wp-user:4dveRElmfKjNrltN
Почта для восстановения
test@example.loc

#devops@itmxav
#linux@itmxav
#fasthowto@itmxav

😉 На сайте

🎬 На Youtube

🎬 На Rutube
Как выключить рекламу в utorrent?

Чтобы выключить рекламу:

1. Надо перейти в "Настройки -> Настройки программы (Ctrl+P) -> Дополнительно"
2. Переключаем все значения в false:

offers.left_rail_offer_enabled
offers.sponsored_torrent_offer_enabled
offers.content_offer_autoexec
offers.featured_content_badge_enabled
offers.featured_content_notifications_enabled
offers.featured_content_rss_enabled
bt.enable_pulse
distributed_share.enable
gui.show_plus_upsell
gui.show_notorrents_node

3. Перезагружаем программу

#разное@itmxav

😉 На сайте
Простая установка Docker

Если не хочется вручную ставить Docker, то можно скрипт использовать:

curl https://get.docker.com | sudo bash -

#devops@itmxav
#docker@itmxav

😉 На сайте
Ошибка Oxidized "Timeout::Error with msg execution expired" и Cisco Nexus

При сборе конфигурации Cisco Nexus через Oxidized может появиться ошибка "Timeout::Error with msg execution expired".

Чтобы её решить, в правилах для роли в Cisco Nexus необходимо добавить:
permit command terminal length 0

Примерный список правил для роли может выглядеть вот так:
NX(config-role)# rule 1 permit command show version
NX(config-role)# rule 2 permit command show inventory
NX(config-role)# rule 3 permit command show running-config
NX(config-role)# rule 4 permit command terminal length 0


#сети@itmxav
#cisco@itmxav

😉 На сайте
Обновление Oxidized c 0.26.3 до 0.29.1 на CentOS 7

Для обновления Oxidized c 0.26.3 до 0.29.1 на CentOS 7 необходимо обновить cmake > 3.0 и ruby > 3.0.

1. Обновляем cmake.
1.1 Создаем папки
# mkdir tmpdir; cd tmpdir/; mkdir tmpcmake; cd tmpcmake

1.2 Качаем cmake-3.6.2
# wget https://cmake.org/files/v3.6/cmake-3.6.2.tar.gz

1.3 Удаляем установленный cmake
# yum remove cmake -y

1.4 Распаковываем с переходим в папку cmake
# clear;tar -zxvf cmake-3.6.2.tar.gz; cd cmake-3.6.2

1.5 Устанавливаем и проверяем версию
# ./bootstrap --prefix=/usr/local
# make
# make install; cmake --version

2. Теперь обновляем ruby.
2.1 Создаем папки
# cd ~/tmpdir; mkdir tmpruby; cd tmpruby; 

2.2 Устанавлиаем доп.пакеты и качаем ruby 3.0.4 (для версии выше могут потребоваться дополнительные зависимости)
#yum groupinstall "Development Tools"; yum install openssl-devel; wget http://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.4.tar.gz

2.3 Распаковываем с переходим в папку ruby
# tar -xzvf ruby-*; cd ruby-3.0.4

2.4 Устанавливаем и проверяем версию
# ./configure
# make
# make install; ruby -v

3. Теперь обновляем сам gem и oxidized
# gem update --system
# gem install oxidized-web oxidized

#linux@itmxav

😉 На сайте
Не запускается MongoDB на виртуальной машине Proxmox

Недавно наткнулся на с проблему с MongoDB. После установки сервис никак не хотел запускаться.
Полез посмотреть в логи, а там:

kernel: traps: mongod[xxxxxx] trap invalid opcode ip:xxxxxx

В других машинах всё нормально отрабатывает и запускается.
Ествественно, начал информацию искать через поиск и вот здесь нашлось решение.
Залез посмотреть какой CPU выбран для этой машины - x86-64-v2-aes.
Поменял на x86-64-v3, перезапустился и всё завелось.
Часто предлагают поставить host, но если на узлах Proxmox разные CPU, то могут быть проблемы с живой миграцией.
Хоть узлы и одинаковые, но всё же отказался от этой идеи.
На тему CPU моделей в Proxmox можно почитать здесь.

#бд@itmxav
#mongodb@itmxav

😉 На сайте
Как установить Graylog 5.2?

❗️ Репозитории из РФ недоступны.
❗️ Все действия происходят под рутом.

Для запуска нужны MongoDB, Opensearch и сам #Graylog 5.2.

1. Устанавливаем MongoDB
Сначала устанавливаем дополнительные пакеты
apt update; apt install gnupg software-properties-common apt-transport-https ca-certificates build-essential libjpeg-dev libpng-dev libtiff-dev curl wget pwgen
Ставим ключ
curl -fsSL https://pgp.mongodb.com/server-7.0.asc | gpg  --dearmor -o /etc/apt/trusted.gpg.d/mongodb-server-7.0.gpg
Прописываем репозиторий
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-7.0.list
Ставим mongodb
apt update; apt install mongodb-org
Закидываем в автозапуск и запускаем mongod
systemctl enable mongod
systemctl start mongod; systemctl status mongod
Если это всё происходит на виртуальной машине Proxmox и не запускается MongoDB, то здесь описывал проблемы и возможное решение.

2. Устанавливаем Opensearch
Opensearch форк Elastacsearch, потому что были изменения в лицензиях Elastacsearch и некоторым разрабочикам это не понравилось.
Ставим ключ
curl -fsSL https://artifacts.opensearch.org/publickeys/opensearch.pgp | gpg --dearmor -o /etc/apt/trusted.gpg.d/opensearch.gpg
Прописываем репозиторий
echo "deb https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/apt stable main" | tee /etc/apt/sources.list.d/opensearch-2.x.list
Обновляемся и прописываем пароль для установки (лучше сохранить его или в окружении добавить):
apt update
export OPENSEARCH_INITIAL_ADMIN_PASSWORD=XXXXXXX
Ставим Opensearch
apt install opensearch
Далее надо поправить конфиг под Graylog
nano /etc/opensearch/opensearch.yml
cluster.name: graylog52
node.name: ${HOSTNAME}
path.data: /var/lib/opensearch
path.logs: /var/log/opensearch
discovery.type: single-node
network.host: 0.0.0.0
#или 127.0.0.1
action.auto_create_index: false
plugins.security.disabled: true
И ещё конфиг
nano /etc/opensearch/jvm.options
-Xms4g
-Xmx4g
sysctl -w vm.max_map_count=262144
echo 'vm.max_map_count=262144' >> /etc/sysctl.conf
Закидываем в автозапуск и запускаем opensearch
systemctl daemon-reload
systemctl enable opensearch.service
systemctl start opensearch.service; systemctl status opensearch.service
Проверяем работу
curl -X GET http://localhost:9200 -u ‘admin:admin’
Должна вернуться информация о версии, названии и т.п.

3. Устанавливаем Graylog
Качаем
wget https://packages.graylog2.org/repo/packages/graylog-5.2-repository_latest.deb
И устанавливаем
dpkg -i graylog-5.2-repository_latest.deb
apt update && apt install graylog-server
Далее надо сделать password_secret и root_password_sha2
Для password_secret
pwgen -N 1 -s 96
Для root_password_sha2
echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1
И теперь настраиваем конфиг Graylog’a
nano /etc/graylog/server/server.conf
is_leader = true
node_id_file = /etc/graylog/server/node-id
password_secret = PASSWORD_PWGEN
root_password_sha2 = PASSWORD_ROOT_SHA2
bin_dir = /usr/share/graylog-server/bin
data_dir = /var/lib/graylog-server
plugin_dir = /usr/share/graylog-server/plugin
http_bind_address = IP_ADDRESS:9000
stream_aware_field_types=false
elasticsearch_hosts = http://127.0.0.1:9200
disabled_retention_strategies = none
allow_leading_wildcard_searches = false
allow_highlighting = false
output_batch_size = 500
output_flush_interval = 1
output_fault_count_threshold = 5
output_fault_penalty_seconds = 30
processbuffer_processors = 5
outputbuffer_processors = 3
processor_wait_strategy = blocking
ring_size = 65536
inputbuffer_ring_size = 65536
inputbuffer_processors = 2
inputbuffer_wait_strategy = blocking
message_journal_enabled = true
message_journal_dir = /var/lib/graylog-server/journal
lb_recognition_period_seconds = 3
mongodb_uri = mongodb://localhost/graylog
mongodb_max_connections = 1000
Закидываем в автозапуск и запускаем graylog
systemctl daemon-reload
systemctl enable graylog-server.service
systemctl start graylog-server.service; systemctl status graylog-server.service

😉 На сайте
Когда-то делал заметку на сайте про поиск хостов по пингам. Сейчас немного поправил команды, чтобы не было повторений при отправке нескольких пакетов и результат был отсортирован.

echo 10.126.0.{1..20} | xargs -n1 -P0 ping -c1 | grep "bytes from" | grep 10.126.0 | awk {'print $4'} | sort | uniq | sed 's/.\{1\}$//'

Вообще есть удобный сайт по расшифровке команд. Там подтягивается информация из манов и описывается что есть что.
Например, вот здесь есть расшифровка команд выше.

#linux@itmxav

😉 На сайте
Сделал копию страницы itmxav.github.io - it.mxav.ru/bkpgh/ и добавил кнопки "backup" для скачивания скриптов напрямую (например, wget, curl), если вдруг GH недоступен.
Так глядишь и дойдут руки выложить ещё что-то по конфигам/скриптам 😊
Вылетел и не поднимается OSD в Ceph+Proxmox

Столкнулся с ситуацией, что один OSD в Ceph вылетел, хотя сам диск виден. После выяснения обстоятельств оказалось, что человек случайно ногой зацепил диск в стойке, когда менял провода, и потом вставил его назад. Ceph работает в связке с Proxmox. Попытки поднять OSD оказывались печалью и путь /dev/sdX, после возвращения диска, изменился на другой.
Т.к. ресурсы были, то можно было пойти «стандартным» маршрутом пересоздания OSD:

1. Диск отмечен как Out.
2. Удаляем OSD. В разделе Ceph(главное не ошибиться с OSD)→More→Destroy
3. Далее выбираем узел → Disks→Выбираем нужный диск и стираем его «Wipe Disk»
4. После в разделе Ceph добавляем диск как новый OSD.
Естественно, будет перебалансировка ресурсов в фоне.

#ceph@itmxav
#proxmox@itmxav

😉 На сайте
Ошибка %ADJ-3-RESOLVE_REQ на Cisco 3560-X


На одной из Cisco 3560-X в логи сыпались постоянно ошибки:

%ADJ-3-RESOLVE_REQ: Adj resolve request: Failed to resolve xx.xx.xx.xx VlanXX

Т.к. на Cisco нет какой-то сложной конфигурации, то помогло:

no ip cef optimize neighbor resolution 

Некоторые писали, что это может быть баг на конкретной железке. Некоторые писали, что может вырасти нагрузка на ЦП, по умолчанию включен параметр. В моем случае нагрузка не изменилась и ошибки ушли.

#сети@itmxav
#cisco@itmxav

😉 На сайте
Защита от простых наплывов запросов в Nginx

Часто, когда сайт начинает становится более популярным, всякие нехорошие люди (ботов люди создают) пытаются его положить наплывом запросов.
Можно попытаться защититься стандартными решениями на Nginx. В качестве ответов сервера здесь выдается 444 код (закрывает соединение без отправки данных), но можно ставить тот, который посчитаете нужным.

1. Когда в запросах идут левые заголовки, то можно оставить только нужные, а по остальным не отвечать:
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 444;
}

2. Если запросы идут внешне нормальные, но с разными http_referer (например, с взломанных сайтов), то можно вести черные список при помощи map.
2.1 Перед разделом server в vhost создаем map
map $http_referer $bad_referer {
default 0;
"~https://example.com" 1;
}

Аналогично example.com можно добавлять в новой строке и другие http_referer.
2.2 В разделе server создаем условие на проверку
if ($bad_referer) { 
return 444;
}

Если в http_referer указан https://example.com, то он будет получать 444 от Nginx.

3. Если нужно ограничить количество запросов от IP-адресов, но некоторые адреса надо исключить, то можно применять limit_req со списком исключений (geo+map).
3.1 Формируем список перед разделом server в vhost
geo $limited_net {
default 1;
192.168.1.0/24 0;
}

Сеть 192.168.1.0/24 будет в исключениях.
3.2 Создаем map c $binary_remote_addr
map $limited_net $addr_to_limit {
0 "";
1 $binary_remote_addr;
}

$binary_remote_addr - параметр в Nginx, который отвечающий за адрес клиента.
3.3 Перед разделом server создаем условия по запросам. В данном случае создаем зону reqtest, где возможно отправлять с одного IP 10 запросов в секунду.
limit_req_zone $addr_to_limit zone=reqtest:10m rate=10r/s;

3.4 В location ставим limit_req с возможностью всплеска 50:
limit_req zone=reqtest burst=50;

Если нужно без задержек обрабатывать всплески, то надо добавить nodelay после burst. Если запросы выше всплеска, то будут отбрасываться.

4. Если надо ограничить количество одновременных запросов от IP-адреса, то можно применить limit_conn.
4.1 Перед разделом server создаем зону.
limit_conn_zone $binary_remote_addr zone=conntest:10m;

4.2 В разделе server указываем условия одновременных подключений. В данном примере 30.
limit_conn conntest 30;

Конечно, это всё защита не от серьезного DDOS'a, но в блокировке всяких мутных ботов может помочь. Плюс хорошо бы ещё добавить fail2ban для выявления и блокирования странных запросов в логах.

#devops@itmxav

😉 На сайте