仮想化生活への軌跡

Feed Rss


リバースプロキシサーバー(Pound)の構築

08.23.2013, Pound, Ubuntu Server, by .

はじめに

サーバーの仮想化によるメリットのひとつに、新規サーバーを即時かつコストをかけずに増設できるということがあります。
これにより、たとえばWEBサーバーをコンテンツや設定内容、あるいはOSの種類に応じて複数台設置することも容易く実現することができます。

しかし、自宅サーバーのように1つのグローバルIPしか使用できないことが通常であるような環境においては、複数のWEBサーバーを同時に外部公開することはできません。
Apacheなど一部のWEBサーバーソフトには複数のサイトを一台のサーバーで構築するバーチャルホスト機能が備わっていますが、あくまで1台のサーバー内でのことであり、複数のサーバーを1つのIPで公開する用途には対応できません。

そこで活躍するのが本稿で取り上げるリバースプロキシです。

リバースプロキシは公開すべきコンテンツをもつWEBサーバーの代理人(プロキシ)として外部からのリクエスト(HTTP,HTTPS)を受け付けます。
そして、このリクエストとあらかじめ設定されたルールとを照合した上で、該当するWEBサーバーとの通信を行ってコンテンツ情報を受け取り、これをクライアントに引き渡します。
その間クライアントはWEBサーバーとの通信を行わず、一切のやり取りはリバースプロキシとの間でのみ行われることになります。
これに対して、リバースプロキシはリクエストに応じてさまざまなWEBサーバーにリクエストを転送することができます。
したがって、外部公開すべき必要のあるサーバーばリバースプロキシ1台に限られるため、あたかも複数のWEBサーバーを外部公開するのと同様の環境を1つのグローバルIPで実現することができるわけです。

Linuxで利用できるリバースプロキシには様々な製品が存在しますが、本稿では設定が簡易かつ豊富な機能性に定評のあるPoundを利用します。


Pound導入のメリット

導入作業を行う前に、ここで仮想化サーバーでPoundを利用することのメリットをまとめておきます。
  1. リバースプロキシ機能により様々なWEBサーバーのコンテンツを1つのグローバルIPで公開することができます。とくにOSの異なる複数のWEBサーバー(LinuxとWindowsServerなど)を設置したい場合などに有用です。
  2. コンテンツを持つWEBサーバーを直接外部に公開する必要がなくなるため、セキュリティが向上します。
  3. SSLラッパー機能により、簡易な設定で特定のコンテンツをSSL通信化することができます。
  4. ディレクトリ単位に加えてドメイン単位でのリクエスト転送にも対応するため、複数のドメインを容易に一元管理することができます。

前提となる環境

■ Ubuntu Server 12.04 x64


Poundのインストール

それではPoundの導入手順を紹介します。

まずはPound本体をインストールします。
sudo apt-get install pound


インストールが完了すると”set startup=1 in /etc/default/pound.”と表示されていることに気づくと思います。
この指示に従い、エディタで/etc/default/poundを開き修正します。
startup=1  # 0を1に書き換える


設定ファイルの編集

Poundの動作の仕方を決定付けるのが/etc/pound/pound.cfgです。
以下、重要な箇所を中心に解説します。

まず、/etc/pound/pound.cfgを開くと34行目付近に以下のような記述が見つかります。
ListenHTTP
        Address 127.0.0.1
        Port    8080


ListenHTTPは「HTTPリクエストを待ち受ける」という意味で、下のアドレスはPoundサーバー自身のローカルIPを、ポート番号はHTTPリクエストを受け付けるポート番号を指します。
そこで、アドレスを正しい内容に、ポート番号を80に書き換えます。
ListenHTTP
        Address 192.168.x.xxx
        Port    80


さらに、その下部には次のような記述が行われています。
Service
                BackEnd   # バックエンド=Poundからリクエストを転送されるWEBサーバー
                        Address 127.0.0.1
                        Port    80
                End
        End


この部分には、個々のHTTPリクエストをどのWEBサーバーに転送するかのルールを設定します。
上記のサンプルでは全てのHTTPリクエストを自分自身(127.0.0.1)の80番ポートに転送する設定になっていますので、ここを目的の内容に書き換えていくことになります。

リクエストをディレクトリ単位でバックエンドに振り分けるためには、以下のように記述します。
Service
    URL         "^/ディレクトリ名/.*"
    BackEnd
        Address 192.168.x.xxx   #バックエンドサーバーのIP
       Port  80
    End
End


リクエストをドメイン名単位で振り分けるためには、以下のように記述します。
Service
    HeadRequire "Host:.*ドメイン名.*"
    BackEnd
        Address 192.168.x.xxx
        Port    80
    End
End


これらのルール設定は必要な転送内容毎に記述する必要があります。
複数の設定を行った場合、上位に記述されているものから順に転送されていきます。

設定を終えたらモジュールを再起動します。
/etc/init.d/pound restart


SSLラッパーの設定

以上の設定によりHTTPリクエストの転送が実現できますが、PoundにはHTTPSのリクエストを待ち受ける機能も備わっています。

この機能により、バックエンドのWEBサーバーに何ら変更を加えることなく、特定のコンテンツをSSL通信で暗号化しつつ公開することができるようになります。

ここでは簡易な自己署名証明書を用いた方法を紹介します。

まず、以下のコマンドによりPoundサーバーで使用する証明書の作成を行います。
sudo su -
cd /usr/local/etc
openssl genrsa -des3 -out server-key.pem 1024
openssl rsa -in server-key.pem -out server-key.pem
openssl req -new -key server-key.pem -x509 -out pound.pem
cat server-key.pem >> pound.pem


途中でパスフレーズの入力を2度求められますので、同じフレーズ(内容は任意)を入力してください。

証明書が作成できたら、再び/etc/pound/pound.cfgを編集します。
先ほど編集した”ListenHTTP”の上部に、以下の内容を追記します。
ListenHTTPS   # HTTPSリクエストを待ち受ける
        Address 192.168.x.xxx   # PoundサーバーのローカルIP
        Port 443
        Cert "/usr/local/etc/pound.pem"   # 作成した証明書の場所を指定
        xHTTP 0


SSL通信で公開するコンテンツの転送方法は、通常のHTTPリクエストと同様に記述します。

HTTPSリクエストであっても、バックエンドのポート番号は80のままであることに注意してください。
HTTPSで待ち受けるのはあくまでPoundであり、クライアント-Pound間の通信はSSL化されますが、Pound-バックエンド間の通信は通常のHTTPで行われることになります。

最後に、以上の設定内容を見易くまとめておきます。
ListenHTTPS
        Address 192.168.x.xxx
        Port 443
        Cert "/usr/local/etc/pound.pem"
        xHTTP 0

Service
    HeadRequire "Host:.*ドメイン名.*"
    BackEnd
        Address 192.168.y.yyy
        Port    80
    End
End

End

ListenHTTP
    Address 192.168.x.xxx
    Port    80

Service
    URL "^/ディレクトリ名/.*"
    BackEnd
        Address 192.168.z.zzz
        Port    80
    End
End

End


それぞれのListenに対する末尾のEndの数に注意してください。

ポートの開放

ルーター上にて、Poundサーバーに対してTCPの80番ポート、SSLラッパー機能を利用する場合にはさらにTCPの443番ポートの開放を行います。


Advertisement


RelatingPosts

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*