Linux 网络接口混杂模式(Promiscuous mode)认知
网络接口的混杂模式
混杂模式(Promiscuous mode),简称 Promisc mode,俗称监听模式。混杂模式通常被网络管理员用来诊断网络问题,但也会被无认证的、想偷听网络通信的人利用。混杂模式是指一个网卡会把它接收的所有网络流量都交给CPU,而不是只把它想转交的部分交给CPU。
使用ifconfig 或者 netstat-i命令查看一个网卡是否开启了混杂模式,当输出包含 PROMISC 时,表明该网络接口处于混杂模式。
启用网卡的混杂模式,可以使用下面这条命令:ifconfig eth0 promisc
# ifconfig eth0 promisc
# ifconfig eth0
eth0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
可以看到多了一个 PROMISC 状态
使网卡退出混杂模式,可以使用下面这条命令:ifconfig eth0 -promisc
# ifconfig eth0 -promisc
# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
# netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 43352 0 0 0 31769 0 0 0 BMPRU
将网络设备加入 Linux bridge 后,会自动进入混杂模式: 把一个 veth 虚拟设备添加到网桥
# ip link add veth5 type veth
# brctl addbr br5
# brctl addif br5 veth5
# dmesg | grep promiscuous
device veth5 entered promiscuous mode
如上所示,veth5 设备加入Linux bridge后,可以通过查看内核日志看到 veth5 自动进入混杂模式,而且无法退出,直到将 veth5 从 Linux bridge 中移除。即使手动将网卡设置为非混杂模式,实际上还是没有退出混杂模。
# ip link set eth1 promisc on
The flag will be updated to BMPRU. Flag details are as follows:
- B flag is for broadcast
- M flag is for multicast
- P flag is for promisc mode
- R is for running
- U is for up
netstat 输出的状态BMPRU包含了状态P就是混杂模式。