如何通过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
相关产品推荐
相关产品推荐

