オープンソース

プロキシ/ロードバランサOSS比較18選

プロキシサーバとは

プロキシとは、クライアントとサーバの間に中継サーバとして配置するサーバのことです。プロキシは、クライアントから見た場合、サーバのように振る舞い、サーバから見た場合、クライアントのように振る舞います。クライアントアプリケーションは、プロキシへ通信を行い、プロキシはそのリクエストを受信し、受信したリクエストを本来送られるべきサーバへ転送するかのように送信します。サーバは、リクエストを送信してきたプロキシへ応答を返します。プロキシは応答に対応したクライアントに対して、応答を送信します。

プロキシサーバの図

プロキシサーバの種類

プロキシは、通信を中継するため通信内容をログに残したり、検査したり、書き換えたりといった処理が可能です。そのため、様々なプロトコルに対応した汎用的なプロキシと、アプリケーション(プロトコル)毎に特化した処理を行うソフトウェアがあります。

なお、Webプロキシは、HTTPプロトコルに特化したプロキシです。HTTPに特化したプロキシは様々な用途で使われており、Webプロキシを狭義のプロキシと呼ぶ場合があります。

フォーワーディングプロキシ

フォーワーディングプロキシとは、クライアントとサーバの間で、単純に処理を中継するプロキシです。クライアントとサーバが直接的に通信を行えない場合や、直接通信を行うとセキュリティ上のリスクがある場合に使うことが多いです。つまり、ローカルネットワークの出口に設置し、組織内から組織外への通信を中継したり、組織外から組織内の特定のサーバへの通信を中継したりという用途で使われています。何段階もプロキシを経由して通信を行う場合もあり、これを多段プロキシと呼びます。

キャッシュサーバ

キャッシュサーバとは、インターネットへの通信を1つのサーバに集約しキャッシュすることで、通信回線の帯域を有効に利用するために利用するプロキシサーバです。特に、HTTPに対応したキャッシュサーバをWebキャッシュサーバ、DNSに特化したキャッシュサーバをDNSキャッシュサーバまたはキャッシュDNSサーバと呼びます。

キャッシュサーバでは、キャッシュの管理が非常に重要となります。すべてのキャッシュをメモリ上に配置すると高速に動作することができますが、現実的にはメモリ容量に制約があるため、必要に応じてディスク上にキャッシュファイルを配置することも多いです。また、すべてのデータをキャッシュしておくことはできないため、キャッシュを削除することも必要です。キャッシュ機能を提供するほとんどのサーバでは、キャッシュサイズの上限や、削除ポリシーをチューニングできるようになっています。

リバースプロキシ

リバースプロキシは、特定のサーバ(群)への通信を中継するプロキシです。サーバの負荷の軽減やロードバランシングのために使われています。そのため、ほとんどの場合は、サーバの直前に配置されます。TLS/SSLの暗号化通信のデコードのみを行うプロキシサーバを、TLS/SSLオフローダと呼びます。

また、HTTPやデータベースなど、1つのコネクションの中で連続して複数の処理を行えるプロトコルでは、サーバの処理を高速化するために、リバースプロキシが使われることがあります。プロキシサーバが、サーバとの接続を維持しておき、クライアントからの処理を接続済みのコネクション上で行います。これによって、通信の接続/切断/認証などの処理を行う必要がなくなるため、サーバの処理負担を減らし、有効にリソースを利用することができるようになります。このとき、プロキシがサーバとの間で保持しているコネクション群を、コネクションプールと呼びます。

このようにリバースプロキシに処理を高速化する機能を持たせたものをアクセラレータと呼びます。アクセラレータの実現方法としては、コネクションプールの他に、キャッシュ機能などを利用したものがあります。

リバースプロキシの図

透過型プロキシ

透過型プロキシは、通信相手がプロキシの存在を意識せずに使えるプロキシです。一般的なプロキシは、クライアントにプロキシサーバのアドレスを明示的に設定して利用します。例えば、Webブラウザにはプロキシの設定項目があり、プロキシサーバを利用する場合には明示的な設定を行います。しかし、こうした設定をすべてのクライアントに行うことは、非常に面倒です。

透過型プロキシの図

透過型プロキシは、クライアントからサーバへのリクエストを強制的に曲げて中継処理を行います。そのため、クライアントにはプロキシサーバの設定が必要ないというメリットがあります。

ただ、強制的に通信をねじ曲げるためには、クライアントとサーバの間の通信を外部から傍受して介入する必要があります。透過型プロキシをルータとして通信経路上に配置するか、L4スイッチの機能などを使って強制的にプロキシへデータを転送する必要があります。

プロキシのメリット

