* 아직 미완성인 글이지만, 적당히 참고는 가능할 듯 하여 공개로 전환합니다.
들어가며,
집에서 수년간 함께해온 레이저 프린터가 있다. 평소 USB 케이블로 메인 PC와 연결해 사용했지만, 사실 이더넷 포트가 내장되어 있어 언제든 네트워크 프린터로도 활용할 수 있는 모델이다. 하지만 네트워크 케이블을 아무리 바꿔봐도, 라우터 포트를 바꿔봐도 연결이 되지 않았다. 프린터의 LAN 포트가 고장난 것이다. 결국 USB 케이블에 의존하여 사용할 수 밖에 없었고, 메인 PC를 켜지 않으면 사용할 수가 없는 장비가 되어버렸다.
그런데 최근 흥미로운 변화가 생겼다. Intel N100 프로세서가 탑재된 미니 PC를 새로 장만하면서, 저전력으로 24시간 구동이 가능한 Ubuntu 서버가 하나 추가된 것이다. Docker를 통해 웹 서버와 파일 서버, 홈 서버를 구축하고 이런저런 실험을 하는 서버로 활용을 하고 있다.
이때 문득 떠오른 아이디어, '고장난 LAN 포트 때문에 USB로만 사용하던 프린터를 미니 PC에 연결해서 네트워크 프린터로 만들 수 있지 않을까?' 하는 생각이 들었다.
USB로 연결된 프린터를 Linux 서버에서 CUPS(Common Unix Printing System)로 공유하면, 같은 네트워크의 모든 기기에서 무선으로 인쇄할 수 있게 된다. 스마트폰, 태블릿, 노트북은 물론이고 별도의 드라이버 설치 없이도 사용할 수 있게 되는 것이다. 이 글에서는 하드웨어 고장으로 포기했던 기능을 소프트웨어의 힘으로 되살려보는 작업을 해본다.
CUPS란 무엇인가
이번 작업의 핵심은 CUPS이다. Common Unix Printing System의 약자, CUPS는 Linux/UNIX 계열 운영체제에서 컴퓨터를 인쇄 서버로 기능하도록 해주는 모듈 방식의 프린팅 시스템이다. 단순한 프린터 드라이버가 아닌, 클라이언트의 인쇄 요청을 받아 처리하여 적절한 프린터로 전송하는 인쇄 서버의 역할을 하는 것이다.
CUPS는 작업 대기열 관리를 하는 스풀러(Spooler), IPP 서버, 스케줄러, 데이터 변환을 위한 필터 시스템, 실제 전송이 이뤄지는 백엔드의 5가지 핵심 구성 요소가 협력하여 작동한다. 특히 631번 기본 포트로 HTTP 서버를 동작하여 웹 브라우저를 통한 직관적인 관리가 가능하며, 현재 macOS의 기본 인쇄 시스테미나 거의 모든 Linux 배포판의 표준 솔루션으로 자리 잡았다.
가장 큰 특징이 IPP(Internet Printing Protocol) 기반의 네트워크 인쇄 표준화이다. 과거 UNIX 시스템에서 서로 호환되지 않던 System V와 BSD 인쇄 방식을 통합하여, 플랫폼에 상관없이 동일한 방식으로 인쇄할 수 있게 했다. 또 IPP Everywhere 표준을 통해 Driver-less 인쇄를 구현하여 운영체제에 무관하게 별도의 드라이버 설치 없이 CPUS 서버의 프린터를 자동으로 찾아 사용할 수 있다.
이번 작업에서는 N100 미니 PC가 CUPS 서버 역할을 담당하게 된다. USB로 연결된 프린터를 CUPS가 네트워크로 고유하면, 마치 원래 네트워크 프린터였던 것처럼 동일 네트워킁의 모든 기기에서 무선으로 인쇄할 수 있게 된다.
유의사항
아래에서 설명하는 방법은 Ubuntu Server 18.04 LTS 이상 버전에서 사용이 가능하다. 이보다 전 버전을 사용할 경우 일부 IPP 기능이 제한되어 향후 추가적인 기능을 구현하는 데에 제한이 발생할 수 있다.
또, 실제로 사용 중인 프린터인 Samsung SL-M3320 제품을 기준으로 설명하고 있지만, 프린터 드라이버를 설치하는 과정을 제외하면 다른 프린터 모델도 동일한 방법으로 설정할 수 있다. 프린터 드라이버 설치만 각 프린터 제조사에서 제공하는 가이드에 따라 진행하면 된다.
마지막으로 이 글에서 다룬 내용은 편의성을 우선으로 한다. 필자의 경우 Tailscale을 통한 VPN 기반 네트워크 환경을 구축하여 외부에서는 접근을 할 수 없도록 되어있어 별도의 보안 조치를 취하지 않았지만, 외부 접속이 가능한 환경이라면 반드시 TLS 암호화, 방화벽, IP 기반 접근 제어 등의 보안 조치가 필요하며 특히 가정이 아닌 환경에서는 사용자 및 그룹 기반 권한 관리나 로그 모니터링, 감시 시스템 구축 등 강화된 보안 조치까지 고려하여 진행하여야 한다.
시작해보자
1단계: 하드웨어 연결 확인
먼저 프린터가 올바르게 미니 PC에 연결되어 있는지 확인해야 한다. 이 과정에서 lsusb 명령어를 사용하는데, 이는 Linux USB 서브시스템이 제공하는 표준 도구이다. 최소 OS 설치로 인해 설치되어 있지 않다면 apt install 명령어를 통해 설치해주도록 하자.
# USB 유틸리티 설치 (필요 시에만 설치)
sudo apt update
sudo apt install usbutils
# 연결된 USB 장치 확인
lsusb
하드웨어가 정상적으로 연결됐음을 확인할 수 있다. 상세 정보가 필요한 경우 lsusb -v를 통해 확인할 수 있다.
Bus 001 Device 005: ID 04e8:331d Samsung Electronics Co., Ltd M332x 382x 402x Series
Device Descriptor:
bInterfaceClass 7 Printer
bInterfaceSubClass 1 Printer
bInterfaceProtocol 2 Bidirectional
iSerial 3 ZDA2BJBD90007YN
Interface Class는 7 Printer로 USB 장치가 프린터로 올바르게 인식됐음을 확인할 수 있다. Bidrectional Protocol을 지원한다는 문구도 볼 수 있는데, 이는 양방향 통신을 지원하기 때문에 인쇄 데이터를 보내는 것뿐만 아니라 토너 정보, 프린터 상태 정보를 수신할 수도 있다는 뜻이다.
2단계: Samsung ULD 드라이버 설치
Samsung ULD란 Samsung Unified Linux Driver의 약자로 삼성전자에서 만든 통합 리눅스 드라이버이다. 여러 삼성 프린터 모델을 하나의 드라이버로 지원하며, Generic Driver(범용 드라이버)에서 지원하지 않는 프린터 상태 정보 수신, 에코 모드나 워터마크 등 삼성 특화 기능 등을 지원한다.
다른 프린터 모델을 사용한다면 각 제조사 사이트에서 Linux/UNIX용 드라이버를 다운로드받아 사용해야 하며, 반드시 공식 다운로드 센터를 통해 다운로드받는 것을 권장한다.

