Linux C/C++实现Socks5代理及Socks5协议抓包分析

news2025/3/14 0:31:38

如果你想在保持匿名的同时以更好的安全性和性能浏览网页,SOCKS5代理是一个不错的选择。
在使用互联网时,存在许多安全和数据隐私风险。此外,您可能不得不面对一些限制。想象一下,你想访问一个网站,但你根本无法访问它,原因可能是地理限制。但是,如果你决定访问该网站怎么办?使用像SOCKS5代理这样的代理服务器可以增加安全性和隐私性。

什么是代理?

代理或代理服务器是充当用户和网络之间的中介或网关的服务器应用程序。因此,当您在计算机上启用代理的情况下在网络上搜索某个内容时,此请求会首先到达代理服务器。此服务器将评估请求,然后代表您向目标网页发出请求。一旦网页批准了请求并发送了请求的信息,它将首先到达代理服务器,然后作为用户到达您。

这意味着你的请求不会直接进入你试图访问的网页。相反,代理服务器会为您这样做,以便您的身份(如IP地址)保持隐藏。因此,目标网站无法识别或阻止您的实际IP地址,您将可以访问整个网站。通过这种方式,您可以从任何地方访问任何网站,并在访问时保护您的安全和隐私。

代理与VPN是否相同

许多人将代理与VPN混淆,认为它们是一样的。但事实并非如此。不过,它们看起来可能很相似,因为它们都用于隐藏请求网页获取信息的用户的身份。它们都通过外部服务器路由请求和响应,同时提供隐私和安全。因此,您可以在保持匿名的同时访问任何您想要的内容。

然而,存在特定的差异,因此理解代理与VPN是至关重要的。VPN对您的连接进行加密,从而提供更好的安全保护,免受黑客攻击。但代理并不能做到这一点,尽管它们提供了一定程度的安全性。

此外,还有不同类型的代理,如前向代理、透明代理、匿名代理、旋转代理、扭曲代理、数据中心代理、住宅代理、反向代理、公共代理、私有代理、Socks代理等。

让我们详细讨论一下SOCKS5。

什么是SOCKS5代理?

套接字安全(SOCKS)是一种类似HTTP/S、TCP等的网络协议,用于促进服务器之间的连接。它使用代理服务器在请求信息的用户和目标服务器之间路由数据包。这种类型的代理服务器是SOCKS代理服务器,可以路由任何程序或协议创建的任何类型的流量。

SOCKS有两个版本——SOCKS5和SOCKS4。SOCKS5支持不同的身份验证方法和UDP代理,而SOCKS4则不支持。

SOCKS5代理更安全,因为它们提供完整的TCP连接并使用SSH协议和身份验证机制。因此,传输中的每个数据包都经过验证,只有安全的数据包才能通过,从而增强安全性和隐私性。

为什么要使用SOCKS5代理服务器?

以下是使用SOCKS5对个人和企业都有益的原因:

  • 更好的性能

与其他代理不同,SOCKS5不重写数据包。相反,它在系统之间中继网络流量。因此,它涉及更少的错误并导致更好的性能。

  • 更高的安全性

它提供了比其他代理更好的安全性,因为它支持各种身份验证方法来验证身份。

  • 隐私

除了安全之外,在使用网络时最好隐藏您的个人信息或设备身份以保持匿名。

Socks5协议分析

如图这里是最简单的一个socks连接代理的过程,采用的是无用户密码认证的socks代理。我们这里忽略掉tcp三次握手和四次挥手的过程,只分析socks协议。

  • 客户端 -> 代理服务器,请求认证

以 05 01 00 为例:
Version: 5 #05,socks协议版本号
Authentication Method Count: 1 #01,客户端提供了一种认证方法
Method[0]: 0 (No authentication) #00对应的方法字段,无需身份验证

V5身份验证方法:

#define NO_AUTHENTICATION           0
#define GSS_API_AUTHENTICATION      1
#define USER_NAME_AUTHENTICATION    2
#define CHAP_AUTHENTICATION         3
#define AUTHENTICATION_FAILED       0xff

  • 代理服务器 -> 客户端,响应认证

