HTTP CONNECT隧道七层正向代理

Nginx七层正向代理

前言

位于客户端和目标服务器之间的Nginx正向代理服务器,客户端向Nginx正向代理发送一个请求并指定目标服务器,然后代理向目标服务器转交请求并将获得的内容返回给客户端及本地代理服务器缓存。

正向代理Http请求

# 10.122.10.98,七层代理,在http模块下添加,正向代理转发http请求
server {
	# 监听8080端口
	listen 8080;
	
	# 指定DNS服务器IP地址 
	resolver 114.114.114.114;

	# 服务器IP或域名
	server_name  localhost;

	# 正向代理转发http请求
	location / {
		proxy_pass                 http://$host$request_uri;
		proxy_set_header           HOST $host;
		# 传递真实客户端IP
		proxy_set_header X-Real-IP $remote_addr;
		# 传递端口
		proxy_set_header X-Real-Port $remote_port;
		# 传递经过代理链的客户端IP列表
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		# 传递请求协议(http/https)
        proxy_set_header X-Forwarded-Proto $scheme;
	}
}

通过设置系统代理,或者curl http://www.baidu.com -v -x 10.122.10.98:8080访问。

正向代理Https请求

Nginx官方版本并不直接支持HTTPS请求的转发,需要ngx_http_proxy_connect_module 模块支持,安装参考

# 10.122.10.98,七层代理,在http模块下添加,转发http、https请求
server {
	listen  8080;

	# dns resolver used by forward proxying
	resolver  114.114.114.114;

	# forward proxy for CONNECT request
	proxy_connect;
	proxy_connect_allow            443 80;
	proxy_connect_connect_timeout  10s;
	proxy_connect_read_timeout     10s;
	proxy_connect_send_timeout     10s;

	# forward proxy for non-CONNECT request
	location / {
		proxy_pass $scheme://$host;
		proxy_set_header Host $host;
	}
}

在另外一台机器,通过设置系统代理,或者curl http://www.baidu.com -v -x 10.122.10.98:8080,或者curl https://www.baidu.com -v -x 10.122.10.98:8080访问。

正向代理转发两次

Client Machine C –> Nginx Machine B(installed connect_module)–> Nginx Machine A(installed connect_module) –> target website

在前面配置好正向代理请求Http,或者正向代理请求Https之后,配置如下 。

# 10.122.10.218,内网二次转发,只支持转发http请求,proxy_connect模块无法转发https请求
server {
	listen                           8081;
	#server_name                     localhost;
	#resolver                        10.122.10.98 ipv6=off;
	#proxy_connect;
	#proxy_connect_allow            443 80;
	#proxy_connect_connect_timeout  10s;
	#proxy_connect_read_timeout     10s;
	#proxy_connect_send_timeout     10s;
	location / {
		proxy_pass $scheme://10.122.10.98:8081;
		proxy_set_header Host $host;
		proxy_set_header Referer $http_referer;    
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
	}
}

在另外一台机器,通过设置系统代理,或者curl http://www.baidu.com -v -x 10.122.10.218:8080访问正常,curl https://www.baidu.com -v -x 10.122.10.218:8080访问不正常。

Linux设置代理

# 编辑
vim /etc/profile
export http_proxy=http://proxy_address:port
export https_proxy=https://proxy_address:port

# 设置
export http_proxy=http://lideyu:lideyu@10.122.10.98:808
export https_proxy=http://lideyu:lideyu@10.122.10.98:808

# 重新加载系统环境变量文件
source /etc/profile
# 查看环境变量
env

# 取消代理,profile注释代理后执行生效
unset http_proxy
unset https_proxy