VPS原理及搭建方法
01 网络通信的基本过程


我们在浏览器中输入baidu.com这个网址,我们的网络是通过ip来定位某一台服务器的,域名仅仅是一串字符串,他绑定了一个ip地址。这个ip地址是找dns服务器获取。但是一开始不是直接去找dns服务器。
首先他会检查浏览器的缓存还有本地的缓存,里面有没有他的域名,如果浏览器里没有缓存就会检查本地的hosts文件,看看文件里面有没有添加映射关系。如果hosts文件里面也没有就会将请求发送到电脑配置的dns服务器上。
怎么发送到dns的服务器上去的?
首先要了解一下OSI的七层模型
首先输入baidu.com,浏览并没有得到本地的百度ip地址,所以说他就会将请求发送到dns服务器上
dns是一个应用层的协议,它主要就是用来获取域名所绑定的ip地址,当传到应用层就会构造一个相关的协议,这个协议会生成一个相关的请求。然后,他要通过OSI模型一层一层往下传到物理层,也就是网卡的接口。生成请求数据之后,会传到传输层,他会对应用层的数据进行封装,他封装了一个源端口和目标端口,比如源端口404,目标端口,dns默认的是53号端口。然后将应用层传过来的协议和端口封装成一个数据包,然后接着往下传。传输层主要是有端口这个概念。
接下来来到网络层,网络层在前面也会封装一个包头,也就是源ip和目标ip,本机的电脑ip和你要访问的服务器ip,比如本机IP192.168.1.20 和dns服务器地址8.8.8.8。将和之前的数据封装号之后发送到链路层。网络层主要会添加ip地址。网络层封装数据之后,发现目标的ip地址并不在我的网段范围之内,找不到ip地址,接下里他就会去找网关。家里的网关一般是路由器。这里就可以将请求发送给网关。在同一个局域网里面通信,使用的mac地址,数据将会来到下一层。准备发往网关数据里。
数据链路层会在前面加上网关的mac地址和你的源mac地址。通过ARP协议来获取到网关的cc的mac地址。
接着,这条数据就会顺着物理层来到网卡的接口,他就会通过网卡从网线中发出去,来到了交换机的位置。
交换机他是一个二层的设备,也就是说他只能解析两层的数据。数据包从网卡来到交换机,交换机收到数据之后,看一下它里面的mac地址,源mac地址,接着,就将数据包转发到路由器mac地址为cc的这个端口。(路由器是一个三层设备,所以说它能解析三层的数据)。数据到达路由器端口之后,传到数据链路层,发现mac地址和我一样就会把它拿掉,然后就收这个数据包,接受之后就会把它的头部拿掉,拿掉之后在往上传,传到网络层,源ip地址和目标IP地址,发现没有8.8.8.8直接链接,那么路由器,它的工作就是把这个数据在路由出去,转发出去,路由器他会设置一个默认路由,当路由器发现找不到8.8.8.8的时候,他就会发送到默认路由,一般来说就直接发送到公网的其他的路由器了,于是他就会把这个数据转发给公网上的其他路由器,他会把我们的数据包从我们的WAN口(路由器中有一个颜色不一样的口,叫做WAN口,他是通往互联忘的道路),WAN口有一个公网的ip地址,也就是20.20.20.20,他需要将内网的数据转发出去,这里的话路由器还需要做一个NAT操作(网络地址转换)。因为源ip地址是一个内网的的网段,他不能在公网上进行传输,必须转成WAN口允许公网传输的这么一个协议。路由器中有一个NAT的映射表,他会先将本地的ip地址保存在在NAT映射表中,源ip地址和源端口放进去,然后将WAN公网ip地址放入网络层数据包的地址中,数据包的端口也会随便生成一个,同时也会在NAT映射表中记录一个他们之间的映射关系。之后路由器就会把数据包的ip和端口改掉,然后再回到数据链路层,然后在加上源mac地址和目标地址(注意:源mac地址就是现在的WAN口地址了,目标mac地址就是它的下一条的路由器的mac地址)。最后在来到物理层。最后他这个数据包就会从WAN口出去来到了互联网上的其他路由器,经过十来个路由器,最终找到dns服务器,然后将数据交给这台dns服务器。
我们知道dns是一个应用层的协议,所以这台服务器也能解析到应用层。
dns服务器拿到数据包之后,从物理层到数据链路层,解析mac地址正确,拿掉数据包的mac地址,然后在往上传这个数据包,网络层,传输层依旧如此。最后把这个报文发送给应用层的dns应用,dns收到这个请求后。生成一个dns的响应,之后就会沿着OSI模型往回传
补充
在传输层有两个协议一个是tcp,还有一个是udp。我们在应用层这个http的话,他是基于tcp的,我们要发送http请求,必须先使用tcp的方式跟访问的谷歌服务器建立连接,才能发送http请求。
现在要访问谷歌,得到正确的ip地址之后,我们要先发送一个tcp建立连接的请求 ,比如说,发送一个连接请求,来到传输层,用源端口和目标端口建立连接,一系列操作后,来到物理层发送出去,发现ip不在国内,于是会经过防火墙(GFW),经过防火墙的时候,(这个防火墙强大到可以解析应用层的流量)防火墙里有一个列表,记录了一些黑名单的ip地址或者域名之类的,或者防火墙可以伪装的谷歌服务器,给你返回数据包。(tcp重置攻击)
当与服务器建立连接发送请求后,如果数据包里面有关于google 的信息,GFW也会把它干掉,虽然已经与服务器建立连接,但是数据根本就传不出去
02 墙拦截的原理与绕过
当浏览器发送一个请求,发送的谷歌服务器,当返回回来之后,GFW会在返回的ip里面动一些手脚,本地收到数据包之后,由应用层解析完毕之后,于是我们就拿到了一个假的IP地址(DNS污染 ,也可以叫dns劫持)。
这个时候我们如果不发送dns请求,他就不会造成dns污染。当我们浏览器访问谷歌的一瞬间,他并不是直接发送dns,而是先检查本地的dns缓存,如果没有再去检查hosts文件。如果hosts文件中有ip和域名的映射关系,当浏览器发起的时候,而是直接找到hosts文件,应为hosts文件里面添加了映射关系,他就会直接使用这个ip,不需要在发送dns请求,去通过dns获取ip地址。
经过以上集中凡是的拦截,我们的路就会被卡的死死的,我们第一时间想到的就是使用代理进行访问,我们接触最后的代理方式就是http代理和socks5代理。比如我们在vps上搭建一个socks5的服务,监听了一个端口1080,我们就可以构建一个数据包,发往这台vps6.6.6.6 端口1080,和这个端口建立连接。虽然说确实可以正常访问谷歌服务器,也没有经过防火墙,但是从我们这里发出去就不行了,比如说,我们发送到防火墙这里,众所周知,防火墙可以解析到应用层,也就是说它可以看到里面的内容, 看到想让vps这台服务器帮你解析谷歌,他又会帮你干掉了
为什么可以如此精确的阻断连接?
归根结底,我们的意图被它看到了,它可以解析里面的数据内容
怎么才能让他看不到里面的内容?
加密,vpn他就是会加密数据流量的,比如我们经常使用的IPsec,或者openVpn,这些协议他都可以进行对数据加密。那么这种传统的vpn虽然可以进行对数据加密,但是他的特征会非常明显,也就是说虽然防火墙它看不到我们的数据内容,但是它能知道我们在进行vpn连接。
那么要怎么做才能既加密流量又没有特征呢?
shadowsocks,这个协议一出生就是为了绕过防火墙的检查
假设在vps上搭建一个ss的服务端,它监听一个端口8388,同时我们本机运行一个ss客户端,然后它监听一个端口1080,socks5的端口,同时我们的浏览器设置了一个代理端口,也就是说我们浏览器的访问请求会先走这个代理端口(1080),ip地址就是本机127.0.0.1,就相当于我们在浏览器中发送一个访问谷歌请求的时候,这个请求会转发到本机的1080这个端口, 那么这个端口是由ss的客户端在监听,那么这个请求就会发送到ss的客户端,客户端拿到这个请求,他会对这个请求加密,会把里面的内容加密,加密之后我们是看不到数据包里面的内容,然后就会来到传输层,那么他会从源端口是监听1080,目标端口就是客户端里面配置好的需要连接的服务器(8388),最后由物理层发送出去。防火墙放行通过后,就会路由到vps服务器,服务器拿到数据包,解析8388端口,是ss服务端处理,拿到数据之后进行解密,解密之后就会获得原始的请求,他会代替你访问谷歌,他会从谷歌得到一份响应, 收到数据后,同样也会对数据进行加密,加密之后重新构造一个数据包,返回给客户端,最后客户端会得到这个数据包,ss客户端拿到数据之后将会返回给浏览器,浏览器拿到数据之后就可以愉快的访问了。

