Socks5。Socks是个电路级网关,由David

Koblas在1990年开发。此后,就一直作为Internet RFC(Request for

Comments)中的开放标准。Socks在协议栈的TCP层上运行。Socks代理只是简单地传递数据包,而不必关心是何种应用协议(比如FTP、HTTP和NNTP请求)。

 

 

Socks5代理支持TCP和UDP协议,而且还支持各种身份验证机制、服务器端域名解析等,socks5通过配置可以支持socks4。我们平时使用的Internet

Explorer、QQ等软件都支持socks代理设置。

 

Red Hat Linux本身并不带socks5的rpm软件包,但可以从网上下载:

 

http://ftp.falsehope.com/home/gomez/socks5/socks5-1.0r11-3.i386.rpm

 

我们主要通过socks5.conf

文件来配置socks5服务器。缺省路径为:/etc/socks5.conf。在/usr/doc/socks5-1.0r11/examples目录

下有socks5的配置示例(注意是/usr/doc/而不是/usr/share/doc/)。

 

§§ socks5.conf的配置选项

 

socks5.conf通常由以下几个方面的内容构成:

 

-ban host:定义拒绝服务的客户列表

-authentication:定义Socks5服务器使用的用户认证方法

-interface:定义Socks5服务器绊定的ip地址和服务端口

-variables and flags:定义Socks5服务器运行的环境

-proxies:定义客户可以通过Socks5服务器访问的地址列表以及Socks5服务器访问这些地址的方法

-access control:定义Socks5服务器接受或拒绝客户连接的规则

 

下面我们分别来讲述这些条目对应的语法:

 

ban host

语法:ban source-host source-port

说明:Socks5服务器将拒绝接受来自source-host:source-port的客户连接。

 

authentication

语法:auth source-host source-port auth-methods

说明:对于来自source-host:source-port的客户连接,Socks5服务器将使用

auth-methods所定义的用户认证方法。对于没有定义认证方法的客户将使用任何可以使用的认证方法。

 

interface

语法:interface hostpatern portpattern interface-address

说明:来自source-host:source-port的客户连接由interface-address处理;目的地址为source-host:source-port的客户连接由Socks5

代理服务器从 interface-address发出连接请求。

 

variables

语法:set variable value

说明:定义Socks5运行参数,Socks5有以下一些常用的运行参数:

 

SOCKS5_BINDINTFC host:port

host:port

指定socks5运行的主机和端口号,用于代替缺省的端口。忽略时,socks5用0.0.0.0作为主机值。

 

SOCKS5_CONFFILE filename

Filename

指定配置文件。在许多系统中,缺省是/etc/socks5.conf。在运行socks5之前,设置这个变量。如果有多个socks5

daemon运行,为每个daemon使用不同的配置文件。

 

SOCKS5_DEMAND_IDENT

当客户没有响应ident

请求时,认证失败。使用SOCKS5_DEMAND_IDENT确认每个连接有一个关联的用户名。

 

SOCKS_ENCRYPT

如果可能的话,请求下一个socks5进程加密数据。SOCKS5_ENCRYPT

仅仅在编译socks5时包括了GSS-API认证时,才有意义。

 

SOCKS5_FORCE_ENCRYPT

当认证方式支持加密时,强迫客户加密数据。

 

SOCKS5_IDENTFILE filename

Filename指定存储ident信息的文件名。在许多系统中,缺省是/tmp/socks5.ident。当有多个socks5

daemon运行时,SOCKS5_IDENTFILE非常有用。

 

SOCKS5_MAXCHILD val

val指定同时存在的最大子进程数。Socks5预设为64。可以降低预设置。不能超过64。Socks5运行在线程模式时,忽略此参数。当运行在oneshot或inetd模式时,此参数不发生作用。

 

SOCKS_NOIDENT

忽略ident请求。当客户机没有运行identd时,使用SOCKS5_NOIDENT将降低超时值。

 

SOCKS_NOINTCHK

请求下一个socks5进程执行没有完整检查的代理请求。只有在编译时加入GSS-API认证时,SOCKS5_NOINTCHK才发生作用。

 

SOCKS_NONETMASKCHECK

指示daemon忽略检查主机的子网掩码。缺省时,daemon检查掩码,如果在同一子网时,在检查配置文件之前,直接连接。

 

SOCKS5_REVERSEMAP

总是试图影射地址到主机名。缺省时,socks5只有当主机名或域名在配置文件中使用时才影射。设置后,log文件将纪录主机名,这将降低性能。

 

SOCKS5_SERVICENAME

总是影射端口号到服务名。缺省时,socks5只有当服务名在配置文件中使用时才影射。设置后,log文件将纪录服务名,这将降低性能。

 

SOCKS5_PASSWD [password]

当socks5 daemon连接到其它socks服务器时,如果采用Username/Password

认证,用它来指定密码。

 

