smalllinux

The Linux ip Command: A Practical Guide to Network Troubleshooting

Originally published October 26, 2018 | Updated October 2026

If you have spent much time working with Linux, you probably remember commands such as ifconfig, route, and arp. For years, these utilities were commonly used to examine network interfaces, IP addressing, routing tables, and other networking information.

Those commands may still be available on some Linux systems, but modern Linux distributions generally provide a much more capable alternative: the ip command.

Part of the iproute2 suite of networking utilities, the ip command allows us to examine and manage network interfaces, IPv4 and IPv6 addresses, routing tables, neighbor information, multicast addresses, and much more.

For network technicians, engineers, and anyone troubleshooting connectivity problems, it is an essential tool.

What I particularly like about the ip command is that it lets us examine the Linux networking stack from several different perspectives. We can start with the interface itself, move into IP addressing, examine routing decisions, and even watch network state changes as they happen.

In this article, we’ll explore these capabilities using actual examples from two Linux environments: Ubuntu running under Windows Subsystem for Linux 2 (WSL 2), and a native Linux Mint computer.

We’ll also look at a few unexpected results that illustrate why troubleshooting requires more than simply checking whether an interface is UP.

Let’s explore!

1. Our Linux Environments

For this article, we’re using two systems.

The first is Ubuntu 26.04 LTS running under WSL 2 on a Windows computer. This provides a genuine Linux kernel environment without requiring a dedicated Linux workstation.

The second is a computer named aw-satellite running Linux Mint 22.3, with both wired Ethernet and Wi-Fi interfaces connected to the network.

EnvironmentOperating SystemNetworking
WSL 2Ubuntu 26.04 LTSVirtual Ethernet interface
aw-satelliteLinux Mint 22.3Physical Ethernet, Wi-Fi, and virtual bridge

The distinction is useful. WSL provides a relatively simple environment for learning the commands, while native Linux exposes additional information about physical network interfaces and more extensive IPv6 configuration.

One caution: WSL networking can differ from native Linux. For example, our WSL configuration has an IPv4 default route but no IPv6 default route. That is a property of this particular configuration, not a limitation of the Linux ip command itself.

Microsoft also offers mirrored networking support for WSL 2, which can provide additional IPv6, multicast, and network compatibility capabilities.

2. Getting Started with the ip Command

Open a terminal and enter:

ip

Linux displays the command syntax and available objects.

We can also request help:

ip help

And check the installed version:

ip -V

On our WSL system, the version command returned:

ip utility, iproute2-6.19.0, libbpf 1.6.3

The ip command provides numerous objects, including:

ObjectPurpose
addressIP addressing information
linkNetwork interface and link-layer information
routeRouting information
neighIPv4 and IPv6 neighbor information
maddressMulticast address memberships
ruleRouting policy rules
monitorLive networking events

Many commands also have abbreviated forms. For example, ip address, ip addr, and ip a can all be used to examine interface addressing.

We’ll concentrate on displaying information rather than making configuration changes. Most of the commands in this article can be executed without administrator or root privileges.

Examining the installed iproute2 version and the available Linux ip command objects.

3. Displaying Network Interfaces and IP Addresses

Let’s begin with one of the commands you’ll probably use most frequently:

ip addr

Or simply:

ip a

This command displays network interfaces and their associated addressing information.

Depending on the Linux system, you might see physical Ethernet interfaces, wireless adapters, virtual interfaces, bridges, tunnels, and the loopback interface.

On our native Linux Mint system, we have four interfaces:

InterfaceDescription
loLoopback interface
enp8s0Wired Ethernet interface
wlp7s0Wireless network interface
virbr0Virtual network bridge

Our Ethernet interface has IPv4 address 192.168.1.58/24, while the Wi-Fi interface has 192.168.1.199/24.

Both are on the same IPv4 subnet, an interesting configuration we’ll return to when discussing routing.

The loopback interface uses the familiar IPv4 address 127.0.0.1/8 and IPv6 address ::1/128.

The IPv4 addresses appear after the inet keyword, while IPv6 addresses appear after inet6.

The number following the slash is the prefix length. For example, /24 indicates that the first 24 bits identify the IPv4 network prefix, while /64 indicates a 64-bit IPv6 prefix.

Use:

