shadowsocks搭建教程

介绍

本片文章内容主要记录本人对节点搭建合集的学习记录,本章主要记录网络通信的一些基础知识。

网络通信的基本过程

下图为本小节的网络结构的例子。
示意图

DNS解析

首先对一台电脑打开浏览器后输入baidu.com进行搜索这一动作进行分析。

  1. 对于域名baidu.com,首先需要得到这个域名对应的ip地址,这个地址首先通过检查浏览器缓存寻找
  2. 若没有浏览器记录则检查本地缓存即检查本地hosts文件是否有映射关系
  3. 若还未找到,则会去请求电脑所配置的DNS服务器。其中DNS解析示意图如下所示。
    DNS解析示意图

DNS请求发送过程

DNS为应用层的协议,其主要用于获取域名所绑定的ip地址
本地向DNS服务器具体发送请求的方式如下图所示。

  1. 首先在应用层生成请求
  2. 传输层封装源端口目标端口
  3. 接着传到网络层加上本机的ip和DNS服务器ip,当电脑找不到目标的ip地址之后,继续将数据包发送到网关(家中一般是路由器)
  4. 在同一个局域网同通信,一般是采用MAC地址进行通信,因此在数据链路层会继续添加源MAC地址(通过ARP协议获取到网关地址)和本机MAC地址
  5. 随后将封装好的数据包从物理层即通过网卡从网线发出去达到交换机的位置
    分层示意图
  6. 交换机为二层的设备,其只能解析到物理层数据链路层的内容,因此交换机可以得到转发的目标MAC地址,因此将数据包发送给路由器
  7. 路由器为三层设备,当数据到其数据链路层时,它发现包的目标地址即为自己的地址,之后它就会将头部拿去继续向上传输
  8. 当传到路由器网络层时,他会确定目标的ip地址,当路由器没有直接与目标ip地址连接时,他会将数据包发送到WAN口,上面配有一个公网ip地址
  9. 由于数据需要从WAN口到公网路由,但是数据包本身的ip地址内网的ip,因此需要NAT内网ip进行转换。路由器上有NAT映射表,其将本地ip加端口进行保存并记录映射关系,例如数据包上的源ip加端口``192.168.1.10:404会通过映射转为20.20.20.20:505随后再返回物理层进行转发
  10. 经过多个路由器,最终数据包会传输到DNS服务器上,数据包经过多层结构,逐渐去掉头部达到应用层
  11. 应用层得到请求后发送解析结果,随后也经过五层结构封装原路返回
  12. 本机电脑得到DNS解析结果之后,则会向解析完的ip地址发送请求,按照相同方法最终得到结果

GFW阻隔方式

DNS污染

假设本机电脑配置了一个公网ip(20.20.20.20)DNS服务器(8.8.8.8),当本地输入了google.com的时候,首先检查本地DNS缓存有没有保存google.comip地址,如果没有则回去寻找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
2
3
4
5
6
7
8
9
10
11
{
"server":"0.0.0.0",
"mode":"tcp_and_udp",
"server_port":8388,
"local_port":1080,
"password":"YMCBFhehcaxD",
"timeout":86400,
"method":"chacha20-ietf-poly1305",
"plugin":"ss-v2ray-plugin",
"plugin_opts":"server"
}

随后重新启动

本地运行shadowsocks+plugin

利用shadowsocks客户端加上plugin插件,监听1080端口,随后在浏览器上利用socks5代理1080端口后即可成功访问。
socks5配置

封面

封面