把C#/.net写的服务端程序,丢到服务器里,然后用防火墙给这个程序设置白名单,这本来是很正常的操作步骤。问题是,.net程序,有些连接并不是由程序本身开的,而是由 System.exe 进程开的!!因此,无论你怎么给.net程序开防火墙白名单,都没木有作用滴。这坑爹的鸟设计啊..虽然这是为了端口复用,但完全可以把权限划给用户程序,为毛非得给System.exe,微软的开发者,设计模式没过关?
事实上并非如此。微软之所以这样设计,是为了实现tcp端口复用。比如,IIS web网站的端口为80,然而,你用其他程序,为它做了一个js访问用的WebService。如果没有端口复用功能,由于IIS占了tcp 80端口,则你需要把WebService改为别的端口。但是,按照js跨域问题的定义,端口不同,是会引起跨域问题,造成拒绝访问的。所以,微软把监听的事情,交给System.exe去做,来实现端口复用,这样一来,WebService也可以监听80端口了。
这货优点逆天,但大部分估计用不着。因此,这里还是给出防火墙解决方案:
1.在防火墙里,还是需要给服务端程序,设置白名单的。但这种设置,是为了让该程序主动能外连到其他位置,也就是说,该程序为client,连接其他Server时,就需要这样设置。
2.如果该程序还对外提供ServerSocket端口,则需要在防火墙的高级设置里面,通过指定的类型tcp/upd与端口号,来进行设置。这种设置是为了让该程序能接受外部的连入。