私は次の設定をしています:
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でインターネットからアクセスできるようにしたいと思います。
http://server-external-ip/prn1
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/prnXをhttp :// 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モジュールを変更することはできますが、実際にはそうは思いません... :-)
それまでの間、私はいくつかのネット魔法を試してみます... :-)
次のことを行わないのはなぜですか。外部プリンタに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パラメーターに正しいサービス名が含まれます。
申し訳ありませんが、コメントを追加することはできませんが、まだコメントを追加していない場合は、次のことを確認してください。
ProxyPreserveHost On
confファイルに設定されています。
書き換えを伴うアプローチはコンテキストルートには適していますが、ホスト名の問題については、ProxyPreserveHostを確認する必要があるようです。