プロキシサーバには、次のようなメリットがあります。

セキュリティの強化

クライアントとサーバの間に、プロキシサーバを配置することで、セキュリティの強化を行うことができます。ファイアウォールの実装として、プロキシが使われることもあります。

通信の分離

組織内のローカルな通信と、インターネットとの通信を明確に分離し、指定したアプリケーションの通信だけしか通さないことで、ネットワークを分離することができます。

アクセス制御

プロキシへのアクセスを制限することで、該当アプリケーションへの通信を制限することできます。クライアントのIPアドレスでアクセスの可否を制御したり、ユーザ・パスワードでアクセスを制御する方法などがあります。ユーザとパスワードで認証を行う場合は、ユーザ名とパスワードを検査する仕組みが必要になります。LDAPActiveDirectoryと連携できるプロキシサーバもあります。

通信内容の検査

プロキシで通信内容を確認し、問題がある通信を遮断したりすることができます。プロキシの機能を利用して、ウィルスチェックやURLフィルタリングなどの処理を行う方法も一般的であり、プロキシで通信内容の検査を行うプロトコルとしてICAPなどが使われています。

通信内容の検査の図

通信量削減、サーバの負荷軽減、処理の代行

プロキシサーバにキャッシュ機能を持たせることで、通信量の削減を行うことができます。また、キャッシュ機能が利用できるリバースプロキシ(アクセラレータ)では、サーバへのリクエストの一部をプロキシサーバのみで処理することができます。これによって、サーバがアクセス制御やTLS/SSLの処理に対応していない場合でも、機能が利用できるようになります。サーバが機能を持っている場合でも、処理をプロキシで代行することで負荷を軽減することができます。

ロードバランサとして働き負荷を分散

リバースプロキシは、ロードバランサとして負荷分散の用途で使われる場合も多いです。複数のサーバを配置し、プロキシが処理を送るサーバを決定して振り分けを行います。このような構成では、プロキシサーバ(ロードバランサ)の背後に設定されているサーバをバックエンドと呼びます。

ロードバランサとしての働き

アクセス監査

プロキシを通過した通信のログを記録することで、通信を監査することができます。そのため、アクセス監査の目的でプロキシサーバを導入することがあります。認証処理で取得したユーザ名やIPアドレスと処理を一緒に記録しておけば、誰がどのような処理を行ったのかが一目瞭然です。

最近では、ログだけでなく、動画で処理内容を残せるソフトウェアもあります。例えば、Apache Guacamoleでは、リモートデスクトップやSSHでの操作の様子を動画で保存できるため、厳密な監査が可能になります。

経路制御

プロキシサーバの経路制御や多段プロキシを活用して、通信の相手や内容によって利用する通信経路を切り替え、これにより、複数の通信回線の経路を使い分けることができます。

プロキシ構築時の注意点

プロキシを構築する場合には、次のような点に注意する必要があります。

オープンリレー

プロキシを利用する場合には、利用者か通信先のどちらかを必ず限定しなければなりません。両方が限定されていない場合は、他のサーバを攻撃として使うための踏み台として使われてしまう可能性があります。こうした制御がされていないプロキシをオープンプロキシ、またはオープンリレーと呼びます。インターネット上の悪意を持った攻撃者は、こうしたオープンリレーを探して利用しているので、オープンリレー状態はすぐに検出されて、攻撃に利用されてしまいます。

パフォーマンス

プロキシサーバは、多くの通信を中継することになります。そのため、プロキシサーバが性能のボトルネックになってしまうことも多く、そのため、プロキシサーバには十分なリソースを割り当てる必要があります。拡張性が必要な場合には、複数のプロキシサーバを配置して、ロードバランサなどで負荷分散して利用し、また、常にパフォーマンスの状態をモニタしておくべきです。

冗長化

プロキシサーバが停止すると、通信ができなくなってしまいます。そのため、重要な通信では、プロキシサーバの冗長性を確保しておく必要があります。冗長化は、ロードバランサを使う方法と、冗長化ソフトウェアを使う方法があります。

サーバのログ

プロキシを経由してアクセスすると、サーバ側のログにはプロキシサーバのアドレスがアクセス元として記録されるため、本来のクライアントの情報は記録されていません。そのため、プロキシでログを記録するか、代替の方法を考える必要があります。

Webプロキシでは、HTTPリクエストヘッダに元のクライアントアドレスを記録されるので、サーバ側ではそれを記録する必要があります。また、Webプロキシ以外でも、Proxy Protocolに対応したプロキシとソフトウェアを組み合わせれば、本来のリクエスト元を保管することができます。

OSSのロードバランサ

