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:
-
http://server-external-ip/prn1
-
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 ...: -)