ifconfig is gone. ip is the one command that answers every 'what is my network doing' question.
ifconfig has been deprecated for over a decade, yet half the tutorials online still teach it. ip does everything it did — and everything it never could — in one command.
ip is the iproute2 suite's front door. It manages network interfaces (ip link), IP addresses (ip addr), routing tables (ip route), and the neighbor/ARP cache (ip neigh). It replaced the old net-tools commands — ifconfig, route, arp — which have been unmaintained for years and are often not even installed on modern distros.
When a machine 'has no network', ip is the first thing you reach for. Is the interface up? What address did DHCP hand out? Is there a default route? Is the gateway reachable? Each is one ip subcommand. It is also scriptable and machine-readable, which is why every modern Linux admin, Docker, and Kubernetes tooling leans on it.
ip -br addr
lo UNKNOWN 127.0.0.1/8 ::1/128 wlp0s20f3 UP 192.168.1.57/24 metric 600 fd5c:2d2b:cb4c:ef7:3e58:c2ff:fed8:5ef5/64 docker0 DOWN 172.17.0.1/16 br-703b0c8f3110 UP 172.23.0.1/16
-br (brief) gives one line per interface: state, IPv4, and IPv6. The fastest way to see what address each interface actually has.
ip route
default via 192.168.1.1 dev wlp0s20f3 proto dhcp src 192.168.1.57 metric 600 192.168.1.0/24 dev wlp0s20f3 proto kernel scope link src 192.168.1.57 metric 600
The first line is the default route — where traffic with no more specific match goes. If this line is missing, you have no internet even with an address assigned.
ip -s link show wlp0s20f3
3: wlp0s20f3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
link/ether 3c:58:c2:d8:5e:f5 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped missed mcast
1234567890 1234567 0 0 0 0
TX: bytes packets errors dropped carrier collsns
987654321 987654 0 0 0 0
-s adds per-interface byte and packet counters. errors and dropped at zero is the sign of a healthy link; non-zero means a cable, driver, or duplex problem.
ip neigh
192.168.1.1 dev wlp0s20f3 lladdr 00:11:32:81:da:a6 REACHABLE 192.168.1.147 dev wlp0s20f3 lladdr b8:27:eb:f9:59:ba STALE 192.168.1.14 dev wlp0s20f3 lladdr 00:17:88:28:a9:f7 STALE
ip neigh is the modern ARP table: which IPs on your subnet have been resolved to MAC addresses. REACHABLE means recently confirmed alive; STALE means seen before but not recently.
ip link set wlp0s20f3 down && ip link set wlp0s20f3 up
$ ip link set wlp0s20f3 down $ ip link set wlp0s20f3 up $ ip -br link show wlp0s20f3 wlp0s20f3 UP 3c:58:c2:d8:5e:f5 <BROADCAST,MULTICAST,UP,LOWER_UP>
Bounce an interface to force it to renegotiate and re-run DHCP. The classic 'turn it off and on again' for a stuck NIC — no reboot needed.
| Flag | Meaning |
|---|---|
addr | show or configure IP addresses on interfaces |
link | show or configure network interfaces (up/down, MTU, MAC) |
route | show or manipulate the routing table |
neigh | show or manipulate the neighbor (ARP) cache |
-br | brief output — one compact line per interface |
-s | statistics — add byte/packet counters to link output |
-4 / -6 | restrict output to IPv4 or IPv6 only |
ip comes from iproute2, written by Alexey Kuznetsov and released in 1999 as part of Linux 2.2's new networking stack. The old net-tools (ifconfig, route, arp) were built for the 2.0 era and never kept up. iproute2 was designed to be extensible — which is why ip has subcommands for things like policy routing and traffic control that ifconfig could never touch.
The 'ip' binary is actually a single program that dispatches on its first argument — ip addr, ip link, ip route are all the same executable. That is why the syntax is consistent across every subcommand, unlike the grab-bag of separate tools it replaced.