ロードバランサには、プロキシ型と透過型の2つの種類があります。透過型のロードバランサは、処理を中継せず、単にパケットを転送することで動作します。このようなロードバランサは、処理を行う通信レイヤーによって、L2ロードバランサ、L3ロードバランサ、L4ロードバランサ、L7ロードバランサなどのように呼ばれています。

プロキシ型のロードバランサでは、パケットをアプリケーションレイヤーで中継するため、サーバから見た通信元はロードバランサになってしまいます。しかし、透過型のロードバランサは、通信元の情報が変更されずにサーバに届きます。そのため、プロキシ型に比べてアクセス制御がしやすく、正確なログが残せるというメリットがあります。

LVS

LVSとは、Linux上でL4ロードバランサの機能を実現するためのソフトウェアです。Linux Virtual Serverの略称で、ロードバランサに求められる基本的な機能を提供します。Linux Virtual Server Projectという開発プロジェクトが開発し管理しており、Linuxカーネルにも正式に取り入られています。LVSでは、プロトコル毎にパケットの転送先を制御することができます。

LVSは、パケットの転送機能だけを実現します。そのため、設定情報の管理、バックエンドサーバの管理、冗長性の確保を行うためには、別のソフトウェアを組み合わせる必要があります。そのようなソフトウェアとしては、keepalivedやldirectordなどが知られています。

ILUKA構築事例

ILUKA

ILUKAは、LVS+keepalivedのフロントエンドとして動作するGUI管理ツールです。デージーネットが開発し、オープンソースソフトウェアとして公開しています。keepalivedでは、仮想サーバや実サーバを設定ファイルで管理するため、管理のハードルが高く、また設定を失敗すると、負荷分散処理を止めてしまうリスクもあります。ILUKAは、このような問題を解決するために作成されたソフトウェアで、仮想サーバやバックエンドサーバの管理をWeb GUIから行うことができます。

ILUKA構築事例

UltraMonkey

UltraMonkeyは、Layer 7まで対応するLinux向けのロードバランサのソフトウェアです。NTTコムウェアが開発し、オープンソースソフトウェアとして提供しています。特に、HTTPに関してはプロトコルレベルまで解析して、URLやCookieの内容を確認して、転送先のサーバを切り替えることができます。開発当初は非常に注目されましたが、設定が難しいというデメリットがあります。そのため、最近ではHAProxyやNginxなどのプロキシ型ロードバランサーの進化やProxy Protocolなどの標準化が進み、プロキシ型ロードバランサーが使われることが多くなっています。

汎用のプロキシサーバ

汎用のプロキシサーバのソフトウェアは、様々なプロトコルに対応したソフトウェアです。プロキシ専用のソフトウェアと、簡易的な機能を提供するソフトウェアの2つがあります。

HAProxy

HAProxyは、高機能なOSSの汎用プロキシサーバです。サービスの冗長性(High Availability)を確保するために使われるプロキシ(Proxy)ということで、HAProxyという名称が付けられています。RedHat Enterprise LinuxやCentOSなどでも、パッケージが提供されているソフトウェアで、安定して動作します。OpenStackなどの内部や、Kubernetesのロードバランシングサービスでも使われていて、実績が豊富で安心して利用できるプロキシサーバです。

HAProxyは、Webプロキシとしても機能が豊富で、リクエストURLによるサーバの振り分け、TLS/SSLのオフロードなどの処理も可能です。また、ロードバランサとしては、バックエンドのサーバのヘルスチェック機能も充実しています。また、HAProxyは、Proxy Protocolにも対応していて、SMTP、POP、IMAPなどのプロキシとしても利用できます。

HAProxy構築事例    HAProxy無料資料

delegate

delegateは、日本の産業技術総合研究所(JAIST)で開発されたオープンソースの汎用プロキシサーバです。1994年に開発されHTTP、FTP、NNTP、SMTP、POP、IMAP、LDAP、Telnet、DNS、TLS、SSHなど非常に多くのプロトコルに対応しています。そのため、1990年代から2000年代にかけて良く利用されました。しかし残念ながら、2014年の9.9.12版を最後にリースが停止しています。

delegate構築事例

systemd(systemd-socket-proxyd)

systemdとは、Linuxシステムを起動するときに最初に起動されるの初期プロセス(init)として動作するオープンソースのソフトウェアです。Red Hat Enterprise Linux、CentOS、Ubuntuなど、様々なLinuxディストリビューションで標準的に採用されています。systemdは、システムのサービスを制御する機能を担っています。

systemdに付属するsystemd-socket-proxydの機能を使って、簡易なプロキシ機能を設定することができますが、機能的には単なるポートフォワーディングとログの記録程度しかできません。アクセス制御の機能もないため、Linuxのパケットフィルタリングの機能を利用して行う必要があります。