사진과 같이 wget을 통해 드라이버 파일을 다운로드받은 후 압축 해제하여 설치를 진행한다.
# 공식 드라이버 다운로드 (2025-08-14 기준)
wget https://downloadcenter.samsung.com/content/DR/201512/20151221165732088/uld_V1.00.37_00.99.tar.gz
# 압축 해제 및 설치
tar -xzf uld_V1.00.37_00.99.tar.gz
cd uld
sudo ./install.sh
설치 스크립트 파일을 실행한 후 Enter 키를 누르면 동의사항이 아주 길게 표시된다. q키를 눌러 생략이 가능하다. 이후 표시되는 프롬프트에 따라 진행을 해주면 된다.
**** Do you agree ? [y/n] : y
**** CUPS package is currently not installed on your system. Please install it first to install & use print driver properly.
**** Do you want to continue to install scan driver ? [y/n] : y
**** SANE package is currently not installed on your system. Please install it first to install & use scan driver properly.
**** Install finished.
의외로 간단하고 빠르게 끝난다.
3단계: CUPS 설치
CUPS에 대한 설명은 앞서 충분히 했으니 생략하겠다. 나중에 기회가 된다면 CUPS에 대해 자세히 설명하는 글을 써볼 생각이다. 바로 설치 과정으로 넘어가보자.
# CUPS 설치
sudo apt install cups
# CUPS 서비스 시작 및 자동 실행
sudo systemctl start cups
sudo systemctl enable cups
# 프린터 감지 확인
sudo lpinfo -v
프린터가 감지가 된다면 아래와 같이 프린터 정보가 표시된다.
ssogari@ssogari-server:~$ sudo lpinfo -v
network https
network lpd
network socket
network beh
network ipp
network http
network ipps
direct usb://Samsung/M332x%20382x%20402x%20Series?serial=ZDA2BJBD90007YN
Samsung의 M332, 382. 402 Series가 USB로 연결되었고, Serial 번호도 확인할 수가 있다. 이 Serial 번호는 앞서 1단계에서 lsusb 명령어를 통해 확인한 iSerial 값과 일치한다. 여러 프린터를 연결한 경우 이를 통해 구분을 할 수가 있다.
CUPS 설치가 완료됐다면 다음 명령어를 통해 간단한 상태를 확인할 수 있다.
# CUPS 서비스 상태 확인
systemctl status cups
# 기본 설정 파일 위치 확인
ls -la /etc/cups/
# 웹 GUI 접근 테스트
curl -I http://localhost:631
위의 명령어에서 눈치챘을 수도 있겠지만, 631번 포트의 개방이 필요하다. UFW 등의 방화벽을 사용하는 경우 해당 포트를 개방을 해줘야하며, 이때 보안 위험이 발생할 가능성도 고려해줘야 한다. 또 웹 인터페이스는 HTTP를 사용하여 기본 인증만 제공하기 때문에 추후 HTTPS 설정을 권장한다.
4단계: CUPS 네트워크 공유 설정
CUPS는 보안상의 이유로 로컬 접근만 허용하는 것을 기본값으로 하고 있다. 네트워크에 CUPS로 연결된 프린터 및 웹 인터페이스 공유를 위해서는 설정 파일을 수정해야 한다.
sudo vim /etc/cups/cupsd.conf
우선 Listen 설정부터 바꿔보자. 다른 기기에서 접근할 수 있도록 설정을 변경하는 내용이다.
# 기존 (기본값)
Listen localhost:631
Listen /run/cups/cups.sock
# 변경
Port 631
Listen /run/cups/cups.sock
기존에는 로컬 호스트(localhost)에서만 접근을 할 수 있었다면, 바꾼 설정을 통해 모든 네트워크 인터페이스를 통해 631 포트로 접근을 허용해준다.
이어서 Browsing 설정이다. 네트워크를 통해 프린터를 자동으로 검색할 수 있도록 활성화해준다. 이때, DNS-SD(DNS Service Discovery) 프로토콜을 통해 자동 검색을 수행할 수 있도록 설정해줘야 한다.
# 기존 (기본값)
Browsing No
BrowseLocalProtocols dnssd
# 변경
Browsing On
BrowseLocalProtocols dnssd
이때 DNS-SD 프로토콜을 사용하는 이유는 범용 호환성이 가장 크다. DNS-SD는 iOS, macOS를 비롯하여 거의 모든 운영체제에서 지원하는 표준 프로토콜이다. Apple의 경우 AirPrint의 기반 기술로써 활용되고, Windows에서도 IPP Everywhere와 함께 지원하며, Linux 또한 거의 모든 배포판에서 Avahi를 통해 지원하고 있다. 별도의 설정없이 가장 넓은 범위에서 사용할 수 있기 때문에 다른 옵션인 cups, ldap, slp를 사용하지 않고 dnssd를 사용한다.
마지막으로 접근 권한 설정이다. 우선 기본값 설정을 살펴보자.
# Restrict access to the server...
<Location />
Order allow,deny
</Location>
# Restrict access to the admin pages...
<Location /admin>
AuthType Default
Require user @SYSTEM
Order allow,deny
</Location>
# Restrict access to configuration files...
<Location /admin/conf>
AuthType Default
Require user @SYSTEM
Order allow,deny
</Location>
# Restrict access to log files...
<Location /admin/log>
AuthType Default
Require user @SYSTEM
Order allow,deny
</Location>
기존 설정에서는 Allow 구문이 없어 모든 접근이 차단된다. 웹 인터페이스는 물론 IPP 인쇄 요청까지 모두 차단되어 있다.
관리 페이지 웹 인터페이스 역시 다른 기기를 통한 원격 관리가 불가하도록 설정되어있다.
이를 아래와 같이 설정을 변경하였다.
# Restrict access to the server...
<Location />
Order allow,deny
Allow @LOCAL
</Location>
# Restrict access to the admin pages...
<Location /admin>
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow @LOCAL
</Location>
# Restrict access to configuration files...
<Location /admin/conf>
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow localhost
</Location>
# Restrict access to log files...
<Location /admin/log>
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow @LOCAL
</Location>
루트 디렉터리와 관리 페이지, 로그 파일에는 각각 로컬 네트워크의 접근을 허용하였다. 즉, 같은 네트워크에 있는 장비에서만 이를 접속하고 통제할 수 있도록 한 것이다. /admin/conf 설정 파일은 보안상 로컬 접근만 허용하도록 변경하였다. 서버에 직접 로그인한 관리자만 접속할 수 있도록 한 것이다.
추후 추가적인 보안 강화가 필요하다면, 다음과 같은 추가 설정을 고려해볼 수도 있다.
# 특정 IP 대역만 허용 (아래 옵션 중 선택적으로 적용)
<Location />
Order allow,deny
Allow 192.168.1.*
Allow from 192.168.1.0/24 # 특정 서브넷만 허용
Allow 10.0.0.*
Deny all # 그 외에 모두 거절
Encryption IfRequested # 클라이언트가 요청 시 암호화
Encryption Required # HTTPS 강제
</Location>
# HTTPS 강제 (TLS 인증서 설정 후)
DefaultEncryption Required
# 인증 필수
<Location />
AuthType Basic
Require valid-user
</Location>
# 로그 레벨 증가 (보안 모니터링용)
LogLevel warn
위와 같이 설정을 모두 변경했다면, 간단하게 설정 구문이 올바른지 검사를 하고 CUPS 서비스를 재시작해주면 설정이 적용된다. 앞서 설명한 바와 같이 방화벽 설정이 되어있다면 631(웹 인터페이스)과 5353(DNS-SD) 포트를 개방해주어야 한다.
sudo cupsd -t
sudo systemctl restart cups
'[ IT ] > Develop' 카테고리의 다른 글
| [번역] 부동 소수점 문제의 예시 (Examples of floating point problems) (0) | 2025.01.17 |
|---|---|
| Android용 SMS/MMS Extractor (문자 추출 앱) (335) | 2024.07.08 |
| 안드로이드용 트위터 인용 보기 (442) | 2024.01.13 |
| 네이버 치지직(CHZZK) API [작성 중] (338) | 2023.12.22 |
개발 적당히, 정치 적당히, 일상 적당히, 그냥 뭐든지 적당히만 하는 소프트웨어전공 대학생, 쏘가리입니다. / Profile Image by REN (Twitter @Ren_S2_)