这里服务端的响应只有两个字节,版本号和确认认证的方法,0x00,则无需客户端发送进一步认证的信息。

由于我代码中设置的是无需用户密码认证,所以这里响应为 05 00 。

  • 客户端 -> 代理服务器,发送目标信息

Socks命令:

#define CONNECT_COMMAND         1
#define BIND_COMMAND            2
#define UDP_ASSOCIATE_COMMAND   3
#define PING_COMMAND            0x80
#define TRACERT_COMMAND         0x81
  • 代理服务器 -> 客户端,确认连接

    在代理服务器确认回应为 0x00 时,此次 SOCKS5 协议协商部分顺利完成,然后就是数据传输阶段。

Linux C/C++实现Socks5代理

bool method_exists(struct method_request * method_req, uint8_t method);
void get_uname_passwd(struct auth_request * req, uint8_t * ulen, uint8_t ** uname, uint8_t * plen, uint8_t ** passwd);
in_addr_t get_dst_addr(union dst_or_bnd * dst, uint8_t atyp);
in_port_t get_dst_port(union dst_or_bnd * dst, uint8_t atyp);
uint8_t * get_payload(struct datagram * dgram, int buflen, int * len);
void udp_relay_cb(struct event_data * fd_data);
void tcp_relay_cb(struct event_data * fd_data);
void request_cb(struct event_data * fd_data);
void auth_cb(struct event_data * fd_data);
void handshake_cb(struct event_data * fd_data);
void accept_cb(struct event_data * fd_data);
bool load_users(const char * path);

int main(int argc, char * argv[])
{
...

    if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) 
    {
        error("signal");
        exit(EXIT_FAILURE);
    }

    bool daemon = false;
    in_addr_t addr = htonl(DEFAULT_ADDR);
    in_port_t port = htons(DEFAULT_PORT);

...
    for (;;) 
    {
        opt = getopt(argc, argv, ":a:p:u:dhv");
        if (opt == -1) break;
        switch (opt) {
            case 'a':
                addr = inet_addr(optarg);
                break;
            case 'p':
                port = htons(atoi(optarg));
                break;
            case 'u':
                if (!load_users(optarg)) exit(EXIT_FAILURE);
                method = USERNAME_PASSWORD;
                after_handshake = auth_cb;
                break;
            case 'd':
                daemon = true;
                break;
            case 'h':
                usage(argv[0]);
                exit(EXIT_SUCCESS);
            case 'v':
                verbose = true;
                break;
            case ':':
                printf("Missing argument after: -%c\n", optopt);
                usage(argv[0]);
                exit(EXIT_FAILURE);
            case '?':
                printf("Invalid argument: -%c\n", optopt);
                usage(argv[0]);
                exit(EXIT_FAILURE);
        }
    }

    if (method == USERNAME_PASSWORD) 
    {
        puts("USERNAME/PASSWORD");
        printf("%d users\n", nusers);
    } else 
    {
        puts("NO AUTHENTICATION REQUIRED");
    }

    int fd = create_and_listen(addr, port);
    if (!fd) exit(EXIT_FAILURE);
    printf("Listening on %s:%hu\n", inet_ntoaddr(&addr), ntohs(port));

    if (daemon) 
    {
        pid_t pid = fork();
        if (pid == -1) 
        {
            perror("fork");
            exit(EXIT_FAILURE);
        }
        if (pid > 0) 
        {
            printf("PID is %d\n", pid);
            exit(EXIT_SUCCESS);
        }
    }

...
}

If you need the complete source code, please add the WeChat number (c17865354792)

选项 -a 和 -p 分别用来指定服务器绑定的 IP 地址和端口号。

选项 -u 用于开启用户名密码认证方式,选项后面必须跟上一个文件的路径。该文件的每一行对应一个用户,用户名和密码之间用逗号 , 隔开,例如:

代码运行代码后需要在Chrome 、Firefox 浏览器设置: socks 主机填写 127.0.0.1, 端口填写: 1080, 选择 SOCKS v5 代理.

