Кстати у нас есть внутренняя темка — написал технический авторский пост от 2500-4000 знаков, скинул Максу, получил 1000р на РФ карту. Несколько человек активно пишут. Кому все эти розыгрыши в хуй не уперлись, можете подколымить.
ㅤ
Но писать нужно из личного опыта, а не из пальца высасывать, азы баша, команды линукса и прочая хуйня — мимо. А вот какие-то личные наблюдения, замечания, разработки и т.п. прям приветствуются.
Самое главное — пост не должен быть нигде ранее опубликован, проверяем. Нейронки сразу мимо, палятся на раз, не порти себе карму, в комментах это сразу пробьют и выведут на чистую воду.
Пост будет протегирован твоим ником, копирайты все дела. Так что кому есть что сказать, камон. Ошибки, форматирование поправим, всё сделаем сверстаем красиво, можешь не париться, в любом формате шли.
До 01.09.25 потестируюм такой формат в паблике, дальше видно будет.
🛠 #людипишут
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
ㅤ
Но писать нужно из личного опыта, а не из пальца высасывать, азы баша, команды линукса и прочая хуйня — мимо. А вот какие-то личные наблюдения, замечания, разработки и т.п. прям приветствуются.
Самое главное — пост не должен быть нигде ранее опубликован, проверяем. Нейронки сразу мимо, палятся на раз, не порти себе карму, в комментах это сразу пробьют и выведут на чистую воду.
Пост будет протегирован твоим ником, копирайты все дела. Так что кому есть что сказать, камон. Ошибки, форматирование поправим, всё сделаем сверстаем красиво, можешь не париться, в любом формате шли.
До 01.09.25 потестируюм такой формат в паблике, дальше видно будет.
Заваливать постами НЕ нужно, максимум 1-2 поста в неделю от одного человека.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Ну что, пошла жара. Первый пост для #балансбатл, ставим котиков, комментируем.
А как ты снимаешь дамп postgres?
Итак, настраиваем автоматическое бэкапирование бд, с блек-джеком и логами.
Периодически возникает такая задача, проектов много, нужно автоматически снимать дампы. В случае чего слать уведомления и дебажить проблемы в случае их присутствия.
В определённый момент пришёл к достаточно простому способу, скрипт в кроне такого вида:
DATE=$(date '+%Y-%m-%d')
echo "save dump db"
pg_dump -h <ip> -p <port> -U <user> -v -F c -f db_$DATE.tar.gz <db name> 2> /opt/backup-db/dump_log_$DATE && [[ $? -eq 0 ]] && curl -i -X \
GET "https://api.telegram.org/bot<bot id>:<bot token>/sendMessage?chat_id=<chat id>&text=Дамп базы данных снят успешно, на сервере <servername>" \
|| curl -i -X GET "https://api.telegram.org/bot<bot id>:<bot token>/sendMessage?chat_id=<chat id>&text=Во время снятия дампа произошла ошибка. Смотри лог на сервере <servername>"
Собственно, что он делает:
- Ну, естественно, снимает дамп бд, вывод процесса кладёт в определённую директорию, прикручивая к названию файла
$DATE.- В случае успеха
(&& [[ $? -eq 0 ]] &&) дёргает телеграм бота, чтоб он написал в заданный чат сообщение об этом.- В случае неуспеха (||, то есть если код выполнения не равен 0) - дёргает тот же бот чтобы он в чат сообщил об ошибке и где она произошла.
Ну и экономим место на дисках, после выполнения этого скрипта, запускаем:
find /opt/backup-db -type f -mtime +10 -delete
Это удалит все файлы в директории, старше заданного количества дней +1.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Второй пост для #балансбатл, ставим котиков, комментируем.
Продолжаю мучать "Жорика", как организовать автоматическую проверку здоровья RAID массива и жёстких дисков, уведомления если проблемы.
ㅤ
Для уведомления о проблем с жёсткими дисками пригодиться
smartmontools.sudo apt update
sudo apt install smartmontools
sudo nano /etc/smartd.conf
В конец файла для каждого диска добавляю строки.
/dev/sda -a -m [email protected]
/dev/sdb -a -m [email protected]
/dev/sdc -a -m [email protected]
/dev/sdd -a -m [email protected]
Будут проводится все проверки и в случае сбоев прилетит сообщение на почтовый ящик.
Подробнее о настройках можно почитать
man smartd.conf.После этого
smartd нужно активировать:sudo systemctl start smartd
sudo systemctl enable smartd
Далее нужно настроить мониторинг самого массива. Тут до меня дошло что нужно же настроить почтовый сервер, иначе как будут отправляться письма.
Сначала думал устанавливать и настраивать
postfix, потом после поисков нашёл легковесное решение - msmtp.geek@zhorik:~$ sudo apt-get install msmtp msmtp-mta
Второй пакет позволяет прозрачно заменить
sendmail на msmtp, что позволит легко отправлять уведомления от любых других служб используя стандартные механизмы.Выбираю <OK> включаю AppArmor.
Создаю пароль приложения для почты яндекс инструкция
Далее создаю конфиг
msmtpsudo nano /etc/msmtprc
defaults
auth on
tls on
tls_starttls on
tls_certcheck off
keepbcc on
account yandex
host smtp.yandex.ru
port 587
protocol smtp
from [email protected]
user user
password password
account default: yandex
Синтаксис предельно понятен и в комментариях не нуждается. Порт 587 используется для подключений клиентских агентов (MUА) и ретрансляции почты от них. Также можно использовать стандартный порт 25.
В одном конфигурационном файле можно создать несколько почтовых аккаунтов, в конце добавить запись, которая будет указывать аккаунт по умолчанию, в нашем случае Яндекс:
account default: yandexСохраняю содержимое файла. Через неделю пробую отправить почту
echo "test" | msmtp -d [email protected] и получаю своё тестовое письмо.Теперь открою конфигурационный файл
/etc/mdadm/mdadm.conf и укажу в нем адрес на который следует отсылать уведомления:MAILADDR [email protected]
Специально для яндекса нужно ещё добавить иначе он будет ругаться
MAILFROM [email protected]
Сохраняю файл и обновляю
initramfs sudo update-initramfs -uДля проверки выполню команду
mdadm --monitor --scan --test --oneshotМне пришло письмо с темой
"TestMessage event on /dev/md127:zhorik" и телом:This is an automatically generated mail message.
TestMessage event detected on md device /dev/md127
The /proc/mdstat file currently contains the following:
Personalities : [raid6] [raid5] [raid4] [raid0] [raid1] [raid10]
md127 : active raid5 sdc[1] sdd[3] sdb[0]
1953260544 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
bitmap: 0/8 pages [0KB], 65536KB chunk
unused devices: <none>
Нужно будет ещё проверить что
smartd тоже корректно шлёт письма.—
Please open Telegram to view this post
VIEW IN TELEGRAM
Третий пост для #балансбатл, ставим котиков, комментируем.
Привет. Есть российская Астра Линух 1.7.7
Есть у нее встроенный админ
administrator. Понадобилось мне создать учетку для периодического сканирования на уязвимости и сбор конфигурации.ㅤ
Захожу под
administrator, проваливаюсь в sudo -i, создаю учетку:useradd -d /home/user -m -s /bin/bash -G astra-admin user
Создаю пароль:
passwd user
Настраиваю сканирование и.... ничего. Ошибка.
Начинаю искать проблему.
Захожу по
user на хост, sudo -i (для сканирования требуется повышение привилегий), хочу проверить /etc/apt/sources.list, чтоб telnet-клиента поставить для пробития портов.nano /etc/apt/sources.list
Снизу меня встречает красная строчка: "File '/etc/apt/sources.list' is unwritable"
Стоп! Я же root!
Захожу под встроенным админом,
sudo -i, могу редактировать файл спокойно. Вспоминаю про мандатную политику, решаю проверить её:astra-mic-control is-enabled
ВКЛЮЧЕНО!
Ок. Проверяю мандатные метки на пользователях:
pdpl-user administrator
pdpl-user user
У обоих пользователей минимальная метка 0, максимальная 63. Доступа все равно нет.
Решение:
Не знаю, глюк это мандатной политики или так было задумано, но несмотря на то, что команда
pdpl-user user выдала нам максимальную метку 63, её фактически там нет. Нужно принудительно добавить 63 метку пользователю:pdpl-user -i 63 user
После этого все заработало. Такие дела.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Про бомжей и authentication key
🔤 🔤 🔥 🔤 🔤 🔤 🔤 🔤 🔤 🔤
Предполагается, что есть bash скрипт
Но, вся фича в том, что нам его нужно выполнить от непривилегированного пользователя - бомжа, а у бомжей как известно - нет домашней директории =(.
Так как нам нужно выполнять скрипт на удаленном сервере, справедливо настроить для
Но, это нужно сделать в каталоге, к которому будет иметь доступ пользователь
Вроде бы все норм, в скрипте указан верный ключ, но, если мы попробуем запустить этот скрипт под бездомным пользователем, то каждый раз при запуске будем получать предложение ввести
Вся штука в том, что у пользователя
Поэтому, рассмотрим возможность, хранить
Одно из возможностей
И немного подправим изначальный скрипт
🛠 #балансбатл
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Предполагается, что есть bash скрипт
/usr/local/bin/run.sh, который запускает другой bash скрипт на удаленном сервере, и получает его выхлоп:
#!/bin/bash
SSH_USER="root"
SSH_HOST="123.45.67.89"
SSH_KEY="/usr/local/share/ssh_keys/my_node" # Путь к приватному ключу
REMOTE_SCRIPT="/usr/local/bin/send_node_stat.sh" # месторасполдожение удаленного скрипта
# проверка наличия ключа необязательна, но неплохо помогает при отладке
if [[ ! -f "$SSH_KEY" ]]; then
echo "Ошибка: ssh ключ не найден по пути $SSH_KEY"
exit 1
fi
ssh -i "$SSH_KEY" "$SSH_USER@$SSH_HOST" "$REMOTE_SCRIPT" # собственно само выполнение удаленного скипта
Но, вся фича в том, что нам его нужно выполнить от непривилегированного пользователя - бомжа, а у бомжей как известно - нет домашней директории =(.
# создаем бомжа
useradd -r -s /bin/false bomj
usermod -aG sudo bomj
Так как нам нужно выполнять скрипт на удаленном сервере, справедливо настроить для
ssh authentication key.Но, это нужно сделать в каталоге, к которому будет иметь доступ пользователь
bomj (также предполагается, что наш бомжара вход в группу run_scripts). В данном случае создаем от пользователя root:mkdir -p /usr/local/share/ssh_keys
chown -R root:run_scripts /usr/local/share/ssh_keys
chmod -R 750 /usr/local/share/ssh_keys
chmod g+r /usr/local/share/ssh_keys/
ssh-keygen -t ed25519 -f /usr/local/share/ssh_keys/my_node
ssh-copy-id -i /usr/local/share/ssh_keys/my_node.pub [email protected]
Вроде бы все норм, в скрипте указан верный ключ, но, если мы попробуем запустить этот скрипт под бездомным пользователем, то каждый раз при запуске будем получать предложение ввести
yes.
sudo -u bomj /usr/local/bin/run.sh
The authenticity of host '123.45.67.89 (123.45.67.89)' can't be established.
ED25519 key fingerprint is SHA256:or+sERSXpC0EsZZALxphJFxtN9Lt3tTtgr2KGO/xikI.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Could not create directory '/home/bomj/.ssh' (No such file or directory).
Failed to add the host to the list of known hosts (/home/bomj/.ssh/known_hosts).
Вся штука в том, что у пользователя
bomj нет домашней директории, и он не может сделать запись в /home/bomj/.ssh/known_hosts.Поэтому, рассмотрим возможность, хранить
known_hosts в альтернативном месте. Для этого воспользуемся утилитой ssh-keyscan которая идет в стандартном наборе OpenSSHОдно из возможностей
ssh-keyscan - автоматическое добавления ssh-ключей в файл known_hosts, избегая ручного подтверждения ключа при первом подключении.
# Первый раз нужно будет явно записать fingerprint во сюда вот:
ssh-keyscan 123.45.67.89 >> /usr/local/share/ssh_keys/known_hosts
chown root:run_scripts /usr/local/share/ssh_keys/known_hosts
chmod 640 /usr/local/share/ssh_keys/known_hosts
И немного подправим изначальный скрипт
#!/bin/bash
SSH_USER="root"
SSH_HOST="123.45.67.89"
SSH_KEY="/usr/local/share/ssh_keys/my_node"
KNOWN_HOSTS_FILE="/usr/local/share/ssh_keys/known_hosts" # Альтернативный known_hosts
REMOTE_SCRIPT="/usr/local/bin/send_node_stat.sh"
if [[ ! -f "$SSH_KEY" ]]; then
echo "Ошибка: ключ SSH не найден по пути $SSH_KEY"
exit 1
fi
# тут проверяем known_hosts, если отсутствует — создадим пустой
if [[ ! -f "$KNOWN_HOSTS_FILE" ]]; then
touch "$KNOWN_HOSTS_FILE"
chown root:bot_scripts "$KNOWN_HOSTS_FILE"
chmod 640 "$KNOWN_HOSTS_FILE"
fi
ssh -i "$SSH_KEY" -o UserKnownHostsFile="$KNOWN_HOSTS_FILE" "$SSH_USER@$SSH_HOST" "$REMOTE_SCRIPT"
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Про DNS, домены и хостинги
🔤 🔤 🔥 🔤 🔤 🔤 🔤 🔤 9️⃣ 1️⃣ 7️⃣
Тут недавно в чате проскакивала тема доменов хостингов, само хостингов и прочей подобной ереси.
ㅤ
Сразу скажу чукча не читатель, так что может излагать коряво, кидаться тапками при обнаружении неточностей не только можно, но и нужно!
Давайте сразу сделаем разделение мухи отдельно котлеты отдельно.
А именно нужно сразу понимать что домен и хостинг, по большому счёту 2 друг от друга не зависимые единицы.
Основная задача у меня была знания донести.
Пост получился объемный, поэтому публикуем так:
🅰️ 🅰️ 🅰️ 🅰️ 🅰️ 🅰️ 🅰️ 🅰️
➡️ https://two.su/4i9b1
🅰️ 🅰️ 🅰️ 🅰️ 🅰️ 🅰️ 🅰️ 🅰️
🛠 #networks
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Тут недавно в чате проскакивала тема доменов хостингов, само хостингов и прочей подобной ереси.
ㅤ
Сразу скажу чукча не читатель, так что может излагать коряво, кидаться тапками при обнаружении неточностей не только можно, но и нужно!
Давайте сразу сделаем разделение мухи отдельно котлеты отдельно.
А именно нужно сразу понимать что домен и хостинг, по большому счёту 2 друг от друга не зависимые единицы.
Основная задача у меня была знания донести.
Пост получился объемный, поэтому публикуем так:
Ждем твоих лайков и комментариев.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Живое вмешательство. File descriptors и GDB.
🔤 🔤 🔥 🔤 🔤 🔤 🔤 🔤 🔤 🔤
Написать статью для #балансбатл навеяли 2 события, разной давности:
ㅤ
1. Вопрос на собесе со мной в качестве соискателя: "Что такое файл в Linux?"
2. Прочтение поста Романа Один рубит - семеро в хуй трубят.
Что такое файл в Linux читателю я предлагаю изучить самостоятельно, или Роману раскрыть эту тему подробнее. Ключевое: файл - это некая абстракция для всего, что можно читать или записывать. Идея - "В linux все - это файл".
Далее, эту идею постараюсь протянуть тонкой нитью через статью Один рубит - семеро в хуй трубят.
Кратко: на собесе Серёжа удалил /var/log/nginx/access.log, далее обсуждается несколько моментов:
а) "Серёжа, а почему файл
б) "Где карта Билли? Нам нужна карта!" (с)
в) "Внятного ответа не получил, что-то на уровне — он появится спустя сутки, когда logrotate отработает. Дада… будем сутки без логов сидеть." (с)
Отвечаем на вопросы и решаем проблемы:
a) удаление файлов в Linux лишь убирает название файла из файла каталога, но inode с данными остаётся, пока его держит открытым хоть один процесс.
Так что это не проблема. Идем дальше.
б) и в) Помогаем Билли с картой и не сидим сутки без логов.
Пока процесс открыт он продолжает держать fd (файловые дескрипторы), даже если файл удален.
1. Проверим утверждение. Пишем скрипт:
2. Запускаем, читаем логи:
3. Удалим файл.
4. Процесс продолжает писать в файл. Смотрим (PID знаем, смотри выше):
или так (тут PID схватим по другому), через watch наглядно:
5. Билли возвращает карту:
Вуаля! Дескриптор НЕ потерялся, процесс не сошел с ума, логи восстановлены.
—
Что дальше? Файл то удален!
Представим, что у нас серьезный PROD, тяжеленный "Билли"нговый демон СверхБербанка, где перезапуск = потеря соединений и часовое восстановление сессий!
Подкинем новый файл
1. Запускаем
2. Выполняем внутри gdb:
3. Проверяем файловые дескрипторы процесса и лог:
На этом все. Процесс пишет в новый файл с тем же дескриптором.
🛠 #балансбатл
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Написать статью для #балансбатл навеяли 2 события, разной давности:
ㅤ
1. Вопрос на собесе со мной в качестве соискателя: "Что такое файл в Linux?"
2. Прочтение поста Романа Один рубит - семеро в хуй трубят.
Что такое файл в Linux читателю я предлагаю изучить самостоятельно, или Роману раскрыть эту тему подробнее. Ключевое: файл - это некая абстракция для всего, что можно читать или записывать. Идея - "В linux все - это файл".
Далее, эту идею постараюсь протянуть тонкой нитью через статью Один рубит - семеро в хуй трубят.
Кратко: на собесе Серёжа удалил /var/log/nginx/access.log, далее обсуждается несколько моментов:
а) "Серёжа, а почему файл
access.log пропал и больше не появляется? Nginx то в данный момент работает, запросы на него идут." (с)б) "Где карта Билли? Нам нужна карта!" (с)
в) "Внятного ответа не получил, что-то на уровне — он появится спустя сутки, когда logrotate отработает. Дада… будем сутки без логов сидеть." (с)
Отвечаем на вопросы и решаем проблемы:
a) удаление файлов в Linux лишь убирает название файла из файла каталога, но inode с данными остаётся, пока его держит открытым хоть один процесс.
Так что это не проблема. Идем дальше.
б) и в) Помогаем Билли с картой и не сидим сутки без логов.
Пока процесс открыт он продолжает держать fd (файловые дескрипторы), даже если файл удален.
1. Проверим утверждение. Пишем скрипт:
#!/bin/bash
echo $$ > /tmp/nginx.pid
exec 3> /tmp/access.log
while true; do
echo "$(date) Где карта Билли? Нам нужна карта!!!" >&3
sleep 1
done
2. Запускаем, читаем логи:
$ ./simple.sh &
[2] 13502
$ tail -f /tmp/access.log
Sun Aug 10 23:15:42 MSK 2025 Где карта Билли? Нам нужна карта!!!
Sun Aug 10 23:15:43 MSK 2025 Где карта Билли? Нам нужна карта!!!
3. Удалим файл.
rm /tmp/access.log
4. Процесс продолжает писать в файл. Смотрим (PID знаем, смотри выше):
$ ls -l /proc/13502/fd
total 0
lrwx------ 1 aflw aflw 64 Aug 10 23:23 0 -> /dev/pts/0
lrwx------ 1 aflw aflw 64 Aug 10 23:23 1 -> /dev/pts/0
lrwx------ 1 aflw aflw 64 Aug 10 23:23 2 -> /dev/pts/0
lr-x------ 1 aflw aflw 64 Aug 10 23:23 255 -> /home/aflw/planka-backup/simple.sh
l-wx------ 1 aflw aflw 64 Aug 10 23:23 3 -> '/tmp/access.log (deleted)'
или так (тут PID схватим по другому), через watch наглядно:
watch -n1 -d "lsof -p $(cat /tmp/nginx.pid) | grep deleted"
Every 1.0s: lsof -p 13502 | grep deleted
simple.sh 13502 aflw 3w REG 8,32 188825 17988 /tmp/access.log (deleted)
5. Билли возвращает карту:
cp /proc/13502/fd/3 /tmp/access.log.restored
Вуаля! Дескриптор НЕ потерялся, процесс не сошел с ума, логи восстановлены.
—
Что дальше? Файл то удален!
Представим, что у нас серьезный PROD, тяжеленный "Билли"нговый демон СверхБербанка, где перезапуск = потеря соединений и часовое восстановление сессий!
Подкинем новый файл
/tmp/access_new.log без перезапуска процесса. Будем использовать отладчик gdb.1. Запускаем
sudo gdb -p $(cat /tmp/nginx.pid)
2. Выполняем внутри gdb:
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04.2) 12.1
# открываем новый файл для логов
(gdb) call (int) open("/tmp/access_new.log", 66, 0644)
$1 = 4 # новый файловый дескриптор
(gdb) call (int) dup2(4, 3) # дублируем fd 4 в позицию 3.
$2 = 3
(gdb) call (int) close(4) # Закрываем временный fd 4
$3 = 0
(gdb) detach
Detaching from program: /usr/bin/bash, process 13502
[Inferior 1 (process 13502) detached]
(gdb) quit
3. Проверяем файловые дескрипторы процесса и лог:
$ ls -l /proc/13502/fd
total 0
lrwx------ 1 aflw aflw 64 Aug 10 23:23 0 -> /dev/pts/0
lrwx------ 1 aflw aflw 64 Aug 10 23:23 1 -> /dev/pts/0
lrwx------ 1 aflw aflw 64 Aug 10 23:23 2 -> /dev/pts/0
lr-x------ 1 aflw aflw 64 Aug 10 23:23 255 -> /home/aflw/planka-backup/simple.sh
lrwx------ 1 aflw aflw 64 Aug 10 23:23 3 -> /tmp/access_new.log
$ tail -f /tmp/access_new.log
Mon Aug 11 00:17:54 MSK 2025 Где карта Билли? Нам нужна карта!!!
На этом все. Процесс пишет в новый файл с тем же дескриптором.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
21 112
Был когда-то интересный квест. Ща расскажу.
🔤 🔤 🔥 🔤 🔤 🔤 🔤 🔤 🔤
Крутился внутри сети сайт (на IP
ㅤ
А пулял запросы в другую сеть которая была за шлюзом
Важно что запросы должны летать в шлюз
Все было хорошо, пока манагеры не захотели видеть этот сайт снаружи сети (IP X.X.X.X, всякие DNS опустим, они тут не важны).
Разраб тоже сказал что ему нужна 22 дырка снаружи, и понятно что проброс порта на шлюзе не сработает. Надо выдумывать маршруты.
Присказка окончена, понеслася сказка.
Пишем маршрутизацию
Применяем изменения (тут если накосячил сообщат)
Создаем отдельную таблицу маршрутизации (table 100)
Создаем правила маршрутизации для каждого порта:
Что делает:
Пометка исходящего трафика (iptables mangle + MARK)
Что делает:
Зачем:
Метка (mark) позволяет позже применить к пакетам особые правила маршрутизации.
Правило маршрутизации по метке (fwmark)
Что делает:
Зачем:
Это гарантирует, что ответы на SSH/HTTP-запросы (исходящие с портов 22/8080) будут направляться через шлюз
Общий смысл всей настройки:
Для входящих запросов на eth0 (порты 22 и 8080): Ответный трафик маркируется (mark=1).
Маркированный трафик направляется через таблицу 100 (шлюз 192.168.0.1).
Для исходящих ответов (SSH/HTTP с портов 22/8080): Трафик также маркируется и направляется через таблицу 100.
Результат:
Весь трафик, связанный с SSH (22) и HTTP (8080), всегда идёт через шлюз 192.168.0.1, даже если в системе есть другие маршруты по умолчанию.
Проверяем:
Если все отработало, идем дальше.
При перезагрузке вся настроенная маршрутизация слетит.
Надо восстанавливать при каждой перезагрузке. Тут на выбор. Пойдем по пути systemd.
Включаем
Перегружаемся\проверяем.
🛠 #балансбатл #networks
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Крутился внутри сети сайт (на IP
192.168.0.87) который пулял куда-то API-запросы, с такой особенность, что работал он не как все машины через шлюз 192.168.0.1.ㅤ
А пулял запросы в другую сеть которая была за шлюзом
192.168.0.176 и далее в дивный неведомый интернет, хуй знает куда он там чего отправляет, это в данном случае не важно.Важно что запросы должны летать в шлюз
192.168.0.176 а общий шлюз в сети 192.168.0.1 с внешним X.X.X.X.Все было хорошо, пока манагеры не захотели видеть этот сайт снаружи сети (IP X.X.X.X, всякие DNS опустим, они тут не важны).
Разраб тоже сказал что ему нужна 22 дырка снаружи, и понятно что проброс порта на шлюзе не сработает. Надо выдумывать маршруты.
Присказка окончена, понеслася сказка.
Пишем маршрутизацию
/etc/netplan/00-installer-config.yamlnetwork:
version: 2
renderer: networkd
ethernets:
eth0:
addresses: [192.168.0.87/24]
routes:
- to: 0.0.0.0/0 # Весь интернет-трафик через 192.168.0.176
via: 192.168.0.176
metric: 100
- to: 192.168.0.1/32 # Явный маршрут до шлюза 192.168.0.1
via: 192.168.0.1
metric: 50 # Более высокий приоритет
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
Применяем изменения (тут если накосячил сообщат)
sudo netplan apply
Создаем отдельную таблицу маршрутизации (table 100)
sudo ip route add default via 192.168.0.1 dev eth0 table 100
Создаем правила маршрутизации для каждого порта:
sudo ip rule add iif eth0 dport 22 lookup 100
sudo ip rule add iif eth0 dport 8080 lookup 100
Что делает:
iif eth0 — трафик, пришедший на интерфейс eth0.dport 22 и dport 8080 — если это SSH (порт 22) или HTTP (порт 8080).lookup 100 — использовать таблицу 100 для маршрутизации этого трафика.Пометка исходящего трафика (iptables mangle + MARK)
sudo iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 1
sudo iptables -t mangle -A OUTPUT -p tcp --sport 8080 -j MARK --set-mark 1
Что делает:
-t mangle — таблица mangle для изменения (marking) пакетов.--sport 22 и --sport 8080 — если исходящий трафик идёт с портов 22 (SSH) или 8080 (HTTP).--set-mark 1 — помечает такие пакеты меткой 1.Зачем:
Метка (mark) позволяет позже применить к пакетам особые правила маршрутизации.
Правило маршрутизации по метке (fwmark)
sudo ip rule add fwmark 1 lookup 100
Что делает:
fwmark 1 — если пакет помечен меткой 1 (как в iptables выше).lookup 100 — использовать таблицу 100 для маршрутизации.Зачем:
Это гарантирует, что ответы на SSH/HTTP-запросы (исходящие с портов 22/8080) будут направляться через шлюз
192.168.0.1 (из таблицы 100), а не через основной маршрут.Общий смысл всей настройки:
Для входящих запросов на eth0 (порты 22 и 8080): Ответный трафик маркируется (mark=1).
Маркированный трафик направляется через таблицу 100 (шлюз 192.168.0.1).
Для исходящих ответов (SSH/HTTP с портов 22/8080): Трафик также маркируется и направляется через таблицу 100.
Результат:
Весь трафик, связанный с SSH (22) и HTTP (8080), всегда идёт через шлюз 192.168.0.1, даже если в системе есть другие маршруты по умолчанию.
Проверяем:
ssh -p 1422 user@Х.Х.Х.Х
curl ident.iss.one #должен вернуть внешний адрес шлюза
Если все отработало, идем дальше.
При перезагрузке вся настроенная маршрутизация слетит.
Надо восстанавливать при каждой перезагрузке. Тут на выбор. Пойдем по пути systemd.
В комментах содержимое portforward-routes.service, в пост не влезло.
Включаем
sudo systemctl daemon-reload
sudo systemctl enable portforward-routes.service
Перегружаемся\проверяем.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
12 87
Учим Docker в SNAT
ㅤ
Последнее время всё чаще начал сталкиваться с тем, что IP сервера висит на Dummy интерфейсе и вещаются в сторону сетевиков организации/хостера/провайдера по BGP.
🔤 🔤 🔥 🔤 🔤 🔤 🔤 🔤 🔤
Вроде бы всё выглядит и ничего, и всё работает, но:
1. У меня есть Docker на таких серверах
2. И он в упор отказывается SNAT-ить контейнеры с IP Dummy-ка
Это надо как то исправить.
Смотрим, то что мы имеем
Такс, у нас есть:
Железонька стандартная, с двумя сетевыми интерфейсами, которые воткнуты в сеть провайдера.
- На интерфейсе
- На интерфейсе
- На интерфейсе
- На сервере стоит гордый птыц bird, который делает bgp с провайдером
Зачем 32е и 31е маски? Потому что могу, да и ну его, айпишники тратить на 30е маски...
Делаем докериную сетку (bridge) и запускаем контейнер (например
Получаем:
Херня, товарищи! Идём смотреть правила в iptables:
Видим, что Docker делает MASQUERADE. Это обычный, всем привычный NAT, но! оно работает только с физическими сетевыми интерфейсами. И весь трафик от сервера выходит с IP именно физических интерфейсов. Нам такое не подходит.
Имеем, то что мы смотрим
Закапываемся в доку Docker и трём глаза в изумлении, ничего не нашли. Отлично, полезем в кишочки разбираться. Нам надо попробовать сделать вместо
Идём в сырцы Docker (а точнее в moby/moby), грепаем, копаемся, и видимволшебные грибы которые потребляли разработчики строчки:
Ага. В доке этого не было. Поехали, попробуем!
Отлично, связь есть. Смотрим в iptables:
Поразительно. Не, я точно слепой, такую же фичу не могли в документации пропустить... Или могли? Идём гуглим, и получаем всего один результат! И тот в Release Notes...
Итоги
Мы имеем работающие Docker контейнеры, которые SNAT-ятся с нужного нам IP, кровь из глаз после вида исходников, и непреодолимое желание написать разработчикам, что бы поправили доку.
🛠 #балансбатл #networks
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
ㅤ
Последнее время всё чаще начал сталкиваться с тем, что IP сервера висит на Dummy интерфейсе и вещаются в сторону сетевиков организации/хостера/провайдера по BGP.
Вроде бы всё выглядит и ничего, и всё работает, но:
1. У меня есть Docker на таких серверах
2. И он в упор отказывается SNAT-ить контейнеры с IP Dummy-ка
Это надо как то исправить.
Смотрим, то что мы имеем
Такс, у нас есть:
Железонька стандартная, с двумя сетевыми интерфейсами, которые воткнуты в сеть провайдера.
- На интерфейсе
p1p0 у нас адрес 10.0.0.1/31 (у провайдера соответственно 10.0.0.0/31)- На интерфейсе
p1p1 у нас адрес 10.0.0.3/31 (у провайдера соответственно 10.0.0.2/31)- На интерфейсе
dummy-moew у нас висит адрес 188.222.33.1/32- На сервере стоит гордый птыц bird, который делает bgp с провайдером
Зачем 32е и 31е маски? Потому что могу, да и ну его, айпишники тратить на 30е маски...
Делаем докериную сетку (bridge) и запускаем контейнер (например
alpine:3), проверяем сетку:docker network create -d bridge br-dzhigurda
docker run -it --rm --network br-dzhigurda alpine:3
ping -c 1 8.8.8.8
Получаем:
PING 8.8.8.8 (8.8.8.8): 56 data bytes
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
Херня, товарищи! Идём смотреть правила в iptables:
-A POSTROUTING -s 198.18.66.0/24 ! -o br-dzhigurda -j MASQUERADE
Видим, что Docker делает MASQUERADE. Это обычный, всем привычный NAT, но! оно работает только с физическими сетевыми интерфейсами. И весь трафик от сервера выходит с IP именно физических интерфейсов. Нам такое не подходит.
Имеем, то что мы смотрим
Закапываемся в доку Docker и трём глаза в изумлении, ничего не нашли. Отлично, полезем в кишочки разбираться. Нам надо попробовать сделать вместо
MASQUERADE - SNAT.Идём в сырцы Docker (а точнее в moby/moby), грепаем, копаемся, и видим
// Файл integration/network/network_linux_test.go
ipv4SNATAddr := "172.0.0.172"
// Create a bridge network with --opt com.docker.network.host_ipv4=172.0.0.172
bridgeName := "hostIPv4Bridge"
network.CreateNoError(ctx, t, c, bridgeName,
network.WithDriver("bridge"),
network.WithOption("com.docker.network.host_ipv4", ipv4SNATAddr),
network.WithOption("com.docker.network.bridge.name", bridgeName),
)
Ага. В доке этого не было. Поехали, попробуем!
docker network create -d bridge br-fuckingsnat --opt com.docker.network.bridge.name=br-fuckingsnat --opt com.docker.network.host_ipv4=188.222.33.1
docker run -it --rm --network br-fuckingsnat alpine:3
ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=108 time=16.5 ms
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 16.497/16.497/16.497/0.000 ms
Отлично, связь есть. Смотрим в iptables:
-A POSTROUTING -s 198.18.66.0/24 ! -o br-fuckingsnat -j SNAT --to-source 188.222.33.1
Поразительно. Не, я точно слепой, такую же фичу не могли в документации пропустить... Или могли? Идём гуглим, и получаем всего один результат! И тот в Release Notes...
Итоги
Мы имеем работающие Docker контейнеры, которые SNAT-ятся с нужного нам IP, кровь из глаз после вида исходников, и непреодолимое желание написать разработчикам, что бы поправили доку.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Делал это для автоматического выполнения разных команд на сетевом оборудовании и парсинга по разным критериям.
🔤 🔤 🔥 🔤 🔤 🔤 🔤 🔤 🔤 🔤
Подключение к telnet c аутентификацией
Если же в конце этой кишки будет
Подключение через ipython:
Подключение к telnet без аутентификации
ㅤ
В
Добавить скрипт telnet_noauth с содержимым:
Дать права на исполнения:
Подключение через ipython:
Такие дела!
🛠 #балансбатл
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Подключение к telnet c аутентификацией
def respond_to_telnet_commands(sock, data):
"""Отвечает на IAC-команды, отправляя WONT на все DO и DONT на все WILL."""
i = 0
while i < len(data):
if data[i] == 0xff and i + 2 < len(data): # IAC
command, option = data[i + 1], data[i + 2]
if command == 0xfd: # DO
sock.send(bytes([0xff, 0xfc, option])) # WONT
elif command == 0xfb: # WILL
sock.send(bytes([0xff, 0xfe, option])) # DONT
i += 3
else:
i += 1
respond_to_telnet_commands - функция понадобится только если в ответе от сервера получаем такое b"\xff\xfb%\xff\xfb&\xff\xfd\x18\xff\xfd \xff\xfd#\xff\xfd'\xff\xfd$".Если же в конце этой кишки будет
login то всё ок можно сразу отправлять логин sock.send(b'login\r\n')Подключение через ipython:
import socket
sock = socket.socket()
sock.connect(('192.168.1.100', 5000))
data = sock.recv(1024)
print(data)
respond_to_telnet_commands(sock, data)
data = sock.recv(1024)
print(data)
respond_to_telnet_commands(sock, data)
data = sock.recv(1024)
print(data)
sock.send(b'<login>\r\n')
data = sock.recv(1024)
print(data)
sock.send(b'<pass>\r\n')
data = sock.recv(1024)
print(data)
sock.send(b'<command>\r\n')
data = sock.recv(1024)
print(data.decode())
Подключение к telnet без аутентификации
ㅤ
В
/etc/inetd.conf добавить:5000 stream tcp nowait root /usr/local/bin/telnet_noauth
telnet_noauth - 5000 можно заменить на любой порт или написать просто telnet будет использоваться для подключения порт 23<service_name>: имя службы (например, telnet), соответствует записи в /etc/services.<socket_type>: обычно stream (для TCP) или dgram (для UDP).<protocol>: протокол, например, tcp или udp.<wait/nowait>: wait (ждёт завершения процесса) или nowait (многопоточный).<user>: пользователь, от имени которого запускается служба (например, root).<server_program>: путь к исполняемому файлу службы (например, /usr/sbin/in.telnetd).<server_args>: аргументы для программы (обычно имя программы).Добавить скрипт telnet_noauth с содержимым:
#!/bin/bash
/bin/bash -i
Дать права на исполнения:
chmod +x /usr/local/bin/**telnet_noauth**
Подключение через ipython:
import socket
sock = socket.socket()
sock.connect(('192.168.1.100', 5000))
data = sock.recv(1024)
print(data)
sock.send(b'<command>\r\n')
data = sock.recv(1024)
print(data.decode())
Такие дела!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Если в каком-то скрипте лень заморачиваться с логами, можно воспользоваться утилитой
🔤 🔤 🔥 🔤 🔤 🔤 🔤 🔤 🔤 🔤
Например:
Просмотреть логи можно по тегу:
Можно указать приоритет сообщения текстом или числом, как в syslog:
А можно и префиксом в начале сообщения (число в угловых скобках):
В случаях отправки через
Для логирования
Во втором случае можно задать отдельный приоритет для сообщений из
😀 😃 😄 😁 😅 😂 🤣
😇 🙂 🙃 😉 😌 😍 🥰
😗 😙 😚 😋 😛 😝 😜
🤨 🧐 🤓 😎 🤩 🥳 😏
🛠 #балансбатл
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
systemd-cat. Она отправляет логи прямиком в journald.Например:
echo "Successful backup" | systemd-cat -t my-backup
Просмотреть логи можно по тегу:
journalctl -t my-backup
Можно указать приоритет сообщения текстом или числом, как в syslog:
echo "Шеф, усё пропало!" | systemd-cat -t my-backup -p 1
А можно и префиксом в начале сообщения (число в угловых скобках):
echo "<1>Шеф, усё пропало!" | systemd-cat -t my-backup
В случаях отправки через
pipe в journald попадет только то, что вывелось в stdout.Для логирования
stderr можно либо отправить stderr в stdout, либо запускать команду как аргумент systemd-cat:ls non-exists 2>&1 | systemd-cat -t my-log
systemd-cat -t my-log ls non-exists
Во втором случае можно задать отдельный приоритет для сообщений из
stderr: --stderr-priority.—
Please open Telegram to view this post
VIEW IN TELEGRAM
1 114
Как я проебал 4 часа из-за кавычки
Балансбатл заебал, теперь пишу Я, одним дублем, на ошибки не триггеритесь🥳
Да всё просто. После блокировок появилось много тикетов от клиентов, в которых говорилось - хочу GPT чат ёпта и чтобы блядь как раньше, нажал кнопочку и пошел работать.
Да, без GPT уже никто не работает, деградировали все сука в зеленые сопли.
Тут даже не «вайб-кодинг», а прям массовая истерия и осмысленный слив корпоративных данных.
Нужно проверить договор? Так этож его читать нужно, нахуй надо, заливаем в GPT, а он пусть анализирует риски и неточности. Ну и всё в таком духе.
😀 😃 😄 😁 😅 😂 🤣 😊
😇 🙂 🙃 😉 😌 😍 🥰 😘
😗 😙 😚 😋 😛 😝 😜 🤪
🤨 🧐 🤓 😎 🤩 🥳 😏 😒
Левой дрочу, правой жопу щекочу!
Короче спрос есть, тем более я умею настраивать
Хуль, пошел настраивать на серваки клиентов, настроил, пытаюсь подключиться с локальной машины. ХУЙ ТАМ ПЛАВАЛ! Сервер нотфаунд. Пробую курлы, телнеты, меняю порты — ничего!
Ладно, думаю у клиента сервак с плохим айпишником, пошел настраивать другому клиенту. Такая же история.
Хм… уже закономерность какая-то. Иду к третьему клиенту, переношу полностью образ своего сервера на его сервер. Ну теперь 100% заработает!
Ага, история повторяется… Сервер нотфаунд.
Ну не может же такого быть. У меня с моим сервером все работает, а с клиентскими не работает. Даж не курлит и не телнетит ничего. Однако.
Как говорится:
Утро вечера мудренее. Если что-то не получается, нужно это дело отложить и вернуться к нему позже. Так и сделал.
На утро вернулся и подумал иначе. А что если проблема — во мне? Нужно проверить эту гипотезу.
Беру ноут для созвонов, ставлю
Хм… иду за комп на котором все вчера настраивал — сервер нотфаунд.
Да ёбтавоюмать! Это как в nginx с редиректами, ебешься 5 часов, а потом понимаешь что дело не в nginx, а в твоём браузере. Оно закешировало запросы и похуй ему, редиректит по умолчанию, даже если меняешь конфиг nginx.
Что было?
😀 😃 😄 😁 😅 😂 🤣 😊
😇 🙂 🙃 😉 😌 😍 🥰 😘
😗 😙 😚 😋 😛 😝 😜 🤪
🤨 🧐 🤓 😎 🤩 🥳 😏 😒
Антивирус блядь! Какой не скажу, а то опять придут люди и начнут в меня письками тыкать и угрожать. Мыж с вами достаточно медийные, обсирать никого нельзя.
В антивирусе есть галка — Блокировать нерекомендуемые сайты.
Методом подбора эта галка была определена, она и блочила все мои попытки подключения. Это даже не фаервол, фаервол я отключал, когда настраивал
Это чисто хуйня, которая блядь неочевидно скрыта в другом разделе. И до сих пор непонятно, почему айпишники моих серверов это рекомендуемые, а айпишники клиентов это не рекомендуемые.
ㅤ
Так и живем. Один лишний пробел, одна не поставленная запятая, забытый таб, вполне может уничтожить твой день.
Но опять же опыт. Теперь при настройке подобного гавна, буду иметь это ввиду. Но это не точно. Я люблю по 5 раз наступать на грабли. Говорят на ошибках учатся, но это не про меня.
Век живи, век учись!
🛠 #рабочиебудни
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Балансбатл заебал, теперь пишу Я, одним дублем, на ошибки не триггеритесь
Самое главное в ходе дебага, не выйти на самого себя.
Да всё просто. После блокировок появилось много тикетов от клиентов, в которых говорилось - хочу GPT чат ёпта и чтобы блядь как раньше, нажал кнопочку и пошел работать.
Да, без GPT уже никто не работает, деградировали все сука в зеленые сопли.
Тут даже не «вайб-кодинг», а прям массовая истерия и осмысленный слив корпоративных данных.
Нужно проверить договор? Так этож его читать нужно, нахуй надо, заливаем в GPT, а он пусть анализирует риски и неточности. Ну и всё в таком духе.
Левой дрочу, правой жопу щекочу!
Короче спрос есть, тем более я умею настраивать
openconnect да и сам им пользуюсь в личных целях.Хуль, пошел настраивать на серваки клиентов, настроил, пытаюсь подключиться с локальной машины. ХУЙ ТАМ ПЛАВАЛ! Сервер нотфаунд. Пробую курлы, телнеты, меняю порты — ничего!
Ладно, думаю у клиента сервак с плохим айпишником, пошел настраивать другому клиенту. Такая же история.
Хм… уже закономерность какая-то. Иду к третьему клиенту, переношу полностью образ своего сервера на его сервер. Ну теперь 100% заработает!
Ага, история повторяется… Сервер нотфаунд.
Ну не может же такого быть. У меня с моим сервером все работает, а с клиентскими не работает. Даж не курлит и не телнетит ничего. Однако.
Как говорится:
Лох этот тот, кто пытается понять что вокруг происходит, хотя все кругом уже это понимают.
Утро вечера мудренее. Если что-то не получается, нужно это дело отложить и вернуться к нему позже. Так и сделал.
На утро вернулся и подумал иначе. А что если проблема — во мне? Нужно проверить эту гипотезу.
Беру ноут для созвонов, ставлю
openconnect клиента и без проблем подключаюсь ко всем 3м серверам которые вчера настраивал.Хм… иду за комп на котором все вчера настраивал — сервер нотфаунд.
Да ёбтавоюмать! Это как в nginx с редиректами, ебешься 5 часов, а потом понимаешь что дело не в nginx, а в твоём браузере. Оно закешировало запросы и похуй ему, редиректит по умолчанию, даже если меняешь конфиг nginx.
Что было?
Антивирус блядь! Какой не скажу, а то опять придут люди и начнут в меня письками тыкать и угрожать. Мыж с вами достаточно медийные, обсирать никого нельзя.
В антивирусе есть галка — Блокировать нерекомендуемые сайты.
Методом подбора эта галка была определена, она и блочила все мои попытки подключения. Это даже не фаервол, фаервол я отключал, когда настраивал
openconnect. Всегда фаер отключаю когда работы подобного плана делаю.Это чисто хуйня, которая блядь неочевидно скрыта в другом разделе. И до сих пор непонятно, почему айпишники моих серверов это рекомендуемые, а айпишники клиентов это не рекомендуемые.
ㅤ
Так и живем. Один лишний пробел, одна не поставленная запятая, забытый таб, вполне может уничтожить твой день.
Но опять же опыт. Теперь при настройке подобного гавна, буду иметь это ввиду. Но это не точно. Я люблю по 5 раз наступать на грабли. Говорят на ошибках учатся, но это не про меня.
Век живи, век учись!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Бесплатный онлифанс
😀 😃 😄 😁 😅 😂 🤣 😊
😇 🙂 🙃 😉 😌 😍 🥰 😘
😗 😙 😚 😋 😛 😝 😜 🤪
🤨 🧐 🤓 😎 🤩 🥳 😏 😒
🛠 #xfiles
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
begin 644 bashdays.txt
MT)_1@-"XT++0M=&"+"#1@="ZT+[0N]&,T+K0OB#0L=&#T+30M=&"(#$P,"\P
M+C4L(-"]T+#0O]"XT8C0N"#0OM&"T++0M=&"(-"R(-"ZT+[0O-"\T+70O=&"
MT+#1@-"XT8_1A2#0NB#0O]"^T8'1@M&#(-"X(-"RT+[0M]"\T+[0MM"]T+X@
IT8$@T8+0OM"QT+[0N2#1@="RT8_0MM"UT8+1@=&/(-"<T+#0NM&!+@H`
`
end
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Безумству храбрых поём мы песню
Ну чё, принёс я тебе «остров с сокровищами».
ㅤ
На карте наш подписчик рандомом разбросал 100 кодов. Каждый код ты можешь обменять на 500 настоящих рублей. Все коды установлены на поверхности для простоты поисков.
Поиск кодов это не основное, можно банально встретиться 1x1 и набить друг другу ебальник. Ну или просто почилить, отгрохать себе подземную базу или построить личный дата-центр.
Если будут лаги и т.п. пиши сюда @linuxfactorybot, бум разбираться.
Я нашел код, что дальше?
1. Делаешь скрин кода и координат XYZ (нажать F3)
2. Скидываешь эту инфу Максу
3. Забираешь приз
Что бы не было соблазна схитрить, предприняты меры, все ходы записаны, так что будь честен.
Как начать?
Качаешь клиент отсюда или берешь официальный. Версия сервера
Регистрация
Время работы сервера: c 05:00 МСК до 19:00 МСК
😀 😃 😄 😁 😅 😂 🤣 😊
😇 🙂 🙃 😉 😌 😍 🥰 😘
😗 😙 😚 😋 😛 😝 😜 🤪
🤨 🧐 🤓 😎 🤩 🥳 😏 😒
Что дальше?
А дальше посмотрим, если сервак переживет эту неделю и не будет уничтожен письками, то таблички с промокодами будут пополняться каждую неделю. Ну и время работы сервера будет увеличено. А по пятницам можно сходки устраивать, голосовой чатик замутить, пиво, все дела.
На этом пока всё. Хорошей тебе рабочей недели.
🛠 #островсокровищ
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Ну чё, принёс я тебе «остров с сокровищами».
ㅤ
На карте наш подписчик рандомом разбросал 100 кодов. Каждый код ты можешь обменять на 500 настоящих рублей. Все коды установлены на поверхности для простоты поисков.
Дополнительно установлены 10 кодов на два бесплатных месяца обучения в Linux Factory.
Поиск кодов это не основное, можно банально встретиться 1x1 и набить друг другу ебальник. Ну или просто почилить, отгрохать себе подземную базу или построить личный дата-центр.
Если будут лаги и т.п. пиши сюда @linuxfactorybot, бум разбираться.
Я нашел код, что дальше?
1. Делаешь скрин кода и координат XYZ (нажать F3)
2. Скидываешь эту инфу Максу
3. Забираешь приз
Что бы не было соблазна схитрить, предприняты меры, все ходы записаны, так что будь честен.
Учти, что за тобой будут охотиться специально обученные боты-вжопуебаки.
Как начать?
Качаешь клиент отсюда или берешь официальный. Версия сервера
1.21.8 Подключаешься к mc.bashdays.ru и погружаешься в приключения.Регистрация
/reg <пароль> <пароль>
/log <пароль>
Время работы сервера: c 05:00 МСК до 19:00 МСК
Что дальше?
А дальше посмотрим, если сервак переживет эту неделю и не будет уничтожен письками, то таблички с промокодами будут пополняться каждую неделю. Ну и время работы сервера будет увеличено. А по пятницам можно сходки устраивать, голосовой чатик замутить, пиво, все дела.
На этом пока всё. Хорошей тебе рабочей недели.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Хотел бы предложить пост о деградации батареи в Linux.
🔤 🔤 🔥 🔤 🔤 🔤 🔤 🔤 🔤 🔤 🔤 🔤 🔤
Оригинал статьи написал для своего блога и хотел бы поделиться с интересующейся Linux-ом аудиторией 👇
https://alchemmist.xyz/ru/articles/battery-degradation/
🛠 #балансбатл #людипишут
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Оригинал статьи написал для своего блога и хотел бы поделиться с интересующейся Linux-ом аудиторией 👇
https://alchemmist.xyz/ru/articles/battery-degradation/
—
Please open Telegram to view this post
VIEW IN TELEGRAM
1 38
Как-то давненько пришлось мне отлаживать большущую APIху, но под рукой была только консолька. Ни о каком GUI и речь не шла. А пулять запросы через
ㅤ
Тем более хотелось что-то организованное и визуально приятное.
Postman сразу мимо, это гавно сделали настолько перегруженным, что им пользоваться уже нереально, да и под чистым терминалом его не запустишь.
Выбор пал на Posting. Это TUI клиент со всем необходимым функционалом.
Так он и прижился, сейчас если что-то нужно отладить или потестить у меня есть эта замечательная тулза. Не перегружена хуйнёй и дружелюбная. Есть все самое необходимое, даже мышкой можно тыкать. Ну и сессии сохраняет со всеми запросами.
Ставится элементарно:
Для хакерменов прям мастхев. Забирай в копилку, годнота!
🛠 #linux #utilites
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
curl я заебался.ㅤ
Тем более хотелось что-то организованное и визуально приятное.
Postman сразу мимо, это гавно сделали настолько перегруженным, что им пользоваться уже нереально, да и под чистым терминалом его не запустишь.
Выбор пал на Posting. Это TUI клиент со всем необходимым функционалом.
Так он и прижился, сейчас если что-то нужно отладить или потестить у меня есть эта замечательная тулза. Не перегружена хуйнёй и дружелюбная. Есть все самое необходимое, даже мышкой можно тыкать. Ну и сессии сохраняет со всеми запросами.
Ставится элементарно:
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install --python 3.13 posting
uv — это современный инструмент для Python, который объединяет в себе функционал менеджера пакетов и виртуальных окружений, задумывается как замена pip + venv/virtualenv + pip-tools.
Для хакерменов прям мастхев. Забирай в копилку, годнота!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Из каждого чайника слышу про ZED, это такой новомодный IDE от авторов Atom. Славится своей скоростью и минимализмом, никаких тебе новогодних ёлок и перегруженных интерфейсов. Чем-то напоминает VIM.
ㅤ
Дошли руки потыкать. Но одного желания мало, под винду сука дистрибутив не завезли. Хочешь под винду? Скомпилируй из исходников!
😀 😃 😄 😁 😅 😂 🤣 😊
😇 🙂 🙃 😉 😌 😍 🥰 😘
😗 😙 😚 😋 😛 😝 😜 🤪
🤨 🧐 🤓 😎 🤩 🥳 😏 😒
Да легко! Спустя 4 часа ебатни и дебага — спасибо, идите нахуй!
Залил в себя пару пиалок до-хун-пао, словил дзен и нашел выход.
Пиздуем на сайт и ищем ZED. Ебала жаба гадюку! Всё уже придумано и собрано за нас. Верните мне 4 часа компиляции!
Открываем CMD и хуячим:
Всё!
Если не установлен
Что по IDE?
Моё почтение, все нужные мне плагины по девопсовым делам — есть. Даже маркдаун и превью работает. Шикарно!
Из коробки есть подключение к удаленным серверам. То есть подключаешься к своему удаленному серверу разработки и пишешь код. В лучших традициях VSCode.
Чтобы по умолчанию в качестве терминала у тебя не открывался CMD, делаем финт ушами и дружим ZED с WSL.
Теперь открывается ZSH, или что там у тебя установлено в WSL.
Больше добавить пока нечего, всё нравится. Буду тыкать, а там уже посмотрим.
🛠 #windows #ide #dev
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
ㅤ
Дошли руки потыкать. Но одного желания мало, под винду сука дистрибутив не завезли. Хочешь под винду? Скомпилируй из исходников!
Да легко! Спустя 4 часа ебатни и дебага — спасибо, идите нахуй!
Если официальный мануал по компиляции писала жопорукая обезьяна, тут уже ничего с этим не поделаешь.
Залил в себя пару пиалок до-хун-пао, словил дзен и нашел выход.
Пиздуем на сайт и ищем ZED. Ебала жаба гадюку! Всё уже придумано и собрано за нас. Верните мне 4 часа компиляции!
Открываем CMD и хуячим:
scoop bucket add extras
scoop install extras/zed
Всё!
Если не установлен
scoop, ставим так:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
irm get.scoop.sh | iex
Что по IDE?
Моё почтение, все нужные мне плагины по девопсовым делам — есть. Даже маркдаун и превью работает. Шикарно!
Из коробки есть подключение к удаленным серверам. То есть подключаешься к своему удаленному серверу разработки и пишешь код. В лучших традициях VSCode.
Чтобы по умолчанию в качестве терминала у тебя не открывался CMD, делаем финт ушами и дружим ZED с WSL.
"terminal": {
"shell": {
"program": "C:\\Windows\\System32\\wsl.exe"
},
"font_family": "Hack Nerd Font Mono",
"font_size": 15,
"line_height": "standard"
}Теперь открывается ZSH, или что там у тебя установлено в WSL.
Ааа, забыл, в ZED можно подключить ИИ агенты, причем можешь локально поднять дипсик или т.п. и использовать его прям в IDE.
Больше добавить пока нечего, всё нравится. Буду тыкать, а там уже посмотрим.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
1 49
Поделюсь своим решением, как я организовал бэкапы баз 1С. Основное требование к решению (за исключением работоспособности) - использование штатного ПО, которое уже есть в репозитории/ничего дополнительно не устанавливать. Имитация закрытого контура.
🔤 🔤 🔥 🔤 🔤 🔤 🔤 🔤 🔤
Итак, условия: windows server на котором работает 1с и на нем же PostgreSQL и некое файловое хранилище, к которому есть доступ исключительно по ftp.
ㅤ
Из утилит, которыми можно решать задачу, под рукой оказалась
Бэкап базы 1С будем делать штатной программой от 1С. Однозначного мнения нет, чем лучше бэкапить - средствами СУБД или этой программой, есть у каждого варианта свои преимущества и недостатки. В нашем варианте используем именно ПО от 1С.
Чтобы делать это с помощью планировщика, делаем простой .bat для windows сервера, имя файла отражает дату его создания.
Бэкапы базы сохраняются локально. Теперь надо их оттуда забрать и бережно перенести на файловое хранилище.
Для этих целей хорошо подойдет
Формат будущей команды выглядит так:
Обращайте внимание на слэши в конце пути - играют роль в вопросе перенести папку целиком или же ее содержимое, без создания одноименной папки в точке назначения.
Все хорошо, но rsync работает, если хотя бы один путь локальный, а у нас два удаленных хоста. Выход есть. Примонтируем папку с бэкапами по SMB.
Строка в
В
Далее, возникла засада в виде того, что если доступ есть по
В этой ситуации поможет замечательная
Установим ее и добавим своего пользователя в группу fuse (чтобы работать без повышения привилегий):
Создаем файлик с кредами, создаем папку куда будем монтировать и подключаемся (все от своего пользователя):
Кроме работы
Стоит еще пояснить о ключе
🛠 #балансбатл #людипишут
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Итак, условия: windows server на котором работает 1с и на нем же PostgreSQL и некое файловое хранилище, к которому есть доступ исключительно по ftp.
ㅤ
Из утилит, которыми можно решать задачу, под рукой оказалась
rsync.Бэкап базы 1С будем делать штатной программой от 1С. Однозначного мнения нет, чем лучше бэкапить - средствами СУБД или этой программой, есть у каждого варианта свои преимущества и недостатки. В нашем варианте используем именно ПО от 1С.
Чтобы делать это с помощью планировщика, делаем простой .bat для windows сервера, имя файла отражает дату его создания.
set datetemp=%date:~-10%`
"C:\Program Files\1cv8\8.3.24.1819\bin\ibcmd.exe" infobase dump --db-server=localhost --dbms=PostgreSQL --db-name=название_бд --db-user=имя_пользователя_бд --db-pwd=пароль_пользователя_бд --user=имя_пользователя_в_1С --password=пароль_пользователя_1С "C:\путь_для_бэкапа\имя_файла_"%datetemp%".dt"
Бэкапы базы сохраняются локально. Теперь надо их оттуда забрать и бережно перенести на файловое хранилище.
Для этих целей хорошо подойдет
rsync. Поднимать сервер rsync не хотелось, поэтому пошел по пути набора команд.Формат будущей команды выглядит так:
rsync -av ~/bases_1s/bgu ~/backup/
Rsync (ключа а = в архивном режиме, его обычно достаточно для целей бэкапа, ключ v добавит подробностей) скопирует папку bgu из ~/bases_1s и положит их в ~/backup/.Обращайте внимание на слэши в конце пути - играют роль в вопросе перенести папку целиком или же ее содержимое, без создания одноименной папки в точке назначения.
Все хорошо, но rsync работает, если хотя бы один путь локальный, а у нас два удаленных хоста. Выход есть. Примонтируем папку с бэкапами по SMB.
Строка в
/etc/fstab выглядит у меня так://192.168.0.2/название_папки_на_сервере_win /home/user/bases_1s cifs credentials=/home/user/.smbcreds,noauto,users,iocharset=utf8,uid=500,gid=500 0 0
В
.smbcreds лежит логин с паролем пользователя windows сервера, noauto=не монтировать при запуске.Далее, возникла засада в виде того, что если доступ есть по
ftp, то rsync бессилен, ftp - протокол и rsync тоже протокол и надо выбрать.В этой ситуации поможет замечательная
curlftpfs. Утилита позволяет монтировать удаленные ftp папки в локальную файловую систему.Установим ее и добавим своего пользователя в группу fuse (чтобы работать без повышения привилегий):
apt-get install curlftpfs
usermod -aG fuse имя_пользователя.
Создаем файлик с кредами, создаем папку куда будем монтировать и подключаемся (все от своего пользователя):
echo 'machine 192.168.0.18
login фтп_юзер
password пароль' > .netrc
Кроме работы
rsync есть еще реализация резервного копирования посредством cp. Оставил пока как есть, в планах единообразить и прикрутить отчет о выполнении. На данном этапе скрипт выглядит примерно так, смотри в первом комментарии к этому посту, одним кадром не влез.
Стоит еще пояснить о ключе
--temp-dir=/tmp/rs в команде rsync. Он нужен чтобы обойти ограничение "ftp файловой системы", которая не поддерживает создание временных файлов.—
Please open Telegram to view this post
VIEW IN TELEGRAM
Рубрика "упоротые однострочники".
🔤 🔤 🔥 🔤 🔤 🔤 🔤 🔤 🔤
Как послать
ㅤ
Первым делом мы шлём в известный нам сервер кластера
Референс команды cluster nodes.
Пример выхлопа
Дальше мы парсим выхлоп
Ура, у нас есть список редисок с портами. Всё это заворачиваем в
И кайф, осталось порезать по двоеточию в разные переменные хост и порт, и, вооружившись
Режем строку по двоеточию на 2 переменных
Итого у нас получается следующее:
Выводим себе для удобства чтения результата хост редиса и порт куда стучимся:
И
Получаем на выходе:
🛠 #балансбатл #людипишут
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Как послать
PING всем серверам кластера редиса и не умереть от скукиㅤ
for nodeport in $(echo "CLUSTER NODES" | nc redis.example 6900 | awk '$1~/^[0-9a-z].*$/ {sub("@"," "); print $2}'); do IFS=":" read -r node port <<< $nodeport; echo -n "$nodeport: "; echo "PING" | nc $node $port; doneПервым делом мы шлём в известный нам сервер кластера
redis команду CLUSTER NODES.echo "CLUSTER NODES" | nc redis.example 6900
Референс команды cluster nodes.
Пример выхлопа
shell$5256
07c37dfeb235213a872192d90877d0cd55635b91 127.0.0.1:30004@31004,hostname4 slave e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 0 1426238317239 4 connected
67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 127.0.0.1:30002@31002,hostname2 master - 0 1426238316232 2 connected 5461-10922
292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 127.0.0.1:30003@31003,hostname3 master - 0 1426238318243 3 connected 10923-16383
6ec23923021cf3ffec47632106199cb7f496ce01 127.0.0.1:30005@31005,hostname5 slave 67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 0 1426238316232 5 connected
824fe116063bc5fcf9f4ffd895bc17aee7731ac3 127.0.0.1:30006@31006,hostname6 slave 292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 0 1426238317741 6 connected
e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 127.0.0.1:30001@31001,hostname1 myself,master - 0 0 1 connected 0-5460
Дальше мы парсим выхлоп
awk-шкой, так как нам нужны чисто IP и портawk '$1~/^[0-9a-z].*$/ {sub("@"," "); print $2}')$1~/^[0-9a-z].*$/ - берём строчки, которые начинаются с циферкобуковок{sub("@"," "); print $2} - режем дополнительно по символу собаки, выводим 2ю колонку. Получаем:127.0.0.1:30004
127.0.0.1:30002
127.0.0.1:30003
127.0.0.1:30005
127.0.0.1:30006
127.0.0.1:30001
Ура, у нас есть список редисок с портами. Всё это заворачиваем в
for:for nodeport in $(echo "CLUSTER NODES" | nc redis.example 6900 | awk '$1~/^[0-9a-z].*$/ {sub("@"," "); print $2}'); do ...; doneИ кайф, осталось порезать по двоеточию в разные переменные хост и порт, и, вооружившись
netcat-ом, сделать PING.Режем строку по двоеточию на 2 переменных
IFS=":" read -r node port <<< $nodeport;
Итого у нас получается следующее:
nodeport=127.0.0.1:30004
node=127.0.0.1
port=30004
Выводим себе для удобства чтения результата хост редиса и порт куда стучимся:
echo -n "$nodeport: "
И
netcat-ом шлём команду PING уже на ноду.echo "PING" | nc $node $port
Получаем на выходе:
127.0.0.1:30004: +PONG
127.0.0.1:30002: +PONG
127.0.0.1:30003: +PONG
127.0.0.1:30005: +PONG
127.0.0.1:30006: +PONG
127.0.0.1:30001: +PONG
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Закончилось место на диске? Или же закончились inode?
🔤 🔤 🔥 🔤 🔤 🔤 🔤 🔤 🔤
Ситуация неприятная и чаще всего выходом служит удаление "ненужных" файлов. Рассмотрим ситуацию, когда все файлы нужны, то есть удалять ничего не будем.
ㅤ
В качестве примера, смоделируем ситуацию, когда в файловой системе закончились inode.
Создадим файловую систему с небольшим количеством inode на виртуальном блочном устройстве, позаимствовав немного места с реальной файловой системы:
Монтируем файловую систему:
Забиваем ее до отказа файлами:
Проверяем:
Вывод:
Все, создавать новые файлы нельзя. Если сильно надо, выход есть. Понадобится свободное место, с файловой системой ext4.
Сделаем еще одно виртуальное блочное устройство, на нем файловую систему и пару папок для наших нужд.
Теперь главное:
Здесь монтируется специальная файловая система overlayfs.
Аргументы:
В терминологии
Проверяем:
Теперь посмотрим в up:
Вариант для экстремалов (можно задействовать оперативную память, если свободного места нет совсем):
Фактически, это
Теперь пара слов про overlayfs.
Функционал реализован модулем ядра, который, возможно, нужно включить:
Если вывод пустой, то:
Как видно из вышесказанного, особенность этой файловой системы - она работает с директориями а не с устройствами.
На этом все. Выражаю благодарность за идею статьи @AlexeyVictorovi4
🛠 #балансбатл #людипишут
—
✅ @bashdays ✅ @linuxfactory ✅ @blog
Ситуация неприятная и чаще всего выходом служит удаление "ненужных" файлов. Рассмотрим ситуацию, когда все файлы нужны, то есть удалять ничего не будем.
ㅤ
В качестве примера, смоделируем ситуацию, когда в файловой системе закончились inode.
Создадим файловую систему с небольшим количеством inode на виртуальном блочном устройстве, позаимствовав немного места с реальной файловой системы:
dd if=/dev/zero of=/home/user/fs.img count=1000 bs=4096K
mkfs.ext4 -N 512 /home/user/fs.img
Монтируем файловую систему:
mkdir newfs
mount /home/user/fs.img newfs/
Забиваем ее до отказа файлами:
touch file{1..501}Проверяем:
df -i newfs
Вывод:
[root@14 ~] df -i newfs/
/dev/loop6 512 512 0 100% /root/newfs
Все, создавать новые файлы нельзя. Если сильно надо, выход есть. Понадобится свободное место, с файловой системой ext4.
Сделаем еще одно виртуальное блочное устройство, на нем файловую систему и пару папок для наших нужд.
dd if=/dev/zero of=/home/user/newfs.img count=1500 bs=4096K
mkfs.ext4 /home/user/newfs.img
mount /home/user/newfs.img freespacefs
mkdir -p freespacefs/{up,service}
Теперь главное:
mount -t overlay overlay -olowerdir=newfs,upperdir=freespacefs/up,workdir=freespacefs/service newfs
Здесь монтируется специальная файловая система overlayfs.
Аргументы:
lowerdir - директория, которую расширяем. Может быть любой файловой системой, может быть смонтирована только на чтение. В терминологии overlayfs - нижний слой.upperdir - директория на файловой системе с поддержкой d-type (например, ext4).В терминологии
overlayfs верхний слой. В эту папку реально будут попадать результаты деятельности (новые файлы например) workdir- служебная директория, нужна для работы overlayfs. Должна находится на той же файловой системе, что и upperdir.Проверяем:
[root@14 ~] df -i newfs
overlay 376K 16 376K1% /root/newfs
занято 1 % inode.
[root@14 ~] df -i newfs
[root@14 ~] touch newfs/extrafile
[root@14 ~] ls newfs/
extrafile file125 file152 file1.....
(вывод обрезан, здесь 501 файл)
Теперь посмотрим в up:
[root@14 ~] ls freespacefs/up
extrafile
Вариант для экстремалов (можно задействовать оперативную память, если свободного места нет совсем):
[root@14 ~] mkdir ramfs
[root@14 ~] mount -t tmpfs tmpfs -osize=4G ramfs
[root@14 ~] mkdir ramfs/{up,work}
[root@14 ~] mount -t overlay overlay -\ olowerdir=newfs,upperdir=ramfs/up,workdir=ramfs/work newfs
[root@14 ~] df -h newfs/
overlay 7,8G 8,7M 7,8G 1% /root/newfs
Фактически, это
tmpfs, которая располагается в оперативной памяти, и стоит об этом помнить.Теперь пара слов про overlayfs.
Функционал реализован модулем ядра, который, возможно, нужно включить:
[root@14 tmp] lsmod | grep overlay
Если вывод пустой, то:
[root@14 tmp] modprobe overlay
Как видно из вышесказанного, особенность этой файловой системы - она работает с директориями а не с устройствами.
На этом все. Выражаю благодарность за идею статьи @AlexeyVictorovi4
—
Please open Telegram to view this post
VIEW IN TELEGRAM
10 109