네트워크를 통해 파일을 공유할 프로토콜을 선택할 때, 소프트웨어 인터페이스와 문서에서 SMB와 CIFS라는 용어를 흔히 접하게 됩니다. 일부 사용자들은 SMB와 CIFS가 동일한 것으로 생각하지만, 두 용어의 차이점을 명확히 구분하는 것은 어려울 수 있습니다. 그러나 왜 CIFS를 SMB의 동의어로 사용할 수 없는지 살펴보겠습니다. SMB와 CIFS 프로토콜의 차이점과 용어 사용 방법에 대해 알아보세요.
SMB란 무엇인가?
SMB, 즉 서버 메시지 블록은 OSI 통신 모델의 응용 계층에서 작동하는 네트워크 프로토콜입니다. SMB는 네트워크 상의 자원에 대한 공유 접근을 제공하는 데 사용됩니다. SMB 프로토콜은 파일 서버에서 파일을 공유하거나, 사용자 컴퓨터 간에 파일을 공유하고, 컴퓨터 간에 파일을 복사하는 데 널리 사용됩니다.
파일 조작 외에도, SMB의 다른 사용 사례로는 메시징과 인쇄(일반적인 원격 트랜잭션) 및 네트워크 내 컴퓨터 탐색이 있습니다. IBM은 1983년에 SMB를 개발했으며, 이후 프로토콜은 여러 번 개선되었습니다.
SMB 파일 공유란 무엇인가?
SMB 파일 공유는 SMB 프로토콜을 통해 사용 가능하게 만들어진 원격 호스트의 디렉토리입니다. 이들은 파일 서버에 구성되며, 이 공유에 대한 읽기 및 쓰기 접근을 설정할 수 있습니다. 하나의 파일 서버에는 여러 SMB 공유가 있을 수 있습니다.
SMB 작동 방식: SMB는 무엇을 하는가?
SMB는 클라이언트-서버 네트워크 원칙을 기반으로 작동합니다. 이 프로토콜은 클라이언트가 보낸 요청이나 서버가 보낸 응답을 포함하는 데이터 패킷 세트를 사용합니다. 클라이언트는 IP 주소나 호스트 이름을 사용하여 서버에 연결할 수 있습니다. 이 SMB 데이터 패킷은 다음과 같이 분류될 수 있습니다:
- 세션 제어 패킷은 파일 공유에 연결을 설정하거나 중지합니다
- 파일 액세스 패킷은 이름에서 알 수 있듯이 파일 공유에 액세스하고 파일을 조작합니다
- 일반 메시지 패킷
SMB는 연결을 설정하고 인증을 완료한 후 세션을 엽니다. 그런 다음 SMB 메시지를이 세션을 통해 전송 할 수 있습니다. 세션을 시작할 때 SMB 클라이언트는 자신의 기능 목록을 보냅니다 (기능은 클라이언트의 SMB 버전에 따라 다릅니다)
SMB 프로토콜은 다음과 같이 작동 할 수 있습니다:
- 포트 445를 사용하여 TCP를 통해 직접- 이것이 현대적인 접근 방식입니다.
- UDP 포트 137 및 138 및 TCP 포트 137 및 139를 사용하여 NetBIOS API를 통해-이것은 Windows 2000까지 사용 된 레거시 접근 방식입니다. 초기 버전의 SMB는 전송 용으로 TCP/IP의 NetBIOS를 사용했습니다
SMB 프로토콜은 성능을 향상시키기 위해 여러 메시지를 그룹화하고 한 번에 보내는 일괄 처리를 지원합니다
추가 기능에는 여러 사용자가 동시에 같은 파일을 열 때 공유 파일을 보호하기 위한 파일 잠금 메커니즘이 포함됩니다. 파일을 잠그면 여러 사용자가 동시에 데이터를 쓰지 못하고 파일에서 데이터 불일치가 발생하는 것을 피할 수 있습니다
IPC (프로세스 간 연결)은 널 세션 연결로도 알려져 있습니다. Windows에서 생성 된 IPC$ 공유는 클라이언트와 서버 간의 임시 연결에 사용됩니다. 이 숨겨진 공유는 파일 / 디렉토리 및 프린터로 분류 할 수 없는 데이터를 공유하기 위해 만들어졌습니다. 사용자 및 공유 열거입니다.
Windows 시스템은 기본적으로 SMB 클라이언트와 서버를 가지고 있습니다. 그러나 클라이언트 Windows 버전은 호스트에 연결할 수 있는 사용자 수에 제한이 있습니다. 반면 Windows Server 버전은 이러한 제한이 없습니다.
- Windows XP 및 Vista – 최대 10개의 동시 연결
- Windows 7 및 Windows 10 – 최대 20개의 동시 연결
Linux의 SMB 서버는 Samba를 구성하여 설치됩니다. Samba는 Linux용 무료 SMB 서버 구현체입니다. 또한 Samba를 사용하면 Linux를 Active Directory 도메인에 가입시키고 Linux를 도메인 컨트롤러로 사용할 수도 있습니다. SMB 클라이언트 소프트웨어는 Linux를 비롯한 다른 운영 체제에서도 사용할 수 있습니다(무료로).
CIFS란?
CIFS 또는 공통 인터넷 파일 시스템은 Microsoft가 Windows 95 출시 이후 1996년에 개발한 SMB의 특정 구현체 또는 방언입니다. 방언은 별도의 독립적인 프로토콜이 아닌 버전입니다. 방언은 호스트간에 통신하는 데 사용되는 메시지 패킷의 세트로서 특정 프로토콜 버전을 정의합니다. CIFS는 이름이 시사하는 것과 달리 파일 시스템이 아닙니다.
CIFS 프로토콜 사양은 원래의 SMB 프로토콜을 기반으로 마이크로소프트가 추가한 몇 가지 기능이 포함되어 있습니다. 마이크로소프트는 NetBIOS over TCP(최초의 SMB 1 구현에서 사용되었던 것)를 사용하지 않고 TCP 및 포트 445를 통한 직접 연결을 구현했습니다. CIFS는 SMB 1의 구현체이며 별도의 파일 공유 프로토콜은 아닙니다.
SMB 프로토콜 방언들
마이크로소프트의 SMB1 구현에 대해 이야기할 때 CIFS 용어를 사용할 수 있습니다. 다른 모든 경우와 일반적으로 SMB는 이 네트워크 프로토콜을 가리키는 올바른 용어입니다. CIFS 이후 릴리스된 SMB 버전을 살펴보면 CIFS와 다른(새로운) SMB 방언(버전) 간의 차이를 더 잘 이해할 수 있습니다.
SMB 2.0
마이크로소프트는 2006년 윈도우 비스타에서 SMB 2.0(또는 SMB2)을 출시했습니다. 이 SMB 버전은 SMB 1.0/CIFS보다 신뢰성이 높으며 CIFS가 아닙니다. 파일 전송에 필요한 명령의 수가 100개 이상에서 20개로 줄어듭니다. 성능은 파이프라인 처리 메커니즘으로 인해 더 높아지는데, 즉 이전 요청에 대한 응답을 받기 전에 추가 요청을 보낼 수 있는 능력입니다. 여러 작업을 한 요청으로 묶으면 클라이언트로의 요청 수가 줄어들어 성능이 향상됩니다.
SMB 2.1
SMB 2.1은 SMB 2.0과 비교했을 때 성능 및 차단 메커니즘에서 미미한 개선을 제공합니다. 이 프로토콜 버전은 윈도우 7 및 윈도우 서버 2008 R2와 함께 출시되었습니다.
SMB 3.0
이 프로토콜 버전은 처음에 SMB 2.2로 불렸지만 나중에 윈도우 8에서 SMB 3.0으로 이름이 변경되었습니다. SMB 3.0 버전:
- SMB Direct(메모리 직접 액세스), SMB Multichannel 및 SMB Transport Failover를 추가했습니다
- 보안을 개선했습니다
- 끝 간 암호화 지원을 추가했습니다
- 지연 시간을 줄이는 네트워크 효율성을 개선했습니다
SMB 3.0.2
SMB 3.0.2 또는 3.02는 Windows 8.1 및 Windows Server 2012 R2부터 사용 가능합니다. 이 버전에서는 보안을 향상시키기 위해 SMB 1.0 호환성을 끌 수 있습니다.
SMB 3.1.1
이 버전은 Windows 10 및 Windows Server 2016부터 사용할 수 있습니다. 개선 사항에는 AES 128 GCM 및 AES 128 CCM에 대한 더 나은 암호화 및 사전 인증 무결성 검사를 위한 SHA-512 해시가 포함됩니다.
Windows 및 Microsoft Server의 SMB
Windows에서는 Windows 3.1(Windows for Workgroups)부터 사용할 수 있습니다. 다른 Windows 버전에 대한 SMB 버전 및 호환성은 표에 설명되어 있습니다.
열과 행은 SMB 클라이언트 또는 SMB 서버를 실행할 수 있는 Windows 버전을 포함합니다(열과 행은 서로 바꿀 수 있습니다). 열과 행이 교차하는 셀은 해당 Windows 버전 간 통신에 사용되는 SMB 프로토콜 버전을 표시합니다.
윈도우 10
서버 2016 이상 |
윈도우 8.1
서버 2012 R2 |
윈도우 8
서버 2012 |
윈도우 7
서버 2008 R2 |
윈도우 비스타
서버 2008 |
윈도우 XP, 서버 2003 이전 | |
윈도우 10
서버 2016 이상 |
SMB 3.1.1 | SMB 3.02 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
윈도우 8.1
서버 2012 R2 |
SMB 3.02 | SMB 3.02 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
윈도우 8
서버 2012 |
SMB 3.0 | SMB 3.0 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
윈도우 7
서버 2008 R2 |
SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
윈도우 비스타
서버 2008 |
SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 1.0 |
윈도우 XP, 서버 2003 이전 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 |
CIFS 대 SMB: 혼란의 원인
예를 들어서 사용자들이 여전히 CIFS와 SMB 용어를 혼동하는 이유를 알아보겠습니다. 이를 위해, Windows Server 2019에서 SMB 공유가 구성된 파일 서버를 사용하고, 리눅스 머신이 SMB 프로토콜을 통해 이 파일 서버에 연결하는 상황을 가정해 봅시다. 이 예시에서는 Ubuntu 20.04를 사용합니다. Ubuntu 22에서도 구성이 동일하다는 점에 유의하십시오.
환경 설정은 다음과 같습니다:
- Windows Server 2019: 192.168.101.209
- Linux Ubuntu 20.04: 192.168.101.210
- Windows Server의 SMB 공유: \\192.168.101.209\share
Windows Server 2019에서는 SMB 1.0/CIFS 프로토콜이 기본적으로 비활성화되어 있습니다. 이 설정을 확인하고 SMB 1.0/CIFS 클라이언트 및 서버를 수동으로 활성화/비활성화하려면, Server Manager > Add Roles and Features > Features로 이동하십시오.
우리는 Windows Server 2019 기계에서 SMB 1.0/CIFS를 비활성화 상태로 유지합니다. 이는 SMB 3이 기본적으로 사용되며, SMB 2로 전환하여 SMB 2 버전(언어)을 사용하는 클라이언트와의 호환성을 유지할 수 있다는 것을 의미합니다.
현대의 Windows 10과 같은 최신 Windows 버전에서는 CIFS 프로토콜이 기본적으로 비활성화되어 있어 더 나은 보안을 제공하며, 필요한 경우 수동으로 활성화할 수 있습니다.
참고: 2017년에는 대규모 전 세계적인 랜섬웨어 공격(WannaCry 및 NotPetya)이 SMB 1 취약점을 이용한 공격으로 이루어졌습니다. 이러한 공격은 EternalBlue, EternalRomance 및 EternalChampion으로 명명되었습니다. Microsoft는 Windows XP 및 Windows Server 2003부터 보안 패치를 배포했으며, 이 시점에서 이러한 OS가 공식적으로 지원되는 버전이 아니었음에도 불구하고 그렇게 했습니다. Microsoft는 SMB 1.0/CIFS 대신 SMB 2 및 SMB 3(사전 인증 무결성 지원)을 사용할 것을 권장했습니다.
위에서 언급한 바와 같이, Linux용 SMB 서버의 이름은 Samba입니다(samba는 패키지 이름입니다). 우리는 Windows에서 SMB 서버를 사용하고 있습니다. 따라서 이 예시에서는 Samba가 필요하지 않고, Ubuntu Linux용 SMB 클라이언트가 필요합니다.
Linux CIFS Utils(cifs-utils는 패키지 이름)에는 Linux용 SMB 클라이언트가 포함되어 있습니다. 이것이 혼란의 근본이 됩니다. Linux용 이 클라이언트의 첫 번째 버전은 SMB 1.0/CIFS가 널리 사용되던 시기에 만들어 졌습니다. SMB 프로토콜이 업데이트되었고, SMB 버전 2와 3이 출시되었지만, Linux SMB 클라이언트의 이름은 그대로이며, SMB 클라이언트를 포함하는 패키지는 여전히 CIFS Utils로 불립니다. 패키지 cifs-utils는 samba의 일부가 아닙니다.
우리는 CIFS Utils를 사용하여 Linux에서 Windows Server 2019에 위치한 SMB 공유에 연결하여 CIFS가 여전히 사용되고 있는지 알아볼 것입니다. CIFS Utils를 설치하려면 다음 명령을 루트 권한으로 실행하십시오:
sudo apt-get install cifs-utils
SMB 공유를 마운트 포인트로 사용할 디렉토리를 생성하십시오:
mkdir /mnt/share
원격 Windows 파일 서버에 위치한 SMB 파일 공유에 연결하십시오:
mount.cifs //192.168.101.209/share /mnt/share -o user=administrator
교육 목적으로 예제에서는 Windows 관리자 사용자 계정을 사용합니다.
CIFS 대 SMB – 현재 세션에서 파일 서버에 연결할 때 어떤 것을 사용해야 할까요? Windows Server 2019에서 SMB 공유에 연결된 클라이언트의 SMB 버전을 확인하려면 PowerShell 명령을 사용하십시오:
Get-SmbSession | Select-Object -Property ClientComputerName,ClientUserName,Dialect
PowerShell 출력에서 볼 수 있듯이 Ubuntu Linux에서 우리의 연결에 SMB 3.1.1이 사용됩니다. cifs-utils 및 mount.cifs 명령을 사용하여 Windows Server 2019에 구성된 파일 서버에 연결할 때 SMB 1.0/CIFS는 사용되지 않습니다.
또한 Linux에서 /proc/mounts에서 SMB 프로토콜 버전을 확인할 수 있습니다. 필요한 결과만 필터링하는 다음 명령을 사용할 수 있습니다:
cat /proc/mounts | grep cifs
출력에서 파일 공유에 연결하는 프로토콜 버전은 cifs로 표시되지만 표시된 버전은 3.1.1 (vers=3.1.1)이며 이는 CIFS 버전이 아닙니다. 이는 SMB 대 CIFS 용어가 혼동될 수 있는 또 다른 예입니다.
실제로 SMB 3.1.1이 사용되고 CIFS가 아닙니다. 분석 및 문제 해결에 사용되는 무료 네트워크 탐지 도구인 nmap을 사용하여 한 가지 더 방법으로 증명할 수 있습니다.
Ubuntu에 nmap을 설치하려면 다음 명령을 root로 실행하십시오:
sudo apt-get install nmap
온라인 및 192.168.101.0/24 네트워크에 연결된 모든 호스트를 스캔하려면 다음 명령을 사용하십시오:
nmap --script smb-protocols 192.168.101.0/24
우리는 파일 서버로 작동하는 우리의 Windows Server 2019의 IP 주소인 192.168.101.209에 대한 결과를 보고 싶습니다. Linux는 이 서버의 파일 공유에 연결되어 있습니다. 출력에서 우리의 Windows Server에서 지원하는 SMB 프로토콜의 방언은 2.02, 2.10, 3.00, 3.02, 3.11임을 알 수 있습니다. 그러나 CIFS 용어는 여전히 Linux 구성 파일과 명령에서 사용되고 있으며 SMB 1.0/CIFS는 없습니다.
Linux에서 mount 명령에 vers=1.0 매개변수를 추가하여 원격 서버의 파일 공유에 연결할 때 SMB 1.0/CIFS 프로토콜만 사용하도록 강제할 수 있습니다(클라이언트 측).
mount -t cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=1.0
또는
mount.cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=1.0
결과는 다음과 같습니다.
서버가 연결을 갑작스럽게 닫았습니다. 이것은 서버가 사용하려는 SMB 버전을 지원하지 않는 경우에 발생할 수 있습니다. 기본 SMB 버전은 최근 SMB1에서 SMB2.1 이상으로 변경되었습니다..
이 결과는 최신 운영 체제에서 SMB vs CIFS 조사 결과와 일치합니다. CIFS는 사용되지 않으며 우리의 Windows Server에서 SMB 1.0/CIFS는 비활성화되어 있습니다.
최소한 SMB 2.0을 사용하도록 설정하면 서버에 연결할 수 있습니다(우리의 Windows Server 2019가 지원하는 SMB 방언 목록을 nmap에서 표시했음을 기억하십시오):
mount.cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=2.0
리눅스 또는 다른 운영 체제에서 그래픽 사용자 인터페이스를 사용할 때, 원격 서버의 파일 공유에 연결하기 위해 사용되는 네트워크 프로토콜을 정의할 때 주소 행에 smb://를 사용하세요.
SMB 파일 공유의 주소를 입력할 때는:
smb://서버-이름/공유-이름
을 사용해야 합니다. 다음을 사용하지 마세요:
cifs://서버-이름/공유-이름
왜냐하면 클라이언트는 SMB1.0/CIFS 프로토콜을 사용하여 연결을 시도할 것이고, 이는 서버에서 비활성화될 수 있습니다(클라이언트가 cifs:// 구문을 지원한다고 해도).
결론
CIFS 프로토콜이 구식이 되었기 때문에, SMB는 파일 서버와 NAS에 연결하기 위해 사용되는 프로토콜 중 하나입니다(다른 자주 사용되는 것은 NFS입니다). 공유 스토리지는 데이터 손상, 랜섬웨어 및 네트워크를 통해 쉽게 퍼질 수 있는 다른 위협에 특히 취약하기 때문에, 데이터 손실을 방지하기 위해 공유 리소스에 저장된 파일과 폴더를 백업하는 것이 중요합니다. 공유 파일에 쓰기 권한이 있는 단 한 명의 사용자의 컴퓨터가 감염되면 모든 사용자에게 데이터 손실이 발생할 수 있습니다.
NAKIVO Backup & Replication은 NAS 및 Windows/Linux 파일 서버에 있는 데이터에 대한 SMB 및 NFS를 통한 증분 백업을 지원하는 데이터 보호 솔루션입니다.