SOCKS协议完全指南:原理、部署与使用教程

SOCKS协议完全指南:原理、部署与使用教程

摘要

本文全面介绍SOCKS协议,从协议发展历程、技术原理到实际部署进行详细讲解。内容涵盖SOCKS4、SOCKS4a、SOCKS5三个版本的区别,协议工作原理与握手过程,服务端部署(包括Dante、Shadowsocks等),各平台客户端配置使用,以及安全性注意事项。旨在帮助读者深入理解SOCKS协议并掌握其实际应用。

一、SOCKS协议介绍

1.1 什么是SOCKS协议

SOCKS(Socket Secure)是一种网络传输协议,工作于OSI模型的会话层,用于在客户端和服务器之间通过代理服务器进行数据转发。SOCKS协议最初由David Koblas开发,后由NEC的Ying-Da Lee扩展为SOCKS4和SOCKS5。

SOCKS协议的核心思想是:通过代理服务器中转网络连接,使客户端能够间接访问目标服务器,同时隐藏客户端的真实IP地址。

graph LR
A[SOCKS协议] --> B[SOCKS4]
A --> C[SOCKS4a]
A --> D[SOCKS5]

B --> B1[仅TCP]
B --> B2[无认证]

C --> C1[域名解析]
C --> C2[无认证]

D --> D1[TCP/UDP]
D --> D2[多种认证]
D --> D3[IPv6支持]

1.2 SOCKS协议版本对比

1.2.1 SOCKS4

SOCKS4是协议的最早版本,发布于1992年:

特性说明
协议版本4
支持协议仅TCP
认证方式无认证(可选用户ID)
地址类型仅IPv4
域名解析不支持,需客户端解析
端口范围任意

限制

  • 不支持UDP协议
  • 不支持域名远程解析
  • 无安全认证机制
  • 仅支持IPv4地址

1.2.2 SOCKS4a

SOCKS4a是SOCKS4的简单扩展,解决了域名解析问题:

特性说明
协议版本4a(兼容SOCKS4)
域名支持支持域名远程解析
地址类型IPv4 + 域名
认证方式无认证(可选用户ID)

改进

  • 支持域名格式的目标地址
  • 由代理服务器进行DNS解析
  • 避免客户端DNS泄露

1.2.3 SOCKS5

SOCKS5是最新版本,发布于1996年(RFC 1928),大幅增强了功能:

特性说明
协议版本5
支持协议TCP + UDP
认证方式无认证/用户名密码/GSSAPI
地址类型IPv4/IPv6/域名
加密支持可配合TLS使用
安全性支持多种认证方法

新特性

  • 支持UDP协议(适用于DNS查询、视频流等)
  • 多种认证机制
  • 完整的IPv6支持
  • 更强的安全性

1.3 版本功能对比

特性SOCKS4SOCKS4aSOCKS5
TCP支持
UDP支持
IPv4支持
IPv6支持
域名支持
认证机制多种
安全性中高
性能开销最低中等

1.4 适用场景

SOCKS协议适用于以下场景:

  • 企业内网代理:通过代理服务器访问外网资源
  • 匿名访问:隐藏客户端真实IP地址
  • 流量转发:作为其他代理协议的基础传输层
  • 爬虫应用:通过代理池分散请求来源
  • 游戏加速:UDP支持适合游戏流量转发
  • 安全测试:渗透测试中的流量转发

重要说明:SOCKS协议本身不对数据进行加密,建议配合加密传输(如TLS)使用,或作为其他加密代理的底层传输。

1.5 与其他代理协议对比

特性SOCKS5HTTP代理ShadowsocksTrojan
协议层会话层应用层应用层应用层
支持协议TCP/UDPHTTP/HTTPSTCP/UDPTCP
认证方式多种基本/无密码密码
加密传输HTTPS可加密是(TLS)
流量伪装HTTP特征HTTPS特征
性能中高
抗检测

二、协议工作原理

2.1 SOCKS5握手流程

SOCKS5协议的连接建立分为三个阶段:认证协商、连接请求、数据传输。

sequenceDiagram
participant C as 客户端
participant P as SOCKS代理
participant T as 目标服务器

Note over C,P: 阶段1: 认证协商
C->>P: 0x05 0xXX 0xXX... (版本+认证方法列表)
P->>C: 0x05 0xXX (版本+选择的认证方法)

opt 需要用户名密码认证
C->>P: 0x01 用户名长度 用户名 密码长度 密码
P->>C: 0x01 0x00 (认证成功)
end

