Делаем usb принтер сетевым и смотрим что под капотом

USB-принтером одного хоста относительно легко поделиться с другими хостами. Хосты должны находиться в одной локальной сети.

Обмен при этом реализуется на базе гремучей смеси новых (ipv6, llmnr) и старых (netbios, ntlm, dce/rpc) протоколов, что можно увидеть в wireshark/tcpdump.

Это, безусловно, не продакшн решение (хотя по факту у многих используется так):

  1. нужно чтобы хост, к которому подключен принтер, был включен, хотя и нет необходимости, чтобы кто-то на нем был авторизован (используется guest учетка, см. ниже)
  2. большое количество древних и потенциально опасных протоколов, хотя и работающих только в одной LAN, ставят вопрос о сетевой безопасности решения – best Practice является отключение NetBios и LLMNR через AD. И это не говоря о включенном guest.
Guest logons do not support standard security features such as signing and encryption. Therefore, guest logons are vulnerable to man-in-the-middle attacks that can expose sensitive data on the network. Windows disables "insecure" (nonsecure) guest logons by default. Microsoft recommends that you do not enable insecure guest logons.
Как реализовать

Как сделать написано со скринами тут:

http://lumpics.ru/enabling-windows-7-printer-sharing/
https://support.microsoft.com/ru-ru/help/4089224/windows-10-share-network-printer

Текстом и особенности (с которыми столкнулся):

1) Включаем обнаружение по сети – комп с которого будем печатать должен видеть в сетевом окружении комп с принтером и сам принтер. Для этого в параметрах общего доступа включаем общий доступ к файлам и принтерам (помимо этого разрешать отдельно трафик в host-based firewall, антивирусах обычно не нужно)

Панель управления\Все элементы панели управления\Центр управления сетями и общим доступом\Дополнительные параметры общего доступа

2) В свойствах принтера назначаем ему сетевое имя, включаем общий доступ

Панель управления\Оборудование и звук\Устройства и принтеры\Samsung Universal Print Driver

3) Пробуем зайти на него с локального ПК

\\Home-PC\SMSG_PRINT

4) Пробуем зайти на него с другого ПК по тому же адресу. Если не пускает – смотрим чтобы компы были в рабочей группе с одним названием, была отключена парольная защита и была рабочей учетная запись guest-пользователя (если не отключается парольная защита – разбираемся с guest по алгоритму ниже)

https://social.technet.microsoft.com/Forums/Windows/ru-RU/8022e99a-385e-4067-a565-81c08ba942b0/10531077-1084108610751091?forum=win10itprogeneralRU

Цитата: "ПКМ по МОЙ КОМПЬЮТЕР - управление - локальные пользователи - пользователи - ПКМ по ГОСТЬ - убрать галочки ЗАПРЕТИТЬ СМЕНУ ПАРОЛЯ ПОЛЬЗОВАТЕЛЕМ и ОТКЛЮЧИТЬ УЧ.ЗАПИСЬ (то бишь она должна быть включена) - ОК - снова ПКМ по ГОСТЬ - ЗАДАТЬ ПАРОЛЬ - оставляем поля пустыми - ОК - перезагрузка теперь можно отключить общий доступ с парольной защитой"

5) Пробуем добавить принтер на удаленном ПК и распечатать. Если при попытке добавления ругается на драйвера, которые не может найти, не печатает несмотря на то, что устройство нашлось и добавилось в список принтеров – переставляем драйвера.

Мне с моим старым Samsung SCX-4100 помогла полная переустановка драйверов на обоих ПК на самую свежую версию Samsung Universal Print Driver 3.

С установкой проблемы вероятно не возникло бы изначально, если бы была одинаковая архитектура на ПК - основной комп может "поделиться" своими драйверами с удаленным. Но у меня на основном компе х64, а на втором х86. Драйверов же х86 не было на основном компе.

При переустановке драйверов на новые на основном компе я указал, что принтер будет использоваться для общего доступа и параметры этого общего доступа. Это привело к тому, что поставились сразу драйвера для обеих архитектур, а не только х64.
Обмен по сети

С точки зрения сети обмен между двумя ПК в одной локальной сети (с подключенным принтером и без принтера) выглядит в wireshark ну очень интересно – используется куча разных новых/старых технологий. Хосты обмениваются сообщениями протокола SMB2 (просто SMB2 или spoolss сообщения Microsoft Print System Remote Protocol в DCE/RPC поверх SMB2), которые вкладываются в NetBIOS и передаются поверх IPv6 сети (NetBios поверх TCP/IP) на базе link-local адресации fe80.

Ethernet -> IPv6 link-local -> TCP 445 -> NetBIOS -> SMB2

Хост без принтера узнает Link-local адрес IPv6 хоста с принтером посредством отсылки запроса протокола LLMNR (link-local multicast name resolution query). При этом хост, посредством LLMNR, узнает и IPv4 адрес.

IPv4 - 224.0.0.252, MAC address 01-00-5E-00-00-FC
IPv6 - FF02:0:0:0:0:0:1:3 (this notation can be abbreviated as FF02::1:3), MAC address 33-33-00-01-00-03

Но для обмена используется именно IPv6 – SMB2 Negotiate Protocol Request формируется для IPv6 адреса хоста с принтером, а не для IPv4. При этом сообщениями SMB поверх NetBios в IPv4 хосты обмениваются и ничего не зафильтровано. Видимо IPv6 адресация считается предпочтительной.

Безопасность тут можно не искать. Если сделать Follow tcp-stream с кодировкой символов ASCII и UTF-16, то можно увидеть часть методанных о хостах и файле, отправленном на печать, хотя и не само содержимое файла – насколько понял, оно не зашифровано, но закодировано (хотя SMB2 уже умеет шифровать, 2 несмотря на расхожее мнение). Аутентификация есть – используется NTLM, передается Token Signing Public Key, только толку от нее как по мне никакого, используется же guest.

9164 463.088303 Azurewav_7b:d2:80 fe80::412a:b03a:6087:dc90 fe80::e014:61d7:d551:aa5f SMB2 240 Session Setup Request, NTLMSSP_NEGOTIATE

9165 463.088559 AsustekC_a1:08:21 fe80::e014:61d7:d551:aa5f fe80::412a:b03a:6087:dc90 SMB2 339 Session Setup Response, Error: STATUS_MORE_PROCESSING_REQUIRED, NTLMSSP_CHALLENGE

9166 463.090349 Azurewav_7b:d2:80 fe80::412a:b03a:6087:dc90 fe80::e014:61d7:d551:aa5f SMB2 627 Session Setup Request, NTLMSSP_AUTH, User: ASUS-NOTE\123

 

 

Leave a Reply