Найти в Дзене
Евгений Лощаков

Настройка файлового сервера Samba на платформе Debian

Samba — это программный пакет с открытым исходным кодом, который реализует протокол SMB/CIFS (Server Message Block/Common Internet File System) для Linux и Unix-систем. Это позволяет создавать общие ресурсы, доступные с компьютеров Windows, Linux и macOS. Основные компоненты: Протоколы: Корпоративные сети: Малый бизнес и домашние сети: Образовательные учреждения: Совместимость: Безопасность: Гибкость: # Обновление системы sudo apt update && sudo apt upgrade -y # Установка необходимых утилит sudo apt install -y wget curl nano net-tools # Установка Samba sudo apt install -y samba samba-common-bin smbclient # Установка утилит для управления sudo apt install -y samba-vfs-modules samba-dsdb-modules # Проверка установки samba --version smbd --version Основные файлы конфигурации: # Создание резервной копии оригинального файла sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.original # Создание новой конфигурации sudo nano /etc/samba/smb.conf # ================= Глобальные Настройки =======
Оглавление

🔹 Теоретическая часть: Основы Samba

1.1. Что такое Samba?

Samba — это программный пакет с открытым исходным кодом, который реализует протокол SMB/CIFS (Server Message Block/Common Internet File System) для Linux и Unix-систем. Это позволяет создавать общие ресурсы, доступные с компьютеров Windows, Linux и macOS.

Историческая справка:

  • 1991 год — начата разработка Эндрю Триджеллом
  • SMB протокол — первоначально разработан IBM
  • CIFS — расширенная версия SMB от Microsoft
  • Samba 4 — включает поддержку Active Directory

1.2. Архитектура и компоненты Samba

Основные компоненты:

  • smbd — демон для предоставления файловых и печатных служб
  • nmbd — демон для разрешения NetBIOS имен
  • winbindd — для интеграции с Active Directory
  • samba-tool — утилита для управления доменными службами

Протоколы:

  • SMB/CIFS — обмен файлами и принтерами
  • NetBIOS — разрешение имен в локальной сети
  • RPC — удаленный вызов процедур

1.3. Области применения Samba

Корпоративные сети:

  • Общие файловые хранилища для отделов
  • Резервное копирование данных
  • Совместная работа над документами
  • Интеграция с Active Directory

Малый бизнес и домашние сети:

  • Общие папки для мультимедиа
  • Сетевые принтеры
  • Файловый обмен между разными ОС
  • Централизованное хранилище данных

Образовательные учреждения:

  • Общие ресурсы для студентов и преподавателей
  • Сдача заданий и проектов
  • Распространение учебных материалов

1.4. Преимущества использования Samba

Совместимость:

  • ✅ Полная интеграция с сетями Windows
  • ✅ Поддержка всех версий Windows
  • ✅ Работа с macOS и Linux клиентами
  • ✅ Поддержка Active Directory

Безопасность:

  • ✅ Аутентификация пользователей
  • ✅ Разграничение прав доступа
  • ✅ Шифрование трафика
  • ✅ Интеграция с системными пользователями Linux

Гибкость:

  • ✅ Настройка различных уровней доступа
  • ✅ Поддержка символических ссылок
  • ✅ Гибкая конфигурация общих ресурсов
  • ✅ Масштабируемость

🔹 Практическая часть: Установка и настройка Samba в Debian

🔹 2. Установка Samba

2.1. Предварительная настройка системы

# Обновление системы

sudo apt update && sudo apt upgrade -y

# Установка необходимых утилит

sudo apt install -y wget curl nano net-tools

2.2. Установка Samba и вспомогательных пакетов

# Установка Samba

sudo apt install -y samba samba-common-bin smbclient

# Установка утилит для управления

sudo apt install -y samba-vfs-modules samba-dsdb-modules

# Проверка установки

samba --version

smbd --version

2.3. Базовая структура файлов Samba

Основные файлы конфигурации:

  • /etc/samba/smb.conf — основной файл конфигурации
  • /etc/samba/smb.conf.bak — резервная копия (создается)
  • /var/log/samba/ — директория логов
  • /var/lib/samba/ — данные Samba (базы данных, привязки)

