基于nginx的正向代理实现

前言:

  一次偶发的运营商故障,导致部分区域访问BGP站点不可达,为了避免问题再次发生,准备了一套正向代理环境, 当出现类似问题时,可以通过修改DNS实现流量转移。

  其核心原理为代理转发,缺点是正向代理后端接收的源IP为正向代理的IP,对WAF、日志统计等产生干扰,所以不建议长时间使用。

  由于是单站点的正向解析,且站点拥有站点的证书文件,可以将HTTP及HTTPS搭建起来。

  刚开始实现正向代理时,没有考虑互联网上大量的爬虫,导致服务器被用作在线代理,为了避免爬虫利用正向代理,在DNS解析中,关闭递归解析,实现指定的域名才能解析的效果。

 allow-recursion { none; };

工作原理:

  1. 客户机通过域名解析,访问正向代理

  2. 正向代理接收请求后, 根据请求头部的Host 信息,寻找配置中的DNS私服进行DNS解析IP地址,本文使用IP为 127.0.0.1 的DNS服务器

  3. 正向代理向后端代理请求,并在头部带上客户机的头部信息及定制信息

  4. 正向代理接收数据后,将数据返回给客户端

实现方式:

  nginx + bind 实现。

使用组件如下:



nginx version: nginx/1.8.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
built with OpenSSL 1.0.2h 3 May 2016
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --prefix=/usr/local/nginx-1.8.1 --with-http_ssl_module --with-openssl=/usr/local/src/openssl-1.0.2h --with-pcre=/usr/local/src/pcre-8.35 --add-module=/usr/local/src/ngx_devel_kit-master/ --add-module=/usr/local/src/lua-nginx-module-master/ --add-module=/usr/local/src/nginx-http-concat-master/ --add-module=/usr/local/src/nginx_upstream_check_module-master/ --add-module=/usr/local/src/nginx_tcp_proxy_module-master/ --with-http_sub_module
注:为了统一版本,部分插件未在本文使用



BIND 9.11.0-P5 <id:ad4fb79>
running on Linux x86_64 2.6.32-431.23.3.el6.x86_64 #1 SMP Thu Jul 31 17:20:51 UTC 2014
built by make with ‘--prefix=/usr/local/bind‘ ‘--enable-threads‘ ‘--enable-largefile‘ ‘--disable-ipv6‘
compiled by GCC 4.4.7 20120313 (Red Hat 4.4.7-17)
compiled with OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013
linked to OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
compiled with zlib version: 1.2.3
linked to zlib version: 1.2.3
threads support is enabled



nginx 的配置信息:

user  nobody nobody;
worker_processes  2;

events {
    worker_connections  65535;
}

