Авторский блог про сетевое и системное администрирование.
Сайт: networkadmin.ru
Реклама: @dad_admin
Биржа: https://telega.in/c/networkadminru
Post #603
2.32K
NE @networkadminru
Showing posts older than #604 · Back to latest
sudo apt install libpam-google-authenticator # на debian/ubuntu
sudo yum install google-authenticator # на RHEL/centOS
google-authenticator
sudo nano /etc/pam.d/sshd
auth required pam_google_authenticator.so
sudo nano /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
UsePAM yes
sudo systemctl restart sshd
sudo apt install oathtool
oathtool --totp -b 'JBSWY3DPEHPK3PXP'
totp() {
oathtool --totp -b "$1"
}
totp JBSWY3DPEHPK3PXP
stat file.txt
File: file.txt
Size: 3 Blocks: 8 IO Block: 4096 regular file
Device: fe00h/65024d Inode: 657571 Links: 1
Access: 2025-08-22 00:31:39.446518364 +0300
Modify: 2025-08-22 00:30:55.460753550 +0300
Change: 2025-08-22 00:30:55.460753550 +0300
Birth: 2025-08-22 00:30:45.778142819 +0300
noatime - метка не обновляется вовсе;relatime (по умолчанию) - обновляется, если: прошло более 24 часов с последнего доступа; atime < mtime или ctime.
cat file.txt
stat file.txt # atime обновится
cat file.txt
stat file.txt # atime НЕ обновится, если прошло меньше 24ч
chmod 644 file.txt
# изменится только ctime, mtime останется прежним
# Найти файлы, измененные по содержимому за последние 2 дня
find . -mtime -2
# Найти файлы с измененными правами/владельцем за последние 2 дня
find . -ctime -2
apt install php php-mysqli
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz
tar xzvf phpMyAdmin-5.2.1-all-languages.tar.gz
cd phpMyAdmin-5.2.1-all-languages
php -S 172.27.50.130:8080
ping с флагом запрета фрагментации (в Linux - -M do):
ping -c 4 -M do -s 1472 8.8.8.8
Почему 1472? 1472 байта данных + 28 байт заголовков (IP + ICMP) = 1500 байт - стандартное MTU для Ethernet.
Frag needed and DF set
tracepath 8.8.8.8
ethernets:
eth0:
dhcp4: yes
mtu: 1400
ip link set dev eth0 mtu 1400
При использовании VPN и туннелей (WireGuard, IPsec, OpenVPN)
В облачных сетях с Jumbo Frames
При неправильно настроенном MSS (Maximum Segment Size)
iptables для автоматической коррекции MSS:
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu
lsmem
RANGE SIZE STATE REMOVABLE BLOCK
0x0000000000000000-0x00000000f7ffffff 3.9G online yes 0-30
0x0000000100000000-0x0000000107ffffff 128M online yes 32
chmem -d 1G
chmem -d -b 22-29
lsmem
chmem -e 1G
ss -tulnp
-tuln - TCP/UDP, слушающие, без разрешения имен-p - имя процесса и PID
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
lsof -i :80
lsof -nP -iTCP -sTCP:LISTEN
/proc - внутренняя кухня процесса. Для изучения процесса изнутри можно обратиться к /proc/<PID>/fd - тут видны все открытые дескрипторы:
ls -l /proc/1234/fd
ls -l /proc/1234/fd | grep socket
cat /proc/1234/cmdline
ss -tulnp | grep :8080
lsof -p 1234 -i
/fd - дескрипторы/status - ресурсы и права/cmdline - команда запуска/etc/passwd - основная информация о пользователях
/etc/shadow - пароли пользователей
/etc/group - группы
/etc/gshadow - пароли групп (редко)
/home/ - директории пользователей и их данные (если нужно)
awk -F: '$3 >= 1000 && $3 < 60000 { print $1 }' /etc/passwd
#пользователей
awk -F: '$3 >= 1000 && $3 < 60000' /etc/passwd > users.passwd
#пароли
awk -F: 'NR==FNR{a[$1]; next} $1 in a' users.passwd /etc/shadow > users.shadow
#группы
awk -F: '$3 >= 1000 && $3 < 60000' /etc/group > users.group
awk -F: 'NR==FNR{a[$1]; next} $1 in a' users.passwd /etc/gshadow > users.gshadow
users.passwd, users.shadow, users.group, users.gshadow на новый сервер.
cp /etc/passwd /etc/passwd.bak
cp /etc/shadow /etc/shadow.bak
cp /etc/group /etc/group.bak
cp /etc/gshadow /etc/gshadow.bak
cat users.passwd >> /etc/passwd
cat users.shadow >> /etc/shadow
cat users.group >> /etc/group
cat users.gshadow >> /etc/gshadow
rsync -avz /home/ user@newserver:/home/
chown -R username:groupname /home/username
getent passwd имя_пользователя
id имя_пользователя
su - имя_пользователя
/etc/sudoers или /etc/sudoers.d/.
journalctl -u nginx.service
journalctl -u ssh.service -b
journalctl -p err # Только ошибки и критичнее
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
journalctl -u ssh.service -p warning
journalctl --since "1 hour ago"
journalctl --since "2025-09-18" --until "2025-09-19 03:00"
/run/log/journal (в RAM), если /var/log/journal отсутствует. Чтобы сохранять логи между перезагрузками:
mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
systemctl restart systemd-journald
/etc/systemd/journald.conf можно настроить:
Storage=persistent
SystemMaxUse=500M
RuntimeMaxUse=100M
MaxRetentionSec=7day
systemctl restart systemd-journald
journalctl _TRANSPORT=kernel -p err
journalctl _PID=1234
journalctl _COMM=nginx
#!/bin/bash
# Удаляем старый список (если был)
ipset destroy whitelist 2>/dev/null
# Создаем новый
ipset create whitelist hash:net
# Скачиваем нужные страны (пример: некоторые страны СНГ)
wget -O netwhite http://www.ipdeny.com/ipblocks/data/countries/{ru,kz,by,uz,kg,am,az,ge,tj}.zone
# Добавляем подсети в ipset
for ipnet in $(cat netwhite); do
ipset add whitelist $ipnet
done
# Проверка
ipset save whitelist > whitelist-export.txt
echo "IP-сети загружены в ipset"
iptables -A INPUT -m set --match-set whitelist src -p tcp --dport 80 -j ACCEPT
fakeroot. Оказывается, она довольно старая и есть в стандартных репозиториях большинства дистрибутивов. Программа запускает окружение, в котором приложения думают, что работают с root-доступом. На самом деле вы остаетесь обычным пользователем, а fakeroot просто перехватывает системные вызовы (через LD_PRELOAD) и подменяет информацию.
sudo apt install fakeroot
fakeroot
touch test.txt
ls -la test.txt
-rw-r--r-- 1 root root 0 ...
-rw-r--r-- 1 username username 0 ...
cat /sys/block/sda/queue/rotational
1
cat /sys/block/sde/queue/rotational
0
/etc/ansible/ansible.cfg (или в локальной копии ansible.cfg) пропишите:
[defaults]
log_path = /var/log/ansible.log
- name: Установка nginx
apt:
name: nginx
state: present
tags:
- web
- nginx
- name: Показываем значение переменной
debug:
var: some_variable
- name: Логируем запуск
shell: echo "{{ ansible_date_time.iso8601 }}: {{ inventory_hostname }} - {{ ansible_user }}" >> /var/log/ansible_run.log
[defaults]
stdout_callback = yaml
[defaults]
callback_whitelist = json
stdout_callback = json
log_path = /var/log/ansible-json.log
ansible-playbook site.yml | tee -a /var/log/ansible-run-$(date +%F-%T).log
📍 Повышение пропускной способности;
📍 Повышение отказоустойчивости (если один порт отваливается - остальные продолжают работать);
📍 Балансировка нагрузки между портами.
📍 LACP автоматически обнаруживает, какие интерфейсы можно объединить
📍 Обе стороны (свитч и хост) договариваются, какие порты войдут в LAG
📍 Если кабель выпал или порт упал - он просто исключается из группы, ничего не рушится
sudo apt install ifenslave
/etc/network/interfaces или аналогичном конфиге:
auto bond0
iface bond0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
bond-slaves ens33 ens34
bond-mode 802.3ad
bond-miimon 100
bond-lacp-rate fast
bond-xmit-hash-policy layer3+4
📍 LACP работает только при поддержке с обеих сторон (сервер + свитч)
📍 LAG не удваивает скорость для одного TCP-соединения, но позволяет нескольким соединениям распределяться по разным каналам
📍 Лучше всего работает с хешированием по Layer3+4 (IP + порт)
stress или stress-ng не всегда хочется. К счастью, это можно сделать встроенными средствами - через dd, sha1sum, yes, /dev/zero, /dev/urandom и другие.
while true; do
dd if=/dev/urandom count=30M bs=1 | bzip2 -9 > /tmp/tempfile
rm -f /tmp/tempfile
done
/dev/urandom → нагрузка на диск
bzip2 -9 → нагрузка на CPU
count=30M - объем данных
-9 - максимальная степень сжатия
sync; dd if=/dev/zero of=/tmp/tempfile bs=1M count=1024; sync
dd if=/dev/zero of=/dev/null
cpuload() {
dd if=/dev/zero of=/dev/null &
dd if=/dev/zero of=/dev/null &
}
cpuload; read; pkill dd
sha1sum /dev/zero
seq 4 | xargs -P0 -n1 timeout 10 sha1sum /dev/zero
seq 4 | xargs -P0 -n1 timeout 10 yes > /dev/null
python3 -c 'a="a"*1024**3; input()'