使用 curl 测试:

curl --socks5 127.0.0.1:1080 https://www.baidu.com

总结

代理被认为是确保您的在线活动保持隐私的最佳方式之一。现在有很多代理类型,有些是基本的,有些是高级的。但是,要在SOCKS5和HTTP代理之间做出选择,需要深入了解每种类型的工作方式以及它们传达的配置。只有这样,才能为您的特定用例选择最佳选项。

Welcome to follow WeChat official account【程序猿编码

参考:https://www.rfc-editor.org/rfc/pdfrfc/rfc1929.txt.pdf
https://www.rfc-editor.org/rfc/pdfrfc/rfc1928.txt.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/761624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】从执行计划了解MySQL优化策略

文章目录 前言一、什么是执行计划1.1. 使用EXPLAIN命令1.2. 使用PROFILING 二、执行计划生成过程三、执行计划的操作符3.1. 查询计划操作符3.2. 连接操作符3.3. 辅助操作符 四、执行计划的诊断分析4.1. 使用EXPLAIN命令4.2. 检查索引4.3. 分析查询日志 五、如何分析 EXPLAIN 结…

pytorch 欠拟合和过拟合 多项式回归

欠拟合 训练误差和验证误差都有,还可能比较严重, 但它们之间仅有差距不大。 这个时候模型不能降低训练的误差,有可能是我们设计的模型简单了,表达能力不足, 捕获试图学习的模式比较难。由于我们的训练和验证误差之间的…

java——this、封装、static修饰成员变量、成员方法

目录 ☂️this的用法 1.访问当前对象的成员变量 2.访问当前对象的成员方法 3.调用当前对象的其他构造方法来简化代码 ☂️封装 什么是封装? 访问修饰限定符 ☂️static修饰成员变量 ☂️static修饰成员方法 ☂️this的用法 1.访问当前对象的成员变量 我们…

容器运行时

容器运行时 Docker运行时Containerd运行时CRI 版本支持Containerd安装配置 systemd cgroup 驱动 CRI-O运行时Mirantis 容器运行时 目前k8s支持的几个常用的运行时 containerdCRI-ODocker EngineMirantis Container Runtime v1.24 之前的 Kubernetes 版本直接集成了 Docker Engi…

IDEA+spring boot+activiti+shiro+layui+Mysql权限管理系统源码

IDEAspring bootactivitishirolayuiMysql权限管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.主页3.用户管理4.部门管理5. 菜单管理6. 角色管理7. 字典管理8.定时任务9.操作日志10.生成管理 三、部分代码UserMapper.javaUserController.javaUser.java 四、其他获…

Python Flask构建微信小程序订餐系统 (七)

🔥 账号管理显示状态 🔥 账号管理选择状态后并显示 修改前 修改后 运行效果 🔥 账号管理执行账号的删除 🔥 修改前 修改后 这里使用的图标库 font awesome</

引入Vue的方式

1.cdn引入 <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

竞赛管理系统实现自动化测试

目录 一、为竞赛管理系统设计测试用例 二、根据测试用例进行测试 登录页面测试 功能测试 界面测试 用户注册页面 功能测试 界面测试 竞赛信息列表页面测试 界面测试 添加竞赛信息页面测试 功能测试 界面测试 修改竞赛信息页面测试 功能测试 一、为竞赛管理…

Rollup 的作用、使用教程、支持 Vue、以及与 Webpack / Babel 的区别

一、前置知识 没接触过前端模块化概念的同学可先参考&#xff1a;JS & Node 模块化解释&#xff1a;AMD、UMD、CommonJS、 ESM 二、什么是 Rollup &#xff1f; Rollup 工具可以将代码转成不同模块&#xff0c;实现一套代码多端&#xff08;浏览器/Node&#xff09;引入…

SpringBoot的静态资源文件访问问题

一、采用默认的文件存放位置&#xff1a; Spring Boot 对静态资源映射提供了默认配置&#xff0c; 默认将 /** 所有访问映射到以下目录&#xff1a; classpath:/static classpath:/public classpath:/resources classpath:/META-INF/resources在如上路径的文件可以被直接访问…

