ISA Server 2004中带了一个SOCKS V4筛选器插件,它可以将来自SOCKS应用程序的请求转发到 Microsoft 防火墙服务,然后Microsoft防火墙服务检查访问规则,以确定 SOCKS 客户端应用程序是否可以与 Internet 进行通讯,如果允许,则将此请求转发至Internet上的对应服务器。另外,ISA Server只支持SOCKS V4 的代理,不支持SOCKS V5,不过在ISA2000光盘里的application filter sample code中附带了一个SOCKS5的应用程序过滤器的编码,需要自行编译。
当安装 ISA 服务器时,SOCKS 筛选器对所有网络禁用。您可以启用此筛选器,然后进行配置,选择侦听的网络及端口(默认侦听端口是1080),以便侦听任何端口上的SOCKS请求。
本人对ISA2004的SOCKS筛选器进行了研究,我没有其它使用SOCKS的软件,顺手拿来了MSN Messenger6.2试验,在ISA和客户端同时sniffer监视,ISA上开启防火墙日志记录。
测试方法,分别使用完全通过,监视完整的通信过程;有限制的通过,监视通信是否有变化;阻拦通信,确定通信是否能使用新通信方法
a.开启内部到外部所有出站通讯,所有用户,使用sniffer监视MSN Messenger登录过程。
客户端对ISA发出1080端口通信,这样使用1080端口的数据往返29次,第30次进行了一次loginnet.passport.com的DNS解析,然后客户端使用passport登录到loginnet.passport.com进行用户身份认证,我们看到使用的是443端口发送认证请求,而不是通过1080端口的,认证完成之后发了多次80端口请求获得广告以及一些服务之类的请求。也就是说,即便使用了SOCKS代理,身份认证依然还要通过https协议进行认证,如果关闭了内网到外部的https协议,不能完成登录。
b.我们知道msn messenger登录是需要使用1863端口的,如果1863端口被阻拦,使用80端口于登录服务器取得联系,那么我们只开启内部到外部https和msn messenger(1863端口)协议,所有用户,使用sniffer监视MSN Messenger登录过程。
登录成功,网友信息可以读取,但是其它如:Alerts这类的功能不行,这些功能是使用80端口的,因为我们并没有允许80端口通信。我们从sniffer没有看到登录使用1863端口,但是在防火墙日志看到了登录使用了1863和https协议。我们禁止了80端口,说明不是使用80端口登录的,那么1863端口的信号就是被包裹在客户端到ISA服务器的1080端口的通信之中,因为我们用sniffer不能看到1080端口通信的内容,又没有其它通信,这也说明,ISA2004的SOCKS筛选器可以看到SOCKS内的通信使用了什么协议,因为我们在防火墙日志里面看到1863的通信记录。
c.只开启内部到外部https协议,所有用户,使用sniffer监视登录过程。
登录失败,查看防火墙日志,发现1863端口被阻,用sniffer监视从客户端并没有向外送出1863端口的请求,只有和ISA的1080的多次通信,可以判断,MSN Messenger把登录1863端口的请求放在1080的请求里面代理发出,这时候SOCKS筛选器对1080端口内的通信进行识别,发现了1863的请求,然后阻断,证明了ISA2004的SOCKS筛选器的确可以检查SOCKS通信内容使用什么协议,也就是说无论是不是使用了SOCKS都仍然完全按照防火墙策略。
在看一下ISA外网卡sniffer的记录,和普通的外部IP登录没有区别。可以这样认识SOCKS的工作过程,当内部客户端请求的时候,把原来要使用什么端口什么协议都加载送到SOCKS服务器的1080端口的通信里面,这些请求由SOCKS服务器发出,收到外界服务器的回复之后,SOCKS服务器把这些回复加载到对1080请求的回复里面返回给客户端。对比使用SOCKS和不使用的情况,在isa外网卡上的sinffer记录没有不同。那么为什么有些软件只能工作在SOCKS下,不能工作在NAT下,我这里没有这样的软件,没有实际数据证据,我只能做一个猜想。道理和FTP的PASV模式下的二次连接一样,我们为什么一定要加载FTP筛选器,在我们连接过21控制端口后,要进行数据的连接的时候,内网发出的对该服务器的数据请求可以是任意一个端口的请求,这么说我们一定要打开所有内部到外部的所有通讯了,因为这个端口是随机打开的,我们也不知道会是那个,其实不然,我们只开FTP21即可,因为FTP筛选器通过对21端口的监视,已经知道我们将要打开的数据端口了,及时通知了ISA,ISA就打开从这个内网该客户端IP到外界FTP服务器IP的指定端口的策略,这个策略是随机产生,并不在策略中显现,所以我们看不到。SOCKS应该和这个一样,如果只打开实际上软件需要访问外界服务器的端口,在二次连接产生的时候,SOCKS没有监视到下次需要打开的端口,毕竟都是各自自己做的软件,不像FTP一样有标准的协议可以查阅,很容易监视到,而不会动态打开下一个端口,造成失败。
所以使用SOCKS的关键是必须知道该软件在公网IP的时候实际上需要访问的服务器端口,然后加入内网到外网的该端口的协议即可,因为SOCKS筛选器的另外一个能力是能够查看需要访问的端口,根据规则适用。但是这个软件如果有像FTP那样2次连接恐怕就必须打开所有端口了,或者你可以通过咨询软件的设计者确定要开的端口,加入许可也可以。