节点搭建系列

  • 网络通信的基本原理
  • 被墙的原理
  • 上手搭建shadowsocks服务
  • 搭建trojan协议
  • 搭建Vmess协议
  • 搭建Vless协议
  • 节点搭建七

网络通信的基本原理

OSI模型 信息
应用层 请告诉我百度的ip (HTTP)
传输层 封装本机端口和DNS服务器端口 (TCP,UDP)
网络层 封装原ip和目标ip
数据链路层 封装原MAC地址和目标MAC地址
物理层 通过网卡传输数据

请求网址的瞬间发生的事情(DNS解析)

  • 开始发送请求

    1. 检查本地缓存是否之前访问过该网址,检查hosts文件查看是否存在映射关系

    2. 将该请求发送给本地运行在应用层的DNS服务器

    3. 传输层对数据进行封装 封装端口 本机端口封装为本地DNS服务器默认端口

      添加本地端口 目标端口
    4. 网络层 封装ip 本机ip封装为本地DNS服务器ip

      添加本地ip 目标ip
    5. 数据链路层 封装ip后本机在同一网段内找不到该ip,请求网关,由于局域网内通信是通过MAC地址,且网关的MAC地址和路由器的MAC地址不匹配,于是通过ARK协议进行通信

      添加本地MAC地址 目标MAC地址
    6. 物理层 通过网卡发送数据

  • 交换机

    可以解析物理层和数据链路层

    交换机拿到数据查看数据链路层封装的MAC地址去发送给路由器

  • 路由器

    路由器能解析后三层 能查看到封装好的ip 发现本地没有就会通过WAN口转发到公网路由

  • 匹配服务器

    • 当匹配到DNS服务器后,DNS服务器会从物理层开始逐层拆解之前封装的数据最后获取到域名对应的ip地址
  • 返回数据 —此处主要是拆解数据—

    1. 当拿到ip来到应用层再次执行相反流程
    2. 来到传输层将端口反制
    3. 来到网络层将ip反制
    4. 来到链路层将MAC反制
    5. 路由跳转
    6. 通过MAC地址匹配到本地路由应用层通过NAT更改目标ip
    7. 来到交换机通过ip去找本机MAC地址
    8. 在来到本机逐层拆解最后拿到百度的 ip地址
  • 注意事项

    • 每一次路由跳转的时候都会修改自己的MAC地址
    • NAT映射:将传输过来的数据进行ip和port保存,将wan口的ip放置数据包内端口随机分配 再次拿出来进行保存 形成了一组映射关系
    • HTTP默认端口为80端口

被墙的原理

GFW防火墙禁止访问的方式

  1. DNS污染

    寻找DNS服务器正常但是在返回的时候防火墙看到你应用层的内容 于是篡改ip地址 使你请求错误的服务器地址

  2. 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-go
      • V2ray客户端配置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上手搭建

三分大赛

似懂非懂舒服