03 节点搭建
vps
虚拟专用服务器(英语:Virtual private server,缩写为VPS),是将一台服务器分割成多个虚拟专用服务器的服务。实现VPS的技术分为容器技术和虚拟机技术。在容器或虚拟机中,每个VPS都可分配独立公网IP地址、独立操作系统、实现不同VPS间磁盘空间、内存、CPU资源、进程和系统配置的隔离,为用户和应用程序模拟出“独占”使用计算资源的体验。VPS可以像独立服务器一样,重装操作系统,安装程序,单独重启服务器。VPS为用户提供了管理配置的自由,可用于企业虚拟化,也可以用于IDC资源租用。
购买vps服务器
vultr :https://www.vultr.com/
第二个相对比较实惠;

在Linux下搭建shadonsocks服务端
shadownsocks相关命令
1
2
3
4
5
6
7
8
9
10安装shadowsocks
apt install shadowsocks-libev
查看shadowsocks状态
systemctl status shadowsocks-libev.service
编辑ss配置文件
vim /etc/shadowsocks-libev/config.json
重启shadowsocks
systemctl restart shadowsocks-libev.service
查看shadowsocks运行日志:
journalctl -u shadowsocks-libev.service -fUbuntu防火墙设置
1
2
3
4
5
6
7
8
9
10
11
12查看状态
ufw status
开放端口
ufw allow 8388
拒绝端口
ufw deny 8388
删除规则
ufw delete allow 8388
关闭防火墙
ufw disable
启动防火墙
ufw enable相关命令解释
vim /etc/shadowsocks-libev/config.json
需要将IP地址改成0.0.0.0,改成0的意思是接受所有ip地址往他的8388端口发送数据,默认是只允许本机(127.0.0.1环回地址)的地址发送数据。
密码需要一样,因为它使用的是对称加密算法,并且加密方式为GCM的格式,这种加密方式是带身份认证的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22{
"server":["::1", "0.0.0.0"],
"mode":"tcp_and_udp",
"server_port":8388,
"local_port":1080,
"password":"k58LRQwcnKqb",
"timeout":86400,
"method":"chacha20-ietf-poly1305"
}
{
"server":["::1", "0.0.0.0"],
"mode":"tcp_and_udp",
"server_port":8388,
"local_port":1080,
"password":"h0rc6ZWBBaRI",
"timeout":86400,
"method":"chacha20-ietf-poly1305"
}
重放攻击:假设电脑生成一个数据包,往服务器上发,其中经过了防火墙,防火墙它也可以拿着你的数据主动往服务器上发送,用你的数据发送,这就是一个重放攻击。它的探测目的就是为了了解你这个服务器上是否运行了某些服务,比如shadowsockes。具体怎么探测到就不得而知了。
相关连接
SSH连接工具(FinalShell):http://www.hostbuf.com/t/988.html
SS客户端(shadowsocks-windows): https://github.com/shadowsocks/shadowsocks-windows
shadowsocks插件(v2ray-plugin):https://github.com/shadowsocks/v2ray-plugin
方便测速但不支持ss插件(v2rayN):https://github.com/2dust/v2rayNTcpping测试连接显示timeout,也就是没办法和vps进行通讯,这是为什么呢?
因为服务器上的防火墙没有关,在服务器的外围,其实还有一层防火墙,刚安装好只开放了一个22号端口,也就是说我们从外面往它里面发送数据,他只允许访问22号端口,8388端口是不允许访问的。
在外面发送请求的时候,防火墙马上发送了一个探测包,这个防火墙拿这我们的数据,他也主动往服务器发送了一次,然后我们服务器显示认证失败,但是这个防火墙已经得到了它想要的。他可能在这一次探测当中,就已经知道了你这里已经运行了shadowsocks的服务,虽然说他可能防重放攻击,但是防火墙已经达到的探测目的,当他已经知道你这里运行了shadowsocks的服务的时候,他就会把你们的连接切断。
既然能被探测那么ss节点是不是没办法用了?理论上来说确实是,但是ss协议引入了plagin功能,它主要的功能就是对数据流量进行伪装,比如说把我们经过ss假币后的数据流量伪装成普通的http或者websocket这种协议的流量。
首先浏览器会构建一个请求,由于我们设置了系统代理,所以说他会把这个请求发送到配置的系统代理,也就是1080端口,这个数据就会来到ss客户端,因为它监听了客户端,会使用ss客户端的加密方式和密码对请求进行加密,如果没有插件就会直接传到防火墙,但是加了插件,会传到插件这里,他会对这个数据流量进行伪装(比如会伪装成http协议头的头),让防火墙以为我们在访问一个正常的网站,当防火墙发现他只是一个普通的http流量的时候,就可能不会再向服务器发送探测包了。于是数据包就会放行通过,当来到vps时,插件拿到数据的时候会把协议头去掉,之后就把真正的数据发往服务端了。这就是plagin的原理,主要起到了流量伪装的作用。
ssr节点就是类似加了插件的ss节点
- 服务端安装plugin插件
apt install shadowsocks-v2ray-plugin
修改配置文件
1 | { |
客户端安装shadowsocks与v2ray-plugin插件
安装完成之后将v2ray-plug插件放入shadowsocks目录中






