En un servidor tengo un IIS que sirve unas webs estátics que actúan de frontend. A la vez, en ese mismo servidor, hay un Adobe Flash Server que hasta hace poco escuchaba únicamente al puerto 1935.

Pero dado que en muchos sitios (clientes principalmente) tienen firewalls que no tienen este puerto abierto, se decidió habilitar los puertos 80, 443 (rtmps) y 8080, haciendo que el frontend detectara cual era el puerto abierto e hiciera la llamada de streaming por ese.

Añadimos una segunda IP al servidor (10.10.10.80) y en Flash Server editamos el archivo r ${FLASH_ROOT_DIR}conf_defaultRoot_Adaptor.xml con lo siguiente (incluye aquí ya la configuración SSL):

(…)
<HostPortList>
<HostPort name=”edge1″ ctl_channel=”localhost:19350″>10.10.10.50:1935</HostPort>
<HostPort name=”edge2” ctl_channel=”localhost:19351“>10.10.10.80:1935,80,-443,8080</HostPort>
</HostPortList>
(…)
<Edge name=”Edge1″>
<Enable>true</Enable>
<IdlePostInterval>512</IdlePostInterval>
<IdleAckInterval>512</IdleAckInterval>
<MimeType>application/x-fcs</MimeType>
<WriteBufferSize>16</WriteBufferSize>
<SetCookie>false</SetCookie>
<Redirect enable=”false” maxbuf=”16384″>
<Host port=”80″>:8080</Host>
<Host port=”443″>:8443</Host>
</Redirect>
<NeedClose>true</NeedClose>
<MaxWriteDelay>40</MaxWriteDelay>
</Edge>
<Edge name=”Edge2″>
<Enable>true</Enable>
<IdlePostInterval>512</IdlePostInterval>
<IdleAckInterval>512</IdleAckInterval>
<MimeType>application/x-fcs</MimeType>
<WriteBufferSize>16</WriteBufferSize>
<SetCookie>false</SetCookie>
<Redirect enable=”false” maxbuf=”16384″>
<Host port=”80″>:8080</Host>
<Host port=”443″>:8443</Host>
</Redirect>
<NeedClose>true</NeedClose>
<MaxWriteDelay>40</MaxWriteDelay>
</Edge>

(…)
<SSL>
<SSLServerCtx>
<SSLCertificateFile>E:flashserversslrtmp.domain.com.crt</SSLCertificateFile>
<SSLCertificateKeyFile type=”PEM”>E:flashserversslrtmp.domain.com.key</SSLCertificateKeyFile>
<SSLPassPhrase></SSLPassPhrase>
<SSLCipherSuite>ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH</SSLCipherSuite>
<SSLSessionTimeout>5</SSLSessionTimeout>
</SSLServerCtx>
</SSL>

A la hora de la verdad esto no funcionaba ya que, aunque en el Administrador de IIS especifiquemos las IPs sobre las que escuchan los VirtualHosts, el IIS hace lo que denominan SocketPooling, es decir, abrir el puerto 80 para todas las IPs que tenga (o sea *:80). Hasta IIS 5.0 parece ser que sólo bastaba con activar el parámetro DisableSocketPooling en el Metabase.xml, pero en la versión 6.0 este método no funciona.

Microsoft lo confirma y muestra un procedimiento de como actuar. Como no puede hacerse a través del Administrador del IIS, se deben instalar las Support Tools que vienen en el CD1 del CD de Windows 2003 Server, tras lo que tendremos la herramienta httpcfg.

Podemos ver la configuración actual ejecutando:

C:Program FilesSupport Tools> httpcfg.exe query iplisten
HttpQueryServiceConfiguration completed with 1168

La salida 1168 indica que no hay ninguna entrada configurada, con lo que IIS está configurado para arrancar con todas las IPs disponibles. Como queremos que IIS sólo escuche por la IP 10.10.10.50 y así tengamos la 10.10.10.80 libre para Adoble Flash server, hemos ejecutado lo siguiente, y han funciona correctamente ya que devolvía el valor 0.

httpcfg set iplisten -i 10.10.10.50

Podemos ver la configuración actual de nuevo:

C:Program FilesSupport Tools>httpcfg query iplisten
IP : 10.10.10.50
——————————————————————————

Para que el cambio sea efectivo reiniciaremos los servicios de IIS. Via comando sería:

net stop http /y
net stop w3svc
net start w3svc

Para eliminar esta configuración y volver a activar el SocketPooling basta con borrar todas las entradas y reiniciar el servicio, y luego verificaremos que trás el httpcfg query iplisten obtenemos de nuevo un 1168:

httpcfg delete iplisten -i 10.10.10.50
net stop http /y
net stop w3svc
net start w3svc