Note over C,P: 阶段2: 连接请求
C->>P: 0x05 0xXX 0x00 地址类型 目标地址 目标端口
P->>C: 0x05 0x00 0x00 地址类型 绑定地址 绑定端口

Note over C,T: 阶段3: 数据传输
C->>P: 应用数据
P->>T: 转发数据
T->>P: 响应数据
P->>C: 转发响应

2.2 协议数据包格式

2.2.1 认证协商请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
客户端请求格式:
┌────────────────────────────────────────────────────┐
│ VER(1B) │ NMETHODS(1B) │ METHODS(1-255B) │
├────────────────────────────────────────────────────┤
0x05 │ 0xXX │ 0x00/0x01/0x02...
└────────────────────────────────────────────────────┘

字段说明:
- VER: SOCKS版本,固定为0x05
- NMETHODS: 支持的认证方法数量
- METHODS: 认证方法列表
- 0x00: 无需认证
- 0x01: GSSAPI
- 0x02: 用户名/密码
- 0x03-0x7F: IANA分配
- 0x80-0xFE: 私有方法
- 0xFF: 无可用方法

2.2.2 认证协商响应

1
2
3
4
5
6
7
8
9
10
11
服务器响应格式:
┌─────────────────────────┐
│ VER(1B) │ METHOD(1B)
├─────────────────────────┤
│ 0x05 │ 0xXX
└─────────────────────────┘

METHOD字段:
- 0x00: 无需认证,直接进入连接阶段
- 0x02: 需要用户名密码认证
- 0xFF: 不支持任何认证方法,连接关闭

2.2.3 用户名密码认证(方法0x02)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
认证请求格式(RFC 1929):
┌───────────────────────────────────────────────────────────┐
VER(1B) │ ULEN(1B) │ UNAME(ULEN) │ PLEN(1B) │ PASSWD(PLEN)│
├───────────────────────────────────────────────────────────┤
0x01 │ XX │ ... │ XX │ ... │
└───────────────────────────────────────────────────────────┘

认证响应格式:
┌─────────────────────────┐
VER(1B) │ STATUS(1B) │
├─────────────────────────┤
0x01 │ 0xXX │
└─────────────────────────┘

STATUS字段:
- 0x00: 认证成功
- 其他: 认证失败

2.2.4 连接请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
客户端请求格式:
┌─────────────────────────────────────────────────────────────────┐
│ VER(1B) │ CMD(1B) │ RSV(1B) │ ATYP(1B) │ DST.ADDR │ DST.PORT(2B)│
├─────────────────────────────────────────────────────────────────┤
│ 0x05 │ 0xXX │ 0x00 │ 0xXX │ ... │ ... │
└─────────────────────────────────────────────────────────────────┘

字段说明:
- VER: SOCKS版本,固定为0x05
- CMD: 命令类型
- 0x01: CONNECT(TCP连接)
- 0x02: BIND(绑定端口,用于FTP等)
- 0x03: UDP ASSOCIATE(UDP关联)
- RSV: 保留字段,固定为0x00
- ATYP: 地址类型
- 0x01: IPv4地址(4字节)
- 0x03: 域名地址(1字节长度 + 域名)
- 0x04: IPv6地址(16字节)
- DST.ADDR: 目标地址
- DST.PORT: 目标端口(2字节,大端序)

2.2.5 连接响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
服务器响应格式:
┌─────────────────────────────────────────────────────────────────┐
│ VER(1B) │ REP(1B) │ RSV(1B) │ ATYP(1B) │ BND.ADDR │ BND.PORT(2B)│
├─────────────────────────────────────────────────────────────────┤
│ 0x05 │ 0xXX │ 0x00 │ 0xXX │ ... │ ... │
└─────────────────────────────────────────────────────────────────┘

REP字段(响应状态):
- 0x00: 成功
- 0x01: 通用SOCKS服务器错误
- 0x02: 不允许的连接
- 0x03: 网络不可达
- 0x04: 主机不可达
- 0x05: 连接被拒绝
- 0x06: TTL超时
- 0x07: 不支持的命令
- 0x08: 不支持的地址类型
- 0x09-0xFF: 未分配

2.3 UDP关联(UDP ASSOCIATE)

SOCKS5支持UDP转发,通过UDP ASSOCIATE命令实现:

