diff --git a/src/main/java/com/tongran/agent/client/core/vo/NetworkInterfaceInfo.java b/src/main/java/com/tongran/agent/client/core/vo/NetworkInterfaceInfo.java index a136109..190e23a 100644 --- a/src/main/java/com/tongran/agent/client/core/vo/NetworkInterfaceInfo.java +++ b/src/main/java/com/tongran/agent/client/core/vo/NetworkInterfaceInfo.java @@ -21,5 +21,6 @@ public class NetworkInterfaceInfo { String carrier; // 运营商 String province; // 省 String city; // 市 + String ipv6; // 市 } diff --git a/src/main/java/com/tongran/agent/client/scheduler/service/AppInitializer.java b/src/main/java/com/tongran/agent/client/scheduler/service/AppInitializer.java index 67e54f7..0628a32 100644 --- a/src/main/java/com/tongran/agent/client/scheduler/service/AppInitializer.java +++ b/src/main/java/com/tongran/agent/client/scheduler/service/AppInitializer.java @@ -95,7 +95,7 @@ public class AppInitializer implements CommandLineRunner { // 检测防火墙策略配置 AssertLog.info("检测防火墙策略配置"); agentService.checkFirewall(); - AssertLog.info("启动检查防火墙策略定时任务 - 延迟: {}ms, 间隔: {}ms", milli, 600000); + AssertLog.info("启动检查防火墙策略定时任务 - 延迟: {}ms, 间隔: {}ms", 15000, 600000); dynamicTaskService.scheduleTask("checkFirewall", businessTasks::checkFirewallTask, 15000, 600000); AssertLog.info("检测agent更新配置"); agentService.checkAgentUpdate(); diff --git a/src/main/java/com/tongran/agent/client/scheduler/service/BusinessTasks.java b/src/main/java/com/tongran/agent/client/scheduler/service/BusinessTasks.java index 1c97508..a6a4084 100644 --- a/src/main/java/com/tongran/agent/client/scheduler/service/BusinessTasks.java +++ b/src/main/java/com/tongran/agent/client/scheduler/service/BusinessTasks.java @@ -850,7 +850,7 @@ public class BusinessTasks { // 检测防火墙策略配置 AssertLog.info("检测防火墙策略配置"); agentService.checkFirewall(); - AssertLog.info("启动检查防火墙策略定时任务 - 延迟: {}ms, 间隔: {}ms", milli, 600000); + AssertLog.info("启动检查防火墙策略定时任务 - 延迟: {}ms, 间隔: {}ms", 15000, 600000); dynamicTaskService.scheduleTask("checkFirewall", businessTasks::checkFirewallTask, 15000, 600000); AssertLog.info("检测agent更新配置"); agentService.checkAgentUpdate(); diff --git a/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java b/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java index 1a05b10..e4a3f8b 100644 --- a/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java +++ b/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java @@ -309,7 +309,7 @@ public class AgentServiceImpl implements AgentService { // 检测防火墙策略配置 AssertLog.info("检测防火墙策略配置"); checkFirewall(); - AssertLog.info("启动检查防火墙策略定时任务 - 延迟: {}ms, 间隔: {}ms", milli, 600000); + AssertLog.info("启动检查防火墙策略定时任务 - 延迟: {}ms, 间隔: {}ms", 15000, 600000); dynamicTaskService.scheduleTask("checkFirewall", businessTasks::checkFirewallTask, 15000, 600000); AssertLog.info("检测agent更新配置"); checkAgentUpdate(); @@ -1586,10 +1586,36 @@ public class AgentServiceImpl implements AgentService { try { String netName = getBusinessNetNames(); if (StringUtils.isBlank(netName)) { - AssertLog.debug("没有配置业务网卡,跳过防火墙检查"); + AssertLog.info("没有配置业务网卡,跳过防火墙检查"); return; } - addFirewall(netName); + for (String interfaceName : netName.split(";")) { + String iface = interfaceName.trim(); + if (iface.isEmpty()) { + continue; + } + + // 检查IPv4 INPUT规则是否存在 + if (!checkRuleExists("iptables", "INPUT", "-i", iface, "-j", "ACCEPT")) { + executeIptablesCommand("iptables", "-I", "INPUT", "1", "-i", iface, "-j", "ACCEPT"); + } + + // 检查IPv4 OUTPUT规则是否存在 + if (!checkRuleExists("iptables", "OUTPUT", "-o", iface, "-j", "ACCEPT")) { + executeIptablesCommand("iptables", "-I", "OUTPUT", "1", "-o", iface, "-j", "ACCEPT"); + } + + // 检查IPv6 INPUT规则是否存在 + if (!checkRuleExists("ip6tables", "INPUT", "-i", iface, "-j", "ACCEPT")) { + executeIptablesCommand("ip6tables", "-I", "INPUT", "1", "-i", iface, "-j", "ACCEPT"); + } + + // 检查IPv6 OUTPUT规则是否存在 + if (!checkRuleExists("ip6tables", "OUTPUT", "-o", iface, "-j", "ACCEPT")) { + executeIptablesCommand("ip6tables", "-I", "OUTPUT", "1", "-o", iface, "-j", "ACCEPT"); + } + } + AssertLog.info("防火墙策略检查完成"); } catch (Exception e) { AssertLog.error("检查防火墙策略时发生错误: {}", e.getMessage()); } diff --git a/src/main/java/com/tongran/agent/client/utils/AgentUtil.java b/src/main/java/com/tongran/agent/client/utils/AgentUtil.java index bd8c84e..a763b29 100644 --- a/src/main/java/com/tongran/agent/client/utils/AgentUtil.java +++ b/src/main/java/com/tongran/agent/client/utils/AgentUtil.java @@ -276,6 +276,7 @@ public class AgentUtil { while (interfaces.hasMoreElements()) { NetworkInterface ni = interfaces.nextElement(); String ipv4 = getIPv4Address(ni); + String ipv6 = getGlobalIPv6Address(ni); AssertLog.info("ipv4={},接口状态={}",ipv4,ni.isUp()); // 跳过回环、虚拟、关闭的接口 @@ -320,6 +321,7 @@ public class AgentUtil { .type("Ethernet") .mac(getMacAddress(ni)) .ipv4(ipv4) + .ipv6(ipv6) .gateway(gateway) // 网关通常是默认路由,全局一致 .publicIp(publicIp) .build(); @@ -433,7 +435,42 @@ public class AgentUtil { } return "N/A"; } + /** + * 获取第一个全局 IPv6 地址 + */ + private static String getGlobalIPv6Address(NetworkInterface ni) { + Enumeration addresses = ni.getInetAddresses(); + while (addresses.hasMoreElements()) { + InetAddress addr = addresses.nextElement(); + if (addr instanceof Inet6Address) { + Inet6Address ipv6Addr = (Inet6Address) addr; + // 返回公网ipv6 + if (!ipv6Addr.isLoopbackAddress() && + !ipv6Addr.isLinkLocalAddress() && + !ipv6Addr.isSiteLocalAddress() && + !ipv6Addr.isMulticastAddress() && + !ipv6Addr.isAnyLocalAddress()) { + return removeZoneIndex(ipv6Addr.getHostAddress()); + } + } + } + return null; + } + /** + * 移除IPv6地址中的区域索引(%eth0等) + */ + private static String removeZoneIndex(String ipv6Address) { + if (ipv6Address == null) { + return null; + } + // 找到第一个%的位置 + int percentIndex = ipv6Address.indexOf('%'); + if (percentIndex != -1) { + return ipv6Address.substring(0, percentIndex); + } + return ipv6Address; + } /** * 获取默认网关(调用 shell 命令) */