Espelhar localhost: 3280 / some / long / url para localhost: 3000

0

Eu tenho um webservice rodando em localhost 3280 que expõe o servidor Elasticsearch em /some/long/url . Eu gostaria de acessar o Elasticsearch a partir da porta 3000 do localhost.

Posso fazer isso com o encaminhamento de porta, o espelhamento e o proxy? Qual é o melhor caminho?

Editar: eu quis dizer que o serviço está rodando em 3280 e gostaria de acessá-lo a partir de 3000 que está fechado.

    
por Dávid Natingga 01.08.2013 / 01:26

2 respostas

2

Comparado à resposta do slm, tendo que manter dois locais diferentes (iptables e apache) e também dando o efeito colateral de não poder visitar / no localhost: 3280, usaria apenas o Apache para conseguir o resultado. Isso servirá o ElasticSearch via / on 3000 (e não "redirecionará" o usuário para localhost: 3280 / some / long / url - alterando o URL que aparece no navegador). Essa solução lida com as etapas nº 4 e nº 7 de uma só vez (os aplicativos no nº 7 podem redirecionar o tráfego para IPs diferentes no nível nº 4).

Desde que você tenha mod_proxy carregado em seu Apache, você pode alterar sua porta 3000 <VirtualHost> (suponho que esteja usando * e não o 127.0.0.1 na declaração virtualhost):

<VirtualHost *:3000>
    .
    .
    .

    RewriteEngine On
    ProxyPass / http://127.0.0.1:3280/some/long/url 
    ProxyPassReverse / http://127.0.0.1:3280/some/long/url 
</VirtualHost>

EDITAR: Corrija que a regra deve estar em 3000 e proxypass para 3280, clarifique as diferenças para a sugestão de slm e remova o ponto sobre a mudança de 127.0.0.1 no ProxyPass (como é o virtualhost snippet é exatamente o que é perguntado na pergunta original).

Referências:

Documentação do Apache da diretiva Virtualhost e Documentação da Apache sobre a Diretiva ProxyPass.

    
por 01.08.2013 / 03:42
2

Redirecionando a porta

Você pode usar as duas regras a seguir para fazer o que quiser:

$ sudo iptables -t nat -A PREROUTING -p tcp --dport 3000 -j REDIRECT \
      --to-port 3280

$ sudo iptables -t nat -A OUTPUT -p tcp -d 127.0.0.0/8 --dport 3000 -j REDIRECT \
      --to-port 3280

Se você quiser acessar isto fora do localhost, então você precisará adicionar esta regra usando o endereço IP do host (assumindo 192.168.1.10):

$ sudo iptables -t nat -A OUTPUT -p tcp -d 192.168.1.10 --dport 3000 \
      -j REDIRECT --to-port 3280

Redirecionando / -> /some/long/url

Isso pode ser feito usando uma regra de reescrita no Apache. Isso pode ser adicionado ao arquivo httpd.conf do Apache, por exemplo:

RewriteEngine on
RewriteRule ^$ /some/long/url [R=301,L]

Por que 2 ferramentas?

Então, por que você precisa de iptables e Apache? Tem a ver com o modelo OSI . O modelo OSI contém 7 camadas.

#7. Application (Network process to application)

#6. Presentation (Data representation, encryption and decryption, convert machine dependent data to machine independent data)

#5. Session (Interhost communication, managing sessions between applications)

#4. Transport - (End-to-end connections, reliability and flow control)

#3. Network - (Path determination and logical addressing)

#2. Data link - (Physical addressing)

#1. Physical - (Media, signal and binary transmission)

iptables lida com # 4 enquanto o Apache lida com os dados na camada # 7. Pense nos dados como sendo análogos a um envelope. A parte externa do envelope contém o endereço de onde ser entregue (esta é a porta #). Isso seria a camada 4 no modelo OSI.

O conteúdo do envelope (HTTP + a URL) precisa ser manipulado pelo Apache na camada 7.

Referências

por 01.08.2013 / 02:18