1
2
3
4
5
6
7
8
9
10
11
12
UDP数据包格式:
┌─────────────────────────────────────────────────────────────────┐
RSV(2B) │ FRAG(1B) │ ATYP(1B) │ DST.ADDR │ DST.PORT(2B) │ DATA │
├─────────────────────────────────────────────────────────────────┤
0x0000 │ 0xXX │ 0xXX │ ... │ ... │ ... │
└─────────────────────────────────────────────────────────────────┘

字段说明:
- RSV: 保留字段,固定为0x0000
- FRAG: 分片编号(0x00表示未分片)
- ATYP/DST.ADDR/DST.PORT: 目标地址信息
- DATA: 实际UDP负载数据

UDP注意:SOCKS5的UDP支持需要先建立TCP控制连接,UDP数据通过该连接关联。断开TCP连接时,UDP关联也会终止。

2.4 SOCKS4协议格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SOCKS4请求格式:
┌────────────────────────────────────────────────────────────┐
│ VER(1B) │ CMD(1B) │ DST.PORT(2B) │ DST.ADDR(4B) │ USERID │
├────────────────────────────────────────────────────────────┤
0x040x01 │ ... │ IPv4 │ ...\0
└────────────────────────────────────────────────────────────┘

SOCKS4响应格式:
┌─────────────────────────────────────────────┐
│ VN(1B) │ CD(1B) │ DSTPORT(2B) │ DSTADDR(4B) │
├─────────────────────────────────────────────┤
0x000x5A/0x5B │ ... │ ... │
└─────────────────────────────────────────────┘

CD字段:
- 0x5A: 请求批准
- 0x5B: 请求拒绝或失败
- 0x5C: 请求失败(未连接identd)
- 0x5D: 请求失败(用户ID不匹配)

2.5 SOCKS4a扩展

SOCKS4a在SOCKS4基础上增加了域名支持:

1
2
3
4
5
6
7
8
9
SOCKS4a请求格式:
┌────────────────────────────────────────────────────────────────────────┐
│ VER │ CMD │ DST.PORT │ DST.IP(0.0.0.x) │ USERID │ NULL │ DOMAIN │ NULL
├────────────────────────────────────────────────────────────────────────┤
0x040x01...0.0.0.x(x≠0) │ ...\00x00...0x00
└────────────────────────────────────────────────────────────────────────┘

说明:当DST.IP字段的前3字节为0x00,第4字节不为0时,
表示使用域名地址,域名跟在USERID之后。

三、服务端部署教程

3.1 环境准备

3.1.1 服务器要求

项目最低要求推荐配置
CPU1核2核+
内存128MB512MB+
存储2GB10GB+
带宽10Mbps50Mbps+
系统CentOS 7+/Debian 9+/Ubuntu 18.04+最新稳定版

3.1.2 端口规划

服务端口说明
SOCKS代理1080默认端口
SOCKS代理10808备用端口
管理接口1081流量统计(可选)

3.2 Dante服务器部署

Dante是最流行的SOCKS代理服务器实现之一。

3.2.1 安装Dante

Ubuntu/Debian安装

1
2
3
4
5
6
7
8
# 更新软件源
sudo apt update

# 安装Dante
sudo apt install dante-server -y

# 验证安装
danted -v

CentOS/RHEL安装

1
2
3
4
5
6
7
8
# 安装EPEL源
sudo yum install epel-release -y

# 安装Dante
sudo yum install dante-server -y

# 验证安装
danted -v

源码编译安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 下载源码
wget https://www.inet.no/dante/files/dante-1.4.3.tar.gz

# 解压
tar -xzf dante-1.4.3.tar.gz
cd dante-1.4.3

# 配置编译选项
./configure --prefix=/usr/local/dante

# 编译安装
make
sudo make install

# 创建符号链接
sudo ln -s /usr/local/dante/sbin/danted /usr/sbin/danted

3.2.2 Dante配置文件

创建配置文件 /etc/danted.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# /etc/danted.conf - Dante SOCKS代理服务器配置

# 日志配置
logoutput: /var/log/danted.log

# 内部网络接口(接收客户端连接)
internal: 0.0.0.0 port = 1080

# 外部网络接口(连接目标服务器)
external: eth0

# 认证方法
# method: username - 使用用户名密码认证
# method: none - 无需认证(不推荐)
# method: rfc931 - 使用identd认证
clientmethod: none
socksmethod: username

# 用户权限控制
user.privileged: proxy
user.unprivileged: nobody

