1、引言
玩过爬虫的朋友对ip代理都不陌生,有时候在爬取某些数据时我们需要隐藏自己的身份,或是绕过某些站点对ip的限制就会使用到ip代理技术。或者是针对当下app应用中显示ip属地的情况,我们不想暴露自己的ip属地,也会用到ip代理。但正所谓上有政策下有对策,使用ip代理也有被识别出来的时候,那么就没有办法解决这个问题,让我们的真实ip无法被检测吗?这里就教大家实现一下如何彻底隐藏我们的真实ip地址,实现另类的ip代理。
2、检测ip代理的机制
想要知道如何避开ip代理检测就要明白检测ip代理的机制,这里实现的ip代理主要是针对http和https协议类型的代理。
2.1、ip代理检测方法
判断用户是否使用了ip代理就是看用户发起的网络请求中请求头中携带的ip地址和直接获取到的用户主机ip地址是否相同,不相同就是使用了ip代理,我们使用ip代理就是改变直接获取到的ip地址,当然这个ip地址是指用户当前客户端所对应的公网ip地址,我们所有的网络数据都是通过NAT技术转换到对应的公网ip上发送的。
使用常规ip代理技术,每经过一级代理主机,ip地址信息都会被添加到请求头中,因此后端程序就可以通过请求头判断我们是否使用代理,并找到每一个代理主机的地址,从而进一步锁定我们的真实ip,因此,直白的说使用ip代理被发现就是被代理主机出卖的。为了彻底隐藏ip,我们就不能使用这种ip代理方式访问网络。
3、实现方法
既然要彻底隐藏ip地址,我们可以把网络请求拆分独立,让目标服务器只能看见代理主机的ip地址,并且没必要使用多级代理,一级代理就足以,因为我们的真实ip只有代理主机能查看,不会加在请求头中一起发送到目标主机。对目标主机来说这就是一次请求,根本不知道代理这一回事。
3.1、代码实现
这里是把请求信息发送给后端,让后端程序代替发送网络请求,并将网络数据返回的方式实现的,其实就是使用两次请求,后端程序必须放在服务器中才有效果,本地属于同一网络环境,ip都一样,因此看不出效果。
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String url = request.getParameter("url");//要求代替请求的url
String method = request.getParameter("method");//代替请求的方式,默认为get请求
//如果要设置请求头信息,请设置对应的参数并添加设置
//这里使用Jsoup框架代替发送请求,也可以使用其他方式
Document document = Jsoup.connect(url).get();
if (method.equals("GET")){
document = Jsoup.connect(url).get();
}else {
document = Jsoup.connect(url).post();
}//使用其它请求方式自行添加
String html = document.html();
response.setContentType("text/html; charset=utf-8");//html页面数据,
response.getWriter().write(html);
}
3.2、使用方法
例如访问百度,我们通常在浏览器输入如下的url
https://www.baidu.com/
但是使用这种自定义ip代理访问网络就不能使用这种方式,假设我们服务器后端程序访问地址为http://www.my.com/?agent,那么就要使用以下方式访问:
http://www.my.com/agent?url=https://www.bidu.com&method=get
4、总结
使用这种方式就能彻底隐藏ip信息,但是这只是简单实现,在实际情况下要做更多的操作,因此,如果要真正投入使用,需要将其完善才行。