🔹 3. Базовая настройка Samba

3.1. Резервное копирование конфигурации

# Создание резервной копии оригинального файла

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.original

# Создание новой конфигурации

sudo nano /etc/samba/smb.conf

-2

3.2. Минимальная рабочая конфигурация

# ================= Глобальные Настройки ====================

[global]

# Рабочая группа (должна совпадать с Windows сетью)

workgroup = WORKGROUP

# Описание сервера

server string = File Server Debian

# Роль сервера

server role = standalone server

# Поддержка символических ссылок

follow symlinks = yes

wide links = yes

unix extensions = no

# Безопасность и аутентификация

security = user

encrypt passwords = true

passdb backend = tdbsam

# Имя NetBIOS

netbios name = DEBIAN-FILESERVER

# Логирование

log file = /var/log/samba/log.%m

max log size = 1000

logging = file

# Сокеты и производительность

socket options = TCP_NODELAY SO_RCVBUF=65536 SO_SNDBUF=65536

# Поддержка разных клиентов

client min protocol = SMB2

server min protocol = SMB2

# ==================== Общие Ресурсы ====================

# Общая папка для всех пользователей

[public]

comment = Public Shared Folder

path = /srv/samba/public

browseable = yes

read only = no

guest ok = yes

create mask = 0755

directory mask = 0755

# Приватная папка для аутентифицированных пользователей

[private]

comment = Private Shared Folder

path = /srv/samba/private

browseable = yes

read only = no

guest ok = no

valid users = @samba-users

create mask = 0770

directory mask = 0770

-3

После этого сохраните изменения в файле и выйдите.

3.3. Создание структуры директорий

# Создание корневой директории для Samba

sudo mkdir -p /srv/samba

# Создание общих папок

sudo mkdir -p /srv/samba/public

sudo mkdir -p /srv/samba/private

# Настройка прав доступа

sudo chmod 0777 /srv/samba/public

sudo chmod 0770 /srv/samba/private

# Создание группы для пользователей Samba

sudo groupadd samba-users

# Назначение владельца для приватной папки

sudo chgrp samba-users /srv/samba/private

3.4. Создание пользователей Samba

# Создание системного пользователя

sudo useradd -M -s /usr/sbin/nologin user1

sudo usermod -aG samba-users user1

# Создание пользователя Samba (пароль для доступа к общим ресурсам)

sudo smbpasswd -a user1

# Создание второго пользователя

sudo useradd -M -s /usr/sbin/nologin user2

sudo usermod -aG samba-users user2

sudo smbpasswd -a user2

3.5. Запуск и проверка работы

# Проверка синтаксиса конфигурации

sudo testparm

-4
-5

# Перезапуск служб Samba

sudo systemctl restart smbd nmbd

# Включение автозапуска

sudo systemctl enable smbd nmbd

# Проверка статуса

sudo systemctl status smbd

-6

sudo systemctl status nmbd

-7

# Проверка открытых портов

sudo netstat -tulpn | grep -E '(smbd|nmbd)'

-8

🔹 4. Пояснение параметров конфигурации

4.1. Глобальные параметры (секция [global])

-9

4.2. Параметры общих ресурсов

-10

4.3. Параметры прав доступа

🔹 5. Расширенная настройка общих ресурсов

5.1. Настройка отдела продаж

# Создание директории

sudo mkdir -p /srv/samba/sales

sudo groupadd sales

sudo chgrp sales /srv/samba/sales

sudo chmod 0770 /srv/samba/sales

# Добавление в smb.conf

[sales]

comment = Sales Department Shared Folder

path = /srv/samba/sales

browseable = yes

read only = no

valid users = @sales

create mask = 0660

directory mask = 0770

force group = sales

# Ограничение по IP-адресам отдела продаж

hosts allow = 192.168.1.100 192.168.1.101

5.2. Настройка папки для бухгалтерии

# Создание директории

sudo mkdir -p /srv/samba/accounting

sudo groupadd accounting

sudo chgrp accounting /srv/samba/accounting

sudo chmod 0770 /srv/samba/accounting

# Добавление в smb.conf

[accounting]

comment = Accounting Department Secure Folder

path = /srv/samba/accounting

browseable = yes

