kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

nginx https代理配置

https://segmentfault.com/a/1190000019563509


NGINX解决HTTPS代理的方式都属于透传(隧道)模式,即不解密不感知上层流量。具体的方式有如下7层和4层的两类解决方案。

HTTP CONNECT隧道 (7层解决方案)

客户端给代理服务器发送HTTP CONNECT请求。

代理服务器利用HTTP CONNECT请求中的主机和端口与目的服务器建立TCP连接。

代理服务器给客户端返回HTTP 200响应。

客户端和代理服务器建立起HTTP CONNECT隧道,HTTPS流量到达代理服务器后,直接通过TCP透传给远端目的服务器。代理服务器的角色是透传HTTPS流量,并不需要解密HTTPS。

NGINX ngx_http_proxy_connect_module模块

NGINX作为反向代理服务器,官方一直没有支持HTTP CONNECT方法。但是基于NGINX的模块化、可扩展性好的特性,阿里的@chobits提供了ngx_http_proxy_connect_module模块,来支持HTTP CONNECT方法,从而让NGINX可以扩展为正向代理。

NGINX stream (4层解决方案)

NGINX官方从1.9.0版本开始支持ngx_stream_core_module模块,模块默认不build,需要configure时加上 --with-stream 选项来开启。

ngx_stream_ssl_preread_module模块

要在不解密的情况下拿到HTTPS流量访问的域名,只有利用TLS/SSL握手的第一个Client Hello报文中的扩展地址SNI (Server Name Indication)来获取。NGINX官方从1.11.5版本开始支持利用ngx_stream_ssl_preread_module模块来获得这个能力,模块主要用于获取Client Hello报文中的SNI和ALPN信息。对于4层正向代理来说,从Client Hello报文中提取SNI的能力是至关重要的,否则NGINX stream的解决方案无法成立。同时这也带来了一个限制,要求所有客户端都需要在TLS/SSL握手中带上SNI字段,否则NGINX stream代理完全没办法知道客户端需要访问的目的域名。

1
2
3
4
5
6
7
8
9
stream {
	resolver 114.114.114.114;
	server {
		listen 443;
		ssl_preread on;
		proxy_connect_timeout 5s;
		proxy_pass $ssl_preread_server_name:$server_port;
	}
}

test

openssl带servername参数来指定SNI

1
openssl s_client -connect www.baidu.com:443 -servername www.baidu.com

nginx 代理配置

正向代理、反向代理 没有区别

客户端 —-> 代理服务器(发起访问请求) —-> 网站
客户端 <—- 代理服务器(响应的内容) <—- 网站

配置:(https 代理配置较麻烦)

ngx_http_proxy_module 代理配置:

1
2
3
4
5
6
7
8
9
10
11
server {
	listen 88;
	# resolver 8.8.8.8
	location / {
		proxy_pass $http_host$http_request_uri;
		# proxy_pass http://192.168.56.101:88; 多级代理的中间设备用这条

		# proxy_connect_timeout 600;
		# ...
	}
}

ngx_stream_proxy_module 代理配置:

NGINX官方从1.9.0版本开始支持ngx_stream_core_module模块,模块默认不build,需要configure时加上 --with-stream 选项来开启。

配置见 nginx https代理配置

squid 代理转发

https://www.cmdschool.org/archives/4673

Squid的层次结构

图中绿色线代表父子关系的层次结构(上游下游关系)

图中蓝色代表兄弟关系的层次结构(平等关系)

代理转发

Squid使用“cache_peer”指令提供父节点的缓存

cache_peer指令的模式

never direct模式,父节点失败不能直接连接源服务器,如果父节点失败或无法访问,则每个请求都导致错误消息

prefer direct模式,父节点失败允许直接连接源服务器,如果父节点失败或无法访问,则连接到源服务器而不是父节点

注:失败是指没有ICP或HTCP回复

never direct模式
1
2
cache_peer parentcache.foo.com parent 3128 0 no-query default
never_direct allow all

以上使用never_direct指令宣告父节点失败不能直接连接源服务器

prefer direct模式
1
2
3
cache_peer parentcache.foo.com parent 3128 0 no-query
prefer_direct off
nonhierarchical_direct off

以上使用prefer_direct指令宣告首选从DNS中列出源服务器尝试

以上使用nonhierarchical_direct指令宣告往父节点的请求继续发送

hierarchy_stoplist指令是prefer direct模式的另外一种实现(适用于Squid-3.2之前的版本)

cache_peer指令的使用
1
cache_peer hostname type http-port icp-port [options]

hostname参数,指定转发的代理服务器主机名称(IP地址亦可)

type参数,可选值有“parent”(父母)、“sibling”(兄弟)和“multicast”(多播)

http-port参数,指定转发的代理服务器通讯端口,默认值3128

icp-port参数,查询对象的邻居缓存,如果不支持ICP或HTCP,设置为0

options参数,可选的其他选项(不一一列举)

http://www.squid-cache.org/Doc/config/cache_peer/