Rhel

是什麼決定了介面的混雜性、介面標誌或屬性?

  • January 10, 2020

我在 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(以及其他網路擷取和過濾工具)正在使用的東西。

引用自:https://unix.stackexchange.com/questions/561102