# 访问控制规则
# 允许所有客户端连接
client pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: error connect disconnect
}

# 允许认证用户访问所有目标
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
command: bind connect udpassociate
log: error connect disconnect
socksmethod: username
}

# 拒绝其他访问
socks block {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
}

3.2.3 创建认证用户

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建sockd用户组
sudo groupadd sockd

# 创建代理用户
sudo useradd -r -g sockd -s /bin/false sockduser1

# 设置密码
sudo passwd sockduser1

# 或者使用htpasswd创建(推荐用于多用户)
sudo apt install apache2-utils
sudo htpasswd -c /etc/danted.passwd user1
sudo htpasswd /etc/danted.passwd user2

3.2.4 无认证配置(仅限可信环境)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 无认证配置(不推荐用于公网)
logoutput: /var/log/danted.log

internal: 0.0.0.0 port = 1080
external: eth0

# 无需认证
clientmethod: none
socksmethod: none

user.privileged: root
user.unprivileged: nobody

# 允许特定IP访问
client pass {
from: 192.168.1.0/24 to: 0.0.0.0/0
log: error
}

socks pass {
from: 192.168.1.0/24 to: 0.0.0.0/0
log: error
}

3.2.5 启动和管理服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 启动服务
sudo systemctl start danted

# 停止服务
sudo systemctl stop danted

# 重启服务
sudo systemctl restart danted

# 查看状态
sudo systemctl status danted

# 开机自启
sudo systemctl enable danted

# 查看日志
sudo tail -f /var/log/danted.log

3.2.6 验证服务

1
2
3
4
5
6
7
8
# 检查端口监听
sudo netstat -tlnp | grep 1080

# 使用curl测试
curl --socks5 127.0.0.1:1080 http://ifconfig.me

# 带认证测试
curl --socks5 127.0.0.1:1080 -U user1:password1 http://ifconfig.me

3.3 3proxy部署

3proxy是另一款轻量级代理服务器,支持多种代理协议。

3.3.1 安装3proxy

1
2
3
4
5
6
7
8
9
# 下载源码
git clone https://github.com/3proxy/3proxy.git
cd 3proxy

# 编译
make -f Makefile.linux

# 安装
sudo make -f Makefile.linux install

3.3.2 3proxy配置文件

创建配置文件 /etc/3proxy/3proxy.cfg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# /etc/3proxy/3proxy.cfg

# 以nobody用户运行
setgid 65534
setuid 65534

# 日志配置
log /var/log/3proxy.log D
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
rotate 30

# DNS配置
nserver 8.8.8.8
nscache 65536

# 超时设置
timeouts 1 5 30 60 180 1800 15 60

# 用户认证(用户名:明文密码)
users user1:CL:password1
users user2:CL:password2

# 认证方式
auth strong
allow user1,user2

# SOCKS5代理(端口1080)
socks -p1080

# SOCKS4代理(端口1081)
# socks4 -p1081

# HTTP代理(端口8080,可选)
# proxy -p8080

# 管理接口(可选)
# admin -p3128

3.3.3 启动3proxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建日志目录
sudo mkdir -p /var/log/3proxy

# 测试配置
sudo 3proxy /etc/3proxy/3proxy.cfg

# 创建systemd服务
sudo cat > /etc/systemd/system/3proxy.service << 'EOF'
[Unit]
Description=3proxy Proxy Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/3proxy /etc/3proxy/3proxy.cfg
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
sudo systemctl daemon-reload
sudo systemctl start 3proxy
sudo systemctl enable 3proxy

3.4 Shadowsocks SOCKS模式

Shadowsocks可以作为SOCKS5代理服务端使用。

3.4.1 安装Shadowsocks-libev

1
2
3
4
5
6
7
# Debian/Ubuntu
sudo apt update
sudo apt install shadowsocks-libev -y

# CentOS
sudo yum install epel-release -y
sudo yum install shadowsocks-libev -y

3.4.2 配置文件

创建 /etc/shadowsocks-libev/config.json

1
2
3
4
5
6
7
8
9
10
{
"server": "0.0.0.0",
"server_port": 8388,
"password": "your_strong_password",
"timeout": 300,
"method": "aes-256-gcm",
"fast_open": true,
"nameserver": "8.8.8.8",
"mode": "tcp_and_udp"
}

3.4.3 启动服务

1
2
3
4
5
6
# 启动服务
sudo systemctl start shadowsocks-libev
sudo systemctl enable shadowsocks-libev

