网络通信过程 | Vmess 搭建
网络通信的基本过程
设计出层级结构。出去时不断加码,加信息,加标签,到达时,不断解码,减信息,解包
DNS 解析
输入域名/ip – 检查浏览器/本地缓存,hosts 文件 – 发请求到电脑的 DNS 服务器(OSI 七层/五层模型) – DNS 是应用层的协议,用于请求域名/ip,请求一层一层下传,到物理层(网卡接口)– 请求到的数据给传输层 – 传输层封装应用层的数据(源端口、目标端口)为数据包 – 下传 – 网络层、同样封装(源 ip、目标 ip)– 当电脑找不到这个 ip(不在范围内)会发请求给网关(路由器)
数据顺着物理层到网卡接口 - 网线发出到交换机(二层设备) – 转发到路由器(三层设备),接收数据包,传到网络层 – 因为目标 ip 不在局域网内,所以会转发出去(公网的其他路由器)– 把内网网段 NAT 映射为能在公网传输的 ip - 发送数据包到 DNS 服务器(默认端口 53),DNS 服务器根据 OSI 层层解析直到应用层,拿到请求的数据(ip),开始回传
传输层(+端口) – 网络层(+ip) – 数据链路层(+MAC 地址)– 从物理网口出去 –互联网 – 到正确的路由器,路由器转换 IP、MAC、添加头部 – 反向重复一遍发出请求的步骤,让电脑收到目标网站的 ip
OSI 七层模型
层 | 层 | detail |
---|---|---|
应用层 | 应用层 | HTTP、FTP |
表示层 | ||
会话层 | ||
传输层 | 传输层(端口) | TCP、UDP |
网络层 | 网络层 | |
网络接口层 | 数据链接层 | |
物理层 |
GFW 工作原理
底层原因:能看到我们的数据内容
DNS 污染/劫持
访问 Google,先检查本机有无缓存 Google 的 ip,查看 hosts 文件里有没有对 google.com 添加 IP 域名映射关系,都没有 ➡️ 向本机配置的 DNS 服务器发 DNS 请求,请求 Google 的 ip,这个请求的数据包来到 GFW(五层设备)时会被看到内容(假设未被拦截),来到 real internet,到达 DNS 服务器并发回数据包,被 GFW 解包,篡改数据(ip 地址)后发给本机,找不到假 ip 对应的服务器所以访问不了
解决:
不发送 DNS 请求,在 host 文件添加域名 IP 映射关系。因为 HTTP 协议是基于 TCP、要先用 TCP 和服务器建立连接才能用 HTTP 访问,所以接下来向服务器发送 TCP 请求 ⬇️
TCP 重置攻击
这个请求来到 GFW,被解包到网络层发现了目标 ip,在它的黑名单里,它会拒绝或伪造数据(回程阻断,出去的数据包不拦截,服务器返回的包才拦截,这会导致第 2 次握手无法完成,被阻断的服务器会不停的重传,客户端会一直等待超时)
域名被 ban
谷歌有很多服务器,其中一个没在黑名单上,GFW 放行了。返回的数据包也被放行来到本机。现在开始发数据,来到 GFW,网络层 ip 没问题,应用层发现要 google.com 的数据,google.com 域名在黑名单里,数据包被干掉
重放攻击
防火墙用本机发送的数据包探测目标 VPS,有没有运行特定服务,比如 SS
对策
加密数据:
传统 vpn 能加密,但是特征太明显
shadowsocks 协议:vps 上搭建 ss 服务端,监听端口 1111,本机运行 ss 客户端并监听端口 1080,浏览器设置代理端口
vmess 协议
搭建 Shadowsocks 节点(没有实操)
伪装成 http
购买 VPS,SSH 连接
apt install shadowsocks-libev # 安装
systemctl status shadowsocks-libev.service # 查看状态
vim /etc/shadowsocks-libev/config.json # 修改配置文件,ip改为0.0.0.0
systemctl restart shadowsocks-libev.service # 重启
journalctl -u shadowsocks-libev.service -f # 查看日志
防火墙设置
ufw status # 查看状态
ufw allow 8388 # 开放端口
ufw deny 8388 # 拒绝端口
ufw delete allow 8388 # 删除规则
ufw disable # 关闭防火墙
ufw enable #启动防火墙
最近的心得:防火墙白名单+抗封锁 snap 版 shadowsocks-libev+OutlineVPN 客户端 非常抗揍,真香!(关键 SS 比基于 tls 的如 trojan,v2ray 速度要快)
我也是看了网上各路文章才有了这思路的,目前用得很好。1、防火墙 100%阻断中间人,因为只有你设置好白名单的 IP 才能连接服务器 。2、抗封锁 snap 最新版(edge 版不是 stable 版)可能在防主动识别部分针对性改动了一下,听说去了重放过滤器。3、outlineVPN 客户端听说可以合并部分流量,以减少被动识别拉清单(玄学)
裸奔的 ss 服务容易被重放攻击探测到,用 plugin 伪装数据流量
https://github.com/shadowsocks/v2ray-plugin
apt install shadowsocks-v2ray-plugin
dpkg -L
ss-v2ray-plugin
vim /etc/shadowsocks-libev/config.json
+ "plugin": "ss-v2ray-plugin"
+ "plugin_opts": "server"
systemctl restart shadowsocks-libev.service
Trojan 原理和搭建
伪装成 https
http 的问题:明文、可被篡改
https: http + tls
TLS
非对称加密:公钥、私钥
服务器向 CA 机构请求 SSL 证书,CA 机构要求证明域名所有权后颁发证明(包含公钥和有效期),之后才能进行 https 访问
http 数据交给 tls 进行加密,先要跟网站建立 tls 连接,用对方的公钥加密数据(实际上是握手后协商出对称加密算法的密钥)后发送,服务器用私钥解密
所以 tls 协议概括一下就是,客户端和服务端使用非对称加密算法协商出对称加密算法的主密钥(使用非对称加密算法保护主密钥不被中间人窃取),然后切换到使用对称加密算法(使用对应的主密钥)进行双向通讯。
Trojan
不耐烦了,直奔主题,下次再来!
https://www.youtube.com/watch?v=gw2Vl1h89Wo&list=PL5TbbtexT8T3d_7UX2aSFhoMYk-cl4kf4&index=4
Vmess + TCP +TLS
服务器端
#!!!重要!x-ui不要把xray版本升级到1.7.5以上,否则无法搭建vless节点!
#更新软件源
apt update
#启用 BBR TCP 拥塞控制算法
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p
#安装x-ui:
bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh)
(安装 Nginx、申请 SSL 证书)
http 站点优先,个人网盘符合单节点大流量特征
在浏览器搜索 intext:登录 Cloudreve
,找到一个可访问的网站作为伪装站
配置 Nginx
# 创建配置文件
touch /etc/nginx/sites-available/vmess.conf
# 进入修改
vim /etc/nginx/sites-available/vmess.conf
配置文件内容
server {
listen 443 ssl;
server_name joy.ponderduck.cc; #你的域名
ssl_certificate /etc/letsencrypt/live/ponderduck.cc/fullchain.pem; #证书位置
ssl_certificate_key /etc/letsencrypt/live/ponderduck.cc/privkey.pem; #私钥位置
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
location / {
proxy_pass http://pan.qdovo.com/; #伪装网址
proxy_redirect off;
proxy_ssl_server_name on;
sub_filter_once off;
sub_filter "pan.qdovo.com" $server_name;
proxy_set_header Host "pan.qdovo.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; #Xray端口
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;
}
location /xui { #xui路径
proxy_redirect off;
proxy_pass http://127.0.0.1:9999; #xui监听端口
proxy_http_version 1.1;
proxy_set_header Host $host;
}
}
server {
listen 80;
location /.well-known/ {
root /var/www/html;
}
location / {
rewrite ^(.*)$ https://$host$1 permanent;
}
}
}
测试、建立软链接、重启
nginx -t
ln -s /etc/nginx/sites-available/vmess.conf /etc/nginx/sites-enabled/vmess.conf
systemctl start nginx
# or
nginx -s reload
Trojan-Go
一键部署 Trojan-Go
bash <(curl -sSL "https://raw.githubusercontent.com/veip007/hj/main/trojan-go.sh")
参考 & 致谢
[编译、配置 nginx,使 V2ray,Xray,Trojan,博客网站等共用 443 端口](