http {
    server_tokens off ;
    include       mime.types;
    include ./blockip.conf;
    default_type  application/octet-stream;

    client_body_temp_path           /usr/local/nginx/tmpdir/client_body_temp 1 2;
    proxy_temp_path                 /usr/local/nginx/tmpdir/proxy_temp 1 2;
    fastcgi_temp_path               /usr/local/nginx/tmpdir/fastcgi_temp 1 2;
    uwsgi_temp_path                 /usr/local/nginx/tmpdir/uwsgi_temp 1 2;
    scgi_temp_path                  /usr/local/nginx/tmpdir/scgi_temp 1 2;

    # gzip
    gzip                            on;
    gzip_http_version               1.1;
    gzip_vary                       on;
    gzip_proxied                    any;
    gzip_min_length                 1024;
    gzip_comp_level                 6;
    gzip_buffers                    16 8k;
    gzip_proxied                    expired no-cache no-store private auth no_last_modified no_etag;
    gzip_types                      text/plain application/x-javascript text/css application/xml application/json;
    gzip_disable                    "MSIE [1-6]\.(?!.*SV1)";

    reset_timedout_connection       on;
    keepalive_timeout               10 5;
    keepalive_requests              100;

    ignore_invalid_headers          off;
    server_names_hash_max_size      256;
    server_names_hash_bucket_size   6400;
    client_header_buffer_size       8k;
    #large_client_header_buffers     4 32k;
    connection_pool_size            256;
    request_pool_size               64k;

    output_buffers                  2 128k;
    postpone_output                 1460;

    client_header_timeout           1m;
    client_body_timeout             3m;
    send_timeout                    3m;
    proxy_intercept_errors  on;
    fastcgi_intercept_errors    on;

    # log
    log_format  main  ‘$remote_addr - $remote_user [$time_iso8601] "$host" "$upstream_addr" "$request" ‘
                      ‘$status $request_time $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for" "$http_cookie"‘;
    access_log  /home/logs/nginx/access.log  main;

    #log_format  compression  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
    #                  ‘$status $body_bytes_sent "$http_referer" ‘
    #                  ‘"$http_user_agent" "$http_x_forwarded_for"‘;
    #access_log  /home/logs/nginx/awstate.log  compression;

    error_log /home/logs/nginx/error.log  notice;
    log_not_found                   on;

    sendfile                        on;
    tcp_nodelay                     on;
    tcp_nopush                      off;

    error_page   500 502 503 504  /errorPage/50x.html;
    error_page   404  /errorPage/404.html;

    # proxy configuration
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_next_upstream   error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
    #proxy_redirect                off;
    client_max_body_size          20m;
    client_body_buffer_size       1024k;
    proxy_connect_timeout         360;
    proxy_send_timeout            360;
    proxy_read_timeout            260;
    proxy_buffer_size             128k;
    proxy_buffers                 4 64k;
    proxy_busy_buffers_size       128k;
    proxy_temp_file_write_size    128k;
    proxy_headers_hash_max_size   51200;

server {
 listen 80;
 location / {
 resolver 127.0.0.1;
 resolver_timeout 30s;
 proxy_pass http://$host$request_uri;
 }

}

server {
 listen 443;
 ssl on ;
            ssl_session_cache shared:SSL:50m;
            ssl_session_timeout 5m;
            ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
            ssl_prefer_server_ciphers on;

            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
            ssl_certificate                /usr/local/nginx/conf/ssl/123321.crt;
            ssl_certificate_key            /usr/local/nginx/conf/ssl/123321.com.key;
            ssl_trusted_certificate        /usr/local/nginx/conf/ssl/gd_bundle-g2-g1.crt;

            ssl_stapling on;
            ssl_stapling_verify on;
 location / {
 resolver 127.0.0.1;
 resolver_timeout 30s;
 proxy_pass https://$host$request_uri;
 }

}

}

Nginx 配置信息

Bind的配置信息: 

key "rndc-key" {
        algorithm hmac-md5;
        secret "**********";
};

controls {
        inet 127.0.0.1 port 953
                allow { 127.0.0.1; } keys { "rndc-key"; };
};

options {
        listen-on port 53 { any; };
//      listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };
        recursion yes;

        dnssec-enable no;
        dnssec-validation no;
        dnssec-lookaside auto;

        #forward only;
        #forwarders { 114.114.114.114; };
        forwarders { 0.0.0.0; };
        allow-recursion { none; };
        /* Path to ISC DLV key */
        //bindkeys-file "/etc/named.iscdlv.key";

        //managed-keys-directory "/var/named/dynamic";
};

acl general { 0.0.0.0/0; };
acl localNetWork { 127.0.0.1;47.89.48.10/32; };

view qipeipu.com {
     #match-clients { localNetWork; };
     #allow-query { localNetWork; };

     zone "qipeipu.com" IN {
        type master;
        file "qipeipu.com.zone.local";
        #notify yes;
        #also-notify { 192.168.0.254; };
        #allow-transfer { 192.168.0.254; };
        forwarders {};
     };
    #include "/etc/named.rfc1912.zones";
    # include "/etc/named.root.key";

};

Bind 配置信息

