前言
为了让我能够随时远程我的minipc,但是实验室个环境下没有办法使用NAT,所以ipv4肯定是走不了了,所以使用ipv6,如果不使用DDNS的话,我当前有一个公网机器,那么只需要每一段时间向公网及其报告自己的ipv6就好了所以有以下代码,折腾半天实验室环境下的网线是没有ipv6的,然而校园网的ipv6不明原因无法使用。(明明成功连接了一次后续死活连不上了)结论:瞎折腾了
服务器端
const express = require('express');
const fs = require('fs').promises;
const path = require('path');
const app = express();
const PORT = 9021;
const STORAGE_PATH = path.join(__dirname, 'device_records.json');
// 初始化存储文件
async function initStorage() {
try {
await fs.access(STORAGE_PATH);
} catch {
await fs.writeFile(STORAGE_PATH, '[]');
}
}
// 更新记录逻辑
async function updateRecords(newRecord) {
const data = await fs.readFile(STORAGE_PATH, 'utf8');
let records = JSON.parse(data);
// 移除同名或同MAC的旧记录
records = records.filter(r =>
r.name !== newRecord.name &&
r.mac !== newRecord.mac
);
records.push(newRecord);
await fs.writeFile(STORAGE_PATH, JSON.stringify(records, null, 2));
}
// 中间件
app.use(express.json());
// 上报接口
app.post('/report', async (req, res) => {
try {
const { name, ipv6, mac } = req.body;
if (!name || !ipv6 || !mac) {
return res.status(400).send('Missing parameters');
}
await updateRecords({
timestamp: new Date().toISOString(),
name,
ipv6,
mac: mac.toUpperCase() // MAC统一大写
});
res.status(200).send('OK');
} catch (err) {
console.error(`处理失败: ${err}`);
res.status(500).send('Server Error');
}
});
// 启动服务
initStorage().then(() => {
app.listen(PORT, () => {
console.log(`服务运行中 | 端口: ${PORT}`);
console.log(`存储路径: ${STORAGE_PATH}`);
});
});客户端
const axios = require('axios');
const os = require('os');
const schedule = require('node-schedule');
// 获取有效MAC地址(兼容多系统)
function getMAC() {
const interfaces = os.networkInterfaces();
for (const devName in interfaces) {
const iface = interfaces[devName].find(entry =>
!entry.internal &&
entry.mac &&
entry.mac !== '00:00:00:00:00:00'
);
if (iface) return iface.mac;
}
throw new Error('No valid MAC found');
}
// 获取公网IPv6地址
function getIPv6() {
const interfaces = os.networkInterfaces();
for (const devName in interfaces) {
const iface = interfaces[devName].find(entry =>
entry.family === 'IPv6' &&
!entry.internal &&
!entry.address.startsWith('fe80')
);
if (iface) return iface.address;
}
throw new Error('No valid IPv6 found');
}
// 上报数据(包含重试机制)
async function reportToServer() {
try {
const payload = {
name: 'MINIPC-Ubuntu20.04', // 设备名称
ipv6: getIPv6(),
mac: getMAC(),
timestamp: new Date().toISOString()
};
await axios.post('http://www.yanchang.xyz:9021/report', payload, {
timeout: 5000,
headers: {'X-Client-ID': 'monitoring-agent'}
});
console.log(`[${new Date().toLocaleTimeString()}] 上报成功`);
} catch (err) {
console.error(`上报失败: ${err.message}`);
}
}
// 定时任务配置
schedule.scheduleJob('*/5 * * * *', reportToServer); // 每5分钟执行
reportToServer(); // 启动时立即执行