实现:实时监控DNS状态,一旦发现DNS域名故障或DNS域名第一次恢复正常,即向ActiveMQ中发送消息。
监控实体:
package com.syxp.dns.entity; public class Alarm { /** * 告警实体to MQ status: dns状态1正常0故障 instatu: 记录是否入库,1入库,0不入库 */ private int status; // 监控状态 1为正常,0为故障 private int instatu; // 入库状态 1为需要入库,0为不需要入库 private String alarmtype; // 告警类型 private String alarmaddress; // 告警设备地址 private String alarmcontent; // 告警内容 private String alarmoccurtime; // 告警发生时间 private int monitorstatus; // 监控状态 private String sms; // 短信提醒 private String phone; // 手机号 private String alarmdevname; // 告警对象名称 public String getSms() { return sms; } public void setSms(String sms) { this.sms = sms; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public int getMonitorstatus() { return monitorstatus; } public void setMonitorstatus(int monitorstatus) { this.monitorstatus = monitorstatus; } public String getAlarmtype() { return alarmtype; } public void setAlarmtype(String alarmtype) { this.alarmtype = alarmtype; } public String getAlarmaddress() { return alarmaddress; } public void setAlarmaddress(String alarmaddress) { this.alarmaddress = alarmaddress; } public String getAlarmcontent() { return alarmcontent; } public void setAlarmcontent(String alarmcontent) { this.alarmcontent = alarmcontent; } public String getAlarmoccurtime() { return alarmoccurtime; } public void setAlarmoccurtime(String alarmoccurtime) { this.alarmoccurtime = alarmoccurtime; } public String getAlarmdevname() { return alarmdevname; } public void setAlarmdevname(String alarmdevname) { this.alarmdevname = alarmdevname; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public int getInstatu() { return instatu; } public void setInstatu(int instatu) { this.instatu = instatu; } }
检测DNS并判断状态后向MQ发送消息
package com.syxp.dns.send; import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.UnknownHostException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.ResourceBundle; import javax.jms.Connection; import javax.jms.JMSException; import javax.jms.MapMessage; import javax.jms.MessageProducer; import javax.jms.Queue; import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.log4j.Logger; import com.syxp.dns.entity.Alarm; public class SendMessageToMQ { private static Alarm alarm; private static ResourceBundle rb; private static Logger logger = Logger.getLogger(SendMessageToMQ.class); //private static String subject = "integratedalarm.subject"; //消息队列:QUEUE private String subject = ""; private static String user = ""; private static String password = ""; private String url = ""; private String phone = ""; //private static String url = "tcp://192.168.1.126:61616"; //private static String phone = "13940572922"; private static int[] error = { 1, 1, 1 }; /** * 检测DNS并判断状态后向MQ发送消息 * @param alarm * @author */ public Alarm alarmOfMq() { int i = 1; int status = 1; // DNS状态,1正常,0故障 String alarmdevname = ""; String alarmadress = ""; String dom = ""; //暂定两个DNS域名,循环两次 for (i = 1; i <= 2; i++) { alarm = new Alarm(); rb = ResourceBundle.getBundle("conf/dnsinfo"); dom = rb.getString("dom" + i); // dns1的域名,用于检测dns status = this.testDns(dom); if (status == 1) { alarmdevname = rb.getString("alarmdevname" + i); alarmadress = rb.getString("ip" + i); alarm.setStatus(1); if (error[i] == 1) { alarm.setInstatu(0); //logger.info("数据采集监控线程正在运行,状态正常"); } else { alarm.setAlarmdevname(alarmdevname); alarm.setInstatu(1); alarm.setAlarmtype("DNS"); alarm.setAlarmaddress(alarmadress); alarm.setAlarmcontent(dom + "已恢复正常!"); Calendar cal = Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");// 设置日期格式 String time = null; time = df.format(cal.getTime()); alarm.setAlarmoccurtime(time); alarm.setMonitorstatus(1); phone = rb.getString("phone"); alarm.setPhone(phone); alarm.setSms("【告警时间:"+time+"】" +"【告警类型:DNS】"+alarmdevname+"("+alarmadress+ ")" + alarm.getAlarmcontent()); error[i] = 1; logger.info("检测到DNS域名"+dom+"已恢复正常"); } } else { alarmadress = rb.getString("ip" + i); alarmdevname = rb.getString("alarmdevname" + i); alarm.setAlarmdevname(alarmdevname); alarm.setStatus(0); alarm.setInstatu(1); alarm.setAlarmtype("DNS"); alarm.setAlarmaddress(alarmadress); alarm.setAlarmcontent(dom + "发生故障!"); Calendar cal = Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");// 设置日期格式 String time = null; time = df.format(cal.getTime()); alarm.setAlarmoccurtime(time); alarm.setMonitorstatus(0); phone = rb.getString("phone"); alarm.setPhone(phone); if(status==error[i]){ alarm.setSms(""); }else{ alarm.setSms("【告警时间:"+time+"】" +"【告警类型:DNS】"+alarmdevname+"("+alarmadress+ ")" + alarm.getAlarmcontent()); error[i] = 0; logger.info("检测到DNS域名"+dom+"出现异常"); } } if (alarm.getInstatu() == 1) { url = rb.getString("url"); // 创建连接工厂 ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory( user, password, url); try { // 创建连接 Connection connection = connectionFactory .createConnection(); connection.start(); // 创建会话Session /** * 参数解释: * 第一个参数是否使用事务:当消息发送者向消息提供者(即消息代理)发送消息时,消息发送者等待消息代理的确认, * 没有回应则抛出异常,消息发送程序负责处理这个错误。 第二个参数消息的确认模式: AUTO_ACKNOWLEDGE * : 指定消息提供者在每次收到消息时自动发送确认。消息只向目标发送一次,但传输过程中可能因为错误而丢失消息。 * CLIENT_ACKNOWLEDGE : * 由消息接收者确认收到消息,通过调用消息的acknowledge()方法(会通知消息提供者收到了消息) * DUPS_OK_ACKNOWLEDGE : * 指定消息提供者在消息接收者没有确认发送时重新发送消息(这种确认模式不在乎接收者收到重复的消息)。 */ Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建队列/主题 subject = rb.getString("subject"); Queue queue = session.createQueue(subject); // 创建消息生产者 MessageProducer messageProducer = session .createProducer(queue); // 创建消息 MapMessage message = session.createMapMessage(); // 构造消息体 try { message.setBytes("ALARMTYPE", alarm.getAlarmtype() .getBytes("GB2312")); // logger.info("告警类型:"+alarm.getAlarmtype()); message.setBytes("ALARMADDRESS", alarm .getAlarmaddress().getBytes("GB2312")); // logger.info("告警设备地址:"+alarm.getAlarmaddress()); message.setBytes("ALARMCONTENT", alarm .getAlarmcontent().getBytes("GB2312")); // logger.info("告警内容:"+alarm.getAlarmcontent()); message.setBytes("ALARMOCCURTIME", alarm .getAlarmoccurtime().getBytes("GB2312")); // logger.info("告警发生时间:"+alarm.getAlarmoccurtime()); message.setBytes("MONITORSTATUS", String.valueOf(alarm.getMonitorstatus()) .getBytes("GB2312")); // logger.info("监控状态:"+alarm.getMonitorstatus()); message.setBytes("ALARMDEVNAME", alarm .getAlarmdevname().getBytes("GB2312")); // logger.info("设备名称:"+alarm.getAlarmdevname()); message.setBytes("SMS", alarm.getSms().getBytes("GB2312")); // logger.info("短信提醒:"+alarm.getSms()); message.setBytes("PHONE", alarm.getPhone().getBytes("GB2312")); // logger.info("手机号码:"+alarm.getPhone()); } catch (UnsupportedEncodingException e) { logger.error("---------------------------------无法找到字符编码方式GB2312---------------------------"); e.printStackTrace(); } // 发送消息到MQ messageProducer.send(message); logger.info("--------------------------------------成功发送消息----------------------------------------"); // 关闭资源 session.close(); connection.close(); } catch (JMSException e) { logger.error("--------------------------------------发送消息失败----------------------------------------"); e.printStackTrace(); } } } return alarm; } /** * 通过域名dom检测dns是否正常 * * @param dom * @return Dns的状态:1——正常formal,0——不正常stopped */ @SuppressWarnings("unused") public int testDns(String dom) { int status = 1; try { InetAddress[] addresses = InetAddress.getAllByName(dom); return status; } catch (UnknownHostException e) { // e.printStackTrace(); status = 0; return status; } } public static void main(String[] args) { SendMessageToMQ sendMessageToMQ = new SendMessageToMQ(); sendMessageToMQ.alarmOfMq(); } public static Alarm getAlarm() { return alarm; } public static void setAlarm(Alarm alarm) { SendMessageToMQ.alarm = alarm; } public static ResourceBundle getRb() { return rb; } public static void setRb(ResourceBundle rb) { SendMessageToMQ.rb = rb; } }
配置文件:dnsinfo.properties
subject=integratedalarm.subject url=tcp://192.168.1.126:61616 phone=13940572922 ip1=192.168.1.12 dom1=www.baidu.com status1=1 alarmdevname1=\u8BBE\u5907\u4E00 ip2=192.168.1.15 dom2=www.sina.com status2=1 alarmdevname2=\u8BBE\u5907\u4E8C
线程
package com.syxp.dns.send.thread; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.log4j.Logger; import com.syxp.dns.send.SendMessageToMQ; public class SendMessageThread extends Thread{ private static Logger logger = Logger.getLogger(SendMessageThread.class); SendMessageToMQ sendMessageToMQ = new SendMessageToMQ(); /** * 运行线程 */ public void run(){ Date now = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-HH-dd HH:mm:ss"); logger.info("数据采集监控线程开始运行"+sdf.format(now)); //死循环,设置线程休眠 while(true){ sendMessageToMQ.alarmOfMq(); try { Thread.sleep(60000); } catch (InterruptedException e) { logger.error("", e); e.printStackTrace(); } } } /** * 停止线程 */ public void stopT(){ this.stop(); } }
测试方法:
package com.syxp.dns.send.test; import com.syxp.dns.send.thread.SendMessageThread; public class SendMessageTest { public static void main(String[] args) { SendMessageThread sendMessageThread = new SendMessageThread(); sendMessageThread.start(); // sendMessageThread.stop(); } }
相关推荐
在实际应用中,需要根据具体情况编写脚本程序和配置MRTG,以便监控DNS服务器的状态和负载。同时,需要注意安全性和权限问题,以免出现安全漏洞。 使用MRGT监控DNS服务器的负载是一个非常实用的解决方案,可以提高...
通过编写脚本,我们可以让MRGT读取DNS服务器的状态,例如解析请求的成功与失败次数,CPU温度等,然后根据这些数据绘制出图表,帮助管理员快速了解DNS服务器的实时运行状况和长期趋势。 在Linux Debian系统下,首先...
本文档详细介绍了MQ服务器DNS设置及清空DNS缓存操作的步骤和方法,旨在帮助联网企业正确地配置MQ服务器的DNS设置,并进行DNS缓存的清空操作。该文档涵盖了Windows、Linux和AIX三种操作系统的DNS设置和缓存清空方法,...
可改变过源ip和源端口的DNS请求报文发送和响应报文发送
Java 实现DNS数据包发送及响应数据包解析的IDEA源代码主要涉及到以下几个核心知识点: 1. **DNS(Domain Name System)域名系统**:DNS是互联网的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,允许...
而迭代查询则是在DNS服务器无法直接提供答案时,返回其他服务器的地址,客户端再向这些服务器发起新的查询。 使用Socket实现DNS查询时,我们需要遵循以下步骤: 1. **创建Socket**:首先,我们需要创建一个UDP ...
在实际应用中,你可以定期运行这个检查,例如每分钟或几秒钟执行一次,以实时监控网络状态。当网络状态发生变化时,程序可以通过输出信息或者触发其他操作来通知用户。 总结来说,通过VS2008和C++,我们可以利用...
1. **发起查询**:程序通过调用DnsQuery函数,向DNS服务器发送一个查询请求,包含待解析的域名。 2. **构建DNS报文**:在请求中,DNS报文会包含DNS头、问题部分(包含查询的域名和类型)、以及可能的答案、权威记录...
同时,部署监控系统,实时监测DNS服务的运行状态和性能指标。 6. **部署与维护** 将配置推广到所有DNS节点,并持续监控和调整策略,以应对业务变化和网络环境的波动。 总结,智能DNS的实施方案涉及多个环节,包括...
6. **日志和监控**:详尽的日志记录和实时监控功能,帮助管理员了解服务器状态,及时发现并解决问题。 7. **扩展性**:Eagle DNS可能支持与其他系统的集成,例如动态DNS更新,允许家庭用户或移动设备自动更新其不断...
dnsquery 是一个用来发送 DNS 查询包的工具。 参数说明: ./dnsquery 1.1.1.1 www.sincoder.com 8.8.8.8 22 0 伪造源地址为 1.1.1.1 向 8.8.8.8 发送解析域名www.sincoder.com 的请求 重复发送22次 每个包时间间隔...
- DNS放大攻击:攻击者利用开放的DNS服务器发送大量数据包,导致目标网络带宽耗尽。 - 缓存中毒(Cache poisoning):攻击者向DNS缓存中插入虚假记录,导致合法域名被指向恶意IP地址。 - **DNS攻击的影响** - ...
3. **DNS请求转发**:根据解析得到的信息,构造新的DNS查询报文,并发送到上一级DNS服务器。 4. **DNS响应处理**:接收上一级DNS服务器的响应报文,将其转发回原始客户端。 5. **错误处理**:处理可能的网络异常、...
通过编写批处理文件或配合其他编程语言,可以实现定期查询、监控DNS服务状态等功能。 8. **与其他工具结合**:在Windows环境中,Dig可以与Wireshark等网络抓包工具结合,用于分析DNS流量和交互,进一步提升诊断能力...
4. **日志记录**:对于网络管理员来说,DNSproxy可能提供日志记录功能,方便监控和分析DNS查询行为。 在实际应用中,DNSproxy的部署可以提升企业或个人网络环境的稳定性和安全性。同时,对于那些关心自己在线隐私或...
在DNS的工作流程中,当客户端需要解析域名时,首先会向本地DNS服务器发送查询请求。本地DNS服务器首先查询本地缓存,如果找到对应的IP地址,则直接返回给客户端;如果没有找到,则将请求转发给上一级DNS服务器。这样...