ip -4 addr show
IPv4 address assignments on a native Linux Mint system, including Ethernet, Wi-Fi, loopback, and a virtual bridge.

Understanding Linux Network Interface Names

If you are accustomed to older Linux systems, names such as enp8s0 might look unfamiliar.

Historically, Ethernet interfaces were commonly named eth0, eth1, and so forth.

Modern Linux distributions often use predictable network interface naming based on available hardware and firmware information.

For example:

InterfaceGeneral meaning
loLoopback
eth0Traditional or virtual Ethernet interface
eno1Ethernet interface using onboard firmware numbering
ens3Ethernet interface using a firmware or hotplug slot index
enp8s0Ethernet interface associated with PCI bus 8, device slot 0
wlp7s0Wireless interface associated with PCI bus 7, device slot 0

These names are not universal, and interface naming can be affected by distribution policies and system configuration.

For troubleshooting, the critical first step is identifying which interface corresponds to the connection we’re investigating.

4. Using the Brief Output Format

The full output of ip addr contains considerable detail, but sometimes we need a quick summary.

Try:

ip -br addr

The -br option requests brief output.

We can also execute:

ip -br link

On our WSL system, these commands produced:

lo    UNKNOWN  127.0.0.1/8 10.255.255.254/32 ::1/128
eth0  UP       172.25.51.141/20 fe80::215:5dff:fe0b:11c0/64

The results are considerably easier to read than the complete interface output.

Notice that WSL has a virtual Ethernet interface named eth0, while our native Linux Mint system uses enp8s0.

Also notice that WSL’s IPv4 address is in the private 172.16.0.0/12 address range. In our configuration, this is consistent with WSL’s default virtualized NAT networking architecture.

The brief output format provides a concise view of network interfaces, assigned addresses, and operational states.
ip -br addr
ip -br link

This is one of my favorite ways to begin troubleshooting an unfamiliar Linux system.

5. Examining IPv4 and IPv6 Separately

Linux can display addressing information for a specific protocol family.

For IPv4:

ip -4 addr

For IPv6:

ip -6 addr

We can also combine the options:

ip -4 -br addr
ip -6 -br addr

Our native Linux Mint system has several IPv6 addresses assigned to each physical network interface.

For example, the Ethernet interface includes a link-local address:

fe80::1e13:fa66:a514:ae0f/64

It also has global unicast IPv6 addresses from:

2603:8081:1800:b447::/64

And Unique Local Addresses (ULAs) from:

fd00:582f:f773:4832::/64

This illustrates an important difference between IPv4 and IPv6. An IPv6-enabled interface commonly has several IPv6 addresses, each potentially serving a different purpose.

Comparing IPv4 and IPv6 addressing on native Linux, including global, unique-local, and link-local IPv6 addresses.
ip -4 -br addr
ip -6 -br addr

The IPv6 output may be lengthy.

Why Does My Linux Interface Have So Many IPv6 Addresses?

Our Ethernet interface has 12 IPv6 addresses!

At first glance, that might look like a configuration problem, but examining the detailed address information explains much of what we’re seeing.

Try:

ip -6 addr show dev enp8s0

One of our addresses is marked:

scope global temporary dynamic

Another is marked:

scope global temporary deprecated dynamic

Linux supports temporary IPv6 privacy addresses, which can change over time to reduce address-based tracking.

An address marked temporary is a privacy address.

An address marked deprecated is no longer preferred for new communication, although it can remain valid for a period of time.

Two additional fields help explain this behavior:

  • preferred_lft indicates how much longer an address remains preferred.
  • valid_lft indicates how much longer the address remains valid.

An address with a preferred lifetime of zero may still have a substantial valid lifetime remaining.

This is normal IPv6 behavior and an important consideration when analyzing IPv6 connectivity and packet captures.

The mngtmpaddr flag also appears on some of our addresses. It indicates that the address can serve as a template for managing temporary addresses.

The presence of numerous IPv6 addresses does not, by itself, indicate a problem.

6. Understanding Network Interface Status

Let’s move from IP addressing to the network interfaces themselves.

Execute:

ip link

Or examine a specific interface:

ip link show dev enp8s0

On our Linux Mint system, we received:

2: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP>
    mtu 1500 qdisc fq_codel state UP
    mode DEFAULT group default qlen 1000
    link/ether 2c:60:0c:0c:97:bc
    brd ff:ff:ff:ff:ff:ff

