How to find your Zebra printer's IP address
To print over the network you need the printer's address, and Zebras rarely advertise it. Five ways, ordered by what you already have access to.
1. Sweep the network for port 9100
If you are on the same network as the printer, this needs nothing installed. Every networked Zebra listens on TCP 9100:
for i in $(seq 1 254); do
(timeout 0.4 bash -c "</dev/tcp/192.168.1.$i/9100" 2>/dev/null \
&& echo "192.168.1.$i:9100 open") &
done; wait
Real output on a LAN with one printer:
192.168.1.157:9100 open
Two details there are easy to get wrong, and both fail quietly. Wait() throws
when a connection is refused rather than returning $false, so without the try
the loop dies on the first closed address. And the braces in ${ip} are required:
PowerShell reads $ip:9100 as a scoped variable and prints open with no
address at all.
Change 192.168.1 to your own subnet, which ip route or ipconfig will tell
you. It takes a few seconds.
Anything that answers on 9100 is not necessarily a printer. Print servers and label simulators listen there too. Confirm before you send anything (next section).
2. Confirm it is the printer you think it is
Once you have a candidate, ~HI (Host Identify) makes it say what it is:
(printf '~HI'; sleep 2) | nc 192.168.1.157 9100
Real answer:
GX430t-300dpi,V56.17.11Z,12,2104KB
Model, firmware version, dots per millimetre, and memory. The 12 matters more
than it looks: it is 12 dpmm (300 dpi), and it is what every size calculation in
your ZPL depends on.
3. Ask the printer over SGD, and mind the trap
If you can already reach it, SGD reports the configuration. But the obvious query is the wrong one. On a wired GX430t, plainly reachable at 192.168.1.157:
(printf '! U1 getvar "ip.addr"\r\n'; sleep 1) | nc 192.168.1.157 9100
"0.0.0.0"
That is not a fault. ip.addr belongs to a different interface from the one
carrying your connection, and the printer answers honestly about an interface
that has no address. Ask which network is active first, then query that
interface by name:
(printf '! U1 getvar "ip.active_network"\r\n'; sleep 1) | nc 192.168.1.157 9100
"Internal Wired"
(printf '! U1 getvar "internal_wired.ip.addr"\r\n'; sleep 1) | nc 192.168.1.157 9100
"192.168.1.157"
For a wireless printer the prefix is wlan. instead. On the same machine
wlan.ip.addr returns "0.0.0.0", which is the same honest answer about an
interface that is not in use.
Other keys worth having while you are there:
internal_wired.mac_addr "00:07:4d:42:0c:6e"
ip.dhcp.enable "on"
device.friendly_name "32J120300675"
4. Print the configuration label
With physical access and no network at all, the printer will tell you directly. On most desktop models: power off, hold the feed button, power on, and release after the status light flashes once. Some models use a different button dance, so check the manual for yours.
Two labels come out. The network section of the second lists the IP address, subnet mask and MAC.
If you can already reach it over the network, ~WC prints the same thing without
touching the printer:
printf '~WC' | nc 192.168.1.157 9100
5. Find it by MAC address in the router
Zebra's network hardware uses a handful of registered MAC prefixes, 00:07:4D
among them. That makes a Zebra easy to spot in a DHCP client list or an ARP
table:
arp -a | grep -i "0:7:4d\|00:07:4d"
Your router's DHCP leases page shows the same thing with a hostname, which is
often the printer's serial number (32J120300675 above).
Keep it from moving
The printer here has ip.dhcp.enable set to "on", so the address it has today
is a lease, not a property. Every reboot is a chance for it to change, and
hard-coding a leased address into an application is a Monday morning outage
waiting to happen.
Two fixes, either is fine:
- A DHCP reservation in your router, keyed on the MAC above. Nothing on the printer changes.
- A static address on the printer, over SGD:
printf '! U1 setvar "internal_wired.ip.protocol" "permanent"\r\n' | nc 192.168.1.157 9100
printf '! U1 setvar "internal_wired.ip.addr" "192.168.1.157"\r\n' | nc 192.168.1.157 9100
The reservation is usually the safer of the two, because it is undone from the router rather than from a printer you can no longer reach.
Nothing answered on 9100 at all
See Zebra printer not responding on port 9100, which covers the difference between a refused connection and a timeout, and why only one program can hold the port at a time.
I have the address, now what?
Send it ZPL. cat label.zpl | nc 192.168.1.157 9100 is the whole protocol, and
the printing guide covers Windows
and the driver traps. If you would rather test without a printer at all, a
virtual Zebra speaks the same raw 9100.
Published 2026-09-03 · Ben Faerber, software engineer, five years building warehouse fulfillment and label-printing systems; maintainer of pdf-to-zpl (27,000+ installs powering production label generation).