前言
- hello,大家好,我是 Lorin ,今天给大家带来计算网络中不可不知的正向代理和反向代理。
正向代理
- 正向代理,是一个位于客户端和原始服务器之前的服务器,为了从目标服务器取得内容,客户端向代理服务器发送一个请求并且指定目标服务器,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。一般用于客户端无法直接访问服务端或需要对服务端屏蔽客户端的的场景,需要代理服务器帮我们转发请求,比如我们常见的 V**。
常用使用场景
V**
- V** 代表“虚拟专用网络”,这是一项保护互联网连接和在线隐私的服务。比如我们为了保护公司的隐私安全,设置公司的网络只有通过 V**登录后才能进行接入。
SS 工具
- 我们平时是无法直接访问国外的一些网站,比如谷歌等等,我们可以通过SS 工具代理我们请求,帮助我们访问这些网站。
动态 IP 代理
- 动态 IP 代理最常用的场景就是网络爬虫,因为大多数网站为了避免被频繁的访问和抓取,会限制访问 IP,如果使用同一个 IP 进行访问,那么很快就会不限制无法访问。因为我们需要 动态 IP 服务器帮我们转发请求,从而避免被目标服务器检测出是在频繁抓取。
隐藏客户端 IP
- 隐藏客户端 IP 就是我们经常电影中看到的,黑客通过代理手段,隐藏自己的真实 IP,避免被其它发现自己的实际 IP,从而查到黑客实际所在地址。
反向代理
- 反向代理位于客户端和服务端之间,对于客户端而言,反向代理服务器就是服务端,客户端不要知道真实服务器端的地址。一般用于隐藏真实服务端,比如常见我们常见的堡垒机,用于保护真实服务器安全以及作为负载均衡服务器等。
使用场景
堡垒机
- 堡垒机是一种安全审计系统,它管控着各种想登录服务器的权限或者是操作,能够监督员工们的操作,对员工们的行为起到约束监控作用。
- 通过堡垒机我们可以管控员工对服务器的访问,保护真实服务器的安全。
nginx 负载均衡
- 负载均衡服务器(Load Balancer)是一种用于分配网络请求和流量的设备或软件。它的主要目的是在多个服务器(或计算资源)之间平均分配负载,以确保这些服务器能够高效地共同处理请求,提高系统的性能、可用性和稳定性。比如我们常见的使用 nginx 作为负载均衡服务器。
动态 IP 代理实现
- 上面我们简单讲述了动态 IP 用途,下面我们将进一步了解动态 IP 代理,以及简单的实现案例。
分类
按匿名分类
- 分为透明代理、普通代理和高级匿名代理。只有高级匿名代理不会被当前服务器发现,完全隐藏了真实IP,建议选择高级匿名代理。
按成本分类
- IP代理分为免费代理和付费代理,付费代理的价格差距很大。低价代理只是提供免费代理,效率只是提高了一点点。一般高价代理都是自建服务器,成本较高,价格略贵,但质量很高。
按协议分类
- HTTP代理:仅支持HTTP协议,通常用于浏览网页和发送HTTP请求。
- HTTPS代理:支持HTTPS安全协议,用于加密传输网页内容和敏感数据。
- SOCKS代理:支持SOCKS协议,可用于传输各种网络流量,包括邮件、文件传输等。
原理
- 客户端发起请求前按照指定规则从动态代理 IP 池中获取 IP
- 客户端请求获取到的代理服务器同时携带上目标服务地址
- 代理服务器根据收到的请求访问目标服务器,并将获取到的响应返回给客户端
nodeJs 简单实现
代码语言:JavaScript复制const axios = require('axios')
const tunnel = require('tunnel')
// 访问谷歌
let url = 'https://www.google.com/'
// 动态代理 IP 池 由于只有一个代理服务器所有全部都写一样
const dynamicIps = [
{
host: '127.0.0.1',
port: '1080'
}, {
host: '127.0.0.1',
port: '1080'
}, {
host: '127.0.0.1',
port: '1080'
}
]
function getRandomIntInclusive (min, max) {
return Math.floor(Math.random() * (max - min 1)) min
}
// getRandomIntInclusive(0, dynamicIps.length - 1) 生成一个 0, dynamicIps.length - 1 随机数获取动态 IP
const tunnelProxy = tunnel.httpsOverHttp({ proxy: dynamicIps[getRandomIntInclusive(0, dynamicIps.length - 1)] })
// 客户端发起请求
axios(url, {
method: 'GET',
proxy: false,
// 配置代理
httpsAgent: tunnelProxy,
timeout: 10000,
}).then(res => {
console.log(res.data)
}).catch(err => console.log(err))
总结
- 正向代理和反向代理主要的区别在于代理的对象不一样,正向代理的客户端,对于服务端来说,访问的就是真实的客户端;反向代理代理的是服务端,对客户端来说,访问的就是真实服务服务端。
个人简介