# 查看状态
sudo systemctl status shadowsocks-libev

说明:Shadowsocks本身是加密代理协议,客户端连接后会在本地监听SOCKS5端口(默认1080),而不是直接暴露SOCKS服务。

3.5 防火墙配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Ubuntu/Debian (ufw)
sudo ufw allow 1080/tcp comment 'SOCKS5 proxy'
sudo ufw allow 1080/udp comment 'SOCKS5 UDP'
sudo ufw reload

# CentOS (firewalld)
sudo firewall-cmd --permanent --add-port=1080/tcp
sudo firewall-cmd --permanent --add-port=1080/udp
sudo firewall-cmd --reload

# iptables
sudo iptables -A INPUT -p tcp --dport 1080 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 1080 -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4

3.6 安全加固建议

3.6.1 限制访问IP

1
2
3
4
5
6
7
8
9
10
# Dante配置 - 仅允许特定IP
client pass {
from: 203.0.113.0/24 to: 0.0.0.0/0
log: error connect
}

client block {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
}

3.6.2 使用强密码

1
2
3
4
5
# 生成强密码
openssl rand -base64 24

# 或者
tr -dc 'A-Za-z0-9!@#$%^&*()_+' < /dev/urandom | head -c 24

3.6.3 启用流量限制

1
2
3
4
5
6
7
8
# 3proxy流量限制配置
# 限制每个用户最大10GB流量
nscache 65536
nscache6 65536

# 用户配额(字节)
users user1:CL:password1:10000000000
users user2:CL:password2:10000000000

3.6.4 系统安全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 更新系统
sudo apt update && sudo apt upgrade -y

# 2. 安装fail2ban(防止暴力破解)
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# 3. 禁用不必要的服务
sudo systemctl disable --now telnet
sudo systemctl disable --now rsh-server

# 4. 配置SSH安全
sudo sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart sshd

四、客户端使用指南

4.1 各平台客户端推荐

平台客户端特点推荐度
WindowsProxifier全局代理,应用级控制★★★★★
WindowsProxyCap稳定可靠,规则灵活★★★★☆
Windowsv2rayN多协议支持,配置简单★★★★★
macOSProxifier for Mac功能强大,规则丰富★★★★★
macOSClash Verge Rev规则丰富,界面美观★★★★★
macOSSurma轻量级,菜单栏运行★★★★☆
Linuxproxychains命令行工具,简单易用★★★★★
Linuxredsocks透明代理,配合iptables★★★★☆
Androidv2rayNG主流客户端,支持SOCKS★★★★★
AndroidPostern专业代理工具,规则强大★★★★☆
iOSShadowrocket功能全面,支持SOCKS5★★★★★
iOSQuantumult X规则自定义,功能强大★★★★★

4.2 Windows客户端配置

4.2.1 Proxifier配置

基本设置

  1. 下载安装Proxifier(官网或GitHub)
  2. 打开Proxifier,点击"Profile" → “Proxy Servers” → “Add”
  3. 配置SOCKS代理:
字段填写内容
Address代理服务器IP
Port1080
ProtocolSOCKS Version 5
Authentication按需填写用户名密码
  1. 点击"Check"测试连接
  2. 配置代理规则(Profile → Proxification Rules)

配置示例

1
2
3
4
5
6
7
8
9
10
11
代理服务器配置:
Address: 203.0.113.100
Port: 1080
Protocol: SOCKS5
Username: user1
Password: password1

代理规则:
- 浏览器程序 → 通过SOCKS5代理
- 系统程序 → Direct(直连)
- 其他程序 → 通过SOCKS5代理

4.2.2 v2rayN配置SOCKS入站

v2rayN可以作为SOCKS5客户端使用:

  1. 打开v2rayN
  2. 点击"服务器" → “添加SOCKS服务器”
  3. 填写配置:
项目内容
地址代理服务器IP
端口1080
用户名(如需认证)
密码(如需认证)

4.2.3 使用命令行测试

1
2
3
4
5
6
7
8
9
10
11
# PowerShell通过SOCKS5代理访问
# 需要先安装curl或其他支持SOCKS的工具

# 使用curl测试
curl --socks5 203.0.113.100:1080 http://ifconfig.me

# 带认证测试
curl --socks5 203.0.113.100:1080 -U user1:password1 http://ifconfig.me

# 测试UDP(需要支持SOCKS5 UDP的工具)
# 推荐使用proxychains或专门的测试工具

