搭建Socks5代理服务器
1 SOCKS概述
SOCKS其实是一种网络代理协议。该协议所描述的是一种内部主机(使用私有ip地址)通过SOCKS服务器获得完全的Internet访问的方法。具体说来是这样一个环境:用一台运行SOCKS的服务器(双宿主主机)连接内部网和Internet,内部网主机使用的都是私有的ip地址,内部网主机请求访问Internet时,首先和SOCKS服务器建立一个SOCKS通道,然后再将请求通过这个通道发送给SOCKS服务器,SOCKS服务器在收到客户请求后,向客户请求的Internet主机发出请求,得到相应后,SOCKS服务器再通过原先建立的SOCKS通道将数据返回给客户。当然在建立SOCKS通道的过程中可能有一个用户认证的过程。
SOCKS和一般的应用层代理服务器是完全不同的。一般的应用层代理服务器工作在应用层,并且针对不用的网络应用提供不同的处理方法,比如HTTP、FTP、SMTP等,这样,一旦有新的网络应用出现时,应用层代理服务器就不能提供对该应用的代理,因此应用层代理服务器的可扩展性并不好;与应用层代理服务器不同的是,SOCKS代理服务器旨在提供一种广义的代理服务,它与具体的应用无关,不管再出现什么新的应用都能提供代理服务,因为SOCKS代理工作再线路层(即应用层和传输层之间),这和单纯工作在网络层或传输层的ip欺骗(或者叫做网络地址转换NAT)又有所不同,因为SOCKS不能提供网络层网关服务,比如ICMP包转发等。这三种技术的比较如下表所示
| 类别 | IP欺骗(NAT) | Socks V5 | 应用层代理 |
|---|---|---|---|
| 工作区域 | 网络层或传输层 | 线路层 | 应用层 |
| 用户认证 | 无 | 有 | 有 |
| 应用可扩展性 | 好 | 好 | 无 |
| 网络服务 | 有 | 无 | 无 |
目前的SOCKS版本是第五版,第五版同第四版的区别主要在于第五版提供多种不同的用户认证方法和UDP代理。
2 SOCKS5的安装
2.1 安装依赖软件包
yum -y install gcc make automake pam-devel openldap-devel openssl-devel cyrus-sasl-devel
2.2 下载源码、解压、编译、安装
[root@localhost ~]# wget --no-check-certificate https://jaist.dl.sourceforge.net/project/ss5/ss5/3.8.9-8/ss5-3.8.9-8.tar.gz
[root@localhost ~]# tar -xzvf ss5-3.8.9-8.tar.gz
[root@localhost ~]# cd ss5-3.8.9
[root@sg ss5-3.8.9]# ./configure --prefix=/usr/local/src/
[root@sg ss5-3.8.9]# make
[root@sg ss5-3.8.9]# make install
2.3 Socks5配置
我们主要通过socks5.conf文件来配置SOCKS v5服务器。该配置文件的路径可以在编译SOCKS v5时自行指
定,缺省路径为:/etc/opt/ss5/ss5.conf。SOCKSv5服务器在每次启动或收到HUP信号时读入该配置文件的内容。
该配置文件通常由以下几个方面的内容构成
-
ban host:定义拒绝服务的客户列表
-
authentication:定义SOCKS v5服务器使用的用户认证方法
-
interface:定义SOCKS v5服务器绊定的ip地址和服务端口
-
variables and flags:定义SOCKS v5服务器运行的环境
-
proxies:定义客户可以通过SOCKS v5服务器访问的地址列表以及SOCKS v5服务器访问这些地址的方法
-
access control:定义SOCKS v5服务器接受或拒绝客户连接的规则
下面我们分别来讲述这些条目对应的语法:
1) ban host:
语法:ban source-host source-port
说明:SOCKSv5服务器将拒绝接受来自source-host:source-port的客户连接。
2) authentication:
语法:auth source-host source-port auth-methods
说明:对于来自source-host:source-port的客户连接,SOCKSv5服务器将使用auth-methods所定义的用户认证方法。对于没有定义认证方法的客户将使用任何可以使用的认证方法。
3) Interface:
语法:interface host patern port pattern interface-address
说明:来自source-host:source-port的客户连接由interface-address处理;目的地址为source-host:source-port的客户连接由SOCKSv5 代理服务器从 interface-address发出连接请求。
4) variables:
语法:set variable value
说明:定义SOCKS v5运行参数,SOCKSv5有以下一些常用的运行参数:
SOCKS_BINDINTFChost:port:指定SOCKS v5绑定的ip地址和监听的端口。如果不指定绑定的ip地址,SOCKSv5将使用0.0.0.0。
5) proxies:
语法:proxy-type dest-host dest-port proxy-list
说明:当客户请求的目的为dest-host:dest-port时,SOCKSv5将使用proxy-list中的代理服务器请求数据。
6) Access control:
语法:permit auth cmd src-host dest-host src-port dest-port [user-list] deny auth cmd src-host dest-host src-port dest-port [user-list]
说明:通过这两条语句所定义的规则来进行客户访问控制。
我们再对以上语法作进一步的解释:
1) host的表示方法:
-
-:表示任意主机
-
n1.:表示n1.0.0.0/255.0.0.0
-
n1.n2.:表示n1.n2.0.0/255.255.0.0
-
n1.n2.n3.:表示n1.n2.n3.0/255.255.255.0
-
.domain.name:表示主机名以.domain.name结尾的主机
-
some.domain.name:表示主机名为some.domain.name的主机
2) port的表示方法:
-
-:表示任意端口
-
service name:用/etc/service中定义的服务名来表示,如telnet
-
port number:直接指定数字端口,如80
-
[port_start,port_end]:指定一个端口范围,如[1024,6000]表示从端口1024到6000,(1024,6000)表示从端口1025到5999
3) auth的值:
-
n:无用户认证
-
u:使用username/password用户认证方法
-
k:使用Kerberos用户认证方法
-
-:使用任何可用的用户认证方法
4) cmd的值:
-
-:任何命令
-
c:connect
-
b:bind
-
u:UDP
-
p:ping
-
t:traceroute
5) user的值:
- -:任何用户
6) proxy的值:
-
socks5: SOCKSv5
-
socks4: SOCKS版本4
-
noproxy:不使用代理而直接连接
7) server的值:
-
host:指定服务器的hostname,使用缺省服务端口
-
host:port:指定服务器的hostname和该服务的监听端口
2.4 配置案例
auth - -u
说明:对所有的客户连接都使用username/password用户认证方法
permit u -192.168.1. ---
说明:允许来自192.168.1.的任何经过用户认证的连接
2.5 配置验证
修改 /etc/opt/ss5/ss5.conf 文件
1) 不验证
[root@localhost ~]# cat /etc/opt/ss5/ss5.conf | grep -v ^# | grep -v ^$
auth 0.0.0.0/0 - -
permit - 0.0.0.0/0 - 0.0.0.0/0 - - - -
2) 要验证
[root@localhost ~]# cat /etc/opt/ss5/ss5.conf | grep -v ^# | grep -v ^$
auth 0.0.0.0/0 - u
permit u 0.0.0.0/0 - 0.0.0.0/0 - - - - -
在 /etc/opt/ss5/ss5.passwd 文件中添加账号密码,每一行表示一个账户,支持中文,如下
[root@localhost ~]# cat /etc/opt/ss5/ss5.passwd
张三 pass123
marry pass123
启动服务,并验证
[root@localhost ~]# /usr/sbin/ss5
[root@localhost~]# curl --socks5 192.168.1.107:1080 --proxy-user marry:pass123 https://www.baidu.com
如需更改默认端口
echo 'SS5_OPTS=" -u root -b 0.0.0.0:1080"' > /etc/sysconfig/ss5
2.6 查看日志
[root@localhost ~]# tail -f /var/log/ss5/ss5.log
[04/Dec/2021:16:25:41 EST] [10402] 192.168.1.102 "" "" ISERROR - - - (-:- -- -:-) (Socks method unknown or bad request)
[04/Dec/2021:16:25:43 EST] [10403] 192.168.1.102 "" "" ISERROR - - - (-:- -- -:-) (Socks method unknown or bad request)
[04/Dec/2021:16:25:47 EST] [10405] 192.168.1.102 张三 "CONNECT" STARTED 0 0 0 (192.168.1.102:60570 -> 59.36.89.161:80)
[04/Dec/2021:16:25:47 EST] [10405] 192.168.1.102 张三 "CONNECT" TERMINATED 49369 198 0 (192.168.1.102:60570 -> 59.36.89.161:80)
3 常见问题说明
3.1 windows客户端的配置
有些windows的应用程序,如IE、OICQ等等本身就支持SOCKS代理服务器,但是更多的windows应用程序是不提供对SOCKS代理服务器的支持的,这时候我们就可以利用一些相应的工具来使得这些应用程序可以使用SOCKS代理服务器。其中最常用的工具sockscap
3.2 用户认证问题
SOCKSv5已经具有了用户认证功能,诸如IE等应用程序虽然提供了对SOCKS代理服务器的支持,但是并不能进行用户认证,这种情况下我们也只能用sockscap等工具来提供IE的用户认证接口。需要注意的是,SOCKS的认证过程并不会像squid一样弹出认证窗口。
3.3 超时问题
在一个客户会话空闲超过15分钟后,该会话将被断开,可以使用SOCKS5_TIMEOUT 变量改变该值。