1 votos

Servicio AWS para la traducción de Puerto

Hay un Amazon Web Services servicio que se va a traducir puertos, tales como el puerto 8001 al puerto 80?

Me gusta alojar múltiples sitios web detrás de una dirección IP estática, y yo uso el reenvío de puertos para la ruta los diferentes puertos a distintos servidores web detrás de mi firewall que hace el reenvío de puertos.

Sería bueno si pudiera implementar una tabla como esta en algún lugar dentro de un servicio de AWS:

Las solicitudes de cliente mydomain.com:80 -> AWS Ruta 53 se traduce en 123.123.123.123:8001 -> Mi puerto de servidor de seguridad delanteros 8001 para el servidor web dentro de la red LAN.

Si AWS no ofrecen este servicio, entonces hay otro fuera de la solución? Yo podría escribir mi propia aplicación para hacer esto y lo ejecuta en una instancia de EC2, pero yo prefiero usar una herramienta existente, si está disponible.

3voto

EEAA Puntos 66011

Seguro, la AWS ALB puede hacer esto. Además, ahora también soporta basado en host de enrutamiento, por lo que se puede señalar varios nombres para el ALBA y configurarlo para que la ruta de cada uno de ellos por separado.

Nota: el ALBA sólo es capaz de equilibrar la carga de peticiones a los servidores de back-end que están dentro de AWS. No es un propósito general servicio de equilibrio de carga que puede ser utilizado en cualquier lugar. Normalmente, usted podrá implementar servidores de back-end en una subred privada de una VPC y, a continuación, implementar un ALB en frente de ellos para aceptar solicitudes de cliente.

Las solicitudes de cliente mydomain.com:80 -> AWS Ruta 53 se traduce en 123.123.123.123:8001 -> Mi puerto de servidor de seguridad reenvía 8001 para el servidor web dentro de la red LAN.

Creo que usted está confundido acerca de la función de DNS. El DNS no sabe nada acerca de los puertos. Para los efectos de la publicación de un sitio web, DNS sólo se asigna un nombre a una o más direcciones IP. Período. No hay manera de tener DNS "redirigir" a un puerto o algo por el estilo.

1voto

steampowered Puntos 205

Yo escribí mi propio puerto traductor en NodeJS, y estoy presentando el código aquí por si alguien más quiere usar. Se hace el cifrado de las conexiones con los certificados https así como texto sin formato en el puerto 80. Lo corro en una EC2 t2.micro instancia por $10 por mes y funciona genial.

La única pega es que requiere que el navegador soporte SNICallback para el servidor proxy de forma dinámica puede utilizar el certificado correcto para el dominio solicitado.

Esta pequeña aplicación a continuación se aprovecha del http-proxy de la biblioteca para NodeJS.

var proxyTable = {
    'mydomain.com': 'http://localhost:8001',
    'demo1.mydomain.com': 'https://localhost:8002', // https after proxy
    'demo2.mydomain.com': 'https://localhost:8005', // https after proxy
    'demo3.mydomain.com': 'https://localhost:8006', // https after proxy
    'demo4.mydomain.com': 'https://localhost:8007', // https after proxy
    'demo5.mydomain.com': 'https://localhost:8008', // https after proxy
}

http.createServer(function(req, res) {
    var hostname = req.headers.host.replace(/^www\./, ''); // remove www. subdomain prefix
    if (proxyTable[hostname]) {
        if (-1 != httpsDomains.indexOf(hostname)) { // redirect to https for httpsDomains
            redirectToHttps(req, res); // res.redirect() not available here
        } else {
            proxy.web(req, res, {target: proxyTable[hostname]});
        }
    } else {
        displayError(res, hostname)
    }
}).listen(80);

// Use SNICallback to dynamically use various SSL certificates depending upon hostname.
// To add a new SSL domain, add to secureContext AND proxyTable
const efboKey = fs.readFileSync(global.appRootPath + '/../mydomain.com.key', 'utf8');
const efboCert = fs.readFileSync(global.appRootPath + '/../mydomain.com.crt', 'utf8');
const efboCaBundleArray = makeCertificateAuthorityArray(global.appRootPath + '/../mydomain.com.ca-bundle', 'utf8');
const efboHttpsComponents = {
        key: efboKey,
        cert: efboCert,
        ca: efboCaBundleArray,
    };
var secureContext = {
    'mydomain.com': tls.createSecureContext(efboHttpsComponents),
    'demo1.mydomain.com': tls.createSecureContext(efboHttpsComponents),
    'demo2.mydomain.com': tls.createSecureContext(efboHttpsComponents),
    'demo3.mydomain.com': tls.createSecureContext(efboHttpsComponents),
    'demo4.mydomain.com': tls.createSecureContext(efboHttpsComponents),
    'demo5.mydomain.com': tls.createSecureContext(efboHttpsComponents),
}
try {
    var options = {
        SNICallback: function (hostname, cb) {
            if (secureContext[hostname]) {
                if (cb) {
                    cb(null, secureContext[hostname]);
                } else {
                    return secureContext[hostname]; // compatibility for older versions of node
                }
            } else {
                throw new Error('No keys/certificates for hostname requested');
            }
        },
        // must list a key and cert because required by tls.createServer()
        key: efboKey,
        cert: efboCert,
        ca: efboCaBundleArray,
    }
    https.createServer(options, function (req, res) {
        var hostname = req.headers.host.replace(/^www\./, ''); // remove www. subdomain prefix
        proxy.web(req, res, {target: proxyTable[hostname], secure: false}); // proxy https to http
    }).listen(443);
} catch (err){
    console.error(err.message);
    console.error(err.stack);
}

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: