我想从传入请求对象中获取MAC地址。我的应用程序在nginx代理后运行,所以为了获取IP地址,我使用下面的语法,它可以正常工作。
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
同样,有没有一种方法可以获取已发出请求的MAC地址。发现了这个包https://www.npmjs.com/package/getmac,但我不确定它是否有帮助。基本上,我需要获取每个传入请求的MAC和IP地址。
我想从传入请求对象中获取MAC地址。我的应用程序在nginx代理后运行,所以为了获取IP地址,我使用下面的语法,它可以正常工作。
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
同样,有没有一种方法可以获取已发出请求的MAC地址。发现了这个包https://www.npmjs.com/package/getmac,但我不确定它是否有帮助。基本上,我需要获取每个传入请求的MAC和IP地址。
您无法从请求中获取它,但您可以先获取它,然后将其存储在req.session
中。
如何获取MAC地址:
const os = require( 'os' );
var mac_ip = os.networkInterfaces()['en3'][3]['mac'];
console.log('ip_test: ', ip_test);
req.session.macip = mac_ip;
networkInterfaces
来检查你想要的所有内容:var networkInterfaces = os.networkInterfaces();
console.log( networkInterfaces );
注意:此方法仅可获取运行节点进程的设备的MAC地址。如果从您的服务器运行,则此方法将获取您的服务器的MAC地址,而不是发出请求的客户端的MAC地址。
这个回答可能对原问题过于具体,但其他人可能会发现这很有用。根据其他答案,这种方法并不适用于所有情况,但在以下详细说明的条件下确实有效。
我之前编写了一个脚本来查找已知MAC地址的特定计算机是否在网络上。
homeip=$(sudo arp-scan -lq | grep -i -m 1 $homemac | grep -oP "\d+\.\d+\.\d+\.\d+")
然而,这样做需要很长时间(在子网掩码为255.255.192.0
的网络上执行可能需要超过30秒!)
该脚本缓存了IP地址,可以使用类似以下内容迅速验证该机器的有效性:
ping -c 1 -w 2 -q $homeip > /dev/null
$(arp -a | grep -m 1 -oP "(?<=\($homeip\) at )([\da-f]{2}:){5}[\da-f]{2}") != "$homemac"
#!/bin/bash
out=$(arp -a | grep -m 1 -oP "(?<=\($1\) at )([\da-f]{2}:){5}[\da-f]{2}")
if [ -z "$out" ]; then
ping -c 1 -w 1 $1 > /dev/null
echo $(arp -a | grep -m 1 -oP "(?<=\($1\) at )([\da-f]{2}:){5}[\da-f]{2}")
else
echo $out
fi
function getRequestingMAC(requestingIP) {
return new Promise((resolve, reject) => {
execFile(`resolveip`, [requestingIP], (error, stdout, stderr) => {
resolve(stdout.toString().trim());
});
});
// Sync-style
// return execFileSync(`resolveip`, [requestingIP]).toString().trim();
}
并且像这样使用:
app.use((req, res, next) => {
if (req.hostname === "localhost") {
} else {
//match first occurrence of ipv4 ip, not ideal regex
let ip = (req.headers['x-forwarded-for'] || req.socket.remoteAddress).match(/\d{1,3}(\.\d{1,3}){3}/)[0];
console.log(ip);
loop: {
// check if request came from known ip (my ip)
const ifaces = require('os').networkInterfaces();
for (const ifaceKey in ifaces) {
let iface = ifaces[ifaceKey];
if (iface.some(it => it.address === ip)) {
console.log("Local Request");
break loop;
}
}
// else, request mac
getRequestingMAC(ip).then((ans) => {
console.log("Request Came From", ans, ip);
// Give me a banner notif when access attempted
exec(`zenity --notification --text "Foreign request\n${ans} (${ip}) to ${req.url}"`);
});
}
}
next();
})
这可以更改为在调用next()
之前等待mac,并阻止非白名单请求。
再次强调,这在操作的用例中不起作用,但在我的用例中可以并且确实起作用。
arp
命令,它可以列出IP地址与本地网络中设备的MAC地址之间的映射。你可以使用以下命令通过IP地址找到特定设备的MAC地址。arp -n | grep 192.168.1.2 | grep -Eo '([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}'
child_process
模块:const { exec } = require('child_process');
exec("arp -n | grep 192.168.1.2 | grep -Eo '([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}'", (error, stdout, stderr) => {
if (error) {
console.error(`Error: ${error.message}`);
return;
}
if (stderr) {
console.error(`stderr: ${stderr}`);
return;
}
console.log(stdout);
});