346 lines
15 KiB
Go
346 lines
15 KiB
Go
package linuxmodules
|
||
|
||
import (
|
||
"fmt"
|
||
"rubric/utils"
|
||
)
|
||
|
||
var NetfsModule = Module{
|
||
Key: "netfs",
|
||
Aliases: []string{"nfs", "smb", "samba", "autofs", "сетевые-фс"},
|
||
Title: "Сетевые файловые системы",
|
||
Description: "Темы 55–59: 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()
|
||
}
|