You have the IP address but nothing prints
You connected a network printer to your Wi-Fi or Ethernet. You found its IP address in the router admin page. You opened a document in LibreOffice or Firefox and clicked Print. Fedora shows the printer in the list, or maybe it doesn't. You select the printer and hit Print. The status bar says "Processing" for a minute, then "Error". Or the job disappears silently. You tried clicking "Add Printer" in Settings, but the wizard timed out or offered a driver that doesn't match your model. You need a reliable way to register this device so every application can send jobs to it. The graphical tools sometimes struggle with non-standard network configurations, corporate firewalls, or printers that hide behind NAT. The command line gives you precise control over the device URI, driver selection, and queue options.
What's actually happening
Fedora uses CUPS (Common Unix Printing System) to manage printing. CUPS runs as a background service and listens for print jobs from applications. It acts as a traffic controller. When an application sends a PDF, CUPS receives the job, converts it to a language the printer understands, and hands it to a backend that delivers the data to the hardware.
Modern printers speak a protocol called IPP (Internet Printing Protocol). Many support "driverless" printing, which is part of the IPP Everywhere, AirPrint, and Mopria standards. A driverless printer describes its own capabilities to the computer. It tells CUPS what paper sizes it accepts, what color profiles it supports, and whether it can duplex. Fedora can talk to these printers directly without installing a separate driver package. The driverless keyword in CUPS triggers this behavior. It fetches the printer's description file on the fly.
Older printers do not support this. They require a specific driver package that contains a static PPD (PostScript Printer Description) file. Common packages include hplip for HP devices and foo2zjs for some Brother and Ricoh models. This guide focuses on the driverless path first, because it works for the vast majority of printers purchased in the last five years. If your printer is driverless-compatible, you avoid driver conflicts and firmware mismatches.
Run systemctl status cups first. If the service is inactive, no printer will work until you start it.
Enable CUPS and open the firewall
CUPS must be running and the firewall must allow IPP traffic before you can add a printer. Fedora ships with CUPS installed, but the service might not be enabled by default on minimal or server configurations. The firewall also blocks port 631 unless you explicitly allow it.
Here's how to start the service and configure the firewall for persistent access.
sudo systemctl enable --now cups
# Enable starts the service immediately and ensures it starts on boot.
# CUPS must be running before you can add any printers or manage queues.
sudo firewall-cmd --add-service=ipp --permanent
# Open the firewall for IPP traffic permanently.
# Network printers send data over port 631. This rule survives reboots.
sudo firewall-cmd --reload
# Apply the firewall change immediately.
# Without this, the runtime config and the persistent config diverge.
Fedora runs cups-browsed by default on desktop installations. This daemon auto-discovers printers on the network using mDNS and other protocols. It adds them to CUPS automatically. If auto-discovery fails, or if you need to force a specific configuration, you override it with manual commands. Manual configuration takes precedence over auto-discovered entries.
Add the printer via the command line
The lpadmin command is the standard tool for adding printers to CUPS. It accepts the printer name, the device URI, and the driver model. For driverless printers, the model is simply driverless. The device URI tells CUPS how to reach the printer. Use socket:// for raw TCP connections on port 9100, or ipp:// for IPP protocol connections. IPP is preferred when available because it supports job status tracking and color management.
Here's how to register a network printer with a driverless configuration.
sudo lpadmin -p OfficePrinter -E -v ipp://192.168.1.50/ipp/print -m driverless
# -p sets the printer name used by all CUPS commands.
# -E enables the printer immediately after creation.
# -v specifies the device URI. Use ipp:// for protocol features.
# -m driverless tells CUPS to use the printer's built-in capabilities.
# This avoids manual driver installation for modern devices.
If your printer does not support IPP, or if you are connecting to a raw print server, use the socket:// scheme. Some older network printers only accept raw PCL or PostScript data on port 9100.
sudo lpadmin -p LegacyPrinter -E -v socket://192.168.1.50 -m driverless
# -v socket:// connects via raw TCP to port 9100.
# Use this when ipp:// fails or the printer lacks an IPP endpoint.
# driverless may still work if the printer advertises capabilities via PDL.
After adding the printer, set it as the system default so applications send jobs there automatically.
lpoptions -d OfficePrinter
# Set this printer as the system default.
# Applications will send jobs here unless you specify a destination.
Verify the printer works
Run lpstat to check the printer status and default assignment. Then send a test job to confirm data flows end-to-end.
Here's how to verify the printer is enabled and print a test page.
lpstat -p -d
# List all printers and show the default.
# You should see your printer marked as enabled and accepting jobs.
lp /etc/hosts
# Send a simple text file to the default printer.
# Check the printer tray for output. This tests the full pipeline.
If the test page prints, the setup is complete. If the job fails, check the queue for error details.
lpstat -o
# List pending and completed jobs.
# Look for your job ID and status. Errors appear here if the job is stuck.
lpstat -W completed -l
# Show detailed status of completed jobs.
# This reveals filter errors or backend failures that caused rejection.
Check the CUPS logs if the job fails. The logs contain the exact reason CUPS rejected the job or the backend dropped the connection.
journalctl -xeu cups
# Read recent CUPS logs with explanatory text.
# The x flag adds context. The e flag jumps to the end.
# Look for "ERROR" or "WARNING" lines near your job timestamp.
Common pitfalls and error messages
The lpadmin command will refuse to proceed and print lpadmin: Bad request - printer or class already exists if you reuse a name. Remove the old entry first with lpadmin -x OfficePrinter.
If you see lpadmin: Bad request - no such file or directory, the device URI is unreachable or the model is invalid. Verify the IP address and ensure the printer responds to ping. Check that driverless is supported by running lpinfo -m available | grep -i driverless. If the output is empty, your CUPS installation lacks the driverless backend. Install it with sudo dnf install cups-filters.
Some printers require a specific URI path. The generic ipp://192.168.1.50 might fail. Try ipp://192.168.1.50/ipp/print or ipp://192.168.1.50/printers/OfficePrinter. Consult the printer's web interface for the correct IPP endpoint.
SELinux rarely blocks CUPS operations, but if you see denials, check the audit logs. SELinux denials show up in journalctl -t setroubleshoot with a one-line summary. Read those before disabling SELinux. CUPS is well-labeled on Fedora. Manual edits to /etc/cups/cupsd.conf are usually unnecessary. Edit /etc/. Never edit /usr/lib/. Package updates overwrite files in /usr/lib/.
If the printer supports scanning as well as printing, the scanner requires a separate setup using sane. Printing and scanning use different subsystems. Setting up CUPS does not enable scanning.
When to use this vs alternatives
Use lpadmin when you need a reproducible setup script or are managing a headless server. Use the CUPS web interface at localhost:631 when you prefer a visual form but want full control over options. Use the GNOME Settings GUI when you are on a desktop and want automatic discovery via cups-browsed. Use driverless when your printer supports IPP Everywhere, AirPrint, or Mopria. Use hplip when you have an older HP printer that requires proprietary firmware or scanner support. Use socket:// when the printer only accepts raw PCL or PostScript data on port 9100. Use ipp:// when you want to leverage protocol features like job status tracking and color profiles.
Snapshot the system before the upgrade. Future-you will thank you.