There is quite a bit of useful information here.

First, BROADCAST and MULTICAST indicate capabilities of the interface.

The UP flag indicates that the interface has been administratively enabled.

LOWER_UP means the driver reports an operational lower-layer connection.

These are not the same thing!

An Ethernet interface can be administratively UP but have no working physical link.

And even when LOWER_UP is present, that does not guarantee that IP addressing, routing, DNS, or Internet communication is working.

The mtu 1500 field identifies the configured Maximum Transmission Unit.

The link/ether field identifies the interface’s Ethernet MAC address, followed by the Ethernet broadcast address.

You may also notice qdisc fq_codel.

This identifies the queueing discipline associated with the interface. FQ-CoDel combines flow queueing with active queue management and is designed to help control queueing delays.

That is a useful connection to broadband troubleshooting, particularly when discussing latency and bufferbloat.

Examining Ethernet interface flags, MTU, MAC address, and queueing discipline with the Linux ip command.
ip link show dev enp8s0

7. Examining Interface Statistics

Another valuable capability is displaying interface traffic statistics.

Execute:

ip -s link

Or examine a specific interface:

ip -s link show dev enp8s0

Our Linux Mint Ethernet interface reported:

RX: bytes       packets errors dropped missed mcast
    9365452418  7462279      0       0      0 434640

TX: bytes       packets errors dropped carrier collsns
     814174551  4145098      0       0       0      0

The interface has received more than 9 billion bytes and transmitted more than 814 million bytes since its counters were initialized.

The output also includes packet counts, errors, drops, missed packets, multicast packets, carrier errors, and collision counters.

In our example, the reported receive and transmit error counters are zero.

That’s encouraging, but it does not guarantee that the network is operating perfectly.

For one thing, the meaning and availability of some statistics can vary by network driver.

Also, these counters represent information accumulated over time. They are not measurements of current bandwidth utilization.

If we want to calculate a traffic rate, we need to sample byte counters at two different times and calculate the difference divided by the measurement interval.

This is a fundamental distinction in network performance analysis.

Examining received and transmitted bytes, packet counts, errors, drops, and multicast traffic on a Linux Ethernet interface.
ip -s link show dev enp8s0

8. Examining ARP and IPv6 Neighbor Discovery

Before a device can send an Ethernet frame toward a local IPv4 destination or next-hop router, it generally needs to resolve the corresponding link-layer address.

IPv4 uses Address Resolution Protocol (ARP).

IPv6 performs address resolution using ICMPv6 Neighbor Discovery.

Linux maintains neighbor information that can be examined using:

ip neigh

We can also separate IPv4 and IPv6:

ip -4 neigh
ip -6 neigh

On our native Linux computer, we examined the Ethernet interface:

ip -4 neigh show dev enp8s0

One entry identified the IPv4 default gateway:

192.168.1.1 lladdr 58:2f:f7:73:48:32 REACHABLE

For IPv6, we executed:

ip -6 neigh show dev enp8s0

And observed:

fe80::5a2f:f7ff:fe73:4832
    lladdr 58:2f:f7:73:48:32 router REACHABLE

Notice that both entries identify the same MAC address.

The IPv6 entry also identifies the neighbor as a router.

These examples demonstrate how IPv4 and IPv6 can maintain separate neighbor information for the same physical networking device.

IPv4 neighbor entries showing resolved Ethernet MAC addresses and reachability states.
ip -4 neigh show dev enp8s0
IPv6 Neighbor Discovery entries, including router identification and neighbor reachability states.
ip -6 neigh show dev enp8s0

Understanding Neighbor States

The neighbor table provides more than IP addresses and MAC addresses.

Each entry can also contain information about the current neighbor reachability state.

StateInterpretation
REACHABLEReachability has recently been confirmed
STALEReachability has not been confirmed recently
DELAYWaiting briefly before active probing
PROBEActively attempting to confirm reachability
INCOMPLETEAddress resolution has not completed
FAILEDNeighbor resolution or reachability confirmation failed

One of the most important points is that STALE does not mean a device is offline.

It simply means that reachability has not recently been confirmed.

Similarly, a FAILED entry represents an unsuccessful neighbor operation, not necessarily proof that the destination device itself is permanently unreachable.