read only = no

valid users = @accounting

create mask = 0660

directory mask = 0770

force group = accounting

# Запрет доступа гостей

guest ok = no

# Скрытие из сетевого окружения (но доступ по прямому пути)

browseable = no

5.3. Настройка резервных копий

# Создание директории

sudo mkdir -p /srv/samba/backup

sudo chmod 0755 /srv/samba/backup

[backup]

comment = Network Backup Storage

path = /srv/samba/backup

browseable = yes

read only = no

guest ok = yes

create mask = 0755

directory mask = 0755

# Ограничение размера файлов (100 МБ)

max upload size = 100000000

# Запрет определенных типов файлов

veto files = /*.exe/*.com/*.bat/*.cmd/

delete veto files = yes

-11

🔹 6. Управление пользователями и группами

6.1. Создание пользователей скриптом

#!/bin/bash

# create-samba-users.sh

# Массив пользователей

users=("ivanov" "petrova" "sidorov" "kuznetsov")

# Группы

groups=("sales" "accounting" "management")

# Создание групп

for group in "${groups[@]}"; do

sudo groupadd $group 2>/dev/null && echo "Группа $group создана"

done

# Создание пользователей

for user in "${users[@]}"; do

# Создание системного пользователя

sudo useradd -M -s /usr/sbin/nologin $user 2>/dev/null

# Добавление в группы (пример)

sudo usermod -aG sales $user

# Создание пользователя Samba

echo "Создание пользователя Samba: $user"

(echo "password123"; echo "password123") | sudo smbpasswd -a -s $user

echo "Пользователь $user создан"

done

echo "Все пользователи созданы успешно"

6.2. Просмотр и управление пользователями

# Просмотр пользователей Samba

sudo pdbedit -L

# Просмотр информации о конкретном пользователе

sudo pdbedit -L -v user1

-12

# Удаление пользователя Samba

sudo smbpasswd -x user1

# Включение/отключение пользователя

sudo smbpasswd -e user1 # Включить

sudo smbpasswd -d user1 # Отключить

🔹 7. Мониторинг и управление сервером

7.1. Управление службами Samba

# Перезапуск служб

sudo systemctl restart smbd nmbd

# Перезагрузка конфигурации без остановки служб

sudo smbcontrol all reload-config

# Проверка статуса

sudo systemctl status smbd

sudo systemctl status nmbd

# Просмотр логов в реальном времени

sudo tail -f /var/log/samba/log.smbd

-13

7.2. Мониторинг подключений

# Просмотр текущих подключений

sudo smbstatus

-14

# Детальная информация о подключениях

sudo smbstatus -S # Общие ресурсы

sudo smbstatus -P # Процессы

-15

sudo smbstatus -L # Блокировки файлов

# Поиск в логах

sudo grep -i "connect" /var/log/samba/log.*

7.3. Тестирование работы сервера

# Тестирование на сервере

smbclient -L localhost -U%

-16

# Тестирование конкретной общей папки

smbclient //localhost/public -U user1

-17

# Проверка доступности с другого Linux-компьютера

smbclient //IP адрес сервера/public -U user1

-18

Также можно в адресной строке проводника прописать smb://ip адрес сервера/ и открыть доступные папки

-19

🔹 8. Настройка безопасности

8.1. Настройка firewall

# Разрешение Samba в UFW

sudo ufw allow samba

# Или ручная настройка портов

sudo ufw allow 139/tcp

sudo ufw allow 445/tcp

sudo ufw allow 137/udp

sudo ufw allow 138/udp

8.2. Ограничение доступа по IP-адресам

# В секции [global] или конкретной общей папки

hosts allow = 192.168.1.0/24 192.168.2.100

hosts deny = 0.0.0.0/0

# Или в отдельных секциях

[sales]

hosts allow = 192.168.1.100 192.168.1.101

hosts deny = all

8.3. Настройка шифрования

# В секции [global]

[global]

# Требование подписывания SMB

server signing = mandatory

# Шифрование трафика

smb encrypt = required

# Минимальная версия SMB

server min protocol = SMB3

# Отключение устаревших протоколов

ntlm auth = no

🔹 9. Интеграция с Windows сетью

9.1. Настройка для работы в домене Windows

# Установка необходимых пакетов

sudo apt install -y winbind

# Настройка в smb.conf

[global]

security = ads

realm = COMPANY.LOCAL

workgroup = COMPANY

password server = dc.company.local

# Настройки Winbind

winbind use default domain = yes

winbind offline logon = false

winbind enum users = yes

winbind enum groups = yes

9.2. Настройка WINS сервера

[global]

# Включение WINS сервера

wins support = yes

# Или использование внешнего WINS сервера

wins server = 192.168.1.1

# Имя NetBIOS

netbios name = FILESERVER

🔹 10. Устранение неисправностей

10.1. Типичные проблемы и решения

-20

10.2. Команды диагностики

# Проверка конфигурации

sudo testparm

-21
-22

# Проверка сетевой видимости

nmblookup -S WORKGROUP

-23

# Проверка подключения

smbclient -L //server-name -U username

# Подробное логирование

sudo smbcontrol smbd debug 10

Добавление сетевой папки в автозагрузку на клиентских компьютерах

🔹 Windows клиенты

11.1. Подключение через Проводник Windows

Ручное подключение сетевого диска:

  1. Откройте "Этот компьютер"
  2. Нажмите "Подключить сетевой диск" в меню "Компьютер"
  3. Заполните параметры:
    Диск:
    Выберите букву диска (например, Z:)
    Папка: \\ip-адрес-сервера\public (например, \\192.168.1.10\public)
    Восстанавливать при входе: ✅ Отметьте галочку

11.2. Командная строка Windows

Добавление через net use:

# Подключение сетевого диска

net use Z: \\192.168.1.10\public /persistent:yes

# С аутентификацией

net use Z: \\192.168.1.10\private /user:user1 /persistent:yes

🔹 Linux клиенты

11.3. Ручное монтирование в Linux

Временное монтирование:

# Установка клиента CIFS

sudo apt update

sudo apt install -y cifs-utils

# Создание точки монтирования

sudo mkdir -p /mnt/network/public

sudo mkdir -p /mnt/network/private

# Монтирование общей папки

sudo mount -t cifs //192.168.1.10/public /mnt/network/public -o username=user1,password=password123,uid=1000,gid=1000

# Монтирование с гостевого доступом

sudo mount -t cifs //192.168.1.10/public /mnt/network/public -o guest,uid=1000,gid=1000

11.4. Автоматическое монтирование через /etc/fstab

Добавление в /etc/fstab:

# Редактируем fstab

sudo nano /etc/fstab

# Добавляем строки для сетевых папок:

Для папки с аутентификацией:

//192.168.1.10/private /mnt/network/private cifs credentials=/etc/samba/credentials,uid=1000,gid=1000,file_mode=0770,dir_mode=0770 0 0

Для общедоступной папки:

//192.168.1.10/public /mnt/network/public cifs guest,uid=1000,gid=1000,file_mode=0775,dir_mode=0775 0 0

11.5. Создание файла с учетными данными

# Создание файла с учетными данными

sudo mkdir -p /etc/samba/credentials

sudo nano /etc/samba/credentials

# Содержимое файла:

username=user1

password=password123

domain=WORKGROUP

Настройка прав доступа к файлу с учетными данными:

# Только root может читать файл с паролями

sudo chmod 600 /etc/samba/credentials

sudo chown root:root /etc/samba/credentials

11.6. Systemd сервис для монтирования

Создание systemd сервиса:

sudo nano /etc/systemd/system/mount-network-shares.service

Содержимое сервиса:

[Unit]

Description=Mount Network Samba Shares

After=network-online.target

Wants=network-online.target

[Service]

Type=oneshot

RemainAfterExit=yes

ExecStart=/bin/mount /mnt/network/public

ExecStart=/bin/mount /mnt/network/private

ExecStop=/bin/umount /mnt/network/public

ExecStop=/bin/umount /mnt/network/private

[Install]

WantedBy=multi-user.target

Активация сервиса:

sudo systemctl daemon-reload

sudo systemctl enable mount-network-shares.service

sudo systemctl start mount-network-shares.service

11.7. Скрипт для автоматического монтирования

Создание скрипта монтирования:

sudo nano /usr/local/bin/mount-shares.sh

В нем прописать:

#!/bin/bash

# Скрипт для монтирования сетевых папок Samba

# Переменные

SERVER="192.168.1.10"

MOUNT_BASE="/mnt/network"

CREDENTIALS_FILE="/etc/samba/credentials"

# Функция для монтирования

mount_share() {

local share_name=$1

local mount_point=$2

local options=$3

# Проверка существования точки монтирования

if [ ! -d "$mount_point" ]; then

sudo mkdir -p "$mount_point"

echo "Создана точка монтирования: $mount_point"

fi

# Проверка, не смонтирована ли уже папка

if mountpoint -q "$mount_point"; then

echo "Папка $share_name уже смонтирована"

return 0

fi

# Монтирование

if sudo mount -t cifs "//$SERVER/$share_name" "$mount_point" -o "$options"; then

echo "Успешно смонтировано: $share_name -> $mount_point"

return 0

else

echo "Ошибка монтирования: $share_name"

return 1

fi

}

# Монтирование папок

echo "Монтирование сетевых папок..."

# Public папка (гостевой доступ)

mount_share "public" "$MOUNT_BASE/public" "guest,uid=1000,gid=1000,file_mode=0775,dir_mode=0775"

# Private папка (с аутентификацией)

mount_share "private" "$MOUNT_BASE/private" "credentials=$CREDENTIALS_FILE,uid=1000,gid=1000,file_mode=0770,dir_mode=0770"

echo "Монтирование завершено"

# Проверка смонтированных папок

echo "Смонтированные сетевые папки:"

df -h | grep "//$SERVER"

Делаем скрипт исполняемым:

sudo chmod +x /usr/local/bin/mount-shares.sh

Добавление в crontab для автоматического выполнения при загрузке:

# Редактируем crontab

sudo crontab -e

# Добавляем строку:

@reboot sleep 30 && /usr/local/bin/mount-shares.sh

🔹 macOS клиенты

11.8. Подключение в macOS

Ручное подключение через Finder:

  1. Откройте Finder
  2. Нажмите Cmd+K или выберите "Подключиться к серверу"
  3. Введите адрес: smb://192.168.1.10/public
  4. При необходимости введите логин/пароль
  5. Нажмите "Подключить"

11.9. Автоподключение в macOS

Создание скрипта для автоподключения:

#!/bin/bash

# mount-smb-macos.sh

# Переменные

SERVER="192.168.1.10"

MOUNT_POINT="/Volumes"

# Функция для монтирования

mount_smb_share() {

local share_name=$1

local mount_dir="$MOUNT_POINT/$share_name"

# Создание директории, если не существует

if [ ! -d "$mount_dir" ]; then

mkdir -p "$mount_dir"

fi

# Монтирование

mount_smbfs "//user1:password123@$SERVER/$share_name" "$mount_dir"

if [ $? -eq 0 ]; then

echo "Успешно смонтировано: $share_name"

else

echo "Ошибка монтирования: $share_name"

fi

}

# Монтирование папок

mount_smb_share "public"

mount_smb_share "private"

Добавление в автозагрузку через launchd:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

<key>Label</key>

<string>com.user.mountsmb</string>

<key>ProgramArguments</key>

<array>

<string>/path/to/mount-smb-macos.sh</string>

</array>

<key>RunAtLoad</key>

<true/>

<key>StartInterval</key>

<integer>300</integer>

</dict>

</plist>

🔹 Универсальное решение для всех ОС

11.10. Проверка доступности перед подключением

Улучшенный скрипт с проверками:

#!/bin/bash

# advanced-mount-script.sh

SERVER="192.168.1.10"

TIMEOUT=5

# Функция проверки доступности сервера

check_server() {

if ping -c 1 -W $TIMEOUT $SERVER &> /dev/null; then

return 0

else

echo "Сервер $SERVER недоступен"

return 1

fi

}

# Функция проверки доступности шары

check_share() {

local share_name=$1

if smbclient -L $SERVER -N | grep -q "$share_name"; then

return 0

else

echo "Шара $share_name недоступна"

return 1

fi

}

# Основная логика

if check_server; then

echo "Сервер доступен, проверка шаров..."

# Список шаров для монтирования

shares=("public" "private" "sales")

for share in "${shares[@]}"; do

if check_share "$share"; then

echo "Монтирование шара: $share"

# Добавьте здесь команды монтирования для вашей ОС

fi

done

fi

11.11. Логирование операций

Добавление логирования в скрипты:

#!/bin/bash

# mount-with-logging.sh

LOG_FILE="/var/log/network-mounts.log"

# Функция логирования

log_message() {

echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE

}

# Монтирование с логированием

mount_share() {

local share=$1

local mount_point=$2

log_message "Попытка монтирования: $share -> $mount_point"

if mount -t cifs "//192.168.1.10/$share" "$mount_point" -o guest; then

log_message "УСПЕХ: $share смонтирован в $mount_point"

return 0

else

log_message "ОШИБКА: Не удалось смонтировать $share"

return 1

fi

}

# Использование

mount_share "public" "/mnt/network/public"

🔹 Проверка работоспособности

11.12. Тестирование подключения

Скрипт проверки для всех ОС:

#!/bin/bash

# test-network-shares.sh

SERVER="192.168.1.10"

SHARES=("public" "private")

echo "=== Тестирование сетевых папок ==="

for share in "${SHARES[@]}"; do

echo "Проверка: $share"

# Проверка доступности

if smbclient -L $SERVER -N | grep -q "$share"; then

echo "✅ Шара $share доступна"

# Попытка подключения

if smbclient "//$SERVER/$share" -N -c "exit"; then

echo "✅ Подключение к $share успешно"

else

echo "❌ Ошибка подключения к $share"

fi

else

echo "❌ Шара $share недоступна"

fi

echo "---"

done

11.13. Автоматическое восстановление подключения

Скрипт мониторинга и восстановления:

#!/bin/bash

# network-shares-monitor.sh

SERVER="192.168.1.10"

MOUNT_POINTS=("/mnt/network/public" "/mnt/network/private")

CHECK_INTERVAL=60

while true; do

for mount_point in "${MOUNT_POINTS[@]}"; do

if ! mountpoint -q "$mount_point"; then

echo "Восстановление подключения: $mount_point"

/usr/local/bin/mount-shares.sh

break

fi

done

sleep $CHECK_INTERVAL

done

Добавление монитора в автозагрузку:

# Создание systemd сервиса для мониторинга

sudo nano /etc/systemd/system/network-shares-monitor.service

В нём прописываем:

[Unit]

Description=Network Shares Monitor

After=network-online.target

[Service]

Type=simple

ExecStart=/usr/local/bin/network-shares-monitor.sh

Restart=always

RestartSec=10

[Install]

WantedBy=multi-user.target

Теперь сетевые папки будут автоматически подключаться при загрузке операционной системы и поддерживать стабильное соединение с файловым сервером Samba.

🔹 Заключение

Итоги настройки:

Установлен и настроен полнофункциональный файловый сервер
Созданы общие ресурсы с разным уровнем доступа
Настроена аутентификация пользователей
Реализовано разграничение прав доступа
Обеспечена безопасность и мониторинг

Ключевые преимущества решения:

  • Кросс-платформенная совместимость с Windows, Linux, macOS
  • Гибкая система прав доступа на основе пользователей и групп
  • Централизованное управление файловыми ресурсами
  • Высокая производительность и надежность
  • Бесплатность и открытый исходный код

Рекомендации по эксплуатации:

  1. Регулярно обновляйте Samba до актуальной версии
  2. Мониторьте логи на предмет подозрительной активности
  3. Регулярно меняйте пароли пользователей
  4. Создавайте резервные копии конфигурации
  5. Тестируйте новые настройки в тестовой среде

Пример команды для ежедневной проверки:

#!/bin/bash

# samba-health-check.sh

echo "=== Samba Status ==="

systemctl status smbd --no-pager

echo -e "\n=== Active Connections ==="

smbstatus -b

echo -e "\n=== Recent Log Errors ==="

tail -20 /var/log/samba/log.smbd | grep -i error

Файловый сервер Samba готов к работе и обеспечивает надежный общий доступ к файлам в гетерогенной сетевой среде.