Tengo un proveedor (A) que quiere enviarnos datos a través de una conexión TCP entrante. Desafortunadamente, el servicio consumidor (B) no puede recibir conexiones TCP entrantes. Además no tiene una IP estática, otro requisito.
Una forma de resolver esto sería un servicio que conecte el puerto TCP A entrante a otro puerto TCP B, de modo que el consumidor pueda hacer una conexión saliente a B.
Este no es un problema único [1] [2] , y con socat puedo hacer algo muy parecido a lo que quiero:
socat -d -d -d -u TCP4-LISTEN:PORT-A,reuseaddr TCP4-LISTEN:PORT-B,reuseaddr
Sin embargo, esto tiene los siguientes problemas:
- Si B se desconecta, no se puede volver a conectar. Con
TCP4-LISTEN:PORT-B,reuseaddr,fork
, se puede conectar pero no recibe datos. - B no puede conectarse antes de que A haya establecido una conexión (superable)
- Solo se puede establecer una conexión para
PORT-B
(superable)
¿Hay alguna manera de ajustar el comando para que se convierta en "permanente" y resistente a fallas?
El mundo real es desordenado.
En el mundo real, a veces las conexiones TCP mueren, esto puede suceder, por ejemplo, si se reinicia un firewall con estado o NAT, si la conexión dura demasiado sin tráfico, si la conexión subyacente está inactiva durante demasiado tiempo.
Además, a veces, cuando las conexiones mueren, no mueren simétricamente. Si una conexión que transporta muchos datos muere, es probable que el remitente se dé cuenta de que está inactiva mucho antes de que el destinatario lo haga. Esto tiene un par de efectos secundarios.
Además, las conexiones TCP son una secuencia de bytes, NO una secuencia de mensajes, por lo que cuando su conexión falle, puede recibir un mensaje parcial.
El resultado neto de esto me lleva a concluir que una solución robusta requiere una comprensión del protocolo de aplicación para que su solución pueda entender.
fuente