The distinction becomes especially important with IPv6 because Neighbor Discovery is responsible for several functions beyond address resolution.

For additional background, see RFC 4861, which specifies IPv6 Neighbor Discovery.

9. Examining Multicast Addresses

Another interesting capability of the Linux ip command is the ability to examine multicast information associated with network interfaces.

Execute:

ip maddress

Or specify an interface:

ip maddress show dev enp8s0

The output contains three categories:

CategoryDescription
linkLink-layer multicast MAC addresses
inetIPv4 multicast group memberships
inet6IPv6 multicast group memberships

Our Ethernet interface included:

link  01:00:5e:00:00:fb
link  33:33:00:00:00:fb

inet  224.0.0.251

inet6 ff02::fb

These are interesting because 224.0.0.251 and ff02::fb are used by multicast DNS (mDNS), which uses UDP port 5353.

The IPv4 multicast group maps to Ethernet MAC address 01:00:5e:00:00:fb.

The IPv6 multicast group maps to 33:33:00:00:00:fb.

Notice that IPv6 multicast Ethernet destination addresses generally begin with 33:33.

IPv6 Solicited-Node Multicast

One of the most useful examples involves IPv6 solicited-node multicast addresses.

Our Ethernet interface has this IPv6 link-local address:

fe80::1e13:fa66:a514:ae0f

Its solicited-node multicast address is:

ff02::1:ff14:ae0f

This uses the final 24 bits of the assigned IPv6 address.

The corresponding Ethernet multicast MAC address is:

33:33:ff:14:ae:0f

Solicited-node multicast addresses play an important role in IPv6 Neighbor Discovery, including address resolution and Duplicate Address Detection.

Instead of using ARP broadcasts as IPv4 does, IPv6 typically sends Neighbor Solicitation messages to solicited-node multicast groups.

One important technical note: although ip maddress displays IP multicast memberships, its add and delete operations are intended for link-layer multicast address management. They are not a general-purpose method for joining arbitrary IP multicast groups.

Examining IPv4 and IPv6 multicast memberships and Ethernet multicast MAC addresses on a Linux interface.
ip maddress show dev enp8s0

Note the IPv4 mDNS group, IPv6 mDNS group, an IPv6 solicited-node multicast address, and its corresponding Ethernet MAC address.

10. Examining IPv4 and IPv6 Routing Tables

Let’s move up to the network layer.

One of the most useful capabilities of the ip command is displaying routing information.

Execute:

ip route

This normally displays IPv4 routes from the main routing table.

We can explicitly select IPv4:

ip -4 route

Or IPv6:

ip -6 route

On our WSL system, we received:

default via 172.25.48.1 dev eth0 proto kernel
172.25.48.0/20 dev eth0 proto kernel scope link src 172.25.51.141

There are two routes here.

The first is the default route, which uses gateway 172.25.48.1 through interface eth0.

The second identifies the directly connected 172.25.48.0/20 IPv4 subnet.

We can also examine IPv6 routing.

Our WSL system reported:

fe80::/64 dev eth0 proto kernel metric 256 pref medium

Notice what is missing: there is no IPv6 default route.

Although our WSL interface has an IPv6 link-local address, this routing table does not provide a route toward the global IPv6 Internet.

This is a useful reminder that merely having an IPv6 address does not guarantee IPv6 Internet connectivity.

Our native Linux Mint system is different. It has IPv6 global unicast addresses and default routes learned through IPv6 Router Advertisements.

Comparing IPv4 and IPv6 routing tables in WSL 2, showing an IPv4 default route but only an IPv6 link-local route.
ip -4 route
ip -6 route

11. Determining Which Route Linux Will Select

Displaying the routing table is useful, but suppose we want to know exactly which route Linux will select for a particular destination.

We can ask the kernel to perform a routing lookup.

For IPv4:

ip -4 route get 8.8.8.8

On our native Linux Mint computer, the result was:

8.8.8.8 via 192.168.1.1 dev enp8s0
    src 192.168.1.58 uid 1000
    cache

Linux selected the Ethernet interface, enp8s0, and gateway 192.168.1.1.

It also selected 192.168.1.58 as the source address.

Now let’s try IPv6:

ip -6 route get 2001:4860:4860::8888

Our result was:

2001:4860:4860::8888 from ::
    via fe80::5a2f:f7ff:fe73:4832
    dev enp8s0 proto ra
    src 2603:8081:1800:b447:47a4:50b1:5e75:78e3
    metric 100 pref high

There are several interesting things here.

First, Linux selected Ethernet again.

Second, the next-hop router uses a link-local IPv6 address beginning with fe80::. This is normal for IPv6 routing.

Third, proto ra indicates that the route was learned through IPv6 Router Advertisement information.

Fourth, notice the selected source IPv6 address. It is one of the temporary privacy addresses assigned to our Ethernet interface.

This provides a useful demonstration of IPv6 source-address selection.

The operating system has several IPv6 addresses available, but it must select an appropriate source address when performing the routing lookup.

The selected address depends on IPv6 source-address selection policy and the available address characteristics.

One important caution: ip route get performs a route lookup. It does not send a test packet to the destination and does not prove that the destination is reachable.

Linux route lookups identify the selected interface, next-hop gateway, and source address for IPv4 and IPv6 destinations.
ip -4 route get 8.8.8.8
ip -6 route get 2001:4860:4860::8888

An Interesting Routing Problem We Discovered

While examining our Linux Mint system, we discovered something unusual.

Both Ethernet and Wi-Fi were connected to the same IPv4 subnet, but Linux selected different interfaces depending on the destination.

For Internet traffic:

ip -4 route get 8.8.8.8

Linux selected Ethernet.

But for the local gateway:

ip -4 route get 192.168.1.1

Linux selected Wi-Fi.

Why?

Our Ethernet interface had the IPv4 address 192.168.1.58/24, but its address configuration included the noprefixroute flag.

This flag prevents the kernel from automatically creating the corresponding connected prefix route.

In our routing table, the connected 192.168.1.0/24 route was present only through Wi-Fi.

Consequently, traffic destined for 192.168.1.1 matched the more specific Wi-Fi subnet route, while traffic toward 8.8.8.8 selected the Ethernet default route.

This illustrates one of the most important principles in IP routing: longest-prefix matching.

A more specific matching route generally takes priority over a less specific route, even when the less specific route has a lower metric.

The example also demonstrates why checking an interface’s IP address alone is not enough. We need to examine the routing table to understand how the system will actually forward packets.

The reason our NetworkManager configuration omitted the Ethernet connected route was not fully established, but the resulting routing behavior was clear.

12. Monitoring Network Changes in Real Time

So far, most commands have provided a snapshot of the network at a particular moment.

But what if we want to observe network changes as they happen?

The Linux ip command has a monitoring capability.

Try:

ip monitor link

This monitors network interface changes.

We can also monitor routing:

ip monitor route

Address changes:

ip monitor address

Or neighbor information:

ip monitor neigh

We used the last command on our Linux Mint computer and captured some fascinating IPv6 behavior.

Our IPv6 router neighbor transitioned through the following states:

STALE
PROBE
REACHABLE

These were reported for the same IPv6 link-local router address on the same Ethernet interface.

Let’s examine what happened.

First, the neighbor was marked STALE, meaning reachability had not recently been confirmed.

Next, it entered PROBE, indicating that Linux was actively attempting to confirm reachability.

Finally, it became REACHABLE, indicating that reachability confirmation succeeded.

We also observed another IPv6 neighbor transition from PROBE to FAILED on the Wi-Fi interface.

That tells us the reachability confirmation was unsuccessful through that interface at that moment. It does not necessarily mean that the router itself was offline.

Neighbor reachability is tracked separately for each interface and protocol address.

These state changes are part of IPv6 Neighbor Unreachability Detection (NUD).

The actual state machine includes additional states, such as DELAY, which may not appear in every monitoring session.

Monitoring IPv6 Neighbor Discovery events in real time using the Linux ip monitor command.
ip monitor neigh

The important thing is that we were able to observe these changes without repeatedly executing ip neigh.

The monitor remained active and displayed networking events as the kernel reported them.

Also, ip monitor is not a packet capture tool. It displays networking state changes reported through the Linux networking interface.

If we want to examine the actual ICMPv6 Neighbor Solicitation and Neighbor Advertisement packets, we can use Wireshark or tcpdump.

Both approaches are useful, but they provide different information.

Press Ctrl+C to stop monitoring.

