Итак. Предположительно, сервис печати CUPS — это мощное решение, позволяющее организовать централизованное управление принтерами в компании. Так оно и есть, но в процессе настройки потребуется провести некоторое время в поисках решения в Google множества мелких неочевидных проблем, особенно, если ваша необходимость выходит за рамки стандартных мануалов по настройке.
В статье будет описана установка принтсервера CUPS на Ubuntu Server в сети с работающим доменом Active Directory, хотя его наличие совершенно не обязательно и инструкции по настройке взаимодействию с ним можно будет смело пропустить, его настройка, а также настройка клиентских машин Linux и Windows для взаимодействия с данным принт-сервером.
В инструкции домен будет именоваться example.com, сам принтсервер — cupsserver (cupsserver.example.com) с IP адресом 10.10.100.50, а клиентские машины linux1, linux2, linux3 и т.д для клиентских машин Linux и windows1, windows2, windows3 и т.д. для клиентских машин Windows соответственно.
В первую очередь мы настроим принтсервер, а точнее, настроим административный доступ на него, затем настроим печать на него, а затем опишем настройку клиентских машин.
Заходим на принтсервер любым удобным способом и обновим на нем пакеты:
Далее проверим, установлен ли CUPS на сервере:
Если вывод выглядит как то так:
то CUPS установлен, если вывода нет — устанавливаем CUPS:
Теперь настроим административный доступ к веб-интерфейсу CUPS. Все файлы конфигурации находятся по пути /etc/cups/. Для начала, на всякий случай сделаем резервные копии основных файлов конфигурации CUPS:
Впрочем, если вы этого не сделали — не беда, образцы данных файлов по умолчанию лежат по пути /usr/share/cups. Также нужно упомянуть, что вы можете проверить любые добавленные опции в файлы конфигурации CUPS с помощью команды:
Если вы что-то напутали, опечатались или использовали опцию, которая уже не поддерживается CUPS'ом, то вывод команды отразит данные ошибки.
Но приступим наконец к настройке. После любых изменений файлов в папке /etc/cups/ для получения эффекта необходимо перезапускать сервис CUPS:
А если вы отредактировали файл /etc/cups/cups-browsed.conf, то за него отвечает отдельный сервис cups-browsed, который тоже нужно перезапустить:
Выполним команду
Первой незакомментированной опцией является
Она определяет минимальную информативность логов CUPS. Лог-файлы CUPS находятся по пути /var/log/cups/. На время установки, настройки и отладки принтсервера будет разумным перевести логгирование в debug-режим. Для этого изменим warn на debug2:
По умолчанию CUPS слушает входящие подключения только от localhost, то бишь на loopback интерфейсе. Чтобы убедится в этом, можете выполнить команду
Одна из строк будет выглядеть приблизительно так:
Дальнейшие действия зависят от степени вашей паранойи. Вы можете добавить в блоке, который условно начинается с комментария #Only listen for connections from the local machine несколько строк с указанием IP адресов или подсетей, откуда CUPS'у будет позволено слушать подключения.
Либо же вы можете разрешить CUPS'у слушать подключения со всех адресов
Следующий момент настройки — это обнаружение сетевых и расшаренных принтеров.
На мой взгляд эта опция так и должна остаться выключенной, так как она определяет, будет ли рассылаться широковещательная информация по сети о подключенных к принтсерверу принтерах. А они ведь будут подключены к ней все. И соответственно у всех клиентских машин будут отображаться сразу все принтера. Наш принтсервер должен искать и обнаруживать все принтера в сети, но не рассылать их бездумно по всей сети.
Далее идут настройки аутентификации
Определяет права доступа к веб-интерфейсу CUPS, а также к его административной части. Чтобы пользователь user имел право на администрирование CUPS, его нужно добавить в системную группу lpadmin:
Вообще, группы, которым позволен административный доступ к CUPS, определяются в файле конфигурации cups-files.conf в блоке
Если вы хотите добавить некой группе пользователей Linux права на администрирование принтсервера, например printadmins, то просто добавьте их через пробел к lpadmin. Если группа доменная, то это немного сложнее и будет описано позже.
Теперь перейдем к блоку <Location />:
Order allow,deny означает, что запрещены подключения отовсюду, если специально не указано разрешение. То есть нужно добавлять IP-адреса, подсети, хосты или хосты по маске (*.example.com) в виде "Allow from [разрешенный адрес]":
Для полной уверености и отладки, можно оставить, пока не настроите все остальное, такую констукцию, которая позволит печать отовсюду:
Приступим к настройке административного доступа к CUPS на принтсервере. Определитесь, с какого/каких IP и/или подсетей вы собираетесь подключаться к CUPS, и добавить их по аналогии с блоком <Location />:
Еще, по желанию, можно добавить язык интерфейса по умолчанию. Список доступных языков можно посмотреть с помощью команды:
Если нужная вам локализация, например ru, есть, то добавьте строчку в /etc/cups/cupsd.conf:
Чтобы к вашему принтсерверу cupsserver.example.com можно было обращатся по его хосту (hostname), необходимо создать в папке /etc/cups/ файл client.conf с таким содержимым:
Самым простым способом это можно сделать так:
Поскольку мы предполагаем, что в сети есть DNS сервер, то будет предпочтительным, чтобы можно было обращатся к принтсерверу по его доменному имени (cupsserver.example.com). Также серверу может быть присвоен CNAME псевдоним на DNS сервере, например print или cups. Чтобы принтсервер принимал подключения по таким обращениям, необходимо добавить такую строчку в файл /etc/cups/cupsd.conf:
Если вы хотите, чтобы принтсервер примимал любые обращения, или не хотите заморачиваться, то можно добавить это:
Еще нужно взглянуть внутрь файла /etc/cups/cups-browsed.conf. Этот файл управляет тем, как принтсервер будет искать принтеры в сети и проводить широковещательную рассылку своих принтеров. Я предлагаю совершенно отключить опцию рассылки. Принтсервер будет искать принтера в сети, но с него принтеры на клиентские машины будут подключатся вручную. Ниже будет описано, почему. Пока же мы находим строку BrowseRemoteProtocols dnssd cups:
Благодаря этой опции принтсервер ищет расшаренные принтера в сети. Ее мы оставляем включенной, так как в наших интересах, чтобы принтсервер искал принтера в сети. Но нам совершенно не нужно, чтобы принтсервер рассылал вообще все подключенные к нему принтеры, иначе возникнет большая путаница. Для предотвращения такого сценария находим следующую опцию #BrowseLocalProtocols none и раскомментируем ее:
На этом настройку принтсервера приостанавливаем и переходим к настройке клиентких машин Windows и Linux. Требования к ним такие — позволять посылать на себя задания печати принтсерверу, и посылать задания на печать именно (и только) на принтсервер в случае необходимости печати на сетевой принтер.
В качестве примера настроим печать сквозь принтсервер между двумя клиентскими машинами с Linux (имя хоста linux1) и Windows 8 соотвественно (имя хоста windows1). Начнем с настройки windows1 в качестве приемника печати от принтсервера. У меня к нему подключен и штатно работает принтер Canon i-SENSYS MF4410. Имя принтера — Canon-MF4400. Самый простой способ, на самом деле, обеспечить печать с принтсервера на windows1 — перейти в Панель управления > Программы > Программы и компоненты > Включение или отключение компонентов Windows. Там мы включаем компонент Службы печати и документов > Служба печати LPD. Это позволит подключить данный принтер к принтсерверу с помощью адреса lpd://windows1/Canon-MF4400. Разумеется, назревает вопрос, почему бы не подключить с помощью SMB? Никто не запрещает. Если у вас отлажен данный метод, вы можете расшарить принтер таким образом, и подключить к принтсерверу по протоколу SMB. Инстукции по данному подключению, на мой взгляд, выходят за рамки данной статьи, которая и так выходит довольно объемной. Пока же считаем, что читатель успешно зашел по адресу http://cupsserver:631/admin нажал на кнопку «Добавить новый принтер» и следуя интуиции, логике и прочитатанным ранее мануалам успешно подключил принтер с windows1 по протоколу LPD к принтсерверу cupsserver[example.com] и страница принтера доступна по адресу http://cupsserver:631/printers/Canon-MF4400.
Теперь выполним аналогичную операцию на клиентской машине Linux c именем хоста linux1. Вообще, данная часть будет куда объемнее, так как у клиентской машины есть свой сервис CUPS и его тоже нужно настроить во многом так же, как и принтсервер, за исключением его подчиненной роли в организации печати.
Есть неприятный момент. Если вы введете linux1 в домен, настроите на нем CUPS по этим инструкциям, то можете заметить абсурдную ситуацию, когда на WEB-интерфейс linux1 можно зайти снаружи, но на самом хосте этого сделать нельзя! И графические приложения для локальной настройки принтеров, вроде приложения system-config-printer в Linux Mint, отказываются работать. При попытке подключения на свой же CUPS по по адресу http://linux1:631/ будет сообщение «Запрещено» или «Bad Request». Это известная и толком не решенная на множестве форумов интернета проблема.
В большинстве инструкций по введению Linux в домен одним из пунктов является приведение файла /etc/hosts приблизительно к такому виду:
Почему то CUPS не в силах ассоциировать обращение через 127.0.1.1, то есть через Loopback интерфейс, с именем хоста.
Исправляется эта ошибка двумя способами. Если в вашей сети IP адреса статичные, то в файле /etc/hosts.исправьте 127.0.1.1 на IP адрес внешнего сетевого интерфейса клиентской машины, например:
Либо же, раз уж вы вводите Linux в домен, то это предполагает, что в вашей сети работает DHCP и DNS сервер Active Directory. В таком случае просто закомментируйте данную строчку:
Разницы в работоспособности или проблем от данного действия пока обнаружено не было.
Заходим на linux1 любым удобным способом. Редактируем файл /etc/cups/cupsd.conf:
Находим, добавляем или изменяем в нем строки:
В предыдущем блоке мы настроили возможность подключения к CUPS. Теперь перейдем к настройке разрешений на доступ к печати, а также к административным страницам сервиса CUPS на хосте linux1. Вновь открываем, если закрыли, файл /etc/cups/cupsd.conf и переходим к редактированию блоков <Location />, <Location /admin>, <Location /admin/conf>, <Location /admin/log>:
Еще у клиетской машины Linux, в данном случае linux1, необходимо отредактировать файл /etc/cups/cups-browsed.conf:
Еще пару слов по поводу административного доступа, как на WEB-интерфейс CUPS на принтсервере, так и на любой клиентской машине Linux. Даже при условии наличия 30-50 компьютеров нужно унифицировать авторизацию на CUPS, а не держать в голове или еще где пароли каждой машины. И это важно на всех Linux машинах, ведь чтобы добавить принтер на сервер, его сперва нужно установить локально. Я вижу несколько путей.
Первый — на каждой системе Linux создать пользователя printeradmin (например) и добавить в группу lpadmin:
и авторизовываться на http://имя_хоста:631/admin c помощью его учетных данных.
Второй вариант практически идентичен и предлагает создать группу в системе, например, printersadmins, добавить туда требуемого администратора CUPS (printeradmin, user):
Затем нужно найти в файле /etc/cups/cups-files.conf строку
и добавить через пробел одну или несколько групп пользователей с правом администрировать CUPS.
И наконец, третий вариант. Сделать администраторами принтсервера и CUPS'ов клиентских машин доменную группу пользователей. Для этого принтсервер и клиентские машины Linux должны быть присоединены к домену AD. Есть несколько методов подключения Linux к домену Windows, но, насколько я знаю, основные это подключение с помощью winbind и с помощью SSSD(realmd). Описание данных методов не входит в статью, поэтому остановлюсь только на моментах которые касаются конкретно CUPS'а.
Каждый метод присоединения к системе централизованной авторизации в Linux создает специальный файл-«трубу» (pipe), сквозь который приложения могут посмотреть список пользователей домена. Чтобы так мог сделать CUPS, нужно разрешить ему использовать pipe в AppArmor'е для аутентификации пользователей. AppArmor — модуль безопасности Linux по управлению доступом. Ограничивает определенные программы набором перечисленных в его политиках файлов. Чтобы добавить CUPS'у право использовать пользователей и группы домена через winbindd, нужно добавить в файл /etc/apparmod.d/local/usr.sbin.cupsd такую строку:
Если Linux введен в домен через SSSD, то необходимо указать расположение его pipe в /etc/apparmod.d/local/usr.sbin.cupsd, добавив туда строку:
К тому же, в случае с SSSD это позволяет пройти аутентификацию (узнать кто заходит), но чтобы пройти авторизацию (узнать есть ли право у пользователя управлять CUPS) необходимо также добавить в файл конфигурации SSSD /etc/sssd/sssd.conf строку:
Это, условно выражаюсь, дает CUPS'у право «заглядывать» в SSSD.
К тому же, в силу того, что CUPS теперь зависит от сервиса SSSD, нужно указать CUPS'у что он должен запускаться после SSSD, иначе он будет отваливаться при включении и его будет необходимо каждый раз включать вручную.
Добавим CUPS'у указание грузиться после SSSD. Отредактируем файл сервиса cups.service по пути /lib/systemd/system/, добавив инструкцию After в секцию [Unit]:
Таким образом CUPS настроен на Basic авторизацию через домен, то есть авторизацию с помощью ввода логина и пароля доменного пользователя с правом администрирования CUPS.
Авторизация может быть настроена и иначе, но принцип (pipe-файл) в целом универсален и есть шанс настроить и для LDAP, FreeIPA и прочих служб каталогов по аналогии.
Установить принтер на Linux это часто специфическая задача, разная для разных марок и даже моделей. Поэтому не вижу смысла описывать установку принтера и примем за факт, что на хосте linux1 установлен принтер Kyocera-1024FP с именем Kyocera-1024FP, и страница принтера доступна по ссылке http://linux1:631/printers/Kyocera-1024FP.
Теперь, когда сервер и клиенские машины Linux настроены, к некоторым из них присоединены принтеры, а также есть машины на Windows, которым и с которых нужно печатать, и вся эта система должна быть стабильной и в случае, если на одном из ПК необходимо заменить принтер, то это не должно повлечь за собой перенастройку доброй половины всех ПК, если не всех. К тому же нужно как можно меньше проблем с драйверами. И это вполне возможно.
Выше мы описывали подключение Canon-MF4400 c хоста windows1 через протокол LPD. Принтер все еще подключен и его статус можно посмотреть на странице http://cupsserver:631/printers/Canon-MF4400. А теперь обратим пристальное внимание на главную страницу администрирования cupsserver http://cupsserver:631/admin. На этой странице есть кнопка «Добавить группу» [Add Class]. Нажмем на нее. В ней вы увидите поля «Название», «Описание», «Расположение», аналогичные таким же при настройке обычного принтера. В нижнем же блоке вы увидите список всех подключенных к принтсерверу принтеров. Выберите Canon-MF4400 или любой который хотите, затем в поле «Название» впишите, например printer-windows1, «Описание» и «Расположение» на ваше усмотрение, и нажмите «Добавить группу».
Теперь у нас есть группа printer-windows1 с принтером Canon-MF4400 в ней. Страница этой группы доступна так же как и страница принтера Canon-MF4400 с оговоркой на немного другой путь — http://cupsserver:631/classes/printer-windows1.
Еще у нас все еще есть подключенный к linux1 принтер Kyocera-1024FP. Подключим его к принтсерверу по HTTP. Выбираем метод подключения «Протокол интернет печати (http)» [Internet Printing Protocol (http)], из списка драйверов выбираем марку «Generic», модель «IPP Everywhere». Называем его как угодно, мы назовем так же как на хосте linux1 — Kyocera-1024FP. Теперь принтер доступен на принтсервере по ссылке http://cupsserver:631/printers/Kyocera-1024FP. Аналогично настройке группы printer-windows1 создаем группу printer-linux1 c принтером Kyocera-1024FP в ней. Ее ссылка соответственно http://cupsserver:631/classes/printer-linux1.
Теперь подключим принтер Kyocera-1024FP с хоста linux1 через принтсервер cupsserver к хосту windows1 с системой Windows 8 на борту без какой либо дополнительной(!) установки драйверов. Для этого мы при подключении принтера выбираем «Выбрать общий принтер по имени». В общем случае мы пишем http://имя_принтcервера:631/classes/название_группы. В нашем конкретном случае — http://cupsserver:631/classes/printer-linux1. При запросе на выбор драйвера указываем марку «Generic», модель — «MS Publisher Imagesetter». Все подтверждаем далее, и имеем подключенный принтер с название вроде «printer-linux1 на http://cupsserver:631». Если до сих пор никаких ошибок и подводных камней при настойке не возникло, то попытка пробной печати приведет к успешной печати на Kyocera-1024FP.
Теперь подключим принтер Canon-MF4400 с хоста windows1 через принтсервер cupsserver к хосту linux1 с системой Linux на борту без какой либо дополнительной(!) установки драйверов. Для этого мы при подключении принтера действуем аналогично тому, как подключали Kyocera-1024FP к принтсерверу cupsserver. То есть при добавлении принтера на linux1 выбираем метод подключения «Протокол интернет печати (http)», в качестве расположения принтера (Canon-MF4400) ссылку на его группу на принтсервере — http://cupsserver:631/classes/printer-windows1. При запросе на выбор драйвера указываем марку «Generic», модель — «IPP Everywhere». Называем его как угодно, можно назвать так же как группу — printer-windows1. Теперь принтер доступен на linux1 по ссылке http://linux1:631/printers/printer-windows1, и мы уже можем отправлять на печать документы.
Главная прелесть данного метода в том, что если на любом из ПК заменяется принтер, заменяется сам компьютер, или то и другое сразу, то это никак не влияет на тех, кто был к ним подключен через группу на принтсервере. Единственная настройка производится на принтсервере — к принтсерверу подключается новый принтер, затем из группы, в которой состоял старый принтер, он удаляется, и добавляется новый принтер на замену старому. И никаких дополнительных настроек на любом количестве ПК, только на принтсервере и собственно ПК на котором меняли принтер. Драйвера «IPP Everywhere» и «MS Publisher Imagesetter» содержат большое количество настроек бумаги, печати и т.д., так что нет проблем настроить нужный вид печати через них.
Тема слишком обширна, чтобы изложить сколько-нибудь подробно, и даже так статья вышла крайне объемной. Любые уточнения, указания на ошибки, нераскрытые вопросы и советы, данные в комментариях к данной статье, будут приняты во внимание и в случае необходимости включены в статью.
В статье будет описана установка принтсервера CUPS на Ubuntu Server в сети с работающим доменом Active Directory, хотя его наличие совершенно не обязательно и инструкции по настройке взаимодействию с ним можно будет смело пропустить, его настройка, а также настройка клиентских машин Linux и Windows для взаимодействия с данным принт-сервером.
В инструкции домен будет именоваться example.com, сам принтсервер — cupsserver (cupsserver.example.com) с IP адресом 10.10.100.50, а клиентские машины linux1, linux2, linux3 и т.д для клиентских машин Linux и windows1, windows2, windows3 и т.д. для клиентских машин Windows соответственно.
Настройка принтсервера
В первую очередь мы настроим принтсервер, а точнее, настроим административный доступ на него, затем настроим печать на него, а затем опишем настройку клиентских машин.
Заходим на принтсервер любым удобным способом и обновим на нем пакеты:
root@cupsserver:~# apt update && apt uprgrade -y
Далее проверим, установлен ли CUPS на сервере:
root@cupsserver:~# which cupsd
Если вывод выглядит как то так:
/usr/bin/cupsd
то CUPS установлен, если вывода нет — устанавливаем CUPS:
root@cupsserver:~# apt install cups -y
Теперь настроим административный доступ к веб-интерфейсу CUPS. Все файлы конфигурации находятся по пути /etc/cups/. Для начала, на всякий случай сделаем резервные копии основных файлов конфигурации CUPS:
root@cupsserver:~# cp /etc/cups/cupsd.conf /etc/cups/cupsd.conf.original
root@cupsserver:~# cp /etc/cups/cups-files.conf /etc/cups/cups-files.conf.original
root@cupsserver:~# cp /etc/cups/cups-browsed.conf /etc/cups/cups-browsed.conf.original
Впрочем, если вы этого не сделали — не беда, образцы данных файлов по умолчанию лежат по пути /usr/share/cups. Также нужно упомянуть, что вы можете проверить любые добавленные опции в файлы конфигурации CUPS с помощью команды:
root@cupsserver:~# cupsd -t
Если вы что-то напутали, опечатались или использовали опцию, которая уже не поддерживается CUPS'ом, то вывод команды отразит данные ошибки.
Но приступим наконец к настройке. После любых изменений файлов в папке /etc/cups/ для получения эффекта необходимо перезапускать сервис CUPS:
root@cupsserver:~# service cups restart
или
root@cupsserver:~# systemctl restart cups
или
root@cupsserver:~# /etc/init.d/cups restart
А если вы отредактировали файл /etc/cups/cups-browsed.conf, то за него отвечает отдельный сервис cups-browsed, который тоже нужно перезапустить:
root@cupsserver:~# service cups-browsed restart
или
root@cupsserver:~# systemctl restart cups-browsed
или
root@cupsserver:~# /etc/init.d/cups-browsed restart
Выполним команду
root@cupsserver:~# nano /etc/cups/cupsd.conf
Первой незакомментированной опцией является
LogLevel warn
Она определяет минимальную информативность логов CUPS. Лог-файлы CUPS находятся по пути /var/log/cups/. На время установки, настройки и отладки принтсервера будет разумным перевести логгирование в debug-режим. Для этого изменим warn на debug2:
LogLevel debug2
По умолчанию CUPS слушает входящие подключения только от localhost, то бишь на loopback интерфейсе. Чтобы убедится в этом, можете выполнить команду
root@cupsserver:~# netstat -plutn
Одна из строк будет выглядеть приблизительно так:
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 737/cupsd
Дальнейшие действия зависят от степени вашей паранойи. Вы можете добавить в блоке, который условно начинается с комментария #Only listen for connections from the local machine несколько строк с указанием IP адресов или подсетей, откуда CUPS'у будет позволено слушать подключения.
# Only listen for connections from the local machine.
Listen localhost:631
Listen /run/cups/cups.sock
#Слушать подключения с определенного IP адреса
Listen 10.10.100.67:631
#Слушать подключения с подсети бухгалтерии
Listen 172.16.0.0:631
Либо же вы можете разрешить CUPS'у слушать подключения со всех адресов
# Only listen for connections from the local machine.
Listen /run/cups/cups.sock
Port 631
Следующий момент настройки — это обнаружение сетевых и расшаренных принтеров.
# Show shared printers on the local network.
Browsing Off
BrowseLocalProtocols dnssd
На мой взгляд эта опция так и должна остаться выключенной, так как она определяет, будет ли рассылаться широковещательная информация по сети о подключенных к принтсерверу принтерах. А они ведь будут подключены к ней все. И соответственно у всех клиентских машин будут отображаться сразу все принтера. Наш принтсервер должен искать и обнаруживать все принтера в сети, но не рассылать их бездумно по всей сети.
Далее идут настройки аутентификации
# Default authentication type, when authentication is required...
DefaultAuthType Basic
Определяет права доступа к веб-интерфейсу CUPS, а также к его административной части. Чтобы пользователь user имел право на администрирование CUPS, его нужно добавить в системную группу lpadmin:
root@cupsserver:~# usermod -a -G lpadmin user
Вообще, группы, которым позволен административный доступ к CUPS, определяются в файле конфигурации cups-files.conf в блоке
# Administrator user group, used to match @SYSTEM in cupsd.conf policy rules...
# This cannot contain the Group value for security reasons...
SystemGroup lpadmin
Если вы хотите добавить некой группе пользователей Linux права на администрирование принтсервера, например printadmins, то просто добавьте их через пробел к lpadmin. Если группа доменная, то это немного сложнее и будет описано позже.
Теперь перейдем к блоку <Location />:
# Restrict access to the server...
<Location />
Order allow,deny
</Location>
Order allow,deny означает, что запрещены подключения отовсюду, если специально не указано разрешение. То есть нужно добавлять IP-адреса, подсети, хосты или хосты по маске (*.example.com) в виде "Allow from [разрешенный адрес]":
# Restrict access to the server...
<Location />
Order allow,deny
Allow from cupsserver # разрешение подключатся к самому себе по имени хоста
Allow from cupsserver.example.com # разрешение подключатся к самому себе по FQDN
Allow from localhost # разрешение подключатся к самому себе через loopback интерфейс
Allow from 10.10.100.* # Если хотите разрешить
Allow from linux4.example.com # доступ на печать с
Allow from 172.168.5.125 # определенных подсетей, IP или хостов
</Location>
Для полной уверености и отладки, можно оставить, пока не настроите все остальное, такую констукцию, которая позволит печать отовсюду:
# Restrict access to the server...
<Location />
Order allow,deny
Allow from all
</Location>
Приступим к настройке административного доступа к CUPS на принтсервере. Определитесь, с какого/каких IP и/или подсетей вы собираетесь подключаться к CUPS, и добавить их по аналогии с блоком <Location />:
# Restrict access to the admin pages...
<Location /admin>
Order allow,deny
Allow from localhost
Allow from 10.10.100.*
Allow from admin.example.com
</Location>
# Restrict access to configuration files...
<Location /admin/conf>
Order allow,deny
Allow from localhost
Allow from 10.10.100.*
Allow from admin.example.com
</Location>
# Restrict access to log files...
<Location /admin/log>
Order allow,deny
Allow from localhost
Allow from 10.10.100.*
Allow from admin.example.com
</Location>
Еще, по желанию, можно добавить язык интерфейса по умолчанию. Список доступных языков можно посмотреть с помощью команды:
root@cupsserver:~# ls /usr/share/cups/locale
Если нужная вам локализация, например ru, есть, то добавьте строчку в /etc/cups/cupsd.conf:
DefaultLanguage ru
Чтобы к вашему принтсерверу cupsserver.example.com можно было обращатся по его хосту (hostname), необходимо создать в папке /etc/cups/ файл client.conf с таким содержимым:
ServerName имя_хоста
Самым простым способом это можно сделать так:
root@cupsserver:/etc/cups# echo "ServerName $(cat /etc/hostname)" > /etc/cups/client.conf
Поскольку мы предполагаем, что в сети есть DNS сервер, то будет предпочтительным, чтобы можно было обращатся к принтсерверу по его доменному имени (cupsserver.example.com). Также серверу может быть присвоен CNAME псевдоним на DNS сервере, например print или cups. Чтобы принтсервер принимал подключения по таким обращениям, необходимо добавить такую строчку в файл /etc/cups/cupsd.conf:
ServerAlias cupsserver.example.com print cups
Если вы хотите, чтобы принтсервер примимал любые обращения, или не хотите заморачиваться, то можно добавить это:
ServerAlias *
Еще нужно взглянуть внутрь файла /etc/cups/cups-browsed.conf. Этот файл управляет тем, как принтсервер будет искать принтеры в сети и проводить широковещательную рассылку своих принтеров. Я предлагаю совершенно отключить опцию рассылки. Принтсервер будет искать принтера в сети, но с него принтеры на клиентские машины будут подключатся вручную. Ниже будет описано, почему. Пока же мы находим строку BrowseRemoteProtocols dnssd cups:
# Which protocols will we use to discover printers on the network?
# Can use DNSSD and/or CUPS and/or LDAP, or 'none' for neither.
BrowseRemoteProtocols dnssd cups
Благодаря этой опции принтсервер ищет расшаренные принтера в сети. Ее мы оставляем включенной, так как в наших интересах, чтобы принтсервер искал принтера в сети. Но нам совершенно не нужно, чтобы принтсервер рассылал вообще все подключенные к нему принтеры, иначе возникнет большая путаница. Для предотвращения такого сценария находим следующую опцию #BrowseLocalProtocols none и раскомментируем ее:
# Which protocols will we use to broadcast shared local printers to the network?
# Can use DNSSD and/or CUPS, or 'none' for neither.
# Only CUPS is actually supported, as DNSSD is done by CUPS itself (we ignore DNSSD in this directive).
BrowseLocalProtocols none
На этом настройку принтсервера приостанавливаем и переходим к настройке клиентких машин Windows и Linux. Требования к ним такие — позволять посылать на себя задания печати принтсерверу, и посылать задания на печать именно (и только) на принтсервер в случае необходимости печати на сетевой принтер.
В качестве примера настроим печать сквозь принтсервер между двумя клиентскими машинами с Linux (имя хоста linux1) и Windows 8 соотвественно (имя хоста windows1). Начнем с настройки windows1 в качестве приемника печати от принтсервера. У меня к нему подключен и штатно работает принтер Canon i-SENSYS MF4410. Имя принтера — Canon-MF4400. Самый простой способ, на самом деле, обеспечить печать с принтсервера на windows1 — перейти в Панель управления > Программы > Программы и компоненты > Включение или отключение компонентов Windows. Там мы включаем компонент Службы печати и документов > Служба печати LPD. Это позволит подключить данный принтер к принтсерверу с помощью адреса lpd://windows1/Canon-MF4400. Разумеется, назревает вопрос, почему бы не подключить с помощью SMB? Никто не запрещает. Если у вас отлажен данный метод, вы можете расшарить принтер таким образом, и подключить к принтсерверу по протоколу SMB. Инстукции по данному подключению, на мой взгляд, выходят за рамки данной статьи, которая и так выходит довольно объемной. Пока же считаем, что читатель успешно зашел по адресу http://cupsserver:631/admin нажал на кнопку «Добавить новый принтер» и следуя интуиции, логике и прочитатанным ранее мануалам успешно подключил принтер с windows1 по протоколу LPD к принтсерверу cupsserver[example.com] и страница принтера доступна по адресу http://cupsserver:631/printers/Canon-MF4400.
Теперь выполним аналогичную операцию на клиентской машине Linux c именем хоста linux1. Вообще, данная часть будет куда объемнее, так как у клиентской машины есть свой сервис CUPS и его тоже нужно настроить во многом так же, как и принтсервер, за исключением его подчиненной роли в организации печати.
Исправление ошибки обращения к CUPS через loopback по имени хоста
Есть неприятный момент. Если вы введете linux1 в домен, настроите на нем CUPS по этим инструкциям, то можете заметить абсурдную ситуацию, когда на WEB-интерфейс linux1 можно зайти снаружи, но на самом хосте этого сделать нельзя! И графические приложения для локальной настройки принтеров, вроде приложения system-config-printer в Linux Mint, отказываются работать. При попытке подключения на свой же CUPS по по адресу http://linux1:631/ будет сообщение «Запрещено» или «Bad Request». Это известная и толком не решенная на множестве форумов интернета проблема.
В большинстве инструкций по введению Linux в домен одним из пунктов является приведение файла /etc/hosts приблизительно к такому виду:
127.0.0.1 localhost
127.0.1.1 linux1.example.com linux1
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe02::2 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Почему то CUPS не в силах ассоциировать обращение через 127.0.1.1, то есть через Loopback интерфейс, с именем хоста.
Исправляется эта ошибка двумя способами. Если в вашей сети IP адреса статичные, то в файле /etc/hosts.исправьте 127.0.1.1 на IP адрес внешнего сетевого интерфейса клиентской машины, например:
127.0.0.1 localhost
192.168.1.50 linux1.example.com linux1
Либо же, раз уж вы вводите Linux в домен, то это предполагает, что в вашей сети работает DHCP и DNS сервер Active Directory. В таком случае просто закомментируйте данную строчку:
127.0.0.1 localhost
# 127.0.1.1 linux1.example.com linux1
Разницы в работоспособности или проблем от данного действия пока обнаружено не было.
Настройка адресов прослушивания подключений к CUPS у клиентских машин Linux
Заходим на linux1 любым удобным способом. Редактируем файл /etc/cups/cupsd.conf:
user@linux1:~$ sudo nano /etc/cups/cupsd.conf
Находим, добавляем или изменяем в нем строки:
DefaultLanguage ru # Если язык присутствует в папке /usr/share/cups/locale
ServerAlias linux1.example.com linux1 [CNAME псевдоним присвоенный на DNS сервере]
или
ServerAlias * # Если неохота вникать в особенности
Listen /run/cups/cups.sock
Listen localhost:631 # Слушать localhost
Listen 10.10.100.50:631 # IP адрес нашего принтсервера.
Listen cupsserver:631 # Доменное имя принтсервера. Рекомендую чтобы его IP тоже был, на всякий случай
Listen linux1:631 #
или
Port 631 # Будет слушать подключения со всех адресов
Listen /run/cups/cups.sock
Browsing off # Выключено. Машина будет посылать информацию только принтсерверу
DefaultAuthType Basic # Без изменений. Есть вариант с авторизацией Kerberos, но там много подводных камней
Настройка адресов прослушивания подключений к CUPS
В предыдущем блоке мы настроили возможность подключения к CUPS. Теперь перейдем к настройке разрешений на доступ к печати, а также к административным страницам сервиса CUPS на хосте linux1. Вновь открываем, если закрыли, файл /etc/cups/cupsd.conf и переходим к редактированию блоков <Location />, <Location /admin>, <Location /admin/conf>, <Location /admin/log>:
# Restrict access to the server...
<Location />
Order allow,deny # Определяет политику доступа "Что не разрешено, то запрещено"
Allow from localhost # Позволяет печатать самой linux1
Allow from linux1 # Печать на свое имя хоста. Проблемы этого действия описаны выше
Allow from cupsserver # Если CUPS нормально взаимодействует с DNS, то сработает. Увы, не всегда это так
Allow from cupsserver.example.com # FQDN принтсервера
Allow from 10.10.100.50 # Разрешение на печать с IP принтсервера <b>cupsserver</b>
</Location>
# Restrict access to the admin pages...
<Location /admin>
Order allow,deny # Аналогично предыдущему
Allow from localhost # Необходимо для возможности добавлять принтеры
Allow from linux1 # Аналогично предыдущему
Allow from 10.10.101.71 # Предположим, это IP админа
Allow from 10.20.50.* # Предположим, это подсеть вашего IT отдела
AuthType Default # То есть CUPS спросит логин и пароль. Подробнее ниже
Require user @SYSTEM # Определение группы доступа к CUPS
</Location>
# Restrict access to configuration files...
<Location /admin/conf>
#Блок идентичен предыдущему
Order allow,deny # Аналогично предыдущему
Allow from localhost # Необходимо для возможности добавлять принтеры
Allow from linux1 # Аналогично предыдущему
Allow from 10.10.101.71 # Предположим, это IP админа
Allow from 10.20.50.* # Предположим, это подсеть вашего IT отдела
AuthType Default # То есть CUPS спросит логин и пароль. Подробнее ниже
Require user @SYSTEM # Определение группы доступа к CUPS
</Location>
# Restrict access to log files...
<Location /admin/log>
#Блок идентичен предыдущему
Order allow,deny # Аналогично предыдущему
Allow from localhost # Необходимо для возможности добавлять принтеры
Allow from linux1 # Аналогично предыдущему
Allow from 10.10.101.71 # Предположим, это IP админа
Allow from 10.20.50.* # Предположим, это подсеть вашего IT отдела
AuthType Default # То есть CUPS спросит логин и пароль. Подробнее ниже
Require user @SYSTEM # Определение группы доступа к CUPS
</Location>
Настройка раздачи и получения широковещательной рассылки сетевых принтеров
Еще у клиетской машины Linux, в данном случае linux1, необходимо отредактировать файл /etc/cups/cups-browsed.conf:
user@linux1:~$ sudo nano /etc/cups/cups-browsed.conf
BrowseRemoteProtocols none # Пишем none чтобы не получить кучу принтеров автоматически.
BrowseLocalProtocols cups # Показывать подключеные принтеры в сеть. DNSSD указывать не надо, его директива в cupsd.conf
BrowseOrder Allow,Deny # Аналогично директиве Order в cupsd.conf - необходимо явно указать, куда МОЖНО посылать информацию о подключенных принтерах
BrowseAllow 10.10.100.50 # IP принтсервера
BrowseAllow cupsserver # Имя хоста принтсервера
BrowseAllow cupsserver.example.com # Полное доменное имя принтсервера
Настройка административного доступа
Еще пару слов по поводу административного доступа, как на WEB-интерфейс CUPS на принтсервере, так и на любой клиентской машине Linux. Даже при условии наличия 30-50 компьютеров нужно унифицировать авторизацию на CUPS, а не держать в голове или еще где пароли каждой машины. И это важно на всех Linux машинах, ведь чтобы добавить принтер на сервер, его сперва нужно установить локально. Я вижу несколько путей.
Первый — на каждой системе Linux создать пользователя printeradmin (например) и добавить в группу lpadmin:
user@linux1:~$ sudo usermod -a -G lpamin printeradmin
и авторизовываться на http://имя_хоста:631/admin c помощью его учетных данных.
Второй вариант практически идентичен и предлагает создать группу в системе, например, printersadmins, добавить туда требуемого администратора CUPS (printeradmin, user):
user@linux1:~$ sudo groupadd printersadmins
user@linux1:~$ sudo usermod -a -G printersadmins printeradmin
user@linux1:~$ sudo usermod -a -G printersadmins user
Затем нужно найти в файле /etc/cups/cups-files.conf строку
# Administrator user group, used to match @SYSTEM in cupsd.conf policy rules...
# This cannot contain the Group value for security reasons...
SystemGroup lpadmin
и добавить через пробел одну или несколько групп пользователей с правом администрировать CUPS.
# Administrator user group, used to match @SYSTEM in cupsd.conf policy rules...
# This cannot contain the Group value for security reasons...
SystemGroup lpadmin printersadmins somegroup
И наконец, третий вариант. Сделать администраторами принтсервера и CUPS'ов клиентских машин доменную группу пользователей. Для этого принтсервер и клиентские машины Linux должны быть присоединены к домену AD. Есть несколько методов подключения Linux к домену Windows, но, насколько я знаю, основные это подключение с помощью winbind и с помощью SSSD(realmd). Описание данных методов не входит в статью, поэтому остановлюсь только на моментах которые касаются конкретно CUPS'а.
Настройка использования доменных групп пользователей для администрирования CUPS
Каждый метод присоединения к системе централизованной авторизации в Linux создает специальный файл-«трубу» (pipe), сквозь который приложения могут посмотреть список пользователей домена. Чтобы так мог сделать CUPS, нужно разрешить ему использовать pipe в AppArmor'е для аутентификации пользователей. AppArmor — модуль безопасности Linux по управлению доступом. Ограничивает определенные программы набором перечисленных в его политиках файлов. Чтобы добавить CUPS'у право использовать пользователей и группы домена через winbindd, нужно добавить в файл /etc/apparmod.d/local/usr.sbin.cupsd такую строку:
/var/lib/samba/winbindd_privileged/pipe rw
Если Linux введен в домен через SSSD, то необходимо указать расположение его pipe в /etc/apparmod.d/local/usr.sbin.cupsd, добавив туда строку:
/var/lib/sss/pipes/private/pam rw
К тому же, в случае с SSSD это позволяет пройти аутентификацию (узнать кто заходит), но чтобы пройти авторизацию (узнать есть ли право у пользователя управлять CUPS) необходимо также добавить в файл конфигурации SSSD /etc/sssd/sssd.conf строку:
ad_gpo_map_interactive = +cups
Это, условно выражаюсь, дает CUPS'у право «заглядывать» в SSSD.
К тому же, в силу того, что CUPS теперь зависит от сервиса SSSD, нужно указать CUPS'у что он должен запускаться после SSSD, иначе он будет отваливаться при включении и его будет необходимо каждый раз включать вручную.
Добавим CUPS'у указание грузиться после SSSD. Отредактируем файл сервиса cups.service по пути /lib/systemd/system/, добавив инструкцию After в секцию [Unit]:
[Unit]
Description=CUPS Scheduler
Documentation=man:cupsd(8)
After=sssd.service
Таким образом CUPS настроен на Basic авторизацию через домен, то есть авторизацию с помощью ввода логина и пароля доменного пользователя с правом администрирования CUPS.
Авторизация может быть настроена и иначе, но принцип (pipe-файл) в целом универсален и есть шанс настроить и для LDAP, FreeIPA и прочих служб каталогов по аналогии.
Установка принтера в Linux
Установить принтер на Linux это часто специфическая задача, разная для разных марок и даже моделей. Поэтому не вижу смысла описывать установку принтера и примем за факт, что на хосте linux1 установлен принтер Kyocera-1024FP с именем Kyocera-1024FP, и страница принтера доступна по ссылке http://linux1:631/printers/Kyocera-1024FP.
Теперь, когда сервер и клиенские машины Linux настроены, к некоторым из них присоединены принтеры, а также есть машины на Windows, которым и с которых нужно печатать, и вся эта система должна быть стабильной и в случае, если на одном из ПК необходимо заменить принтер, то это не должно повлечь за собой перенастройку доброй половины всех ПК, если не всех. К тому же нужно как можно меньше проблем с драйверами. И это вполне возможно.
Группы принтеров (Classes)
Выше мы описывали подключение Canon-MF4400 c хоста windows1 через протокол LPD. Принтер все еще подключен и его статус можно посмотреть на странице http://cupsserver:631/printers/Canon-MF4400. А теперь обратим пристальное внимание на главную страницу администрирования cupsserver http://cupsserver:631/admin. На этой странице есть кнопка «Добавить группу» [Add Class]. Нажмем на нее. В ней вы увидите поля «Название», «Описание», «Расположение», аналогичные таким же при настройке обычного принтера. В нижнем же блоке вы увидите список всех подключенных к принтсерверу принтеров. Выберите Canon-MF4400 или любой который хотите, затем в поле «Название» впишите, например printer-windows1, «Описание» и «Расположение» на ваше усмотрение, и нажмите «Добавить группу».
Теперь у нас есть группа printer-windows1 с принтером Canon-MF4400 в ней. Страница этой группы доступна так же как и страница принтера Canon-MF4400 с оговоркой на немного другой путь — http://cupsserver:631/classes/printer-windows1.
Еще у нас все еще есть подключенный к linux1 принтер Kyocera-1024FP. Подключим его к принтсерверу по HTTP. Выбираем метод подключения «Протокол интернет печати (http)» [Internet Printing Protocol (http)], из списка драйверов выбираем марку «Generic», модель «IPP Everywhere». Называем его как угодно, мы назовем так же как на хосте linux1 — Kyocera-1024FP. Теперь принтер доступен на принтсервере по ссылке http://cupsserver:631/printers/Kyocera-1024FP. Аналогично настройке группы printer-windows1 создаем группу printer-linux1 c принтером Kyocera-1024FP в ней. Ее ссылка соответственно http://cupsserver:631/classes/printer-linux1.
Теперь подключим принтер Kyocera-1024FP с хоста linux1 через принтсервер cupsserver к хосту windows1 с системой Windows 8 на борту без какой либо дополнительной(!) установки драйверов. Для этого мы при подключении принтера выбираем «Выбрать общий принтер по имени». В общем случае мы пишем http://имя_принтcервера:631/classes/название_группы. В нашем конкретном случае — http://cupsserver:631/classes/printer-linux1. При запросе на выбор драйвера указываем марку «Generic», модель — «MS Publisher Imagesetter». Все подтверждаем далее, и имеем подключенный принтер с название вроде «printer-linux1 на http://cupsserver:631». Если до сих пор никаких ошибок и подводных камней при настойке не возникло, то попытка пробной печати приведет к успешной печати на Kyocera-1024FP.
Теперь подключим принтер Canon-MF4400 с хоста windows1 через принтсервер cupsserver к хосту linux1 с системой Linux на борту без какой либо дополнительной(!) установки драйверов. Для этого мы при подключении принтера действуем аналогично тому, как подключали Kyocera-1024FP к принтсерверу cupsserver. То есть при добавлении принтера на linux1 выбираем метод подключения «Протокол интернет печати (http)», в качестве расположения принтера (Canon-MF4400) ссылку на его группу на принтсервере — http://cupsserver:631/classes/printer-windows1. При запросе на выбор драйвера указываем марку «Generic», модель — «IPP Everywhere». Называем его как угодно, можно назвать так же как группу — printer-windows1. Теперь принтер доступен на linux1 по ссылке http://linux1:631/printers/printer-windows1, и мы уже можем отправлять на печать документы.
Главная прелесть данного метода в том, что если на любом из ПК заменяется принтер, заменяется сам компьютер, или то и другое сразу, то это никак не влияет на тех, кто был к ним подключен через группу на принтсервере. Единственная настройка производится на принтсервере — к принтсерверу подключается новый принтер, затем из группы, в которой состоял старый принтер, он удаляется, и добавляется новый принтер на замену старому. И никаких дополнительных настроек на любом количестве ПК, только на принтсервере и собственно ПК на котором меняли принтер. Драйвера «IPP Everywhere» и «MS Publisher Imagesetter» содержат большое количество настроек бумаги, печати и т.д., так что нет проблем настроить нужный вид печати через них.
Заключение
Тема слишком обширна, чтобы изложить сколько-нибудь подробно, и даже так статья вышла крайне объемной. Любые уточнения, указания на ошибки, нераскрытые вопросы и советы, данные в комментариях к данной статье, будут приняты во внимание и в случае необходимости включены в статью.
Комментарии (2)
melichronsoul Автор
11.03.2019 17:56Вы безусловно правы. Естественно родные драйвера обеспечат лучший функционал, и по возможности стоит использовать их. Данное руководство не призывает исполнять его буквально, а лишь является сборной солянкой надерганных по просторам интернета советов. Ваше замечание и настройка авторизации через Kerberos будет в следующей итерации статьи.
igrblkv
Не очень понимаю, почему-бы не поставить родные драйвера-то?
Всё-же, MS Publisher Imagesetter — это стандартный драйвер и он не раскрывает весь функционал используемых принтеров, например у нас Киосеры, а он не поддерживает двустороннюю печать (на тот момент, когда я его пробовал для универсальности — как на текущий момент не в курсе)…
Тем более, если есть домен, то есть и сервер под Виндой? Что мешает поднять сервер печати с родными дровами, подключить к нему все пользовательские принтеры как сетевые и раздавать их пользователям централизованно через те-же политики?
PS: Смысла покупки принтеров с массой возможностей и не использование этих возможностей из-за стандартного драйвера я вообще не понимаю, сорри!..