网络通信过程 | Vmess 搭建

Posted on Jul 17, 2023

网络通信的基本过程

设计出层级结构。出去时不断加码,加信息,加标签,到达时,不断解码,减信息,解包

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")

参考 & 致谢

ClashX 配置 V2ray 教程

[编译、配置 nginx,使 V2ray,Xray,Trojan,博客网站等共用 443 端口](