Ciao a tutti e bentrovati.

Lo scopo di quest post non è spiegarvi come funziona il protocollo SMB, che immagino utilizzate quotidianamente e conoscete già benissimo. Invece, vorremmo approfondire alcuni aspetti a basso livello che potrebbero rivelarsi utili, soprattutto perchè la nomenclatura potrebbe confondere alcuni utenti.

SMB, il protocollo che ci permette di accedere a files, cartelle e stampanti condivise in rete, può funzionare in due modi differenti, totalmente trasperenti all’utente finale.

NetBIOS over TCP/IP

Per compatibilità con le versioni precedenti del sistema operativo, Windows Server 2003 può utilizzare ancora NetBIOS su TCP/IP per comunicazioni SMB. In questo caso, la porta utilizzata è la TCP 139.

Direct-hosted SMB

Esiste, parallelamente, la possibilità del Direct Hosting, cioè SMB direttamente su TCP, senza avere la necessità di utilizzare NetBIOS. Questa tipologia di comunicazione viaggia sulla porta TCP 445. Il vantaggio di questa tecnologia è indubiamente quello di semplificare il trasporto del traffico SMB, oltre ad utilizzare il DNS come modalità di risoluzione nomi che al giorno d’oggi è nettamente prevalente rispetto al WINS/NetBIOS.

Il comportamento di default di Windows sarà quindi di tentare una connessione su entrambe le porte 139 e 445, e semplicemente verrà utilizzata quella per cui si ottiene una risposta più veloce. Questo permette a Windows di funzionare correttamente anche con quei device che eventualmente non supportano il Direct Hosting.

Una volta determinata la modalità di connessione, tutto lo scambio di dati a livello SMB ad alto livello avviene in modo analogo.

Come sono implementate queste due modalità a livello di Kernel?

Una trattazione completa dell’implementazione di tutto lo stack è disponibile a questo link:

Microsoft Windows Server 2003 TCP/IP Implementation Details

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=13902

Per lo scopo di questo post, è bene soffermarsi solo su alcuni punti chiave.

image

Il servizio Server, responsabile della gestione delle shares SMB, si appoggia direttamente al driver SRV.sys. Per funzionare correttamente, dovrebbe quindi aprire le due porte TCP che abbiamo descritto precedentemente e mettersi in stato di listening in attesa di connessioni incoming da parte dei vari client. Quello che molti non sanno è che, seppur SRV ne sia responsabile, l’apertura della porta 445 è delegata al driver NetBt.sys.

Al contrario, se abbiamo IPv6 abilitato, la gestione della porta 445 è invece effettuata direttamente da SRV.sys

Qualora dovessimo avere dei problemi, la primissima cosa che dobbiamo controllare che è NetBt sia attivo e funzionante in modo corretto. Inoltre, sono numerosissimi i casi in cui abbiamo dei filter drivers installati (ad esempio driver di Antivirus o real-time Network scanning) che si frappongono tra NetBt e SRV e che impediscono il corretto flow dei dati nello stack e pregiudicano il funzionamento delle connessioni su porta 445 - mentre funziona tutto liscio su 139.

Come verificare se il mio server sta funzionando correttamente, sulle porte 139 e 445?

Il metodo più facile è verificare se entrambe le porte sono in stato di listening con il comando netstat –ano

image

Più nel dettaglio, qualora dovessimo avere dei problemi con una delle porte non in ascolto correttamente, dobbiamo andare a verificare che siano effettivamente presenti i binding sia per il NetbiosSmb (che è il trasporto direct-hosted sulla 445) che per il NetBT_Tcpip (che rappresenta il trasporto NetBIOS over TCP/IP quindi porta 139) tramite il comando net config server

image

è bene specificare che NetbiosSmb è un global device (valido a livello di sistema operativo) mentre NetBT_Tcpip è bindato ad ogni singola interfaccia di rete (di cui vediamo tutti i GUID nell’output di net config). Anche per questo motivo, sull’output di netstat vediamo la porta 445 in ascolto globalmente (TCP 0.0.0.0:445) mentre la 139 è in ascolto su ogni singola interfaccia, con socket associato ai vari indirizzi IP (nel mio caso 10.0.0.15:139)

In caso di ulteriori complicazioni, è opportuno verificare che tutte le interfacce siano linkate anche a livello di registry di Windows, di cui possiamo controllare la seguente chiave.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanManServer\Linkage]
Name: Bind
Type: REG_MULTI_SZ

Value:
\Device\NetbiosSmb\0
\Device\NetBT_Tcpip_{962378A9-E1CC-4707-8BB1-DE766C068347}\0
\Device\NetBT_Tcpip_{0BBC31F9-F0E1-4C3E-B7CB-14904D3925F5}

Come disabilitare l’utilizzo dell’una o dell’altra modalità?

1) Per disabilitare NetBIOS over TCP/IP, bisogna lavorare direttamente sulla scheda di rete, e selezionare “Disable NetBIOS over TCP/IP” dal menu Proprietà / Internet Protocol (TCP/IP) / Proprietà / Avanzate / WINS

image

é bene ricordare che dopo questa operazione, non potrà più funzionare nessuna applicazione basata su NetBIOS.

2) Per disabilitare Direct-Hosted SMB, è sufficiente modificare la seguente chiave di registro :

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters]

Name: SMBDeviceEnabled
Type: REG_DWORD
Value: 0

(il valore di default è 1 che significa che la modalità è abilitata)

Ulteriori informazioni utili

Ciao e alla prossima!

Stefano Gagliardi
Support Engineer
Microsoft Enterprise Platform Support