WCF y Balanceadores de Carga F5 Big IP

|

Como ultimamente sucede ando haciendo servicios Web, y me encanta WCF para hacerlo por muchas razones, en especial la rapidez con la que uno puede hacer cosas complejas, y como era de esperarse en una de las implementaciones que hice por el crecimiento que tienen, cambiaron sus balanceadores de carga de software por "cajas" F5 Big IP estas definitivamente son muy buenas para distribuir la carga y bajar el procesamiento de los servidores, por que entre otras cosas mas que balancear carga, se pueden encargar del procesamiento SSL, y por su puesto esto es un alivio para los servidores! Pero no para los servicios WCF que usan credenciales en el mensaje...
Resulta que como el F5 se encarga del procesamiento SSL, cuando el trafico es pasado al servidor de turno este pasa plano, claro para apliaciones web es facil configurar para que se reciba el trafico plano, de hecho en ciertos casos no hay que hacer nada, pero si usas un servicio WCF con credenciales en el mensaje, por restricciones de seguridad TIENES QUE USAR SEGURIDAD EN EL TRANSPORTE, esto significa encriptar la comunicación con SSL, no hay otra forma, o incurrir en otras practicas no recomendadas como pasar las credenciales como parametros de los mensajes (no hagan esto nunca!) y demas...

Uno puede notar el problema cuando claro ya configurado el F5 y apuntas a tu servicio con Seguiridad en el Transporte y Credenciales en el Mensaje, el trafico pasa y en el servidor donde se ejecuta el servicio te dicen que no pueden validar los mensajes que llegan, y de vuelta tambien tienes el mismo resultado, Faults diciendo que la seguridad no puede ser verificada, ok si tienes estos mensajes tienes el problema...

Hay 2 soluciones, la primera implementar un canal Http que permite que se pasen las credenciales en el mensaje sin seguridad en el transporte, eso puedes encontrar como hacerlo aca: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/87a254c8-e9d1-4d4c-8f62-54eae497423f/, pero la verdad no les recomiendo esto, revise un poco profundamente y hay ciertos casos en que no funciona completamente, y ademas es un poco complicado, ademas una advertencia es que si haces esto los mensajes pasan planos por la red y pueden ser vistos facilmente con un sniffer bien ubicado en la red...

La otra opcion antes no era posible, pero ahora si, antes los F5 no podian pasar el trafico SSL al servidor, solo podian pasarlo plano, gracias al soporte de F5 se nos indico que hoy ya se puede hacerlo, les sugiero que para los pasos exactos contacten al soporte de F5, los pasos basicos y no detallados en resumen son estos:

1.- Crear un virtual server en el puerto 443 y a el asociar un Profile SSL Server
2.- Crear un pool en el puerto 443 y poner como member server el servidor
3.- Dividir el certificado a usar en 2, 1 es el certificado y otro es la clave, subirlo al F5 a las ubicaciones correspondientes para cada tipo
4.- Crear un SSL Proxy, usando el certificado y la clave que se subio anteriormente
5.- Configurar a que apunte a los servidores correctos

Estos son pasos con mucha falta de detalle, yo insisto en que consulten a su soporte F5 para los pasos detallados, la consulta es como hacer un Servidor SSL de Cliente, para que el servidor reciba el trafico SSL.

Espero les sirva!

3 comments:

Michael Hidalgo said...

Desarrollé una aplicación en Visual Studio 2005 utilizando .net remoting 2.0 , para ello estoy usando Servicios Windows para hospedar los objetos remotos. El canal usado es el TCPChannel, para ello utilizo la activación SAO
He acá la configuración del servicio Windows

5- Esta es la activación del objeto remoto.



6-Tengo una granja Middleware (F5 BIGIP) cuya dirección es (192.168.162.162). Esta granja se compone de dos nodos(192.168.162.50, 192.168.162.51).Estos nodos tienen instalados los servicios Widows, ambos servidores poseen las mismas especificaciones de software y hardware.
7-Cuando accedo ala granja para acceder los objetos remotos , obtengo el siguiente error “An active connection was forcibly closed by remote host
System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond Server stack trace: at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.Sockets.Socket.Connect(EndPoint remoteEP) at System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket(EndPoint ipEndPoint) at System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket() at System.Runtime.Remoting.Channels.SocketCache.GetSocket(String machinePortAndSid, Boolean openNew) at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.SendRequestWithRetry(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream) at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream) at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg) Exception rethrown at [0]: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) at

8-Si me conecto directamente a un nodo (192.168.162.50), la aplicación no da ningún problema. Solo cuando la granja balancea los nodos

Fco Lomas said...

Michael, mira seguro el problema esta en la configuracion del f5, asi como configuras el puerto en que se reciben los datos, se debe tambien configurar a donde se envian los datos, este no es un problema de .NET o remoting, es de configuracion de F5, no soy un experto y no tengo siempre un f5 a mano, asi es que te recomendaria que consultes con tu soporte F5 sobre como configurar un servicio que usa TCP y no HTTP, con eso ellos te diran exactamente que hacer

Miguel said...

Hola: Han probado hacer este balanceo de carga usando WCF, pero donde los endpoints usen NetTcpBinding??

Alguna configuracion adicional? algo que se deba tener en consideracion???

Saludos