Havoc!新的开源命令和控制C2框架

工具介绍 Havoc是一款现代化可扩展的后渗透命令控制框架&#xff0c;可作为Cobalt Strike和Brute Ratel等付费选项的替代方案。 关注【Hack分享吧】公众号&#xff0c;回复关键字【230618】获取下载链接 Havoc包含各种各样的模块&#xff0c;允许渗透测试人员&#xff08;和黑…

Rust 数据类型 之 结构体(Struct)

目录 结构体&#xff08;Struct&#xff09; 定义与声明 结构体定义 结构体实例 结构体分类 单元结构体&#xff08;Unit Struct&#xff09; 元组结构体&#xff08;Tuple Struct&#xff09; 具名结构体&#xff08;Named Struct&#xff09; 结构体嵌套 结构体方法…

华为云ROMA Connect 的智能集成 – 现代企业数字化转型的新利器

在当今数字信息智能化的时代&#xff0c;人工智能技术逐渐深入企业的生产流程和实践中。人工智能的应用成为现代企业数字化转型的新利器。华为云的ROMA Connect作为企业级的融合集成服务 EiPaaS平台&#xff0c;从今年开始也进入了人工智能技术&#xff0c;针对几个主要的企业集…

新一代iPaaS全域融合集成平台ROMA Connect HDC.Cloud 2023内容值得再读!

华为云下一代ROMA Connect HDC.Cloud 2023 精彩内容摘要&#xff1a; 7月9号 分论坛上嘉宾分享一站式融合集成平台解决的用户痛点、应用场景、新一代全域升级的新特性、以及伙伴分享案例干活 ROMA Connect 展台提供开发者体验全新升级版ROMA Connect的 AI智能集成 HDC.Cloud…

华为OD机试真题 Java 实现【战场索敌】【2023 B卷 100分】,深度优先搜索dfs算法,这眼花缭乱的,你这是“战场索鬼”吧?

目录 专栏导读一、题目描述二、输入描述三、输出描述四、深度优先搜索dfs五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明4、如果增加目标敌人数量K为55、来&#xff0c;上强度 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于…

从零开始 Spring Cloud 4:Nacos

从零开始 Spring Cloud 4&#xff1a;Nacos 图源&#xff1a;laiketui.com Nacos 是 Alibaba 研发的用于 Spring Cloud Alibaba 的服务注册中心组件&#xff0c;符合 Spring Cloud 官方标准&#xff0c;同样被 Spring Cloud 官方接纳&#xff0c;所以我们可以在 Spring Cloud …

FPGA XDMA 中断模式实现 PCIE3.0 测速试验 提供工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案XDMA简介XDMA中断模式QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采用了目前业内流行的点对点串行连接&#xf…

同步和异步的区别

同步&#xff0c;可以理解为在执行完一个函数或方法之后&#xff0c;一直等待系统返回值或消息&#xff0c;这时程序是处于阻塞的&#xff0c;只有接收到返回的值或消息后才往下执行其他的命令&#xff1b; 异步&#xff0c;执行完函数或方法后&#xff0c;不必阻塞性地等待返回…

缓存服务使用总结

1、介绍 分布式缓存方案缓存服务搭建 2、分布式缓存方案&#xff08;重点掌握&#xff09; 2.1、什么是缓存 通常将数据从数据库中同步一份到内存中&#xff0c;客户端直接从内存中查询数据&#xff0c;减少了和数据库的交互次数&#xff0c;提高查询性能&#xff08;因为内…

什么是 WebSocket?Java 中如何实现 WebSocket?

什么是 WebSocket&#xff1f;Java 中如何实现 WebSocket&#xff1f; WebSocket 简介 WebSocket 是一种新型的网络协议&#xff0c;它允许客户端和服务器之间进行双向通信&#xff0c;可以实现实时数据交互。WebSocket 协议是基于 HTTP 协议的&#xff0c;使用标准的 TCP 连…