By default, a Linux network interface controller (NIC) operates in normal filtering mode: the hardware frame filter inspects incoming Ethernet frames and discards any frame whose destination MAC address does not match the interface’s own hardware address, a multicast group it has joined, or the broadcast address (ff:ff:ff:ff:ff:ff). While this selective filtering reduces CPU overhead and bus traffic, network analysis tools, software bridges, virtual switches, and Intrusion Detection Systems (IDS) require full packet visibility. Enabling promiscuous mode instructs the NIC to pass all incoming Ethernet traffic directly to the operating system kernel for inspection.
What Is Promiscuous Mode and When Is It Used?
Promiscuous mode (frequently abbreviated as PROMISC) disables the network card’s hardware MAC filter. As a result, the kernel network stack receives every frame travelling across the local physical segment or virtual switch port, regardless of intended recipient.
Standard use cases for enabling promiscuous mode include:
- Packet Sniffing and Deep Packet Inspection: Running diagnostic utilities such as
tcpdump, Wireshark, or Zeek to capture raw network traces across shared hubs, mirrored switch ports (SPAN), or virtual taps. - Software Bridging and Hypervisors: Virtualisation platforms like KVM, QEMU, and LXC rely on bridging where the host interface must receive frames bound for guest virtual machines with different MAC addresses. You can learn how to create and configure network bridges in Linux using ip link to interconnect physical interfaces with virtual machines.
- Intrusion Detection and Network Forensics: Security appliances such as Snort and Suricata monitor mirrored uplinks in promiscuous mode to detect malicious payloads, port sweeps, and abnormal protocol handshakes. Power users also frequently discover local network devices in Linux using arp-scan when auditing subnets.
Checking Current Interface Promiscuous Status
Modern Linux distributions utilise the iproute2 suite rather than the deprecated ifconfig utility. You can inspect interface flags using the ip link command.
Open your terminal and run:
ip link show eth0
Replace eth0 with your target interface name (such as enp3s0 or wlan0). If you do not know the exact interface identifier, run ip -br link to view a concise table of all registered network devices.
Examine the flag list contained within angle brackets <...> on the first output line:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 00:1a:2b:3c:4d:5e brd ff:ff:ff:ff:ff:ff
If the word PROMISC is absent from the flag list, promiscuous mode is currently disabled.
How to Enable Promiscuous Mode Using ip link
Modifying kernel-level network device flags requires root privileges via sudo.
- To turn on promiscuous mode for an interface, execute:
sudo ip link set dev eth0 promisc on - Verify that the flag has been applied by querying the interface status again:
ip link show eth0 - Review the flags inside the angle brackets. You will now observe the
PROMISCflag prominently listed:2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:1a:2b:3c:4d:5e brd ff:ff:ff:ff:ff:ff - Confirm kernel acknowledgement by inspecting the kernel ring buffer using
dmesg:
The kernel prints a log entry indicating that the interface entered promiscuous mode:sudo dmesg | grep -i promisc[ 1245.678901] device eth0 entered promiscuous mode
How to Disable Promiscuous Mode Using ip link
Leaving promiscuous mode enabled unnecessarily introduces performance overhead and potential privacy risks, as the kernel must allocate memory and processor cycles to evaluate every frame on the wire. When your capture session or testing is finished, return the NIC to standard filtering mode.
- Run the following command to disable promiscuous mode:
sudo ip link set dev eth0 promisc off - Verify that the
PROMISCflag has been removed:
The angle brackets should once again display only standard flags (e.g.,ip link show eth0<BROADCAST,MULTICAST,UP,LOWER_UP>). - Check the kernel log to confirm that the device successfully exited promiscuous operation:
You will see:sudo dmesg | tail -n 5[ 1390.112233] device eth0 left promiscuous mode
Persisting Promiscuous Configuration Across Reboots
Commands issued via ip link set interact directly with the active runtime kernel state and reset automatically upon reboot. If your server hosts virtual machine hypervisors or dedicated IDS monitoring daemons that require permanent promiscuous operation, configure your network manager accordingly.
Configuring Promiscuous Mode in systemd-networkd
In modern server distributions managed by systemd-networkd, open or create a configuration override file under /etc/systemd/network/ (for example, /etc/systemd/network/10-eth0.network):
[Match]
Name=eth0
[Network]
DHCP=yes
Promiscuous=yes
Restart the network daemon using sudo systemctl restart systemd-networkd to apply the persistent setting.
Configuring Promiscuous Mode in Netplan (Ubuntu / Debian)
For systems using Netplan with the networkd renderer, add an activation-mode directive inside /etc/netplan/01-netcfg.yaml:
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: true
activation-mode: off
# Alternatively configure promiscuous behavior via systemd network drop-ins
For broader network interface tuning, you can also explore how to change network interface MTU in Linux using ip link or how to change network interface transmit queue length in Linux to handle intense packet capture throughput without dropping frames.