13. A Practical Linux Network Troubleshooting Workflow

We’ve examined quite a few commands, so let’s put them together into a simple troubleshooting process.

Suppose a Linux computer cannot access a network resource. Rather than immediately blaming DNS, the network interface, or the default gateway, let’s gather some evidence.

Step 1 — Examine the interfaces

ip -br link

Are the expected network interfaces present? Are they administratively enabled? Does the driver report an operational link?

Step 2 — Examine IPv4 and IPv6 addressing

ip -br addr

Does the system have the addresses we expect? Is it using IPv4, IPv6, or both?

Step 3 — Examine the routing tables

ip -4 route
ip -6 route

Are there routes toward the destination? Is there a default gateway for the relevant protocol family?

Step 4 — Determine the selected route

ip -4 route get 8.8.8.8

For IPv6:

ip -6 route get 2001:4860:4860::8888

Which outgoing interface, next-hop gateway, and source address will Linux select?

Step 5 — Examine neighbor information

ip neigh

Are local neighbors resolving to link-layer addresses? Are there repeated INCOMPLETE or FAILED entries worth investigating?

Step 6 — Examine interface statistics

ip -s link

Are interface errors or drops being reported? Are the counters increasing?

Step 7 — Monitor changes if necessary

ip monitor all

Are interfaces changing state, routes disappearing, or neighbor entries repeatedly failing?

This workflow won’t solve every network problem, but it provides a structured starting point.

Once we’ve established what the Linux operating system knows about its interfaces, addresses, neighbors, and routing decisions, we can move to additional tools such as ping, traceroute, ethtool, tcpdump, or Wireshark.

That is the key to effective troubleshooting: collect evidence, eliminate possibilities, and narrow the problem systematically.

14. Linux ip Command Quick Reference

Here is a summary of the commands explored in this article.

CommandPurpose
ip -VDisplay iproute2 utility version
ip helpDisplay command help
ip addrDisplay IP addresses
ip -br addrBrief address summary
ip -br linkBrief interface summary
ip -4 addrIPv4 addresses only
ip -6 addrIPv6 addresses only
ip linkInterface information
ip link show dev IFACEExamine a specific interface
ip -s linkInterface traffic statistics
ip -4 neighIPv4 neighbor table
ip -6 neighIPv6 neighbor table
ip maddressMulticast memberships
ip -4 routeIPv4 main routing table
ip -6 routeIPv6 main routing table
ip route get ADDRESSPerform a routing lookup
ip monitor linkMonitor interface changes
ip monitor routeMonitor routing changes
ip monitor neighMonitor neighbor changes
ip monitor allMonitor multiple networking event types

15. Final Thoughts

The Linux ip command is one of those tools that becomes more useful the more time you spend working with it.

At first, you may only use it to display an IP address or determine whether an interface is UP. But it can provide much more information than that.

We can examine Layer 2 characteristics, IPv4 and IPv6 addressing, multicast memberships, neighbor reachability, routing decisions, and network state changes.

Perhaps the most important lesson from our examples is that a network interface being operational does not necessarily mean network communication will work correctly.

Our WSL system had IPv6 link-local addressing but no IPv6 default route. Our native Linux system had multiple interfaces on the same IPv4 subnet and selected different interfaces for different destinations. We also observed IPv6 Neighbor Discovery changing neighbor states in real time.

All of those observations came from the Linux ip command.

Combine this information with actual protocol testing and packet captures, and you have a much more complete picture of what is happening within the network.

My advice is to open a Linux terminal and try these commands on your own system. Compare your output with the examples here. Don’t worry if your interface names or addresses differ—that is part of the learning experience.

I hope this article helps you add another practical tool to your network troubleshooting toolkit.

Additional Resources

CellStream, Inc. — Instruction. Knowledge. Skills.


If you would like to help support the continued development of independent networking, broadband, Wi-Fi, VoIP, and packet analysis content, please consider joining our Patreon community where you will gain access to exclusive technical resources, downloadable labs and PCAPs, bonus course content, troubleshooting guides, and additional member-only material.  Comments and technical discussion are always welcomed at our Patreon community or on our Discord server.  You can also support our work by simply buying us a coffee — every contribution helps us continue creating practical, real-world network science education for professionals and enthusiasts alike.

Leave a Comment

Scroll to Top