搭建VPS
节点搭建系列
- 网络通信的基本原理
- 被墙的原理
- 上手搭建shadowsocks服务
- 搭建trojan协议
- 搭建Vmess协议
- 搭建Vless协议
- 节点搭建七
网络通信的基本原理
OSI模型 | 信息 |
---|---|
应用层 | 请告诉我百度的ip (HTTP) |
传输层 | 封装本机端口和DNS服务器端口 (TCP,UDP) |
网络层 | 封装原ip和目标ip |
数据链路层 | 封装原MAC地址和目标MAC地址 |
物理层 | 通过网卡传输数据 |
请求网址的瞬间发生的事情(DNS解析)
开始发送请求
检查本地缓存是否之前访问过该网址,检查hosts文件查看是否存在映射关系
将该请求发送给本地运行在应用层的DNS服务器
传输层对数据进行封装 封装端口 本机端口封装为本地DNS服务器默认端口
添加本地端口 目标端口
网络层 封装ip 本机ip封装为本地DNS服务器ip
添加本地ip 目标ip
数据链路层 封装ip后本机在同一网段内找不到该ip,请求网关,由于局域网内通信是通过MAC地址,且网关的MAC地址和路由器的MAC地址不匹配,于是通过ARK协议进行通信
添加本地MAC地址 目标MAC地址
物理层 通过网卡发送数据
交换机
可以解析物理层和数据链路层
交换机拿到数据查看数据链路层封装的MAC地址去发送给路由器
路由器
路由器能解析后三层 能查看到封装好的ip 发现本地没有就会通过WAN口转发到公网路由
匹配服务器
- 当匹配到DNS服务器后,DNS服务器会从物理层开始逐层拆解之前封装的数据最后获取到域名对应的ip地址
返回数据 —此处主要是拆解数据—
- 当拿到ip来到应用层再次执行相反流程
- 来到传输层将端口反制
- 来到网络层将ip反制
- 来到链路层将MAC反制
- 路由跳转
- 通过MAC地址匹配到本地路由应用层通过NAT更改目标ip
- 来到交换机通过ip去找本机MAC地址
- 在来到本机逐层拆解最后拿到百度的 ip地址
注意事项
- 每一次路由跳转的时候都会修改自己的MAC地址
- NAT映射:将传输过来的数据进行ip和port保存,将wan口的ip放置数据包内端口随机分配 再次拿出来进行保存 形成了一组映射关系
- HTTP默认端口为80端口
被墙的原理
GFW防火墙禁止访问的方式
DNS污染
寻找DNS服务器正常但是在返回的时候防火墙看到你应用层的内容 于是篡改ip地址 使你请求错误的服务器地址
TCP重置攻击
防火墙通过传输层的ip判断你访问的网站是否被列为黑名单,如果是返回一条错误的信息给你,或者是ip没被列为黑名单,但是应用层的数据是黑名单里的内容,本质上还是自己的意图被发现了,所以我们可以通过加密的方式进行隐藏目的
思考:如何解决DNS污染呢?
走本地hosts映射,不发送DNS请求(早起翻墙的手段)
VPN的弊端: 虽然你伪装了数据包的内容但是,GFW防火墙是知道你建立的是VPN连接,如果你长时间进行大流量连接
—- 基于上述情况我们了解到了需要对数据加密的同时也需要对流量进行加密,shadowsocks就此诞生
shadowsocks配置
浏览器
代理服务器为本地127.0.0.1
代理端口是shadowsocks监听的端口shadowsocks客户端实现原理
拿到请求对数据进行加密
同样的流程来到防火墙
但是防火墙并没有发现你有违规的点
路由跳转最终跳到你那台shadowsocks服务器
解密帮你去访问目标网站
拿到数据加密返回数据给你- 漏洞:防火墙会主动发送请求给你这台shadowsocks服务器,判断你是否开启了shadowsocks服务
上手搭建shadowsocks服务
VPS是什么
VPS(Virtual Private Server 虚拟专用服务器)技术,每个VPS都可分配独立公网IP地址、独立操作系统
VPS操作
购买VPS,这里推荐Vultr,可以随时去摧毁服务,停止计费
安装好VPS后,通过ssh连接VPS,这里使用的是finalshell
连接好之后安装shadowsocks服务
apt install shadowsocks-libev //Ubuntu
查看shadowsocks状态:
systemctl status shadowsocks-libev.service //发现安装好后默认情况下已经开启了
通过日志信息可以查看到shadowsocks监听的是8388端口查看日志
journalctl -u shadowsocks-libev.service -f
进入并修改配置文件
vim /etc/shadowsocks-libev/config.json
由于默认地址情况是本机回环地址需要修改ip地址
server: "0.0.0.0" //接收所有ip地址在shadowsocks软件里配置服务端
思考:测试真延迟会发现连不上去原因是什么?
由于没有关闭防火墙使得我们只能访问22号端口,需要我们开放8388端口
ufw allow 8388 //开放端口
ufw status //查看端口开启状态裸奔VPS真延迟测试发现请求成功与失败
请求成功原因
可能是由于你VPSip端不再侦查范围内
请求失败原因
GFW防火墙重放攻击,以你的数据包发送给VPS服务器,发现你的意图,再将你屏蔽
那么请求失败该如何解决呢?
我们可以通过伪装成普通的基于websockets的http流量来解决,当然http流量还是可能被重放攻击侦察到内部的内容,这里我们先拿简单的http练练手,学习https伪装要了解很多概念文章后可能会说明
plugin插件一大堆,在这里我们使用v2ray-plugin
在VPS里配置插件
apt install shadowsocks-v2ray-plugin
查看安装包释放内容
dpkg -L shadowsocks-v2ray-plugin
我们会发现bin目录下多出来一个ss-v2ray-plugin
为shadowsocks配置如下两行
"plugin":"ss-v2ray-plugin",
"plugin_opts":"server"
重新启动服务器
查看shadowsocks状态
成功为止在客户端配置插件
到v2ray-plugin插件发行版里寻找与自己操作系统匹配到文件将插件解压放到指定目录下
v2ray开启socks5代理(Mac端偏好设置里面可以设置)
ip: 127.0.0.1
port: shadowsocks客户端监听的端口
其实默认情况socks5代理ip为127.0.0.1 port: 1080梳理原理
当我们请求谷歌的时候,本地会将请求先发送给v2ray,由于v2rayN代理的端口和ss客户端监听的端口一致,于是将其转发给shadowsocks客户端,shadowsocks数据加密流量伪装
搭建trojan协议
trojan协议
将流量加密成https流量,过墙
http访问
http发送请求数据完全明文显示
https访问流程
https采用的是非对称加密算法 公钥解私钥 私钥解公钥
https请求需要CA机构下发证书
申请证书的流程:将请求的网址和公钥给CA机构,CA机构给出能证明这个网站是你的的条件,你对应去执行,若审查成功,则颁发给你证书
现在开始进行https访问,进入tls,但是不会立刻进行加密,tls会先去请求你要访问的网站,然后网站返回证书,拿到证书进行核实,若有效则连接,拿到证书里面的密钥进行数据加密
经过防火墙可能会被墙强行攻击就会出现证书不匹配,浏览器就会出现私密链接那个警告
假如没问题来到访问的网站通过非对称加密协议进行解密返回数据也是一样的
疑问
为什么tls1.2不去加密访问的网站呢?
这是由于很多应用可能都运行在同一台服务器上,如果加密,那么他就不知道拿哪一串私钥进行解密了
扩展知识: 这个保留的访问网址叫做sni
trojan原理
- 首先想要发送https请求就要经过tls加密加密好的数据是不能直接发送给目标服务器的,因为sni地址是暴露的
- trojan服务器就派上用场了,首先走请求走系统代理来到trojan这台服务器,trojan为请求加上协议头和密码,tls请求trojan服务器证书进行握手拿到公钥,tls对整条数据进行加密,并且在前面加上trojan服务器的sni
- 来到trojan服务器私钥对数据进行解密,查看是否为trojan数据包,通过密码进行解密
- 如果密码错误或者没有trojan请求头就会将另一个网站的数据返回给你 ,这也可以避免防火墙主动探测
VPS服务器搭建trojan
root目录下创建trojan文件夹
mkdir trojan
下载trojan-go安装包
wget https://github.com/p4gefau1t/trojan-go/releases/download/v0.10.6/trojan-go-linux-amd64.zip
解压文件
unzip trojan-go-linux-amd64.zip
需要trojan配置文件
{
"run_type": "server",
"local_addr": "0.0.0.0",
"local_port": 443,
"remote_addr": "192.83.167.78",
"remote_port": 80,
"password": [
"your_awesome_password" //111
],
"ssl": {
"cert": "server.crt",
"key": "server.key"
}
}还需要配置私钥和证书
需要先进行DNS解析这台服务器
安装acme
curl https://get.acme.sh | sh
安装socat
apt install socat
添加软链接
ln -s /root/.acme.sh/acme.sh /usr/local/bin/acme.sh
注册账号
acme.sh --register-account -m my@example.com
开放80端口
ufw allow 80
申请证书
acme.sh --issue -d 你的域名 --standalone -k ec-256
进入自己的域名等待请求返回的公钥
如果默认CA无法颁发,则可以切换下列CA:
* 切换 Let’s Encrypt:acme.sh --set-default-ca --server letsencrypt
切换 Buypass:acme.sh --set-default-ca --server buypass
切换 ZeroSSL:acme.sh --set-default-ca --server zerossl
*安装证书
acme.sh --installcert -d 你的域名 --ecc --key-file /root/trojan/server.key --fullchain-file /root/trojan/server.crt
运行trojan-go脚本
cd /trojan
./trojan-goV2ray客户端配置trojan服务器
addr: 域名
port: 443
password: 配置文件里面设置的
type:tls开放443端口进行真连接
ufw allow 443
自签证书解决没有域名的情况
下发个人私钥
openssl ecparam -genkey -name prime256v1 -out ca.key
通过私钥生成证书
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt -subj "/CN=bing.com"
修改配置文件
再去执行脚本肯定是不行的那为什么呢
因为自己颁发的证书不在受信任证书颁发机构的范围内
解决方法
- 在信任机构里面添加自己的证书(不推荐)
- 可以跳过证书验证(v2rayN独有其他的不到)
- 在sin里添加颁发的证书的对象
后台运行trojan服务
nohup ./trojan-go > trojan.log 2>&1 &
就算退出finalshell服务也会在后台自动代理
搭建Vmess协议
Vmess实现流程
当你访问某个网址的时候,数据包来到系统代理,v2ray监听该端口,来到v2ray客户端,v2ray客户端通过输入的vmess配置信息对数据进行加密,v2ray通过uuid对其余数据进行加密,对用户id和时间戳再进行hash处理,将其加到头部 ,再将服务器ip地址加上,来到v2ray服务器,先撤去ip地址,看到hash值后,在当前系统的时间戳内生成一个数组区间,通过每一个时间戳和v2ray服务器配置的用户id进行hash直到能匹配到客户端传来的hash值为止,然后再加上用户id,此时可以确定是用户发来的数据,再通过用户id对数据进行解密,解密拿到密钥和加密方法,通过这种方法进行解密
如上也就是为什么vmess和系统时间还有随便选择加密算法为什么有关系
注意
- 时间戳取值为当前时间的前30秒和后30秒内的随机数
- hash处理的值是不可逆的
- 用户id需要两边一致
额外ID的作用
防止由于随机值不够用,出现hash值重复的现象
为什么服务器设置的额外id一定要比客户端大?
假如额外id为3那么用户拥有id就有三个
在v2ray4 V4.28.1后alterId设置为0默认情况下采用AEAD加密方式
vmess弊端
可以被防火墙重放攻击篡改加密的内容,因为并没有采用AEAD的加密方式
Md5认证方式和AEAD加密方式只能留一个
Vmess一键脚本实操
安装并启动v2ray
bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)
由于v2ray安装好后默认情况下是关闭的需要打开
systemctl start v2ray.service
修改配置文件
/usr/local/etc/v2ray/
修改配置config.json文件
{
"inbounds": [
{
"port": 8388,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "af41686b-cb85-494a-a554-eeaa1514bca7",
"alterId": 0
}
]
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}重启v2ray服务,开放8388端口,进行配置
由于传输的数据都是无规则的字节流,会被防火墙注意所以我们需要引入tls
vmess+tls+tcp流程
首先发送请求到目标网站,vmess选择zero不加密的方式,请求头在任意情况下都是加密的(AEAD),tcp和远程服务器进行握手,对整条数据进行加密,套上头部
如何修改为vmess+tls+ws
只需要将两边的传输协议都修改为ws协议即可
注意点
zero和none的区别:zero不校验也不加密,none不加密但校验
承载概念
正常来说协议都是由传输层的tcp 或者是 udp来承载,但是如果增加了tls安全协议则应用层的协议都由tls承载,tls由tcp承载
Kcp,udp,ws,tcp
- kcp是一种可靠的传输协议由udp来承载
- udp只管发不管服务端有没有收到
- ws是由tcp来承载的
- tcp是两边握手拿到数据的一种协议比较可靠
伪装概念
- 在数据部分增加一点东西来达到伪装的效果
vmess+tcp(ws)+tls服务搭建
安装v2ray
申请证书
安装证书
书写配置文件
配置文件的目录和证书私钥在一块
路径为: /usr/local/etc/v2ray
配置文件内容
{
"inbounds": [
{
"port": 8388,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "af41686b-cb85-494a-a554-eeaa1514bca7",
"alterId": 0
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"certificates": [
{
密钥路径对准
"certificateFile": "/usr/local/etc/v2ray/server.crt",
"keyFile": "/usr/local/etc/v2ray/server.key"
}
]
}
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}如果查看到v2ray启动失败的话
vim /etc/systemd/system/v2ray.service
将User=nobody那一行删除
配置本地v2ray
主机: vps ip
类型:vmess
uuid配置文件里包含
alterid:0
安全类型:zero或者吧是none
传输协议tcp
如果自签证书需要在sni写签发的网站如果想要配置vmess+ws+tls
只需要将配置文件和本地v2ray配置里的传输协议改为ws即可
弊端
由于vmess并不像trojan一样包含伪装的网站很可能就会被墙
vmess+tls+ws+web
流程
当你去搜索关键字访问外网的时候,vmess通过zero进行加密,用户id再对zero进行加密,在前面添加解密的私钥,ws来承载这一段数据设置/ray路径,tls对整条数据进行加密,头部加上网址,通过ip地址解析道nginx服务器,nginx通过tls对数据进行解密,nginx是能够解析ws的,因为/ray指定端口为8388,于是转发给了监听8388端口的v2ray服务器,一对照路径和传输协议发现匹配上了,就可以帮助我们去访问
当墙发送https请求的时候发生了什么
和trojan一样nginx配置了伪装网站,访问后会进入伪装网站
疑问:为什么传输的时候选择了ws协议
这是由于tls解密后nginx服务器不认识vmess协议,却认识ws协议
配置
安装nginx
apt install nginx -y
配置nginx
前提一定要有DNS解析好的域名
vim /etc/nginx
打开nginx.conf
将http花括号里的内容替换如下
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name a.satrol.top; #你的域名
ssl_certificate /usr/local/etc/v2ray/server.crt;
ssl_certificate_key /usr/local/etc/v2ray/server.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
location / {
proxy_pass https://www.bing.com; #伪装网址
proxy_ssl_server_name on;
proxy_redirect off;
sub_filter_once off;
sub_filter "www.bing.com" $server_name;
proxy_set_header Host "www.bing.com";
proxy_set_header Referer $http_referer;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Accept-Encoding "";
proxy_set_header Accept-Language "zh-CN";
}
location /ray {
proxy_redirect off;
proxy_pass http://127.0.0.1:10000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name a.satrol.top; #你的域名
rewrite ^(.*)$ https://${server_name}$1 permanent;
}重启查看状态
systemctl reload nginix.service
systemctl status nginix.service再为v2ray配置文件配置
/usr/local/etc/v2ray
配置内容如下
"inbounds": [
{
"port": 8388,
"listen":"127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "af41686b-cb85-494a-a554-eeaa1514bca7",
"alterId": 0
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/ray"
}
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}重启并查看状态
systemctl restart v2ray.service
systemctl status v2ray.service配置本地v2ray客户端
相比于之前来说
传输协议改为ws
添加路径为如上设置的路径
搭建Vless协议
Vless+xtls流程
假如在google里面搜索内容,通过tls对内部数据进行加密,生成数据包,通过系统代理来带Xray,由于是vless代理,vless在数据包头部创建一个vless+uuid的vless头,然后通过xtls对数据包未加密过的地方进行加密,再在头部加上服务器ip地址,通过GFW墙发现为正常https流量放行来到,来到Xray服务器,来到vless入站协议通过xtls安全协议进行解析,对比数据包内容,发现正确帮助我们去访问google
回落
先对应用层数据进行tls加密,通过系统代理来到Xray,因为是trojan代理所以对整条数据进行,过墙,vless通过xtls安全协议对tls协议进行解密,发现头部是trojan头,于是回落到本机的8388端口也就是trojan节点,trojan核对信息再次回落到nginx监听的80端口,来到伪装web上
注意事项
- xtls解密tls加密后的流量
xtls上手搭建