← Назад к вопросам

Что такое SMB протокол?

1.6 Junior🔥 241 комментариев
#Сети и протоколы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое SMB протокол?

Краткий ответ

SMB (Server Message Block) — это сетевой протокол для совместного доступа к ресурсам (файлам, принтерам, портам) в локальной сети или через интернет. Это основа протокола CIFS (Common Internet File System) и современного SMB3.

История развития

SMB 1.0 — разработан компанией Microsoft в 1985 году, оригинальная версия для Windows.

CIFS (Common Internet File System) — расширенная версия SMB для интернета (1996).

SMB 2.0 — усовершенствованная версия с улучшенной производительностью и безопасностью (Windows Vista, 2006).

SMB 3.0 — современная версия с шифрованием, отказоустойчивостью и поддержкой облачных сервисов (Windows 8, 2012).

Назначение SMB

SMB используется для:

  • Общих папок — доступ к файлам и папкам через сеть
  • Принтеров — доступ к сетевым принтерам
  • Именованных каналов (named pipes) — IPC между процессами через сеть
  • Почтовых ящиков — древний механизм обмена сообщениями
  • Удалённого выполнения команд — через инструменты вроде PsExec

Архитектура SMB

Уровень приложения (Samba, Windows Networking)
           ↓
        SMB/CIFS протокол
           ↓
Транспортный уровень (обычно TCP порт 445)
           ↓
IP сеть

Порты:

  • 139 (NetBIOS) — старый транспорт через NetBIOS
  • 445 (Direct TCP) — современный способ, прямое подключение к TCP

Примеры использования

1. Доступ к общей папке Windows

# На Windows
\\server\sharedfolder\file.txt

# На Linux через Samba
mount -t cifs //server/sharedfolder /mnt/share -o username=user,password=pass

2. Работа с файлами программно

#include <windows.h>
#include <iostream>

int main() {
    // Подключение к SMB ресурсу через Windows API
    NETRESOURCE nr = {0};
    nr.dwType = RESOURCETYPE_DISK;
    nr.lpLocalName = L"Z:";
    nr.lpRemoteName = L"\\\\192.168.1.100\\sharedfolder";
    nr.lpProvider = NULL;
    
    DWORD result = WNetAddConnection2(&nr, L"password", L"username", 0);
    
    if (result == NO_ERROR) {
        std::cout << "Успешное подключение\n";
        
        // Теперь можно работать как с локальной папкой
        // Z:\file.txt
        
        WNetCancelConnection2(L"Z:", 0, TRUE);
    } else {
        std::cout << "Ошибка подключения: " << result << "\n";
    }
    
    return 0;
}

3. Использование Samba на Linux

# Установка Samba
sudo apt install samba samba-client

# Просмотр доступных ресурсов
smbclient -L //192.168.1.100 -U username

# Подключение к папке
smbclient //192.168.1.100/sharedfolder -U username

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

Уязвимости старых версий:

  • SMB 1.0 — WannaCry атаки (CVE-2017-0144) использовали уязвимости в SMB1
  • Передача паролей — в старых версиях пароли передавались в слабом хешировании

Защита в SMB 3:

  • Шифрование AES-128-CCM — все данные шифруются
  • Подписание — проверка целостности сообщений
  • Аутентификация Kerberos — безопасная аутентификация в домене
  • SMB Signing — предотвращает MITM атаки

SMB в контексте Backend разработки

// Пример: чтение файла через SMB для backup
#include <iostream>
#include <fstream>

// На Linux используем libsmbclient
#include <libsmbclient.h>

void backup_file_from_smb() {
    // Инициализация
    smbc_init(auth_fn, 0);
    
    // Открытие файла через SMB
    SMBCFILE *file = smbc_open("smb://server/share/file.txt",
                                O_RDONLY, 0755);
    if (!file) {
        std::cout << "Ошибка открытия файла\n";
        return;
    }
    
    // Чтение содержимого
    char buffer[4096];
    ssize_t bytes_read;
    while ((bytes_read = smbc_read(file, buffer, sizeof(buffer))) > 0) {
        // Обработка данных
    }
    
    smbc_close(file);
}

Альтернативные протоколы

  • NFS (Network File System) — для Unix/Linux сетей
  • SFTP (SSH File Transfer Protocol) — безопасная передача файлов
  • FTP — старый, небезопасный протокол
  • HTTP/HTTPS — для веб-файлов
  • iSCSI — для блочного хранилища

Проблемы SMB

  • Производительность — не всегда быстрая, особенно при большом количестве файлов
  • Безопасность — SMB1 имеет серьёзные уязвимости, использовать нельзя
  • Совместимость — работает лучше в Windows окружении
  • Сложность отладки — проблемы с сетевыми подключениями трудно диагностировать

Выводы

  • SMB — основной протокол для общих ресурсов в Windows сетях
  • SMB3 — современная, безопасная версия с шифрованием
  • Используй SMB3 если нужен доступ к Windows файлам через сеть
  • Избегай SMB1 — множество уязвимостей
  • На Linux — Samba обеспечивает совместимость с Windows SMB
Что такое SMB протокол? | PrepBro