用nginx搭建http透明代理

背景

代理我们经常听,在技术层面我们谈论的代理往往是非透明代理,那么既然有非透明代理那就存在有透明代理。我们先看看什么是透明代理,引用百度百科的一句话可以描述明白 透明代理的意思是客户端根本不需要知道有代理服务器的存在。既然透明代理是感知不了代理的存在,那么非透明代理就是可以感知到代理的存在了,最简单的方式就是你要去访问网站A,在正常情况下,网站A看到访问是来自于你的终端的(比如源IP地址是你自己浏览器的),假如你的终端是通过代理来访问网站A的,在普通非透明代理情况下,网站A看到请求是来自于你的代理IP而看不到你这个终端,在透明代理情况下,网站A感知不到你和它之间中间有一层代理,网站A看到的请求是来自于你的终端地址。

除了这两种代理方式外,还有一种代理方式的区分(这种是另外一个层面的区分),正向代理和反向代理。正向代理引用百度百科描述如下 意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。 那么反向代理呢,描述如下 在计算机网络中,反向代理是代理服务器的一种。服务器根据客户端的请求,从其关系的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址,而不知道在代理服务器后面的服务器簇的存在。

我们今天要讨论的是用nginx来搭建http的透明正向代理,这种场景需求是非常常见的,比如我们希望接管当前某个网络环境下所有http访问(通俗来讲就是http劫持),所有对外http请求都转发到一台透明代理服务器,再经过这台代理服务器对外访问然后把数据返回给请求者,但是不希望请求者和外部服务器感知到中间有一层代理。

实战

nginx官方已经有一篇非常好的文章介绍使用nginx来搭建透明代理,这篇文章不仅仅描述http代理,还介绍了tcp、udp等代理方式,可以说是非常全面详细,我们只参考了里面有关透明http反向代理部分,有兴趣读者可以查阅相关连接地址如下 nginx官方透明代理教程
准备

操作系统这次用的是 CentOS7.4 64位

nginx版本用的是 nginx-1.14.2

环境及软件版本对方案搭建影响不太大,只要linux内核是3或者以上,nginx不要太旧即可。nginx我们选择的是普通的源码编译安装,过程比较简单不再列出,我们最终的安装目录是/opt

配置

配置是本文的核心关键,1是nginx的配置;2是iptable防火墙策略的配置,nginx配置核心关键内容如下:
server{

listen80; #既然是http代理,那么80端口是必须的

resolver 8.8.8.8; #用于解释对外访问的域名IP地址

location / {

    proxy_pass $scheme://$host$request_uri; #代理转发对应的服务器

    proxy_bind $remote_addr transparent; #这行很关键,启用透明代理

    proxy_set_header X-Real-IP $remote_addr; #这行是可选,把客户端IP头加到http自定义字段而已

    }

} 

除了上面的nginx,接下来另外一个重点就是iptable防火墙策略,要把http对外流量劫持到代理本机(首先在网络层面,要把需要劫持的流量路由到本代理设备),策略如下:
#添加一条策略,把目标是80端口的流量转发到本机的80端口,不加这条策略nginx是不会收到http请求数据的,服务器这个时候只会充当一台路由器的角色做数据转发而已

-A PREROUTING -i em1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 80

#这条策略结合下面两条ip命令规则配合使用,目的是为了使外部http请求返回的数据可以正常地回复给请求者

-A PREROUTING -s 请求者IP范围段 -p tcp -m tcp --sport 80 -j MARK --set-xmark 0x1/0xffffffff

还需要2条ip指令跟上面的iptable策略配合使用,如下:

    ip rule add fwmark 1 lookup 100
    ip route add local 0.0.0.0/0 dev lo table 100

关于以上2条指令和iptable打标签,最终能够发挥出意料之外的效果,希望深知底层原理的读者可以回复小编,重重有赏。

睿江云计算官网链接:https://www.eflycloud.com/home?from=RJ_0024

转载于:https://blog.51cto.com/13475644/2394716

你可能感兴趣的:(用nginx搭建http透明代理)