Как установить и настроить Samba на Linux: полное техническое руководство
Samba — это реализация протокола SMB/CIFS (Server Message Block / Common Internet File System) с открытым исходным кодом, которая позволяет серверам на базе Linux и Unix совместно использовать файлы, принтеры и другие ресурсы с клиентами Windows — и с другими машинами на Linux. Она выступает мостом между операционными системами, являясь де-факто стандартом для кросс-платформенного сетевого обмена файлами в смешанных средах.
Если коротко: установка Samba на Linux требует установки пакета `samba` через менеджер пакетов вашего дистрибутива, определения блоков общих ресурсов в `/etc/samba/smb.conf`, создания учётных данных пользователей Samba с помощью `smbpasswd` и открытия портов 137–139 и 445 в брандмауэре. В разделах ниже каждый уровень этого процесса рассматривается с точными техническими подробностями.
Что Samba делает под капотом
Samba работает как набор демонов. Понимание того, какой демон за что отвечает, позволяет избежать значительного числа ошибок конфигурации:
- `smbd` — обрабатывает совместное использование файлов и принтеров, аутентификацию и блокировку ресурсов через TCP-порты 445 и 139.
- `nmbd` — управляет разрешением имён NetBIOS через UDP-порты 137 и 138. Требуется для просмотра сети Windows (Сетевое окружение / «Сеть» в Проводнике).
- `winbindd` — интегрирует Samba с Active Directory или доменами NT4, обеспечивая аутентификацию доменных пользователей на хосте Linux. Не требуется для автономного обмена файлами.
Когда клиент Windows открывает `servershare`, он сначала разрешает имя сервера через DNS или NetBIOS (nmbd), затем устанавливает сеанс SMB с smbd через порт 445. Samba согласовывает наивысший взаимно поддерживаемый диалект SMB — SMB 3.1.1 на современных системах — и сопоставляет удалённый ресурс с буквой диска или UNC-путём на клиенте.
Предварительные требования
Перед началом убедитесь в следующем:
- Сервер Linux под управлением Ubuntu 20.04/22.04/24.04, Debian 11/12, CentOS Stream 8/9, RHEL 8/9 или Fedora 38+.
- Доступ с правами root или `sudo`.
- Статический частный IP-адрес, назначенный серверу (критически важно для стабильного монтирования общих ресурсов).
- Базовые знания работы с терминалом и правами доступа к файлам.
- Доступ к брандмауэру (UFW, firewalld или iptables) для открытия необходимых портов.
Если вы развёртываете Samba на облачном или виртуальном сервере, среда VPS Хостинга предоставляет полный root-доступ и контроль над сетью, необходимые для управления демонами, правилами брандмауэра и постоянными монтированиями без ограничений общих сред.
Шаг 1: Установка Samba
Используйте менеджер пакетов, подходящий для вашего дистрибутива. Всегда сначала обновляйте индекс пакетов, чтобы избежать установки устаревших версий.
Debian / Ubuntu:
“`bash
sudo apt-get update
sudo apt-get install samba samba-common-bin
“`
CentOS Stream / RHEL:
“`bash
sudo dnf install samba samba-client samba-common
“`
Fedora:
“`bash
sudo dnf install samba samba-client samba-common
“`
Arch Linux:
“`bash
sudo pacman -S samba
“`
После установки проверьте установленную версию:
“`bash
smbd –version
“`
На системах на базе RHEL также установите `samba-client`, чтобы получить диагностическую утилиту `smbclient`, которая понадобится на последующих шагах для тестирования подключения.
Шаг 2: Резервное копирование и редактирование основного файла конфигурации
Вся конфигурация Samba хранится в `/etc/samba/smb.conf`. Этот единственный файл управляет глобальным поведением сервера, моделью безопасности, определениями общих ресурсов и ведением журналов. Перед его изменением создайте резервную копию с временной меткой:
“`bash
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup.$(date +%F)
“`
Откройте файл для редактирования:
“`bash
sudo nano /etc/samba/smb.conf
“`
Файл разделён на секции. Секция `[global]` определяет общесерверные параметры. Отдельные секции общих ресурсов (например, `[sambashare]`) определяют конкретные общие ресурсы.
Критически важные глобальные параметры для проверки
В секции `[global]` обратите внимание на следующие настройки:
“`ini
[global]
workgroup = WORKGROUP
server string = Samba Server %v
netbios name = MYSERVER
security = user
map to guest = bad user
dns proxy = no
log file = /var/log/samba/log.%m
max log size = 1000
logging = file
panic action = /usr/share/samba/panic-action %d
server role = standalone server
obey pam restrictions = yes
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat = *Entersnews*spassword:* %nn *Retypesnews*spassword:* %nn *passwordsupdatedssuccessfully* .
pam password change = yes
min protocol = SMB2
max protocol = SMB3
“`
Ключевое замечание: Директива `min protocol = SMB2` явно отключает SMB1, который устарел с 2014 года и является вектором для эксплойтов, таких как EternalBlue (MS17-010). Никогда не оставляйте SMB1 включённым на производственном сервере. Современные Windows 10/11 и все актуальные клиенты Linux CIFS поддерживают SMB2 и SMB3 нативно.
Шаг 3: Создание и подготовка общего каталога
Создайте каталог, который будет доступен по сети:
“`bash
sudo mkdir -p /srv/sambashare
“`
Установите владельца и права доступа. Правильный подход зависит от того, хотите ли вы гостевой доступ или доступ только для аутентифицированных пользователей.
Для доступа аутентифицированных пользователей (рекомендуется для производственной среды):
“`bash
sudo chown root:sambashare /srv/sambashare
sudo chmod 2770 /srv/sambashare
“`
Права `2770` расшифровываются следующим образом:
- `2` — бит setgid: новые файлы наследуют группу каталога, предотвращая фрагментацию владельца в многопользовательских общих ресурсах.
- `7` — владелец (root) имеет права на чтение, запись, выполнение.
- `7` — группа (sambashare) имеет права на чтение, запись, выполнение.
- `0` — остальные не имеют доступа.
Для гостевого/публичного доступа (домашняя лаборатория или внутренняя LAN):
“`bash
sudo chown nobody:nogroup /srv/sambashare
sudo chmod 0777 /srv/sambashare
“`
Не используйте `0777` на серверах, доступных из интернета. Гостевые общие ресурсы с правами записи для всех подходят только для изолированных, доверенных сетей.
Шаг 4: Создание системной группы и пользователя
Для аутентифицированных общих ресурсов создайте выделенную группу Linux, соответствующую вашему общему ресурсу Samba:
“`bash
sudo groupadd sambashare
“`
Добавьте пользователя Linux, который будет иметь доступ к общему ресурсу:
“`bash
sudo useradd -M -s /sbin/nologin sambauser
sudo usermod -aG sambashare sambauser
“`
Флаг `-M` пропускает создание домашнего каталога (это служебная учётная запись, а не интерактивный пользователь). Флаг `-s /sbin/nologin` запрещает использование учётной записи для входа через SSH или консоль — критически важный шаг по усилению безопасности, который большинство руководств упускают.
Теперь зарегистрируйте пользователя в собственной базе данных паролей Samba (отдельной от `/etc/shadow`):
“`bash
sudo smbpasswd -a sambauser
sudo smbpasswd -e sambauser
“`
Флаг `-a` добавляет пользователя; флаг `-e` активирует учётную запись. Samba ведёт собственное хранилище учётных данных по адресу `/var/lib/samba/private/passdb.tdb` (или файл `smbpasswd` в зависимости от настройки `passdb backend`). Пользователь может существовать в Linux без регистрации в базе данных Samba, и наоборот — он должен быть зарегистрирован в обеих системах.
Шаг 5: Определение общего ресурса в smb.conf
Добавьте следующий блок в конец `/etc/samba/smb.conf`. Показаны две конфигурации: одна для аутентифицированного доступа, другая для гостевого.
Аутентифицированный общий ресурс (рекомендуется для производственной среды)
“`ini
[sambashare]
path = /srv/sambashare
comment = Authenticated Network Share
browsable = yes
writable = yes
read only = no
guest ok = no
valid users = @sambashare
create mask = 0660
directory mask = 2770
force group = sambashare
“`
Описание параметров:
- `valid users = @sambashare` — префикс `@` означает «любой член группы Linux с именем sambashare». Это более масштабируемо, чем перечисление отдельных имён пользователей.
- `create mask = 0660` — новые файлы создаются с правами rw-rw—-, предотвращая создание файлов, доступных для чтения всем.
- `directory mask = 2770` — новые подкаталоги наследуют бит setgid и права группы.
- `force group = sambashare` — принудительно использует группу sambashare для всех файловых операций, независимо от основной группы подключающегося пользователя.
Гостевой общий ресурс (домашняя лаборатория / внутренняя LAN)
“`ini
[public]
path = /srv/sambashare
comment = Public Network Share
browsable = yes
writable = yes
read only = no
guest ok = yes
guest account = nobody
create mask = 0664
directory mask = 0775
“`
Шаг 6: Проверка конфигурации
Перед перезапуском любой службы запустите встроенный анализатор конфигурации:
“`bash
testparm
“`
`testparm` читает `smb.conf`, сообщает о синтаксических ошибках и выводит эффективную конфигурацию после применения значений по умолчанию. Обратите внимание на строки `WARNING` — они часто указывают на устаревшие параметры или неправильные настройки безопасности. Чистый вывод заканчивается следующим:
“`
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
“`
Если `testparm` сообщает об ошибках, исправьте их перед продолжением. Перезапуск smbd с повреждённым файлом конфигурации приводит к тому, что служба завершается без сообщений об ошибках или возвращается к значениям по умолчанию.
Шаг 7: Перезапуск и включение демонов Samba
Debian / Ubuntu:
“`bash
sudo systemctl restart smbd nmbd
sudo systemctl enable smbd nmbd
“`
CentOS / RHEL / Fedora:
“`bash
sudo systemctl restart smb nmb
sudo systemctl enable smb nmb
“`
Убедитесь, что оба демона запущены:
“`bash
sudo systemctl status smbd nmbd # Debian/Ubuntu
sudo systemctl status smb nmb # RHEL/Fedora
“`
Проверьте, что демоны прослушивают правильные порты:
“`bash
sudo ss -tlnp | grep -E '(smbd|nmbd|445|139)'
“`
Ожидаемый вывод должен показывать `smbd`, привязанный к портам 445 и 139.
Шаг 8: Настройка правил брандмауэра
Samba требует открытия следующих портов:
| Порт | Протокол | Служба | Назначение |
|---|
| —— | ———- | ——— | ——— |
|---|
| 137 | UDP | nmbd | Служба имён NetBIOS |
|---|
| 138 | UDP | nmbd | Служба датаграмм NetBIOS |
|---|
| 139 | TCP | smbd | Служба сеансов NetBIOS (SMB через NetBIOS) |
|---|
| 445 | TCP | smbd | Прямой SMB (SMB2/SMB3 — основной порт) |
|---|
UFW (Debian/Ubuntu):
“`bash
sudo ufw allow 'Samba'
sudo ufw status
“`
firewalld (CentOS/RHEL/Fedora):
“`bash
sudo firewall-cmd –permanent –add-service=samba
sudo firewall-cmd –reload
sudo firewall-cmd –list-services
“`
iptables (вручную):
“`bash
sudo iptables -A INPUT -p tcp –dport 445 -j ACCEPT
sudo iptables -A INPUT -p tcp –dport 139 -j ACCEPT
sudo iptables -A INPUT -p udp –dport 137:138 -j ACCEPT
“`
Примечание по безопасности: Если ваш сервер Samba доступен из интернета (не рекомендуется для стандартного обмена файлами), ограничьте эти правила конкретными диапазонами исходных IP-адресов с помощью `-s 192.168.1.0/24` или аналогичного средства. Открытие портов SMB в публичный интернет представляет серьёзную угрозу безопасности.
Шаг 9: Настройка SELinux (RHEL/CentOS/Fedora)
На системах с принудительным применением SELinux Samba требует дополнительных меток контекста для общих каталогов. Без них smbd будет заблокирован при попытке доступа к пути, даже если права Linux настроены правильно.
“`bash
sudo setsebool -P samba_enable_home_dirs on
sudo setsebool -P samba_export_all_rw on
sudo semanage fcontext -a -t samba_share_t "/srv/sambashare(/.*)?"
sudo restorecon -Rv /srv/sambashare
“`
Проверьте, что контекст был применён:
“`bash
ls -lZ /srv/sambashare
“`
В выводе должен отображаться `system_u:object_r:samba_share_t:s0` в качестве контекста SELinux. Пропуск этого шага является наиболее распространённой причиной сбоев общих ресурсов Samba на системах семейства RHEL — служба запускается корректно, но клиенты получают ошибки «Доступ запрещён».
Шаг 10: Доступ к общему ресурсу из Windows
На клиенте Windows:
- Откройте Проводник.
- В адресной строке введите: `<server-ip>sambashare` и нажмите Enter.
- При появлении запроса введите имя пользователя и пароль Samba.
- Чтобы сделать подключение постоянным, щёлкните правой кнопкой мыши по общему ресурсу и выберите Подключить сетевой диск.
Для сценариев или корпоративных развёртываний подключите диск из командной строки:
“`cmd
net use Z: 192.168.1.100sambashare /user:sambauser /persistent:yes
“`
Шаг 11: Доступ к общему ресурсу из Linux
Использование smbclient (интерактивный режим, для тестирования):
“`bash
smbclient //192.168.1.100/sambashare -U sambauser
“`
Откроется интерактивная оболочка, похожая на FTP. Используйте `ls`, `get`, `put` и `exit` для навигации и передачи файлов.
Постоянное монтирование общего ресурса через CIFS:
Сначала установите пакет утилит CIFS:
“`bash
sudo apt-get install cifs-utils # Debian/Ubuntu
sudo dnf install cifs-utils # RHEL/Fedora
“`
Создайте точку монтирования и файл учётных данных (никогда не указывайте пароли в `/etc/fstab` в открытом виде):
“`bash
sudo mkdir -p /mnt/sambashare
sudo nano /etc/samba/credentials
“`
Содержимое файла учётных данных:
“`
username=sambauser
password=yourpassword
domain=WORKGROUP
“`
Защитите файл учётных данных:
“`bash
sudo chmod 600 /etc/samba/credentials
sudo chown root:root /etc/samba/credentials
“`
Добавьте монтирование в `/etc/fstab` для сохранения после перезагрузки:
“`
//192.168.1.100/sambashare /mnt/sambashare cifs credentials=/etc/samba/credentials,uid=1000,gid=1000,iocharset=utf8,vers=3.0,_netdev 0 0
“`
Параметр `_netdev` указывает системе ожидать доступности сети перед попыткой монтирования — это необходимо на серверах, монтирующих сетевые ресурсы при загрузке. Параметр `vers=3.0` принудительно использует SMB3, избегая возврата к более старым диалектам.
Проверьте запись fstab без перезагрузки:
“`bash
sudo mount -a
“`
Сравнение версий протокола SMB
Выбор правильного диалекта SMB влияет на производительность, безопасность и совместимость. В следующей таблице приведены ключевые различия:
| Версия SMB | Год | Ключевые возможности | Безопасность | Рекомендуемое использование |
|---|
| ————- | —— | ————– | ———- | —————– |
|---|
| SMB1 | 1983 | Базовый обмен файлами | Критически уязвим (EternalBlue) | Никогда не использовать — отключить явно |
|---|
| SMB2 | 2006 | Конвейеризация, снижение «болтливости», подпись | Улучшена | Устаревшие клиенты Windows Vista/7 |
|---|
| SMB2.1 | 2010 | Аренда клиентских блокировок oplock | Улучшена | Windows 7/2008 R2 |
|---|
| SMB3.0 | 2012 | Многоканальность, шифрование, отказоустойчивость | Высокая | Windows 8/2012 и новее |
|---|
| SMB3.1.1 | 2015 | Целостность до аутентификации, AES-128-GCM | Наивысшая | Windows 10/11, современный Linux |
|---|
Всегда устанавливайте `min protocol = SMB2` в `[global]` и предпочитайте `SMB3` там, где все клиенты его поддерживают. SMB3.1.1 с шифрованием (`smb encrypt = required`) — правильный выбор для любого общего ресурса, содержащего конфиденциальные данные.
Samba против NFS: выбор правильного протокола
Как Samba (SMB/CIFS), так и NFS широко используются для сетевого обмена файлами на базе Linux, но они предназначены для разных сценариев использования:
| Критерий | Samba (SMB/CIFS) | NFS |
|---|
| ———- | —————– | —– |
|---|
| Основной сценарий использования | Кросс-платформенный (Linux + Windows) | Обмен файлами Linux-Linux |
|---|
| Поддержка клиентов Windows | Нативная, без дополнительного ПО | Требует установки клиента NFS |
|---|
| Поддержка macOS | Нативная (SMB) | Поддерживается через встроенный клиент NFS |
|---|
| Аутентификация | Имя пользователя/пароль, интеграция с AD | На основе хоста (IP/имя хоста) |
|---|
| Производительность (LAN) | Несколько большие накладные расходы | Меньшие накладные расходы, быстрее в LAN |
|---|
| Шифрование | SMB3 поддерживает шифрование AES | NFSv4.2 поддерживает шифрование krb5 |
|---|
| Сложность настройки | Умеренная | Ниже для сред только на Linux |
|---|
| Лучше подходит для | Смешанные ОС, интеграция с доменом | Однородные кластеры Linux, HPC |
|---|
Если ваша инфраструктура состоит исключительно из Linux — например, кластер Выделенных серверов, выполняющих контейнеризированные рабочие нагрузки — NFS может обеспечить меньшую задержку. Для любой среды с клиентами Windows или пользователями macOS Samba является правильным выбором.
Распространённые ошибки и устранение неполадок
Общий ресурс виден, но возвращает «Доступ запрещён»
- На системах с SELinux: Проверьте и примените контекст `samba_share_t`, как описано в шаге 9.
- Проверьте права Linux: Подключающийся пользователь (или учётная запись `nobody` для гостевых ресурсов) должен иметь права на чтение/запись на уровне файловой системы к указанному пути, независимо от собственных ACL Samba.
- Проверьте smbpasswd: Пользователь должен быть добавлен с помощью `smbpasswd -a` и активирован с помощью `smbpasswd -e`.
Общий ресурс не виден при просмотре сети
- Убедитесь, что `nmbd` запущен: `sudo systemctl status nmbd`.
- Убедитесь, что в определении общего ресурса установлено `browsable = yes`.
- В Windows 10/11 отключена служба «Обозреватель компьютеров», зависящая от SMB1. Используйте прямые UNC-пути (`ipshare`) вместо обнаружения сети.
Низкая скорость передачи
- Принудительно используйте SMB3 с `vers=3.0` или `vers=3.1.1` в параметрах монтирования.
- Включите большой MTU: добавьте `socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=131072 SO_SNDBUF=131072` в `[global]`.
- Проверьте доступность многоканального SMB: `smbstatus –verbose`.
Журналы и диагностика
“`bash
sudo tail -f /var/log/samba/log.smbd
sudo smbstatus
sudo pdbedit -L -v # List all Samba users
“`
Samba в производственной среде: архитектурные соображения
Для производственных развёртываний, выходящих за рамки простого обмена файлами, рассмотрите следующее:
Интеграция с Active Directory: Samba 4 может функционировать как полноценный контроллер домена Active Directory, поддерживая LDAP, Kerberos, DNS и групповые политики. Это значительный архитектурный шаг за пределы автономного обмена файлами и требует подготовки `samba-ad-dc`.
Общие ресурсы домашних каталогов: Мета-служба `[homes]` в `smb.conf` автоматически создаёт персональный общий ресурс для каждого аутентифицированного пользователя, сопоставленный с его домашним каталогом Linux. Это устраняет необходимость определять отдельные блоки общих ресурсов для каждого пользователя.
Совместное использование принтеров: Samba интегрируется с CUPS для совместного использования принтеров по сети. Определения общих ресурсов `[printers]` и `[print$]` обеспечивают это, хотя совместное использование принтеров стало менее распространённым с развитием облачных служб печати.
Квоты: Samba соблюдает квоты файловой системы Linux. Реализуйте квоты на уровне файловой системы с помощью инструментов `quota`, и Samba будет применять их прозрачно.
Для команд, запускающих веб-приложения вместе с общими файловыми ресурсами, сочетание Samba с VPS с cPanel предоставляет управляемую панель управления для веб-хостинга при сохранении полного SSH-доступа для администрирования Samba. Для сред, требующих нескольких хостинговых служб под одной крышей, ознакомление с доступными Панелями управления VPS поможет определить правильный уровень управления для вашего стека.
Если ваш сервер Samba также размещает веб-контент или данные приложений, защита его с помощью SSL-сертификата для любых связанных веб-служб обеспечивает соответствие всего стека современным стандартам безопасности.
Контрольный список ключевых технических выводов
Используйте этот контрольный список перед тем, как считать развёртывание Samba готовым к производственной эксплуатации:
- [ ] SMB1 явно отключён через `min protocol = SMB2` в `[global]`
- [ ] Пользователи Samba созданы с помощью `smbpasswd -a` и активированы с помощью `smbpasswd -e`
- [ ] Служебные учётные записи используют `-s /sbin/nologin` для блокировки доступа к оболочке
- [ ] Каталоги общих ресурсов используют бит setgid (`chmod 2770`) для согласованного владения группой
- [ ] `testparm` выполняется без предупреждений и ошибок
- [ ] Оба демона `smbd` и `nmbd` включены и запущены
- [ ] Правила брандмауэра ограничивают порты SMB (445, 139, 137-138) только доверенными исходными IP-адресами
- [ ] Контекст SELinux (`samba_share_t`) применён на системах RHEL/CentOS/Fedora
- [ ] Файл учётных данных для монтирования CIFS имеет права `chmod 600` и принадлежит root
- [ ] Записи `/etc/fstab` используют параметр `_netdev` для монтирований, зависящих от сети
- [ ] Журналы Samba проверены по адресу `/var/log/samba/` после первоначального развёртывания
- [ ] `smbstatus` подтверждает активные сеансы и заблокированные файлы после развёртывания
Часто задаваемые вопросы
Какие порты использует Samba и нужно ли открывать все из них?
Samba использует TCP 445 (прямой SMB, обязателен), TCP 139 (SMB через NetBIOS, необходим для устаревших клиентов) и UDP 137-138 (разрешение имён NetBIOS, необходимо для просмотра сети). В современных средах с клиентами Windows 10/11 или Linux, использующими прямые UNC-пути, строго необходим только TCP 445. UDP 137-138 и TCP 139 можно заблокировать, если разрешение имён NetBIOS не требуется.
Почему мой общий ресурс Samba работает из Linux, но возвращает «Доступ запрещён» из Windows?
Это почти всегда проблема кэширования учётных данных на стороне Windows. Windows кэширует учётные данные SMB для каждого сеанса. Откройте Диспетчер учётных данных (Панель управления > Диспетчер учётных данных > Учётные данные Windows), удалите все кэшированные записи для IP-адреса сервера, затем подключитесь повторно. Если проблема не устранена, убедитесь, что пользователь активирован в базе данных Samba с помощью `sudo pdbedit -L -v`.
В чём разница между `security = user` и `security = share` в smb.conf?
`security = share` (безопасность на уровне общего ресурса) устарел и удалён в Samba 4. `security = user` (безопасность на уровне пользователя) — единственный поддерживаемый режим в современной Samba: каждое подключение аутентифицируется по конкретному имени пользователя и паролю. Гостевой доступ обрабатывается отдельно через директивы `guest ok` и `map to guest`, а не через параметр `security`.
Может ли Samba сосуществовать с NFS на одном сервере?
Да. Samba и NFS работают на совершенно разных портах и протоколах и не конфликтуют на сетевом уровне. Однако одновременный доступ к одному каталогу через оба протокола может вызвать конфликты блокировки файлов, особенно при операциях записи. Если необходимо предоставить доступ к одним и тем же данным через оба протокола, используйте менеджер распределённых блокировок (DLM) или ограничьте один из протоколов доступом только для чтения.
Как добавить нескольких пользователей к одному общему ресурсу Samba?
Используйте группу Linux. Создайте группу (`groupadd teamshare`), добавьте в неё пользователей (`usermod -aG teamshare user1`), установите групповое владение каталогом общего ресурса (`chown root:teamshare /srv/share`) и укажите группу в `smb.conf` с помощью `valid users = @teamshare`. Этот подход хорошо масштабируется — добавление пользователя к общему ресурсу требует только команды `usermod` и регистрации `smbpasswd -a`, без изменений в `smb.conf`.