4.3 macOS客户端配置

4.3.1 Proxifier for Mac配置

配置步骤与Windows版本类似:

  1. 打开Proxifier
  2. 添加代理服务器:
    • 地址:203.0.113.100
    • 端口:1080
    • 协议:SOCKS5
  3. 配置规则

4.3.2 终端使用SOCKS代理

1
2
3
4
5
6
7
8
9
10
11
# 使用curl
curl --socks5 203.0.113.100:1080 http://ifconfig.me

# 使用SSH通过SOCKS代理
ssh -o ProxyCommand='nc -X 5 -x 203.0.113.100:1080 %h %p' user@target.host

# 配置环境变量(部分程序支持)
export ALL_PROXY=socks5://user1:password1@203.0.113.100:1080

# 取消代理
unset ALL_PROXY

4.3.3 Clash Verge Rev配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 配置文件示例
proxies:
- name: "SOCKS5节点"
type: socks5
server: 203.0.113.100
port: 1080
username: user1
password: password1
# skip-cert-verify: true # 跳过证书验证(不推荐)
udp: true

proxy-groups:
- name: "代理选择"
type: select
proxies:
- "SOCKS5节点"
- DIRECT

rules:
- GEOIP,CN,DIRECT
- MATCH,代理选择

4.4 Linux客户端配置

4.4.1 proxychains配置

安装proxychains

1
2
3
4
5
6
7
8
# Debian/Ubuntu
sudo apt install proxychains4 -y

# CentOS/RHEL
sudo yum install proxychains-ng -y

# Arch Linux
sudo pacman -S proxychains-ng

配置文件 /etc/proxychains4.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# /etc/proxychains4.conf

# 代理链模式
# strict_chain - 严格按顺序使用代理
# dynamic_chain - 跳过不可用代理
# random_chain - 随机选择代理
dynamic_chain

# 代理DNS请求
proxy_dns

# TCP读取超时(毫秒)
tcp_read_time_out 15000

# TCP连接超时(毫秒)
tcp_connect_time_out 8000

# 代理列表
# 格式: 类型 地址 端口 [用户名 密码]
[ProxyList]
socks5 203.0.113.100 1080 user1 password1
# socks4 203.0.113.100 1080
# http 203.0.113.100 8080 user1 password1

使用示例

1
2
3
4
5
6
7
8
9
10
# 通过代理执行命令
proxychains4 curl http://ifconfig.me
proxychains4 wget http://example.com/file.zip
proxychains4 ssh user@target.host

# 运行浏览器
proxychains4 firefox

# 指定配置文件
proxychains4 -f /path/to/config.conf curl http://ifconfig.me

4.4.2 环境变量方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 设置SOCKS5代理环境变量
export ALL_PROXY=socks5://user1:password1@203.0.113.100:1080

# 或者分别设置
export http_proxy=socks5://203.0.113.100:1080
export https_proxy=socks5://203.0.113.100:1080

# 部分程序使用这个变量
export HTTP_PROXY=socks5://203.0.113.100:1080
export HTTPS_PROXY=socks5://203.0.113.100:1080

# git配置代理
git config --global http.proxy socks5://203.0.113.100:1080
git config --global https.proxy socks5://203.0.113.100:1080

# 取消代理设置
unset ALL_PROXY http_proxy https_proxy HTTP_PROXY HTTPS_PROXY
git config --global --unset http.proxy
git config --global --unset https.proxy

4.4.3 SSH通过SOCKS代理连接

1
2
3
4
5
6
7
8
9
10
11
12
# 使用netcat(需要支持-X 5选项)
ssh -o ProxyCommand='nc -X 5 -x 203.0.113.100:1080 %h %p' user@target.host

# 使用connect-proxy
sudo apt install connect-proxy
ssh -o ProxyCommand='connect -S 203.0.113.100:1080 %h %p' user@target.host

# SSH配置文件 (~/.ssh/config)
Host target.host
HostName target.host
User user
ProxyCommand nc -X 5 -x 203.0.113.100:1080 %h %p

4.5 Android客户端配置

4.5.1 v2rayNG配置

  1. 打开v2rayNG,点击右上角"+"
  2. 选择"手动输入配置"
  3. 选择类型"SOCKS"
  4. 填写配置:
项目内容
别名SOCKS代理
服务器地址203.0.113.100
端口1080
用户名user1(如需认证)
密码password1(如需认证)
  1. 保存并选择节点连接

