yanchang
yanchang
发布于 2025-04-24 / 10 阅读
0
0

(方案无效)向服务器报告自己的IPV6

前言

为了让我能够随时远程我的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(); // 启动时立即执行


评论