shadowsocks-libev udp转发原理简介

  1. ss_local作为一个sock5服务器,接收来自socks5客户端的数据包。在ss_local启动后,即创建一个udp socket,并bind到一个端口。该udp socket用于接收所有来自socks5客户端的udp包。
  2. 根据socks5规范,socks5客户端和ss_local建立一个tcp连接进行握手,握手成功后ss_local返回上面创建的udp socket的端口给socks5客户端
  3. socks5客户端将udp包包装成socks5的格式(即原始数据前加上socks5 request header)发送给ss_local

    SOCKS5 UDP包格式

    +—-+——+——+———-+———-+———-+

    |RSV | FRAG | ATYP | DST.ADDR | DST.PORT | DATA |

    +—-+——+——+———-+———-+———-+

    | 2 | 1 | 1 | Variable | 2 | Variable |

    +—-+——+——+———-+———-+———-+

  4. ss_local 从Socks5 UDP包中取出ATYP开始的内容(即ATYP开始的addr header加上DATA),加密后发送到ss_server。根据加密方式不同,加密包的格式也不同,主要分为stream加密和AEAD加密两大类。(注:目前版本已经去掉OTA)

    UDP (before encryption)

    +——+———-+———-+———-+

    | ATYP | DST.ADDR | DST.PORT | DATA |

    +——+———-+———-+———-+

    | 1 | Variable | 2 | Variable |

    +——+———-+———-+———-+

    .

    ATYP可能的取值是1(ipv4地址),3(域名),4(ipv6地址)。

    如果ATYP是3,则DST.ADDR是1字节域名长度+域名文本。

  5. ss_server将包解密后,去除addr header后将DATA发送到addr header指定的目标地址。如果addr是个域名还要先进行DNS解析。ss_server会维护一个包含fd和addr等内容的cache,避免对于重复的域名重复解析。

  6. ss_server接收来自目的地址的返回的udp包,将他加上addr header并加密发送给ss_local
  7. ss_local解密来自ss_server的包,前面添加3字节0,构建成socks5 udp包后发送回客户端

整体流程和几个重要的函数

  1. init_udprelay : 创建udp server socket, 创建server_ctx_t,启动libev io

    读事件监听,准备接收来自客户端的udp包
  2. server_recv_cb: 当ss-local可接收来自客户端的udp数据包时调用,这个函数里面会读取数据包并处理成shadowsocks udp包的格式并加密后发送到ss-server。
  3. server_recv_cb:当ss-server可接收来自ss-local的加密udp数据包时调用。(同一个函数,不过部分内容通过宏区分了)这个函数里面会读取并解密数据包,解析出addr header,将数据部分发送到addr header里面的地址。如果addr是域名则先做域名解析。
  4. remote_recv_cb:当ss-server可接收来自目的服务器的udp包时调用。这个函数里面读取数据包加上addr header后加密然后发送给ss-local
  5. remote_recv_cb: 当ss-local可接收来自ss-server的加密udp数据包时调用。ss-local会读取数据包并解密,验证addr header,并在数据包最前面加上三个字节的0以构成合法的socks5 udp包,然后将之发送回socks5客户端。

ss-libev 源码解析udp篇 (1)的更多相关文章

  1. ss-libev 源码解析udp篇 (4)

    本篇分析remote_recv_cb,这是整个udp转发的反方向,即读取从后端发送过来的数据再发送给前端.对于ss-server,读取到的数据是目标地址的udp服务器发送回来的响应数据,ss-serv ...

  2. ss-libev 源码解析udp篇 (3)

    本篇分析server_recv_cb,这个是udp转发中最重要的函数. server_recv_cb: 当ss-local或ss-server接收到来自前端的udp数据包时调用.这个函数代码比较多,除 ...

  3. ss-libev 源码解析udp篇 (2)

    UDP relay的代码基本都在udprelay.c中,无论ss-local还是ss-server的代码都在一起,使用宏MODULE_LOCAL,MODULE_REMOTE等区分开.代码虽然不是很多, ...

  4. jQuery2.x源码解析(缓存篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...

  5. jQuery2.x源码解析(构建篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 笔者阅读了园友艾伦 Aaron的系列博客< ...

  6. jQuery2.x源码解析(设计篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...

  7. jQuery2.x源码解析(回调篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 通过艾伦的博客,我们能看出,jQuery的pro ...

  8. Shiro源码解析-Session篇

    上一篇Shiro源码解析-登录篇中提到了在登录验证成功后有对session的处理,但未详细分析,本文对此部分源码详细分析下. 1. 分析切入点:DefaultSecurityManger的login方 ...

  9. myBatis源码解析-类型转换篇(5)

    前言 开始分析Type包前,说明下使用场景.数据构建语句使用PreparedStatement,需要输入的是jdbc类型,但我们一般写的是java类型.同理,数据库结果集返回的是jdbc类型,而我们需 ...

随机推荐

  1. 20145201李子璇《网络对抗》逆向及Bof基础实践

    20145201李子璇<网络对抗>逆向及Bof基础实践 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回 ...

  2. Java Swing简单的加法器

    package test; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class FrameDe ...

  3. Socket 是嘛玩意儿(简单聊聊)

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装 ...

  4. [BZOJ4137]火星商店问题

    Description 火星上的一条商业街里按照商店的编号1,2 ,…,n ,依次排列着n个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数val来标价.每个商店每天都有可能进一些新商品, ...

  5. 【Semantic segmentation Overview】一文概览主要语义分割网络(转)

    文章来源:https://www.tinymind.cn/articles/410 本文来自 CSDN 网站,译者蓝三金 图像的语义分割是将输入图像中的每个像素分配一个语义类别,以得到像素化的密集分类 ...

  6. SpringBoot中使用log4j日志

    一:引入jar包 使用SpringBoot创建项目的时候,pom文件引入了spring-boot-starter,其中包含了spring-boot-starter-logging,该依赖内容就是Spr ...

  7. mac 下如何建立vue-cli项目

    command+space : terminal //检测是否存在node node -v //检测是否带有npm安装管理工具 npm -v //具备进行下一步 //在documnets下建立vue文 ...

  8. Java之聊天室系统设计二

    服务器端: 浏览器端:

  9. JS书籍推荐

    JS书籍推荐 一.总结 一句话总结: 二.JS进阶书籍 第一阶段:<JavaScript DOM编程艺术> 看这本书之前,请先确认您对Javascript有个基本的了解,应该知道if el ...

  10. Oracle 冷备份详解【实战案例】

    Oracle 冷备份详解 --准备工作 select * from v$database; select file_name from dba_data_files; create tablespac ...