是什麼決定了介面的混雜性、介面標誌或屬性?
我在 RHEL 7 機器上使用 Lynis 執行掃描,它說介面處於混雜模式。我檢查並確定連結不是基於沒有 Promuscuous 標誌(只有廣播、多播、執行和 UP (BMRU) 可見):
$ ip link show dev eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff $ ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001 $ 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 9001 17217705 0 0 0 17899485 0 0 0 BMRU
所以我查看了 Lynis 是如何檢查並執行命令的
ip link -o -d show dev eth0 | grep 'promiscuity 1'
,果然,我發現了以下內容:$ ip -d link show dev eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff promiscuity 1 addrgenmode eui64 numtxqueues 8 numrxqueues 8 gso_max_size 65536 gso_max_segs 65535
我的問題是哪個更權威。我習慣於只檢查標誌而不是介面屬性。是什麼
promiscuity 1
意思?這個界面是混雜的嗎?
正如在/中引入只讀參數的更新檔中所解釋的:
promiscuity``ip-link``iproute2
該標誌
IFF_PROMISC
僅在使用者明確設置時由核心導出,例如在執行時不會導出tcpdump
)。+ if (do_link && tb[IFLA_PROMISCUITY] && show_details) + fprintf(fp, "\n promiscuity %u ", + *(int*)RTA_DATA(tb[IFLA_PROMISCUITY]));
事實上,介面(由 使用)和 rtnetlink 介面(由使用)使用的
dev_get_flags()
核心函式將從導出到使用者空間的一組標誌中顯式清除:ioctl(SIOCGIFFLAGS)``ifconfig``ip link show``IFF_PROMISC
* Get the combination of flag bits exported through APIs to userspace. */ unsigned int dev_get_flags(const struct net_device *dev) { unsigned int flags; flags = (dev->flags & ~(IFF_PROMISC | ...)) | (dev->gflags & (IFF_PROMISC | IFF_ALLMULTI));
[
dev->gflags
以上是一組不被核心使用,而僅由使用者空間介面設置和檢索的兼容性標誌]從使用者空間檢查介面是否處於混雜模式的唯一
ip -d link show
方法是(就像這樣做一樣)通過 介面IFLA_PROMISCUITY
檢索的屬性rtnetlink(7)
。這反映了設備的實際混雜計數:promiscuity > 0
意味著設備處於混雜模式。
ifconfig DEV promisc
通過or更新設備標誌ip link set dev DEV promisc on
不是將設備設置為混雜模式的唯一方法:另一種方法是通過介面:packet(7)
setsockopt()
setsockopt(sock, SOL_SOCKET, PACKET_ADD_MEMBERSHIP, {.mr_type = PACKET_MR_PROMISC})`
這就是
tcpdump
(以及其他網路擷取和過濾工具)正在使用的東西。