$TTL 86400
@       IN SOA localhost.  @  (
                                        1    ;serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@                         IN      NS      localhost.
www                     IN      A       121.201.16.120

Bind 域名配置信息

时间: 2024-10-19 14:15:16

基于nginx的正向代理实现的相关文章

nginx做正向代理

Nginx常用来做反向代理,但是作为正向代理大家有没有试过呢? Nginx配置如下: server{        resolver x.x.x.x;        listen 82;        location / {                proxy_pass http://$http_host$request_uri;        }} 注意项:1. 不能有hostname2. 必须有resolver, 即dns,即上面的x.x.x.x,换成你们的DNS服务器ip即可3 .

nginx作为正向代理,反向代理的一些应用

正向代理代理的对象是客户端 反向代理代理的对象是服务端 举例说下nginx作为正向代理作访问控制 server{ listen 80; server_name localhost jeson.gaosf.com; access_log /var/log/nginx/log/host.access.log main; location /{ if($http_x_forwarded_for !~* "^116\.62\.103\.228"){ return 403; } root /op

Nginx的正向代理和反向代理

一.介绍 实践中客户端无法直接跟服务端发起请求的时候,我们就需要代理服务.代理可以实现客户端与服务端之间的通信,我们的Nginx也可以实现相应的代理服务.代理分为正向代理和反向代理,此文就来演示一下Nginx配置正向代理和反向代理的场景. 二.正向代理和反向代理的区别 正向代理和反向代理的区别我在知乎上找到两张图可以帮助我们很好的理解: 正向代理:客户端 <一> 代理 一>服务端 正向代理简单地打个租房的比方: A(客户端)想租C(服务端)的房子,但是A(客户端)并不认识C(服务端)租不

NGINX学习(七)--nginx做正向代理

1.概述 nginx的正向代理,只能代理http.tcp等,不能代理https请求.有很多人不是很理解具体什么是nginx的正向代理.什么是反向代理.下面结合自己的使用做的一个简介: 1)正向代理: 所谓正向代理就是内网服务器主动要去请求外网的地址或服务,所进行的一种行为.内网服务---访问--->外网 2)反向代理: 所谓反向代理就是外网要访问内网服务而进行的一种行为. 外网----请求--->内网服务 (是不是太简洁了#@#) 2.两种代理配置方式: 1)正向代理: server端: 应用

实践出真知——基于squid实现正向代理实践

实践出真知--基于squid实现正向代理实践 前言 ? 俗话说得好:时间是治愈一切伤口的良药,实践是检验真理的唯一标准!本文将结合代理服务器的基本原理,进行基于squid软件实现传统(标准)代理(正向代理)以及透明代理的实例演示. 先说说squid是个啥 ? 避(kai)免(ge)被(wan)喷(xiao),还是介绍一下什么是squid吧. squid的概念 ? squid是一种用来缓存Internet数据的软件.用于接受来自客户端需要下载对象(object)的请求并适当的处理这些请求.也就是说

nginx实现正向代理和反向代理

注意:nginx正向代理有缺陷,如果同时实现http和https正向代理请使用squid软件 (1)正反向代理 正向代理:实现客户端上网 反向代理:代理访问后端web服务器, 区别:正向代理的对象是客户端,反向代理的对象是服务器端 (2)nginx实现http正向代理 1.修改配置文件 #vim /usr/local/nginx/conf/nginx.conf http { include /usr/local/nginx/conf.d/*.conf } #mkdir /usr/local/ng

Nginx的正向代理与反向代理详解

正向代理和反向代理的概念 代理服务(Proxy),通常也称为正向代理服务. 如果把局域网外Internet想象成一个巨大的资源库,那么资源就分布到了Internet的各个点上,局域网内的客户端要访问这个库里的资源就必须统一通过代理服务器才能对各个站点进行访问. 局域网内的机器借助代理服务访问局域网外的网站, 这主要是为了增加局域网内部网络的安全性,使得网外的威胁因素不容易影响到网内,这里代理服务器起到了一部分防火墙的功能.同时,利用代理服务器也可以对局域网外的访问进行必要的监控和管理.正向代理服

nginx的正向代理和反向的区别及配置

1.正向代理的概念 正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端.客户端必须要进行一些特别的设置才能使用正向代理. 2.反向代理的概念 反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置.客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器

nginx配置正向代理

首先安装nginx apt-get install nginx 进入/etc/nginx/sites-enabled,运行cp default proxy,将下面的内容粘贴至proxy文件中 server{           resolver 8.8.8.8;           resolver_timeout 30s;            listen 82;           location / {                   proxy_pass http://$http