首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何初始化用于VLAN嗅探的原始套接字

如何初始化用于VLAN嗅探的原始套接字
EN

Stack Overflow用户
提问于 2012-06-08 18:38:46
回答 2查看 5.1K关注 0票数 4

我正在尝试创建一种软件,可以从不同的VLAN中嗅探DHCP提供的内容,但我的问题是,我接收到的数据包不包含VLAN标记。我正在使用原始套接字,并尝试启用混杂模式,但没有效果。

问题是,如何指示内核保持数据包中的所有数据完好无损?

使用wireshark时,我可以看到VLAN报头设置为ok的回复数据包,但我记录的数据已删除所有VLAN信息。

提前感谢!

--劳里

EN

回答 2

Stack Overflow用户

发布于 2020-01-16 05:49:39

这是旧的,但这仍然没有解决:

当在NIC Linux上启用VLAN卸载时,

将不会在recv返回的数据中传递VLAN标记。相反,它在控制消息中提供VLAN TCI。

要获取控制字段,您需要使用PACKET_AUXDATA,它将向辅助数据添加以下内容:

代码语言:javascript
复制
 struct tpacket_auxdata {
      __u32 tp_status;
      __u32 tp_len;      /* packet length */
      __u32 tp_snaplen;  /* captured length */
      __u16 tp_mac;
      __u16 tp_net;
      __u16 tp_vlan_tci;
      __u16 tp_padding;
  };

例如

代码语言:javascript
复制
sock.setsockopt(SOL_PACKET, PACKET_AUXDATA, 1)

完成后,使用recvmsg()遍历辅助数据,查找PACKET_AUXDATA。从其中提取tp_vlan_tci,并将其重新注入到数据包数据中。

代码的示例

  • C: libpcap

https://github.com/the-tcpdump-group/libpcap/blob/3a7962215f4f3b13ac792ad0e0487a53c0f1178e/pcap-linux.c#L1756

  • Python

代码语言:javascript
复制
import ctypes, socket

# From bits/socket.h
SOL_PACKET = 263
# From asm/socket.h
SO_ATTACH_FILTER = 26
ETH_P_8021Q = 0x8100
TP_STATUS_VLAN_VALID = 1 << 4

class tpacket_auxdata(ctypes.Structure):
    _fields_ = [
        ("tp_status", ctypes.c_uint),
        ("tp_len", ctypes.c_uint),
        ("tp_snaplen", ctypes.c_uint),
        ("tp_mac", ctypes.c_ushort),
        ("tp_net", ctypes.c_ushort),
        ("tp_vlan_tci", ctypes.c_ushort),
        ("tp_padding", ctypes.c_ushort),
    ]

def _recv_raw(sock, x=65535):
    """Internal function to receive a Packet,
    and process ancillary data.
    """
    flags_len = socket.CMSG_LEN(4096)
    pkt, ancdata, flags, sa_ll = sock.recvmsg(x, flags_len)
    if not pkt:
        return pkt, sa_ll
    for cmsg_lvl, cmsg_type, cmsg_data in ancdata:
        # Check available ancillary data
        if (cmsg_lvl == SOL_PACKET and cmsg_type == PACKET_AUXDATA):
            # Parse AUXDATA
            auxdata = tpacket_auxdata.from_buffer_copy(cmsg_data)
            if auxdata.tp_vlan_tci != 0 or \
                    auxdata.tp_status & TP_STATUS_VLAN_VALID:
                # Insert VLAN tag
                tag = struct.pack(
                    "!HH",
                    ETH_P_8021Q,
                    auxdata.tp_vlan_tci
                )
                    pkt = pkt[:12] + tag + pkt[12:]
        return pkt

(来自https://github.com/secdev/scapy)

票数 1
EN

Stack Overflow用户

发布于 2012-06-08 19:44:01

如果我对Linux code的理解是正确的,那么VLAN标签很早就会从数据包的有效负载中剥离出来,并存储在一个无法通过原始sockets访问的字段中。取而代之的是,试着做wireshark做的事情,即使用pcap API

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10947286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档