4.5.2 Postern配置

  1. 打开Postern,点击"添加代理"
  2. 配置代理:
1
2
3
4
5
6
代理类型: SOCKS5
服务器: 203.0.113.100
端口: 1080
认证: 用户名/密码
用户名: user1
密码: password1
  1. 添加规则控制流量走向

4.6 iOS客户端配置

4.6.1 Shadowrocket配置

  1. 打开Shadowrocket,点击左上角"+"
  2. 类型选择"SOCKS5"
  3. 填写配置:
1
2
3
4
5
类型: SOCKS5
地址: 203.0.113.100
端口: 1080
用户名: user1(可选)
密码: password1(可选)
  1. 保存并选择节点
  2. 开启连接开关

4.6.2 Quantumult X配置

1
2
3
4
5
6
[server_local]
# 添加SOCKS5节点
socks5=203.0.113.100:1080, username=user1, password=password1, fast-open=true

# 或使用订阅链接
;server_remote=订阅URL, tag=SOCKS节点, update-interval=86400

4.7 浏览器代理设置

4.7.1 Firefox设置

  1. 打开Firefox,点击"菜单" → “设置”
  2. 滚动到"网络设置"
  3. 点击"设置"
  4. 选择"手动代理配置":
    • SOCKS主机:203.0.113.100
    • 端口:1080
    • 选择"SOCKS5"
    • 勾选"使用SOCKS5代理DNS"
  5. 点击"确定"保存

4.7.2 Chrome使用SOCKS代理

Chrome需要通过命令行参数或扩展设置代理:

1
2
3
4
5
6
7
8
# Windows
chrome.exe --proxy-server="socks5://203.0.113.100:1080"

# macOS
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --proxy-server="socks5://203.0.113.100:1080"

# Linux
google-chrome --proxy-server="socks5://203.0.113.100:1080"

或使用SwitchyOmega扩展:

  1. 安装SwitchyOmega扩展
  2. 创建新代理配置
  3. 协议选择"SOCKS5"
  4. 填写服务器地址和端口

五、安全性注意事项

5.1 SOCKS协议的安全问题

重要安全警告:SOCKS协议本身不提供任何加密,所有数据(包括认证信息)都以明文传输,存在严重安全风险。

5.1.1 主要安全风险

风险说明影响
数据泄露流量未加密,可被嗅探
认证窃取用户名密码明文传输
中间人攻击无身份验证机制中高
DNS泄露客户端DNS可能绕过代理
IP暴露代理服务器可记录真实IP

5.1.2 攻击场景示例

1
2
3
4
5
6
7
8
攻击者嗅探SOCKS5认证过程:

客户端 -> 代理: 05 02 00 02 (SOCKS5,支持无认证和用户名密码)
代理 -> 客户端: 05 02 (选择用户名密码认证)
客户端 -> 代理: 01 05 admin 08 password (认证请求)
代理 -> 客户端: 01 00 (认证成功)

攻击者获取明文用户名密码:admin/password

5.2 安全加固措施

5.2.1 使用加密隧道

推荐使用SSH隧道或VPN加密SOCKS流量:

1
2
3
4
5
6
7
8
9
10
# SSH动态端口转发(创建本地SOCKS代理)
ssh -D 1080 -C -N user@ssh.server

# 参数说明:
# -D 1080: 在本地1080端口创建SOCKS代理
# -C: 启用压缩
# -N: 不执行远程命令

# 通过SSH隧道连接远程SOCKS代理
ssh -L 1080:127.0.0.1:1080 user@proxy.server

5.2.2 限制访问范围

1
2
3
4
5
6
7
8
9
10
# Dante配置 - 限制目标地址
socks pass {
from: 0.0.0.0/0 to: 10.0.0.0/8
log: error connect
}

socks block {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
}

5.2.3 使用强认证

1
2
3
4
5
6
# 使用复杂的用户名密码
# 密码建议:16位以上,包含大小写字母、数字、特殊字符

# 生成强密码
openssl rand -base64 24
# 输出示例:K7gNU3sdo+OL0wNhqoVWhr3g6s1xYv72ol/pe/Unogs=

5.2.4 配置IP白名单

1
2
3
4
5
6
7
8
9
10
# 仅允许特定IP连接
client pass {
from: 203.0.113.0/24 to: 0.0.0.0/0
log: error
}

client block {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: error
}

5.3 日志与监控

5.3.1 配置详细日志

