原文:
https://www.twblogs.net/a/5b8409092b717776d3c7535d/?lang=zh-cn
ss-redir透明代理:
ss-libev 提供了ss-local,ss-redir,ss-tunnel,ss-server;
顾名思义,ss-local是ss的客户端,提供了sock5代理,但是一般只有浏览器才能使用sock5代理,要想充当“全局代理”可以通过privoxy。注意,这里说的是“充当全局代理”,因为ss-local+privoxy方式并不是真正意义上的全局代理,只不过是设置了终端终端的http/https的代理。要想做到真正的全局透明代理,可以使用ss-redir+iptables。
透明代理:
透明代理的作用是为了突破某些网络限制,访问网络资源。透明代理对于客户端来说是透明的,客户端不需要进行相应的代理设置,就能使用透明代理来访问互联网。
ss-server:
ss服务端。
ss-local:
ss客户端,也就是本地运行的sock5客户端。
ss-local主要提供sock5代理,根据OSI模型,sock5是会话层协议;sock5代理支持TCP、UDP。
ss-redir:
redirect,也就是重定向,也是在本地运行的程序,不过可以提供透明代理。
1. 首先通过iptables将本机的数据包全部重定向至redir监听的端口
2. 当上层应用发出数据包后,首先被iptables重定向至ss-redir,ss-redir将数据包打包并加密,通过与ss服务器建立的ss隧道,将包发至ss的服务器。
3. ss-server接收到数据包后,先解密,然后根据数据包中的目标ip地址,将其发送至目标服务器。
4. 目标服务器做出应答后,将应答数据返回给ss-server,然后ss-server通过ss隧道将其传回给ss-redir,最后ss-redir返回给上层应用。
从上面可以看出,发出的数据包的目标ip地址和端口始终没有改变。
ss-tunnel:
ss-libev提供的本地端口转发工具,通常用于解决dns污染的问题。
首先,ss-tunnel会在本地监听一个端口(假设为127.0.0.1#5353),那么发往127.0.0.1#5353的数据包,ss-tunnel会通过与ss-server监理的ss隧道,将其发往ss-server,ss-server根据ss-tunnel设置的远程地址和端口(8.8.8.8:53),将数据包发往8.8.8.8:53,8.8.8.8:53响应后,返回数据给ss-server,ss-server再将其返回给ss-tunnel,最后ss-tunnel返回给上层应用。
对比ss-redir。ss-tunnel的目标ip和目标端口都发生了变化,开始的地址是127.0.0.1#5353,然后经过ss-tunnel后,地址变为了8.8.8.8:53.
如何解决dns污染:
1、ss-redir转发tcp、udp流量(包括dns),这时系统dns设置为国外公共dns(例如8.8.8.8),dns查询走ss通道,由于dns还是走的udp(非明文),在某些网络环境下udp丢包会比较严重。
2、ss-redir转发tcp、udp流量(除了dns),用ss-tunnel来建立udp转发,将dns通过ss隧道,转发至8.8.8.8:53等上游公共dns服务器。此时的dns解析依旧是udp方式(非明文),某些网络环境下udp丢包比较严重(系统dns设置为127.0.0.1)
3、ss-redir转发tcp、udp流量(除了dns),通过dns-forwarder之类的工具,将udp/53方式的dns查询转换成tcp方式,然后再将该tcp方式的dns查询数据通过ss-redir的tcp转发,将其发送至dns服务器,完成解析(系统dns设置为127.0.0.1)
4、.....
......