forked from w910820618/shadowsocks
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
wu
committed
Jan 12, 2021
1 parent
f754640
commit 7943e66
Showing
1 changed file
with
70 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,72 @@ | ||
# 基于 Golang 实现的 Shadowsocks 源码解析 | ||
|
||
你好,欢迎来到**洲洋的编程课堂**! | ||
|
||
本人邮箱:w910820618@126.com ,欢迎交流讨论学习相关的内容。 | ||
|
||
欢迎转载,转载请标注 :**洲洋的编程课堂**。 | ||
|
||
--- | ||
|
||
本教程是基于 **github.com/shadowsocks/go-shadowsocks2**项目,我将通过分析该项目的源码来帮助大家学习如何通过Golang来实现一个隧道代理转发工具。 | ||
|
||
我会把重点代码罗列出来,方便大家在阅读源码的时候能够找到代码的主线。 | ||
|
||
本教程主要会从以下四个问题入手: | ||
|
||
1. [什么是隧道代理?](#什么是隧道代理?) | ||
2. [本教程的实验环境是什么样的?实现本教程中的示例都需要提前准备哪些条件?](#本教程的实验环境是什么样的?实现本教程中的示例都需要提前准备哪些条件?) | ||
3. [Shadowsocks是如何实现隧道代理的?](#Shadowsocks是如何实现隧道代理的?) | ||
4. [我们可以学习到哪些技术点?](#我们可以学习到哪些技术点?) | ||
|
||
## 1. 什么是隧道代理? | ||
|
||
隧道代理是两个技术的结合,本别是隧道+代理两个技术的结合,分别来解释一下这个词语。 | ||
|
||
### 1.1 代理 (Proxy) | ||
|
||
代理(英语:Proxy)也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。 | ||
|
||
![](https://raw.githubusercontent.com/w910820618/shadowsocks/master/images/proxy.jpg) | ||
|
||
上图中,代理服务器既是服务器又是客户端。客户端向代理发送请求报文,代理服务器必须向服务器一样,正确的处理请求和连接,然后返回响应。同时,代理自身要向服务器发送请求,这样,其行为必须像正确的客户端一样,要发送请求并接收响应。 | ||
|
||
代理服务器的特点: | ||
|
||
- 客户端不知道真正的服务器是谁,服务器也不知道客户端是什么样的 | ||
- 客户端同代理服务器,代理服务器同服务器,这两者之间使用的通讯协议是一样的 | ||
- 代理服务器会对接收的请求进行解析,重新封装后再发送给服务器;在服务器响应后,对响应进行解析,重新封装后再发送给客户端。 | ||
|
||
### 1.2 隧道 (Tunnel) | ||
|
||
隧道(英语:Tunneling )是一种网络通讯协议,在其中,使用一种网络协议(发送协议),将另一个不同的网络协议,封装在负载部分。使用隧道的原因是在不兼容的网络上传输数据,或在不安全网络上提供一个安全路径。 | ||
|
||
![](https://raw.githubusercontent.com/w910820618/shadowsocks/master/images/tunnel_pro.jpg) | ||
|
||
隧道的特点: | ||
|
||
- 该协议是为承载协议自身以外的流量而编写的协议 | ||
- 允许数据从一个网络移动到另一个网络 | ||
- 只关心流量的传输,不对承载的流量进行解析 | ||
|
||
## 2. 本教程的实验环境是什么样的?实现本教程中的示例都需要提前准备哪些条件? | ||
|
||
![](https://raw.githubusercontent.com/w910820618/shadowsocks/master/images/tunnel.jpg) | ||
|
||
上图就是本实验的网络架构图,下面说明一下架构图的含义: | ||
|
||
- 其中有两个192.168.0.0和192.168.1.0网段的IP 的虚拟机,用它作为**中转机**; | ||
- 192.168.1.105、192.168.1.106以及192.168.1.107这三台机器作用**目的端**; | ||
- 192.168.0.103 这台机器作为**客户端**; | ||
- 搭建从192.168.0.103 到 192.168.0.104 之间的隧道代理,使 客户端(192.168.0.103)可以访问到 目的端 的内容。 | ||
|
||
本实验中所需要的基本开发环境: | ||
|
||
- 三台Ubuntu 18.04 的虚拟机 | ||
- Golang 的编译环境 (1.15以上) | ||
- IDE 可自选 | ||
|
||
## 3. Shadowsocks是如何实现隧道代理的? | ||
|
||
## 4. 我们可以学习到哪些技术点? | ||
|