SOCKS5_PIDFILE filename

指定存储socks5进程ID的文件名。Socks5缺省存贮PID在/tmp/socks5.pid。你可以用—bindintfc参数或设置SOCKS5_BINDINTFC环境变量运行socks5在不同于缺省端口的其它端口。当运行在不同于缺省端口的其它端口时,socks5存贮PID在/tmp/socks5.pid-port。

 

SOCKS5_PWDFILE filename

指定密码文件。在许多系统中,缺省是/etc/socks5.passwd。

 

SOCKS5_TIMEOUT minutes

指定连接停顿最长时间。超过最大值后,socks5断开连接。忽略此值时,缺省是15。

 

SOCKS5_UDPPORTRANGE port1-port2

指定一个Socks5用来发送UDP包的UDP端口范围。

 

SOCKS5_USER [user id]

当socks5 daemon连接到其它socks

server时,如果采用Username/Password认证,用此变量指定用户名。

 

SOCKS5_V4SUPPORT

缺省时,socks5只接受SOCKS5协议(rfc 1928)的请求。设此变量后,socks5将接受SOCKS

V4 协议的请求。

 

proxies

语法:proxy-type dest-host dest-port proxy-list

说明:当客户请求的目的为dest-host:dest-port时,Socks5将使用proxy-list中的

代理服务器请求数据。

 

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]

说明:通过这两条语句所定义的规则来进行客户访问控制。

 

我们再对以上语法作进一步的解释:

 

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的主机

 

port的表示方法

-:表示任意端口

service name:用/etc/service中定义的服务名来表示,如telnet

port number:直接指定数字端口,如80

[port_start,port_end]:指定一个端口范围,如[1024,6000]表示从端口1024到6000,(1024,6000)表示从端口1025到5999

 

auth的值

n:无用户认证

u:使用username/password用户认证方法

k:使用Kerberos用户认证方法

-:使用任何可用的用户认证方法

 

cmd的值

-:任何命令

c:connect

b:bind

u:UDP

p:ping

t:traceroute

 

user的值

-:任何用户

 

proxy的值

socks5: Socks 5

socks4: SOCKS 版本4

noproxy:不使用代理而直接连接

 

server的值

host: 指定服务器的hostname,使用缺省服务端口

host:port:指定服务器的hostname和该服务的监听端口

 

下面是一些例子:

auth - - u

说明:对所有的客户连接都使用username/password用户认证方法

 

permit u - 192.168.1. - - -

说明:允许来自192.168.1.的任何经过用户认证的连接

 

更多的例子请参考以下资源:http://www.socks.nec.com/reference/socks5.html

 

§§ Socks5一些常见问题的说明

 

Windows客户端的配置

 

有些Windows的应用程序,如IE、QQ等

等本身就支持SOCKS代理服务器,但是更多的Windows应用程序是不提供对SOCKS代理服务器的支持的,这时候我们就可以利用一些相应的工具来使

得这些应用程序可以使用SOCKS代理服务器。其中最常用的工具sockscap,可以从以下的网址下

载:http://www.socks.nec.com/cgi-bin/download.pl

 

用户认证问题

 

Socks5已经具有了用户认证功能。诸如IE等应用程序虽然提供了对SOCKS代理服务器的支持,但是并不能进行用户认证,这种情况下我们也只能用sockscap等工具来提供IE的用户认证接口。需要注意的是,SOCKS的认证过程并不会象squid一样弹出认证窗口。

 

运行模式问题

Socks5具有以下几种运行模式:

standalone:这是Socks5缺省的运行模式

preforking:该模式适合服务器资源有限的情况,因为我们可以事先指定运行的子进程数。可以用-p选项指定SOCKS以preforking模式运行。

inetd:和telnet等服务一样通过inetd超级服务器运行SOCKS

threaded:在linux平台上,我们推荐使用该模式运行SOCKS,这样能获得最佳性能。

 

超时问题

 

默认的,在一个客户会话空闲超过15分钟后,该会话将被断开,可以使用SOCKS5_TIMEOUT

变量改变该值。

 

绑定失败问题

 

有时候会出现Bind failed for xxx.xxx.xxx.xxx:

...的提示,通常这是因为SOCKS所绑定的端口已被其他程序所使用的缘故,可以通过更改该端口的值来解决这类问题。

 

§§ 一个简单的socks5配置文件

 

下面给出一个socks代理的简单配置示例,该配置允许192.168.100.0/255.255.255.0这个网络的用户使用socks代理,但禁止通过socks代理访问ftp服务:

 

# variables and flags

set     SOCKS5_NOIDENT

#超时设置为15分钟

set     SOCKS5_TIMEOUT 15

#支持socks4

set     SOCKS5_V4SUPPORT

# access control

deny - - - - - 20

deny - - - - - 21

permit - - 192.168.100.0/255.255.255.0 - - -