功能:主动验证给定的域名、IP对是否真正的关联

思路:

  1、一开始通过修改hosts文件,把待验证的域名、IP对添加到文件里,然后用wget尝试访问,再恢复hosts文件重新验证下一对

  2、后来了解到curl命令可以带参数的形式指定访问域名的解析IP,于是改用curl验证。但是要在防火墙上关闭DNS服务,要不然会主动请求外网的DNS服务。

主动验证的脚本如下

#curl www.google.com -L -i --resolve www.google.com:80:123.34.35.41 -o index.html
curl $ -L -i --resolve $:$ -o index.html
if [ ! -f "index.html" ]; then
echo false
else
echo true
fi
if [ -f "index.html" ]; then
rm index.html
fi

参数意义:

-L  允许重定向后继续访问重定向的URL

-i  输出返回的http头部

-o  将输出信息输出到指定文件里

--resolve  指定待访问域名的解析IP,注如果解析IP不对,curl会去尝试访问外网的DNS服务器来获得真正的IP,所以个人觉得应该将程序部署在qiang内

读输入文件调用shell脚本的Java程序

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ResourceBundle; import org.apache.log4j.Logger; /*
* Date:2017-09-30
* Author:glt
* */ public class RunShell { static Logger log = Logger.getLogger(RunShell.class); public static void main(String[] args){
ResourceBundle config = ResourceBundle.getBundle("filePath");
String inputPath = config.getString("inputPath");
String outputPath = config.getString("outputPath");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String today = sdf.format(new Date());
File input = new File(inputPath + today + "-validating.txt");
File output = new File(outputPath + today + "-validated.txt");
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(input));
} catch (IOException e1) {
e1.printStackTrace();
}
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(output, true));
} catch (IOException e1) {
e1.printStackTrace();
}
String line = null;
try {
while((line = br.readLine()) != null){
String[] fields = line.split("\t");
long seq = Long.parseLong(fields[0]);
String ip = fields[1];
String domain = fields[2];
String shpath = "./addHosts.sh " + ip + " " + domain;
log.info(shpath);
Process ps = Runtime.getRuntime().exec(shpath);
ps.waitFor();
BufferedReader console = new BufferedReader(new InputStreamReader(ps.getInputStream()));
StringBuffer sb = new StringBuffer();
String consoleLine = null;
while ((consoleLine = console.readLine()) != null) {
sb.append(consoleLine).append("\n");
}
console.close();
String result = sb.toString();
log.info(seq + "\t" + result);
if(result.contains("false")){
bw.write(seq + "\t" + ip + "\t" + domain + "\t-1\n");
}else{
bw.write(seq + "\t" + ip + "\t" + domain + "\t1\n");
}
bw.flush();
}
br.close();
bw.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}

关闭DNS服务

sudo iptables -A OUTPUT -p tcp --dport  -j DROP
sudo iptables -A OUTPUT -p udp --dport -j DROP

恢复DNS服务

ps:后面会讲一讲为什么这种方法能够验证域名-IP对


参考:http://www.ruanyifeng.com/blog/2011/09/curl.html

   http://www.cnblogs.com/lihuobao/p/6434341.html

   https://yq.aliyun.com/articles/40772

   http://www.cnblogs.com/grimm/p/5362096.html

   http://www.linuxidc.com/Linux/2016-09/134941.htm