xinetd

xinetdは、systemdが一般的になる以前には良く使われていたソフトウェアで、TCP/UDPソケットを扱うinetd型のアプリケーションを制御することができるスーパーバイザです。多くのLinuxディストリビューションで、パッケージが利用できます。機能的には、単なるポートフォワーディングとログの記録程度ですが、簡易にプロキシを作るには便利です。systemdとは異なり、アクセス制御の機能も利用でき、また同時接続数の制限などにも対応しています。

プロキシサーバ機能が使えるWebサーバ

Webサーバには、プロキシ機能を備えたソフトウェアがあります。ここでは、プロキシ機能が使えるWebサーバを紹介します。

Apache

Apacheは、高機能なWebサーバとして有名なオープンソースソフトウェアです。Apacheは、動的モジュールで機能を拡張することができ、mod_proxyというモジュールを使うことでプロキシサーバとして利用もできます。またほとんどすべてのLinuxディストリビューションで利用することができます。

Apache mod_proxyは、Webに特化したプロキシですが、フォワードプロキシ、リバースプロキシ、Webキャッシュ、ロードバランシング、TLS/SSLオフロード、アクセス制御などWebプロキシとして必要なすべての機能に対応しています。また、ユーザ認証、アクセス制御も可能で、LDAPやActiveDirectoryとの連携もできます。

Nginx

Nginxは、軽量なWebサーバとして人気のあるオープンソースソフトウェアです。リバースプロキシサーバとしても豊富な機能を持っており、WebだけでなくSMTP、POP3、IMAP、FTPにも対応しています。ロードバランサ、Webキャッシュなどの機能もサポートしています。また、パフォーマンスが優れていることが特徴で、Kubernetesのロードバランシングサービスにも採用されており、信頼できるプロキシソフトウェアです。Nginxは、Proxy Protocolにも対応しています。

Nginx構築事例

Webプロキシ

狭義のプロキシは、Webプロキシのことを指します。ここでは、Webプロキシに特化したソフトウェアを紹介します。

Squid

Squidは、最も有名で、最も高機能なプロキシソフトウェアです。ほとんどのLinuxディストリビューションに採用されています。単純なフォワーディングプロキシから、Webキャッシュ、リバースプロキシ、透過プロキシとWebプロキシに必要な機能は、ほぼサポートしています。またユーザ認証、アクセス制御も可能で、LDAPやActiveDirectoryとの連携もできます。さらに、ICAPなどにも対応し、外部連携の機能が豊富で、URLフィルタリング、ウィルスチェックなど、通信内容の検査に対応することができます。

ただし、Squidのロードバランサとしての機能は限定的で、HAProxyやNginxの方が高機能です。また、設計が古いことから、性能面でも劣る面があります。

Squid構築事例

Vanish Cache

Vanish Cacheは、オープンソースのWebアクセラレータです。非常に優れたWebキャッシュの機能を持っていて、Squidよりも10倍~20倍高速であると言われています。最近になって、RedHat Enterprise Linux 8/CentOS 8で正式採用されました。

Pound

Poundは、高機能なWebロードバランサのオープンソースソフトウェアです。リバースプロキシとして動作し、TLS/SSLオフロードもサポートしています。バックエンドのサーバの振り分けのアルゴリズムを多数持っていて、Cookieによる振り分けなどもサポートしているのが特徴です。

FTPプロキシ

FTPは、データセッションとコマンドセッションが分離しているため、プロキシを作成することが難しく、汎用的なプロキシでも対応をしていません。機能が制限されるHAProxy、Nginxではリバースプロキシを実装することができますが、フォーワードプロキシとして利用することはできません。

SquidではHTTP経由でFTPへのリクエストを行う場合のみフォーワードプロキシとして機能します。またdelegateは、フォーワードプロキシとして構成することができます。FTPのフォーワードプロキシでは、ユーザ名として「ユーザ名@サーバ名」を指定することで、転送先のサーバ名を指示します。この方式は、1990年代にアプリケーションファイアウォールとして使われていたfwtk(Firewall Tool Kit)が採用した方式です。

ProFTPD(mod_proxy)

ProFTPDは、オープンソースの高機能なFTPサーバのソフトウェアで、モジュールにて機能を拡張することができます。FTPプロキシに対応するため、サードパーティが開発したmod_proxyというモジュールが公開されています。

mod_proxyは、フォーワードプロキシとリバースプロキシの両方をサポートしています。また、認証方式も「ユーザ名@サーバ名」という方式だけではなく、独自のユーザ認証をした後で、FTPサーバに接続する方式をサポートしています。

