socks5介绍
如果您的机器具有一个合法的 internet ip 地址, 或者您利用自己机器
上的调制解调器拨号上网, 可以自由和 internet 上任何主机沟通, 那么您
通常不必关心 socks5 协议。
socks5 协议对于处在内部网络中的机器, 需要透过网络中某些可以联通
外部 internet 的机器访问外部时,有用。
socks5 是一个代理协议,它在使用 tcp/ip协议通讯的前端机器和服务器
机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问internet
网中的服务器,或者使通讯更加安全。
socks5 服务器通过将前端发来的请求转发给真正的目标服务器, 模拟了
一个前端的行为。在这里,前端和socks5之间也是通过tcp/ip协议进行通讯,
前端将原本要发送给真正服务器的请求发送给socks5服务器,然后socks5服务
器将请求转发给真正的服务器。socks5服务器在将通讯请求发送给真正服务器
的过程中,对于请求数据包本身不加任何改变。socks5服务器接收到真正服务
器的响应后,也原样转发给前端。
因此,socks5 协议是一种代理协议,对于各种基于 tcp/ip的应用层协议
都能够适应,几乎是万能的。它虽然不能理解自己转发的数据的内部结构,但
是它能够忠实地转发通讯包,完成协议本来要完成的功能。
与socks5协议不同,http代理是通过http协议进行的,http代理服务器软
件了解通讯包的内部结构,在转发过程中还要对通讯进行某种程序的修改和转
换。和http代理协议不同,socks5实际上是一个传输层的代理协议。
我们可以想象,如果每个具体的应用层协议都要设计对应的代理协议表达
办法,一个特定的代理服务器无论如何也支持不过来那么多新出现的协议。因
此,可以说socks5的出现缓解了各种具体协议需要专门设计代理协议的困难局
面。
不过,并不是凡是使用基于tcp/ip协议的应用协议的软件,都可以无条件
地透过socks5服务器进行通讯,还要求前端软件本身具有socks5的接口,才能
利用socks5代理服务器。
一个支持socks5协议的前端,通常具有两种运行状态:
1)直接通讯状态,不使用socks5接口。这时的通讯是针对最终服务器进行
的。
2)socks5 状态。 使用 socks5 接口将本来要发送给最终服务器的请求发
送给 socks5 服务器。在前端和 socks5 服务器进行初始化会话的时候,前端
告诉了 socks5 服务器关于最终服务器的 ip 地址和端口信息,所以 socks5
服务器能够忠实按照前端的要求启动和最终服务器的通讯过程。
socks5是一个实现socks v5协议的代理服务器。作为一个代理服务器,socks5鉴别、授权、处理客户的网络请求。它为客户建立连接到客户所请求的主机。客户机试图连接到网络时,只需连接到socks5的daemon。
接着是认证,客户请求socks5激活网络连接。包括bind,connect,sendto,ping,traceroute。
socks5是独立于应用层协议的,能应付不同的网络服务。包括telnet,ftp,finger,whois,gopher,www。
socks5 daemon 支持两种授权方式:
username/password -- 参考socks5.passwd
kerberos 5 -- 要求kerberos libraries的支持。使用kerberos 5(gss-api) 的其它信息,请参考kerberos 的man page。
socks5的运行方式:
standalone – default
preforking - -p
threaded - -t 如果你的操作系统支持posix threads 并且你configure socks5时加了—with-threads 参数。-t参数使socks5运行在threaded 模式。所有的操作系统都对线程数和每进程的打开文件描述符加于限制。
through inetd - -i,通过inetd启动。
你可以通过一些配置文件、环境变量和参数控制socks5 daemon。请参考socks5.conf(5)文档。这个配置文件的优先级高于环境变量和参数。环境变量设置高于参数设置。
options
多个参数用空格分开。
-b [host:port] | --bindintfc [host:port]
host:port 指定socks5运行的主机和端口号用于代替缺省的端口。忽略主机的话,socks5使用0.0.0.0做为主机值。
-d [val] | -- debug[val]
打开debug模式,设置debug值为val。如果忽略此值,socks5仅仅发送警告信息。val 的有效值是1,2,3。如果指定其它值,socks5认为是3。有效值的含义:
1 log_notice 不报错
2 log_info 报告信息
3 log_debug 报告用于debug 的信息。
-f | --foreground
前台运行。当运行在standalone模式时,阻止从parent shell**。--foreground 一般用于调试
-i | --inetd
通过inetd运行socks5。
-n val | --nchildren val
设置同时存在的最大子进程数为val。socks5预设最大子进程数为64。使用这个参数降低预设值。你不能设置最大子进程数超过操作系统限制的值。当运行在线程模式时,
socks5忽略此值,在oneshot 模式和 inetd 模式下,此参数也没用。
-o | --oneshot
在前台处理一个请求,打开debug模式,输出到stderr,然后退出。用于调试。
-p | --prefork
preforking进程运行socks5。同时需要 –nchildren 参数控制已forked 的进程数。
-s | --stderr
纪录所有的输出到stderr代替syslog。主要用于debug 模式。
-t | --threaded
运行在线程模式。要求你的操作系统支持posix threads 并且编译socks5时加了—with-threads 参数。如果线程模式无效,socks5打印一个错误信息,转到standalone 模式。
-v | --version
打印一条信息(包括当前socks5版本号)到stderr。
environment
环境变量控制socks5怎样执行。可以在环境或配置文件中设置它们。当环境和配置文件有冲突时,配置文件的优先级高。在配置文件中设置变量,使用如下的语法:
set variable [value]
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只接受socks v5协议(rfc 1928)的请求。设此变量后,socks5将接受socks v4 协议的请求。
request for comments
rfc1928 socks protocol version 5
rfc1929 username/password authentication for socks v5
rfc1961 gss-api authentication method for socks version 5
see also
socks5.conf(5)