Apache mod_substitute em solicitações HTTP para host com proxy reverso

6

Eu tenho a seguinte configuração:

  • Impressora nº 1 na LAN
  • Impressora nº 2 na LAN
  • Internet voltada para o servidor web Debian Apache 2.2 em server-external-ip que eu quero usar como um gateway IPP para as duas impressoras

As duas impressoras podem ser acessadas (da LAN e do servidor Apache) nas seguintes URLs do IPP:

  • http://printer-1-local-ip/printer
  • http://printer-2-local-ip/printer

(As impressoras não estão fisicamente conectadas ao servidor da Web.)

Eu quero que eles sejam acessados pela Internet nos seguintes URLs:

  1. http://server-external-ip/prn1
  2. http://server-external-ip/prn2

O IPP funciona exclusivamente através de solicitações HTTP para o endereço da impressora (ou seja, todo o processo de impressão acontece por meio de solicitações POST no link URLs), então eu só preciso redirecionar (ou seja, proxy reverso com o Apache) URLs 1 e 2 acima.

O Apache está veiculando outro conteúdo, por isso não posso substituí-lo por um programa personalizado (por exemplo, netcat ou netsed). Além disso, não posso executar um programa personalizado em uma porta diferente, pois os clientes da impressora só poderão acessar o servidor na porta 80.

Então eu tentei a seguinte configuração do Apache:

RewriteRule ^/prn1$ http://printer-1-local-ip:80/printer [P]
ProxyPassReverse /prn1 http://printer-1-local-ip

Conectando um cliente Windows à URL link , o proxy reverso funciona. Mas o protocolo IPP também envia para a impressora (dentro dos dados POST-ed) o URL completo do dispositivo.

Isso significa que a impressora recebe uma solicitação IPP explícita para uma impressora link , e não para seu endereço correto ( link ). Por isso, recusa a conexão.

Eu adicionei esta entrada no arquivo HOST no cliente Windows:

server-external-ip    printer-dns-name

Mas ainda não funciona, pois a impressora recebe uma solicitação de IPP para link prn1 que ainda tem o nome de serviço errado (ou seja, prn1 em vez de impressora ).

Não é possível alterar o URL do proxy reverso de link para link impressora pois tenho que fornecer acesso a ambas as impressoras (e posso não altere o nome do serviço impressora na configuração da impressora).

O que eu quero fazer é manipular os dados IPP HTTP POST-ed para a impressora para substituir link com link (não há checksums em o protocolo IPP e dos pacotes que eu capturei isso deve funcionar).

O problema é que todos os módulos do Apache para os quais eu posso pesquisar no Google não irão ajudá-lo a manipular corpos de solicitação enviados para a impressora com proxy reverso. mod_rewrite funciona somente nos cabeçalhos, mod_substitute funciona nos corpos de resposta, mod_headers funciona nos cabeçalhos de solicitação e resposta, mod_replace funciona em tudo, menos em corpos de solicitações, etc.

Com mod_substitute tentei com o seguinte:

<Location /> 
    AddOutputFilterByType SUBSTITUTE application/ipp
    Substitute "s|server-external-ip/prn1|printer-1-local-ip/printer|"
</Location>

Mas, como esperado, funciona perfeitamente em corpos de resposta, mas não em solicitações com proxy (verifiquei o proxy para outro servidor). Observe também que as solicitações de IPP são do tipo MIME application / ipp , portanto, a filtragem não afetará (significativamente) o tráfego normal.

Alguma idéia de como resolver essa bagunça? Eu sinto que deveria haver uma solução fácil e eu não estou olhando as coisas do jeito certo. É por isso que estou pedindo a essa comunidade sempre incrível (ainda não tenho posts aqui, mas sou fã de longa data).

Gostaria de permanecer nessa "abordagem de redirecionamento", para que as soluções alternativas sejam úteis somente se não houver uma solução direta. E sim, eu poderia modificar um módulo do Apache para o propósito, mas eu realmente não sinto isso ... :-)

Enquanto isso, vou tentar alguma magia netsed ...: -)

    
por Danilo Roascio 22.10.2012 / 16:16

2 respostas

3

Por que não fazer o seguinte: Defina dois nomes DNS para sua impressora externa, por exemplo,

printer-1-external.mydomain.com CNAME external-server.mydomain.com
printer-2-external.mydomain.com CNAME external-server.mydomain.com

Você pode até usar os mesmos nomes que usa internamente. Faça com que o DNS interno resolva os nomes das impressoras diretamente para a impressora e o DNS externo para o seu IP externo ...

Adicione dois hosts virtuais baseados em nome em seu servidor:

<VirtualHost *:80>
    ServerName printer-1-external.mydomain.com
    ProxyPass / http://printer-1-local-ip/
</VirtualHost>
<VirtualHost *:80>
    ServerName printer-2-external.mydomain.com
    ProxyPass / http://printer-2-local-ip/
</VirtualHost>

Dessa forma, sua solicitação de IPP para o link terá o nome de serviço correto em seus parâmetros de postagem.

    
por 09.04.2013 / 08:47
2

Desculpe, mas se você ainda não tiver adicionado comentários, verifique se:

ProxyPreserveHost On

está configurado no seu arquivo conf.

A abordagem com a reescrita é boa para a raiz de contexto, mas para o problema do nome do host, parece que você deseja verificar o ProxyPreserveHost.

link

    
por 02.04.2013 / 01:33