POP/IMAPプロキシ

POP/IMAPのプロトコルは、FTPのような複雑なコネクションの制御を行いません。そのため、リバースプロキシ型でPOP/IMAPの通信を中継するプロキシは、systemdxinetdなどの汎用的なプロキシでも構築することができます。しかし、汎用的なプロキシを利用すると、どのユーザがどのIPアドレスから接続してきたかを記録として残すことが難しいです。そのため、Proxy Protocolに対応したHAProxyNginxなどのプロキシを使うのが一般的です。

Dovecot

Dovecotは、POP/IMAPサーバとして広く利用されているオープンソースソフトウェアで、Red Hat Enteprise Linux、CentOS、Ubuntuなど、多くのディストリビューションに採用されています。Dovecotには、リバースプロキシ機能が実装されていて、POP/IMAPのロードバランサとしても利用できます。また、Dovecotのプロキシサーバ機能は、ユーザ毎に転送先のサーバを制御することができるなど、非常に高機能です。

RDPのプロキシ

組織外から、組織内のサーバやPCにアクセスする時には、RDP(Remote Desktop Protocol)が使われることが多いです。RDPプロキシは、組織外のPCから、組織内の適切なサーバやPCにデスクトップを中継するソフトウェアです。

Apache Guacamole(RDP/SSHゲートウェイ)

Apache Gucamoleは、RDPとSSHに対応したオープンソースのゲートウェイソフトウェアです。クライアントは、WebブラウザでApache Guacamoleサーバにアクセスし、組織内のPCやサーバにアクセスすることができます。Apache Guacamoleは、RDPやSSHを使って通信を行うWebアプリケーションとして動作するため、厳密な意味ではプロキシではありません。しかし、プロキシが提供する通信の分離、アクセス制御、通信内容の監査、経路制御などの要件をサポートしています。

Apache Gucamoleは、フォーワードプロキシーのように、ユーザの要望に合わせてアクセスするPCを変更できます。アクセスできる範囲は、ユーザやグループ毎に定義することができ、またRDPやSSH上で行われた処理を動画として保管することで、監査の機能も提供します。

ApacheGucamole無料資料

DNSのロードバランサ

BINDやunboundなどで構築できるDNSキャッシュサーバは、広い意味ではDNSのプロキシです。ただし、単純に処理結果をキャッシュしたり転送したりするだけではなく、再帰的に問合せを行う機能を持っています。一方で、単純にDNSの問合せを転送するだけのプロキシサーバもあります。

dnsdist

dnsdistは、PowerDNSの開発元として知られるオランダのPowerDNS.COM BVが開発した、DNSのロードバランサです。リクエストの内容や種類などによって、DNSサーバの処理の振り分けを行うことができます。また単純なDNSクエリと再帰問合せを見分けて、転送先のDNSサーバを変更することもできます。DNSリクエストの流量制限によるDoS対策や、統計情報の出力などをサポートしています。

dnsdist無料資料

データベースのプロキシ/ロードバランサ

データベースへの接続は、FTPのような複雑なコネクション制御を行いません。そのため、リバースプロキシ型でデータベースへの通信を制御するプロキシは、systemd、xinetd、HAProxy、Nginxなどの汎用的なプロキシでも構築できます。ただし、ロードバランサとして利用する場合は、データベースの一貫性を保持したり、ロックやトランザクションの制御を正常に行うための配慮が必要です。

MariaDB Maxscale

MariaDB Maxscaleは、MariaDB、MySQL用のロードバランサのソフトウェアです。データベースの一貫性を保証するために、処理内容をパースして、更新処理、ロック処理、トランザクションをマスターサーバに転送します。それ以外の処理は、複数のスレーブサーバに分散して転送することができます。また、データベースの動作をモニタし、問題のあるデータベースを自動的に切り離す処理もサポートしています。

バックエンドとなるMariaDB/MySQLを、MariaDB Galera Clusterなどのマルチマスタ構成で構成することで、スケーラブルなシステムを構築することができます。また、この構成で構築した場合、クライアントの処理にはほとんど制約がありません。

MariaDBMaxscale無料資料

pgpool-II

pgpool-IIは、PostgreSQL用のアクセラレータ兼ロードバランサのソフトウェアです。コネクションプーリング、負荷分散に対応します。また、データベースから応答がなくなった場合には、該当サーバを自動的に切り離すことができます。ただし、処理によって転送先を切り替える機能はないため、最初から、システム構成を考慮したアプリケーション開発が必要となります。

プロキシ/ロードバランサOSS比較18選の先頭へ