域名IP主动验证(一)的更多相关文章

  1. apache本地域名ip重定向vhosts

    apache本地域名ip重定向,使本机通过指定域名访问到指定ip路径. 1.apache配置apache/conf/httpd.conf  : 开启配置 Include conf/extra/http ...

  2. 请求一个域名ip的缓存用处

    前言 摘录自操作系统,这一段的内容很有启发,稍微加上自己的理解,写一篇博客记录一下. 缓存 缓存成功解决了速度不匹配设备之间的数据传输,并且在一般情况下,是整个系统的瓶颈:缓存的出现,有效减少了低速I ...

  3. 域名ip自动跳转 跳转指定页面的js

    域名ip自动跳转 跳转指定页面的js 为了应对百度审核,需要客户的网站在个别地区跳转到另一个页面,就搞到了这段代码,屡试不爽,超实用.下面把地址换成你要访问的网站url地址或者文件url地址即可.超实 ...

  4. 内网客户 通过 公网域名/ip 访问内网web服务器 出错

    在一内部局域网中, client  内网地址为 10.0.0.2     web  服务器内网地址为 10.0.0.1    外网地址为  211.6.15.1    域名为  xx.love.com ...

  5. [LeetCode] Validate IP Address 验证IP地址

    In this problem, your job to write a function to check whether a input string is a valid IPv4 addres ...

  6. 网站用域名能访问,用域名IP不能访问的原因分析

    原因分析:一般虚拟主机是不能直接输入IP进行访问的 因为一个IP下有很多网站 ,只能用域名进行访问.如果想IP也能访问,必须网站有独立的IP地址,不是共享IP.如果是IIS的话,要把主机头对应的域名去 ...

  7. IP地址验证

    /** * 验证IP地址 * * @param 待验证的字符串 * @return 如果是符合格式的字符串,返回 <b>true </b>,否则为 <b>false ...

  8. 更改EBSserver域名/IP

    more: 341322.1 : How to change the hostname of an Applications Tier using AutoConfig 338003.1 : How  ...

  9. ip完整验证详情

    不想跳坑就看一下 之前一直不太会写正则表达式,很多要用到正则表达式的都直接百度,像上次要用正则表达式验证是否是合法的ip地址,然后就上网找,结果就是没找到一个对的,今天就为大家贡献一下,写个对的,并做 ...

随机推荐

  1. extjs4.0 treepanel节点的选中、展开! 数据的重新加载

    1.extjs4.0API较3.0有非常大变化2.多级子父节点的选中和展开.3.数据的重新加载.tree.getStore().load4.节点的移除,从树中根据ID获取节点 tree.getStor ...

  2. 成本函数计算方法J

    J = 1/(2*m) * sum((X*theta - y).^2);  OR

  3. mysql优化-------Myisam与innodb引擎,索引文件的区别

    Myisam与innodb引擎,索引文件的区别: innodb的次索引指向对主键的引用. myisam的次索引和主索引都指向物理行. myisam一行一行的插入,会产生一行一行的文件,磁盘上有数据文件 ...

  4. React中Transition的作用

    /** * `Transaction` creates a black box that is able to wrap any method such that * certain invarian ...

  5. webpack 的编译原理

    自从接触了react,vue 这两个框架,都会用到webpack这个打包工具.面试的时候,经常被问到知道webpack的编译原理吗? 可以简单的介绍一下.每每这个时候都被问的哑口无言,平时用的时候挺顺 ...

  6. Map实现缓存

    为什么要使用缓存 缓存最终的目的是为减轻服务端压力,减少网络传输请求 客户端缓存 浏览器访问自带缓存~~ 页面缓存 浏览器缓存 App客户端缓存    IOS 前端开发     底层都有缓存技术的 ( ...

  7. 织梦CMS被挂马特征汇总

    一.织梦CMS被挂马特征汇总 2013织梦CMS被挂马特征汇总.最近很多朋友反应后台多了几个系统管理员用户:service.spider等,而且自己之前的管理员用户登陆时候会提示用户名不存在.还有朋友 ...

  8. eclipse本地覆盖版本库

    1,右键team,与资源库同步 2,选中冲突文件,右键“更新”,此时本地代码出现冲突 3,选中冲突文件,右键点击“标记为解决”,勾选第二项,以本地版本为准 4,冲突被解决,正常提交本地代码

  9. web开发中的mysql使用

    一.单机mysql与mysql集群 1. 单机mysql很好理解,在一台物理机上安装好mysql服务端程序,使用这一台机器的硬件(cpu,内存,硬盘)进行数据的处理. 2.mysql集群 MySQL集 ...

  10. skynet源码阅读<4>--定时器实现

    昨天和三石公聊天,他提到timer的实现原理,我当时迟疑了一下,心想timer不是系统底层时钟中断驱动上层进程/线程,累积计时实现的么?他简述了timer的实现,什么堆排序,优先级队列等,与我想象的不 ...