You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过MATLAB获取MAC地址及以太网数据(IP、Port)用于防火墙开发

在MATLAB中获取以太网数据(IP/Port/MAC)的方法

一、获取本地网络接口的MAC与IP地址

如果只是获取本地网卡的基础信息,有两种常用方式:

  • 调用系统命令:
    Windows下用getmac,Linux/macOS用ip link或ifconfig,通过MATLAB的system函数执行并读取结果:
    % Windows示例
    [~, macResult] = system('getmac /v');
    disp(macResult);
    
    % Linux/macOS示例
    [~, ifResult] = system('ip link show');
    disp(ifResult);
    
  • 跨平台Java API调用:
    利用MATLAB内置的Java支持,直接获取网卡的硬件地址和IP,无需依赖系统命令:
    import java.net.NetworkInterface;
    interfaces = NetworkInterface.getNetworkInterfaces();
    
    while interfaces.hasMoreElements()
        ni = interfaces.nextElement();
        % 跳过回环接口和未启用的接口
        if ~ni.isLoopback() && ni.isUp()
            fprintf('网卡名称: %s\n', char(ni.getName()));
            % 转换MAC字节数组为十六进制字符串
            macBytes = ni.getHardwareAddress();
            if ~isempty(macBytes)
                macParts = arrayfun(@(b) sprintf('%02X', b), macBytes, 'UniformOutput', false);
                fprintf('MAC地址: %s\n', strjoin(macParts, ':'));
            end
            % 获取关联的IP地址
            ipAddrs = ni.getInetAddresses();
            while ipAddrs.hasMoreElements()
                addr = ipAddrs.nextElement();
                if ~addr.isLoopbackAddress()
                    fprintf('IP地址: %s\n', char(addr.getHostAddress()));
                end
            end
            fprintf('---\n');
        end
    end
    

二、捕获网络数据包获取IP与端口信息(防火墙核心需求)

要实现防火墙的过滤规则,需要实时捕获流经网卡的数据包并提取IP、端口,推荐两种方案:

  • 调用命令行抓包工具:
    用tshark(Wireshark的命令行版本,跨平台)或tcpdump,直接提取指定字段,无需手动解析协议:
    % 示例:捕获网卡2的10个TCP数据包,提取源IP、目的IP、源端口、目的端口
    [~, packetData] = system('tshark -i 2 -T fields -e ip.src -e ip.dst -e tcp.srcport -e tcp.dstport -c 10');
    disp(packetData);
    
    先通过tshark -D查看本地网卡列表,替换-i后的数字为目标网卡ID即可。
  • 手动监听端口并解析协议头:
    用MATLAB的tcpip对象监听特定端口,收到数据包后手动解析IP/TCP协议头(需了解协议格式):
    % 创建TCP服务器监听80端口
    tcpServer = tcpip('0.0.0.0', 80, 'NetworkRole', 'server');
    fopen(tcpServer);
    
    while true
        if tcpServer.BytesAvailable > 0
            rawData = fread(tcpServer, tcpServer.BytesAvailable);
            % 解析IP头(前20字节)提取源IP、目的IP
            srcIP = num2str(rawData(13:16))';
            srcIP = strrep(srcIP, ' ', '.');
            dstIP = num2str(rawData(17:20))';
            dstIP = strrep(dstIP, ' ', '.');
            % 解析TCP头(IP头长度后的数据)提取端口
            ipHeaderLen = bitshift(rawData(1), 4);
            srcPort = typecast(rawData(ipHeaderLen+1:ipHeaderLen+2), 'uint16');
            dstPort = typecast(rawData(ipHeaderLen+3:ipHeaderLen+4), 'uint16');
            
            fprintf('源IP: %s 源端口: %d | 目的IP: %s 目的端口: %d\n', ...
                srcIP, srcPort, dstIP, dstPort);
        end
        pause(0.1);
    end
    
    fclose(tcpServer);
    

三、使用MATLAB Network Toolbox(需授权)

如果有Network Toolbox授权,可直接用interfaceinfo函数快速获取网卡信息:

netInfo = interfaceinfo();
for idx = 1:length(netInfo)
    fprintf('网卡: %s\n', netInfo(idx).Name);
    fprintf('MAC地址: %s\n', netInfo(idx).HardwareAddress);
    fprintf('IP地址: %s\n', join(netInfo(idx).IPAddresses, ', '));
    fprintf('---\n');
end

内容的提问来源于stack exchange,提问作者Mohammedelhassan Taifour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:36:20