shadowsocks搭建教程
shadowsocks搭建教程
Miyako介绍
本片文章内容主要记录本人对节点搭建合集的学习记录,本章主要记录网络通信的一些基础知识。
网络通信的基本过程
下图为本小节的网络结构的例子。
DNS解析
首先对一台电脑打开浏览器后输入baidu.com
进行搜索这一动作进行分析。
- 对于域名
baidu.com
,首先需要得到这个域名对应的ip地址
,这个地址首先通过检查浏览器缓存寻找 - 若没有浏览器记录则检查本地缓存即检查本地
hosts
文件是否有映射关系 - 若还未找到,则会去请求电脑所配置的
DNS服务器
。其中DNS解析示意图
如下所示。
DNS请求发送过程
DNS
为应用层的协议,其主要用于获取域名所绑定的ip地址
。
本地向DNS服务器
具体发送请求的方式如下图所示。
- 首先在
应用层
生成请求
- 在
传输层
封装源端口
和目标端口
- 接着传到
网络层
加上本机的ip
和DNS服务器ip
,当电脑找不到目标的ip
地址之后,继续将数据包发送到网关
(家中一般是路由器) - 在同一个局域网同通信,一般是采用
MAC地址
进行通信,因此在数据链路层会继续添加源MAC地址
(通过ARP协议获取到网关地址)和本机MAC地址
- 随后将封装好的数据包从
物理层
即通过网卡从网线发出去达到交换机的位置 交换机
为二层的设备,其只能解析到物理层
和数据链路层
的内容,因此交换机
可以得到转发的目标MAC地址
,因此将数据包发送给路由器
路由器
为三层设备,当数据到其数据链路层
时,它发现包的目标地址即为自己的地址,之后它就会将头部拿去继续向上传输- 当传到
路由器
的网络层
时,他会确定目标的ip地址
,当路由器没有直接与目标ip地址
连接时,他会将数据包发送到WAN口
,上面配有一个公网ip地址
- 由于数据需要从
WAN口
到公网路由,但是数据包本身的ip地址
为内网的ip
,因此需要NAT
将内网ip
进行转换。路由器上有NAT映射表
,其将本地ip加端口
进行保存并记录映射
关系,例如数据包上的源ip加端口``192.168.1.10:404
会通过映射转为20.20.20.20:505
随后再返回物理层
进行转发 - 经过多个
路由器
,最终数据包会传输到DNS服务器
上,数据包经过多层结构,逐渐去掉头部达到应用层
应用层
得到请求后发送解析结果,随后也经过五层结构封装原路返回- 本机电脑得到
DNS解析结果
之后,则会向解析完的ip地址
发送请求,按照相同方法最终得到结果
GFW阻隔方式
DNS污染
假设本机电脑配置了一个公网ip(20.20.20.20)
和DNS服务器(8.8.8.8)
,当本地输入了google.com
的时候,首先检查本地DNS缓存
有没有保存google.com
的ip地址
,如果没有则回去寻找hosts文件
,若寻找不到则会向DNS服务器
发送请求。
在本地从应用层
产生请求逐步向下,在传输层
添加端口和目标端口(DNS服务
一般为53号端口
),接着到网络层
添加ip地址和目标ip地址,再经过数据链路层
添加MAC地址后,通过物理层
传输出去。
由于8.8.8.8服务器
不在国内,因此数据包会传输到防火墙,它可以看到数据包里面的内容,即它可以知道你想DNS解析
的ip地址,此时它就可以对这个数据包进行拦截。
假设数据包能够传输出去,传输到DNS服务器后,层层解析,返回google的ip地址,随后变成数据包返回。在返回的数据包回到防火墙时,他会把真正的ip进行修改,随后返回电脑,最终回到本地之后,得到错误的ip,即DNS污染
。
TCP重置攻击
若通过修改hosts文件
,直接得到正确的ip地址,则可以跳过DNS污染
。在与服务器连接过程中,涉及TCP传输协议
,即也会发送一个数据包,其目标ip为外网的ip,内容为连接请求,当该数据包经过GFW时,首先在网络层解析到目标ip地址
为外网ip地址
,该地址在它的黑名单
上,因此它会阻隔数据包的传输,并且伪造
从google服务器传过来的数据包,内容为拒绝连接。
若目标ip不在GFW的黑名单
上面,发送连接请求时可以正常连接。连接成功后,本地会发送一个数据包,内容为”给我google.com的首页数据”。当该数据包经过GFW时,当其解包到`应用层``时,会发现并且进行阻断。因此就算能够成功连接,也不能正常访问。
代理服务器
Socks5
是一种网络代理协议,广泛应用于网络通信中。它允许客户端通过代理服务器与目标服务器进行通信,主要用于隐藏用户的真实IP地址、提高安全性以及绕过网络限制。
使用场景:
- 匿名上网:
Socks5
可用于隐藏用户的真实IP地址,提高隐私性,防止被追踪。 - 访问被封锁的内容:当用户所在地或网络环境限制访问某些网站时,
Socks5
可以帮助绕过这些限制。 - P2P下载:由于
Socks5
支持UDP
传输,它常用于P2P(点对点)下载中,提供更高效的网络通信。 - 安全通信:通过使用身份验证机制和代理服务器,Socks5能够提升数据通信的安全性。
若希望用代理服务器来进行访问google.com,即使服务器可以正常访问google.com,但是通过本地向代理服务器发送的请求
(通过该服务器帮忙访问google.com),该应用层内容
会被GFW解析并且隔断,并且把代理服务器加入黑名单。
传统vpn连接
由于GFW可以解析到应用层数据,若采用vpn进行加密,有可能可以绕过GFW,但由于特征明显
,它明确该数据包通过了vpn进行加密,因此会对目标ip进行监控
。
shadowsocks协议
假设在VPS上搭建了SS的服务端,它监听端口号为8388
,与此同时本机运行着一个SS客户端
,让客户端监听1080端口
(本地代理socks5的端口),即浏览器发送访问google的请求时,该请求会转移到本地(127.0.0.1)的1080端口
,即SS客户端
。当请求发送到SS客户端
,它会对内容进行加密
,之后从本地的1080端口
发送到服务器的8388端口
。由于应用层内容
进行了加密
,GFW无法进行识别且目标服务器不在黑名单上,因此该数据包可以正常发送到服务器,之后服务器上的SS客户端
对数据包进行解密
,得到内容(访问google.com)。之后服务器会帮我们进行访问得到google的网页数据,接着进行加密传输回本地。
搭建SS节点+plugin
服务器搭建SS节点
首先购买一台vps,确认其ipv4地址,username和Password,可以在FinalShell上进行ssh连接。
连接完成后,输入:
1 | apt install shadowsocks-libev |
安装完成后可以使用命令来查看状态:
1 | systemctl status shadowsocks-libev.service |
随后需要编辑配置文件,输入:
1 | vim /etc/shadowsocks-libev/config.json |
把其中的server配置改成0.0.0.0即接收所有ip向其8388端口发送数据。
随后重启:
1 | systemctl restart shadowsocks-libev.service |
要使得v2ray能够正常ping通服务器,需要关闭防火墙(目前只开启了22号端口):
1 | uwf allow 8388 |
这样就可以使得外部访问服务器的8388端口。
但是如果直接这样采用真连接进行测试,有可能会导致重放攻击,它可以检测到这一台服务器执行了shadowsocks,因此阻止连接。
plugin原理
plugin可以将数据流量伪装成普通的http或者websocket的流量。
首先流量通过系统代理(127.0.0.1:1080)传输到本地的SS客户端(127.0.0.1:505)并进行加密,而plugin监听本地的505端口,在接收到加密的数据后,会为它加上http协议,再访问服务器的8388端口。
此时服务器的plugin插件监听着8388端口,接收到数据后,去掉http协议头,随后发送给服务器端的SS客户端进行解密,得到解密内容后就可以帮我们访问外网网站。
服务器搭建plugin
安装命令:
1 | apt install shadowsocks-v2ray-plugin |
查看安装的内容:
1 | dpkg -L shadowsocks-v2ray-plugin |
随后需要修改配置文件:
1 | vim /etc/shadowsocks-libev/config.json |
修改为:
1 | { |
随后重新启动
本地运行shadowsocks+plugin
利用shadowsocks客户端加上plugin插件,监听1080端口,随后在浏览器上利用socks5代理1080端口后即可成功访问。