serviço da AWS para tradução de porta

1

Existe um serviço Amazon Web Services que traduzirá portas, como a porta 8001 para a porta 80?

Eu gosto de hospedar vários sites atrás de um único endereço IP estático, e eu uso o encaminhamento de porta para rotear as diferentes portas para vários servidores web atrás do meu firewall, que faz o encaminhamento de porta.

Seria bom se eu pudesse implementar uma tabela como essa em algum lugar dentro de um serviço da AWS:

Solicitações do cliente mydomain.com:80 - > O AWS Route 53 traduz para 123.123.123.123:8001 - > Minha porta de firewall encaminha 8001 para o servidor da web dentro da LAN.

Se a AWS não oferece esse serviço, existe outra solução pronta para uso? Eu poderia escrever meu próprio aplicativo para fazer isso e executá-lo em uma instância do EC2, mas eu prefiro usar uma ferramenta existente se estiver disponível.

    
por steampowered 30.04.2017 / 21:36

2 respostas

3

Claro, o ALB da AWS pode fazer isso. Além disso, agora suporta roteamento baseado em host , para que você possa apontar vários nomes para o ALB e configurá-lo para rotear cada um separadamente.

Observação: o ALB só pode carregar solicitações de saldo para servidores de back-end que estão dentro da AWS. Não é um serviço de balanceamento de carga de uso geral que pode ser usado em qualquer lugar. Normalmente, você implantará servidores de back-end na sub-rede privada de um VPC e depois implantará um ALB na frente deles para aceitar solicitações de clientes.

Client requests mydomain.com:80 -> AWS Route 53 translates to 123.123.123.123:8001 -> My firewall port forwards 8001 to the web server inside the LAN.

Eu acho que você está confuso sobre o papel do DNS. O DNS não sabe nada sobre portas. Para fins de publicação de um site, o DNS somente mapeia um nome para um ou mais endereços IP. Período. Não há como redirecionar o DNS para uma porta ou algo assim.

    
por 30.04.2017 / 21:46
1

Eu escrevi meu próprio tradutor de porta no NodeJS, e estou enviando o código aqui, caso alguém mais queira usá-lo. Ele faz conexões criptografadas com certificados https e também com a porta de texto simples 80. Eu o executo em uma instância EC2 t2.micro por US $ 10 por mês e ele funciona muito bem.

O único recurso necessário é que o navegador suporte SNICallback para que o servidor proxy possa usar dinamicamente o certificado correto para o domínio solicitado.

Este pequeno aplicativo abaixo aproveita o link para o 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);
}
    
por 01.05.2017 / 02:22