web-dev-qa-db-ja.com

リバースプロキシされたホストへのHTTPリクエストに対するApachemod_substitute

私は次の設定をしています:

  • LAN上のプリンター#1
  • LAN上のプリンター#2
  • 2台のプリンターへのIPPゲートウェイとして使用したいserver-external-ipのDebianApache 2.2Webサーバーに面したインターネット

2つのプリンターは、次のIPP URLで(LANおよびApacheサーバーから)到達可能です。

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

(プリンターはWebサーバーに物理的に接続されていません。)

次のURLでインターネットからアクセスできるようにしたいと思います。

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

IPPは、プリンタアドレスへのHTTPリクエストを介してのみ機能します(つまり、印刷プロセス全体は、http:// printer-X-local-ip/printer でのPOSTリクエストを介して行われます。 = URL)なので、上記のURL 1と2をリダイレクトするだけで済みます(つまり、リバースプロキシ Apacheを使用)。

Apacheは他のコンテンツを提供しているため、カスタムプログラム(netcatやnetsedなど)に置き換えることはできません。また、プリンタクライアントはポート80でのみサーバーに到達できるため、別のポートでカスタムプログラムを実行することはできません。

次に、次のApache構成を試しました。

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

Windowsクライアントをhttp:// server-external-ip/prn1 URLに接続すると、リバースプロキシが機能します。ただし、IPPプロトコルは、完全なデバイスURLも(POSTされたデータ内で)プリンターに送信します。

これは、プリンターがhttp:// server-external-ip/prn1プリンターに対して明示的なIPP要求を受信し、正しいアドレス(http :// printer-1-local-ip/printer)。そのため、接続を拒否します。

このエントリをWindowsクライアントのHostファイルに追加しました。

server-external-ip    printer-dns-name

しかし、プリンターがhttp:// printer-dns-name /prn1のIPP要求を受信したため、それでも機能しません。これはまだ間違ったサービスを持っています名前(つまり、printerの代わりにprn1)。

リバースプロキシのURLをhttp:// server-external-ip/prn1からhttp:// server‑external‑ip / に変更できませんprinter両方のプリンターへのアクセスを提供する必要があるため(そして、プリンター構成でプリンターサービス名を変更できません)。

私がやりたいのは、プリンターにHTTP POSTされたIPPデータをマングルしてhttp:// server‑external‑ip/prnXhttp :// printer-X-local-ip/printer(IPPプロトコルにはチェックサムがなく、キャプチャしたパケットからこれが機能するはずです)。

問題は、私がグーグルで検索できるすべてのApacheモジュールが、逆プロキシされたプリンターに送信されるHTTP リクエストボディのマングリングに役立たないことです。 mod_rewriteはヘッダーのみで機能し、mod_substituteは応答本文で機能し、mod_headersは要求ヘッダーと応答ヘッダーで機能し、mod_replaceは要求本文以外のすべてで機能します。

mod_substituteを使用して、次のことを試しました。

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

ただし、予想どおり、応答本文では完全に機能しますが、プロキシされた要求では機能しません(別のサーバーへのプロキシを確認しました)。また、IPPリクエストはapplication/ippMIMEタイプであるため、フィルタリングが通常のトラフィックに(大幅に)影響を与えることはありません。

この混乱を解決する方法について何かアイデアはありますか?簡単な解決策があるはずだと感じており、物事を正しい方法で見ていません。だから私はこのいつも素晴らしいコミュニティに質問しています(私はまだここに投稿はありませんが、私は長年のファンです)。

この「リダイレクトアプローチ」を継続したいので、回避策は直接的な解決策が存在しない場合にのみ役立ちます。はい、その目的のためにApacheモジュールを変更することはできますが、実際にはそうは思いません... :-)

それまでの間、私はいくつかのネット魔法を試してみます... :-)

6
Danilo Roascio

次のことを行わないのはなぜですか。外部プリンタに2つのDNS名を定義します。

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

内部で使用するのと同じ名前を使用することもできます。内部DNSにプリンタ名を直接プリンタに解決させ、外部DNSに外部IPに解決させます...

サーバーに2つの名前ベースの仮想ホストを追加します。

<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>

そうすれば、 http://printer-2-external.mydomain.com/printer に対するIPPリクエストのPOSTパラメーターに正しいサービス名が含まれます。

3

申し訳ありませんが、コメントを追加することはできませんが、まだコメントを追加していない場合は、次のことを確認してください。

ProxyPreserveHost On

confファイルに設定されています。

書き換えを伴うアプローチはコンテキストルートには適していますが、ホスト名の問題については、ProxyPreserveHostを確認する必要があるようです。

http://httpd.Apache.org/docs/2.2/vhosts/examples.html

2
Schrute