1
2
3
4
5
6
7
8
9
10
11
12
# Dante日志配置
logoutput: /var/log/danted.log

client pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: error connect disconnect data
}

socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: error connect disconnect data
}

5.3.2 日志分析

1
2
3
4
5
6
7
8
# 查看连接日志
sudo tail -f /var/log/danted.log

# 统计访问来源
sudo cat /var/log/danted.log | grep "connect from" | awk '{print $4}' | sort | uniq -c | sort -rn

# 统计访问目标
sudo cat /var/log/danted.log | grep "connect to" | awk '{print $6}' | sort | uniq -c | sort -rn

5.4 最佳实践建议

5.4.1 安全部署架构

1
2
3
4
5
6
7
8
9
10
推荐架构:客户端 -> 加密隧道(VPN/SSH/TLS) -> SOCKS代理 -> 目标

┌─────────────┐ 加密隧道 ┌─────────────┐
│ 客户端 │ ────────────► │ 代理服务器 │
└─────────────┘ └─────────────┘


┌─────────────┐
│ 目标服务器 │
└─────────────┘

5.4.2 安全检查清单

检查项状态
使用强密码认证
配置IP访问限制
启用详细日志
定期审计日志
配置防火墙规则
使用加密隧道
定期更新软件
限制并发连接数

六、常见问题排查

6.1 连接失败

症状:无法连接到SOCKS代理服务器

排查步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. 检查网络连通性
ping proxy.server

# 2. 检查端口是否开放
telnet proxy.server 1080
# 或
nc -zv proxy.server 1080

# 3. 检查服务状态
sudo systemctl status danted

# 4. 检查防火墙
sudo ufw status
sudo iptables -L -n

# 5. 查看日志
sudo tail -f /var/log/danted.log

常见原因

原因解决方案
端口未开放配置防火墙放行端口
服务未启动启动danted服务
配置文件错误检查配置语法
IP被限制检查访问控制规则

6.2 认证失败

症状:提示用户名密码错误

排查步骤

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 确认用户存在
id sockduser1

# 2. 检查密码是否正确
# 重新设置密码
sudo passwd sockduser1

# 3. 检查配置文件认证方法
grep -i "method" /etc/danted.conf

# 4. 查看认证日志
sudo grep -i "auth" /var/log/danted.log

6.3 连接速度慢

可能原因及解决方案

原因解决方案
服务器网络带宽不足升级服务器带宽
服务器负载过高检查CPU/内存使用
DNS解析慢配置更快的DNS服务器
客户端网络问题检查本地网络

性能优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 检查服务器负载
top
htop

# 检查网络延迟
ping -c 10 proxy.server

# 检查带宽
iperf3 -c proxy.server

# 启用BBR拥塞控制
echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

6.4 UDP不可用

症状:TCP连接正常,UDP无法使用

排查步骤

1
2
3
4
5
6
7
8
9
10
11
# 1. 确认SOCKS5支持UDP
# SOCKS4不支持UDP,需使用SOCKS5

# 2. 检查防火墙UDP端口
sudo ufw allow 1080/udp

# 3. 测试UDP连接
# 使用支持UDP的客户端测试

# 4. 检查服务器配置
# Dante默认支持UDP,确认未禁用

七、总结

7.1 SOCKS协议优势

  1. 通用性强:支持多种应用协议,不限于HTTP
  2. 底层代理:工作于会话层,透明代理TCP/UDP
  3. 协议简单:标准明确,实现广泛
  4. UDP支持:SOCKS5支持UDP协议
  5. 客户端丰富:各平台都有成熟的客户端

7.2 SOCKS协议局限

  1. 无加密:所有数据明文传输,安全性差
  2. 无伪装:协议特征明显,容易被识别
  3. 认证简单:用户名密码明文传输
  4. 不抗审查:在高审查环境下容易被封锁

7.3 适用场景建议

场景推荐方案
内网代理SOCKS5 + IP白名单
匿名访问SOCKS5 + SSH隧道
爬虫应用SOCKS5代理池
游戏加速SOCKS5(UDP支持)
安全代理Shadowsocks/Trojan(替代方案)

7.4 与其他协议配合使用

SOCKS协议常作为其他代理协议的底层传输:

协议SOCKS使用方式
Shadowsocks客户端本地监听SOCKS5
V2Ray/Xray支持SOCKS入站/出站
Trojan可配置SOCKS转发
SSH动态端口转发创建SOCKS

参考资料