rubric/modules/linuxmodules/linux_netfs.go
2026-04-06 11:02:36 +03:00

346 lines
15 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package linuxmodules
import (
"fmt"
"rubric/utils"
)
var NetfsModule = Module{
Key: "netfs",
Aliases: []string{"nfs", "smb", "samba", "autofs", "сетевые-фс"},
Title: "Сетевые файловые системы",
Description: "Темы 5559: IPv6, передача файлов, NFS, SMB/Samba, autofs",
Run: showNetfs,
}
func showNetfs() {
utils.Header("Linux — Сетевые файловые системы")
// ─── 55. IPv6 ─────────────────────────────────────────────────
utils.Section("55. Работа с IPv6")
utils.Println("IPv6 — протокол интернета следующего поколения (128-битные адреса).")
fmt.Println()
utils.Println(utils.ColorBold + "Формат IPv6 адресов:" + utils.ColorReset)
utils.Code(`Формат: 8 групп по 4 hex-цифры, разделённых :
2001:0db8:85a3:0000:0000:8a2e:0370:7334
Сокращения:
- Ведущие нули в группе можно опустить: 0db8 → db8
- Одну последовательность групп из нулей → ::
2001:db8::1 (полный: 2001:0db8:0000:0000:0000:0000:0000:0001)
::1 — loopback (аналог 127.0.0.1)
fe80::/10 — link-local (автоконфигурация в подсети)
fd00::/8 — уникальные локальные (аналог 192.168.x.x)
2000::/3 — глобальные unicast (публичные)
Длина префикса: 2001:db8::/32 (аналог маски подсети)`)
utils.Println(utils.ColorBold + "Настройка IPv6 через nmcli:" + utils.ColorReset)
utils.Code(`# Статический IPv6:
nmcli con mod eth0 ipv6.addresses "2001:db8::10/64"
nmcli con mod eth0 ipv6.gateway "2001:db8::1"
nmcli con mod eth0 ipv6.method manual
nmcli con up eth0
# SLAAC (автоконфигурация):
nmcli con mod eth0 ipv6.method auto
# DHCPv6:
nmcli con mod eth0 ipv6.method dhcp
# Отключить IPv6 для интерфейса:
nmcli con mod eth0 ipv6.method disabled`)
utils.Println(utils.ColorBold + "IPv6 команды:" + utils.ColorReset)
utils.Command("ip -6 addr", "IPv6 адреса интерфейсов")
utils.Command("ip -6 route", "IPv6 таблица маршрутов")
utils.Command("ping6 ::1", "ping loopback IPv6")
utils.Command("ping6 fe80::1%eth0", "ping link-local с указанием интерфейса")
utils.Command("traceroute6 2001:4860:4860::8888", "traceroute IPv6")
utils.Command("ss -6 -tuln", "IPv6 порты")
utils.Command("dig AAAA google.com", "DNS AAAA запись (IPv6)")
// ─── 56. Передача файлов по сети ─────────────────────────────
utils.Section("56. Передача файлов по сети")
utils.Println(utils.ColorBold + "SCP — копирование через SSH:" + utils.ColorReset)
utils.Code(`# Скопировать локальный файл на сервер:
scp file.txt user@server:/path/to/dest/
# Скопировать с сервера на локальную машину:
scp user@server:/path/file.txt /local/path/
# Директорию рекурсивно:
scp -r mydir/ user@server:/tmp/
# Нестандартный порт:
scp -P 2222 file.txt user@server:/tmp/
# С указанием ключа:
scp -i ~/.ssh/mykey file.txt user@server:/tmp/
# Между двумя серверами:
scp user1@server1:/path/file.txt user2@server2:/path/`)
utils.Println(utils.ColorBold + "SFTP — интерактивная передача файлов:" + utils.ColorReset)
utils.Code(`# Подключиться:
sftp user@server
sftp -P 2222 user@server
# Команды в интерактивном режиме:
ls — список файлов на сервере
lls — список файлов локально
pwd — директория на сервере
lpwd — локальная директория
cd /remote/path — перейти на сервере
lcd /local/path — перейти локально
get file.txt — скачать файл
get -r dir/ — скачать директорию
put file.txt — загрузить файл
put -r dir/ — загрузить директорию
rm file.txt — удалить на сервере
mkdir newdir — создать директорию на сервере
exit / quit — выйти`)
utils.Println(utils.ColorBold + "rsync — эффективная синхронизация:" + utils.ColorReset)
utils.Code(`# rsync передаёт только изменения — быстрее scp для больших объёмов.
# Синхронизировать локально:
rsync -av /source/ /dest/
# Синхронизировать на удалённый сервер:
rsync -avz /local/data/ user@server:/remote/data/
# С сервера локально:
rsync -avz user@server:/remote/data/ /local/data/
# Ключи:
# -a — архивный режим (сохраняет права, время, симлинки)
# -v — verbose
# -z — сжатие при передаче
# -P — прогресс + продолжение прерванной передачи
# --delete — удалять файлы которых нет в источнике
# --exclude='*.log' — исключить паттерн
# -n / --dry-run — симуляция (что будет скопировано)
# -e "ssh -p 2222" — нестандартный порт SSH
# Зеркалирование с исключениями:
rsync -avz --delete \
--exclude='.git/' \
--exclude='node_modules/' \
/project/ user@server:/var/www/project/`)
// ─── 57. NFS ──────────────────────────────────────────────────
utils.Section("57. Сетевые файловые системы — NFS")
utils.Println("NFS (Network File System) — монтирование директорий с удалённых серверов.")
utils.Println("Прозрачно для приложений: работает как обычная локальная ФС.")
fmt.Println()
utils.Println(utils.ColorBold + "Сервер NFS — настройка экспорта:" + utils.ColorReset)
utils.Code(`# Установка:
dnf install nfs-utils # RHEL/Fedora
apt install nfs-kernel-server # Debian/Ubuntu
# Включить и запустить:
systemctl enable --now nfs-server # RHEL
systemctl enable --now nfs-kernel-server # Ubuntu
# Настройка экспортов /etc/exports:
# директория клиент(опции)
/shared 192.168.1.0/24(rw,sync,no_root_squash)
/data *(ro,sync) # всем только чтение
/home/alice server2(rw,sync,no_subtree_check)
# Опции:
# rw — чтение и запись
# ro — только чтение
# sync — синхронная запись (безопасно)
# async — асинхронная (быстрее, риск потери)
# no_root_squash — root клиента = root сервера
# root_squash — root клиента → nobody (безопаснее, по умолчанию)
# no_subtree_check — не проверять поддерево (производительность)
# Применить изменения:
exportfs -r # перечитать /etc/exports
exportfs -v # показать активные экспорты
exportfs -a # экспортировать всё из /etc/exports`)
utils.Println(utils.ColorBold + "Firewall для NFS:" + utils.ColorReset)
utils.Code(`firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=mountd
firewall-cmd --reload`)
utils.Println(utils.ColorBold + "Клиент NFS — монтирование:" + utils.ColorReset)
utils.Code(`# Установка клиента:
dnf install nfs-utils
apt install nfs-common
# Посмотреть экспорты сервера:
showmount -e 192.168.1.10
# Смонтировать:
mount -t nfs 192.168.1.10:/shared /mnt/shared
mount -t nfs4 192.168.1.10:/data /mnt/data # NFSv4
# Параметры монтирования:
mount -t nfs -o rw,sync,hard,intr 192.168.1.10:/shared /mnt
# В /etc/fstab (постоянно):
192.168.1.10:/shared /mnt/shared nfs defaults,_netdev 0 0
# _netdev — монтировать только после настройки сети
# Размонтировать:
umount /mnt/shared`)
// ─── 58. SMB/Samba ────────────────────────────────────────────
utils.Section("58. Сетевые файловые системы — SMB/Samba")
utils.Println("SMB (Server Message Block) / CIFS — протокол файлового обмена Windows.")
utils.Println("Samba — реализация SMB на Linux. Позволяет обмениваться файлами с Windows.")
fmt.Println()
utils.Println(utils.ColorBold + "Сервер Samba — установка и настройка:" + utils.ColorReset)
utils.Code(`# Установка:
dnf install samba samba-client # RHEL
apt install samba # Ubuntu
# Включить и запустить:
systemctl enable --now smb nmb # RHEL
systemctl enable --now smbd nmbd # Ubuntu`)
utils.Println(utils.ColorBold + "Конфигурация /etc/samba/smb.conf:" + utils.ColorReset)
utils.Code(`[global]
workgroup = WORKGROUP # рабочая группа Windows
server string = Samba Server
security = user # аутентификация по пользователю
passdb backend = tdbsam # база паролей
# Публичная шара (без пароля):
[public]
path = /srv/samba/public
browseable = yes
writable = yes
guest ok = yes
create mask = 0664
directory mask = 0775
# Приватная шара (с паролем):
[private]
path = /srv/samba/private
valid users = alice bob
writable = yes
browseable = no
create mask = 0660`)
utils.Println(utils.ColorBold + "Управление пользователями Samba:" + utils.ColorReset)
utils.Code(`# Пользователь Samba должен существовать в Linux:
useradd -s /sbin/nologin alice
# Добавить пользователя в Samba (отдельный пароль!):
smbpasswd -a alice
smbpasswd -e alice # включить
smbpasswd -d alice # отключить
smbpasswd -x alice # удалить
# Список пользователей Samba:
pdbedit -L`)
utils.Println(utils.ColorBold + "SELinux + Samba:" + utils.ColorReset)
utils.Code(`# Разрешить Samba доступ к домашним директориям:
setsebool -P samba_enable_home_dirs on
# Разрешить Samba читать/писать общие директории:
chcon -t samba_share_t /srv/samba/public
semanage fcontext -a -t samba_share_t '/srv/samba(/.*)?'
restorecon -Rv /srv/samba/`)
utils.Println(utils.ColorBold + "Firewall для Samba:" + utils.ColorReset)
utils.Code(`firewall-cmd --permanent --add-service=samba
firewall-cmd --reload`)
utils.Println(utils.ColorBold + "Клиент SMB — монтирование Windows-шары:" + utils.ColorReset)
utils.Code(`# Установка:
dnf install cifs-utils samba-client
apt install cifs-utils smbclient
# Просмотр шар на сервере:
smbclient -L //192.168.1.20 -U alice
# Интерактивный клиент:
smbclient //192.168.1.20/shared -U alice
# Монтирование:
mount -t cifs //192.168.1.20/shared /mnt/windows \
-o username=alice,password=secret
# С файлом учётных данных (безопаснее):
cat > /etc/samba/creds << 'EOF'
username=alice
password=secret
domain=WORKGROUP
EOF
chmod 600 /etc/samba/creds
mount -t cifs //192.168.1.20/shared /mnt/windows \
-o credentials=/etc/samba/creds
# В /etc/fstab:
//server/shared /mnt/windows cifs credentials=/etc/samba/creds,_netdev 0 0`)
// ─── 59. Autofs ───────────────────────────────────────────────
utils.Section("59. Автоматическое монтирование — Autofs")
utils.Println("Autofs — демон автоматического монтирования сетевых ФС по запросу.")
utils.Println("Монтирует при обращении к директории, размонтирует при простое.")
fmt.Println()
utils.Println(utils.ColorBold + "Установка и запуск:" + utils.ColorReset)
utils.Code(`dnf install autofs # RHEL
apt install autofs # Ubuntu
systemctl enable --now autofs`)
utils.Println(utils.ColorBold + "Конфигурация autofs:" + utils.ColorReset)
utils.Code(`# Главный файл /etc/auto.master:
# точкаонтирования файл_карты [опции]
/mnt/nfs /etc/auto.nfs --timeout=60
/home /etc/auto.home --timeout=300
/- /etc/auto.direct
# /etc/auto.nfs — монтирование NFS:
# ключ опции сервер:путь
shared -rw,sync 192.168.1.10:/shared
data -ro 192.168.1.10:/data
# Обращение: ls /mnt/nfs/shared → автоматически монтируется
# /etc/auto.home — домашние директории через NFS:
* -rw,sync 192.168.1.10:/home/&
# & → подставляется ключ (* = любой пользователь)
# /home/alice → монтируется 192.168.1.10:/home/alice
# /etc/auto.direct — прямые точки монтирования:
/srv/data -rw,sync 192.168.1.10:/data
# Применить изменения:
systemctl reload autofs
# или:
automount -v`)
utils.Println(utils.ColorBold + "Использование с FreeIPA/LDAP:" + utils.ColorReset)
utils.Code(`# FreeIPA хранит карты autofs в LDAP.
# После настройки sssd + ipa-client autofs
# получает карты автоматически.
# Подключить autofs к SSSD:
# В /etc/sssd/sssd.conf:
[domain/ipa.example.com]
autofs_provider = ipa
# Перезапустить:
systemctl restart sssd autofs`)
utils.Note("Autofs удобен для сотен пользователей: их домашние директории монтируются автоматически при входе.")
utils.Note("--timeout=60 означает размонтировать после 60 секунд бездействия.")
utils.Footer()
}