CentOS8 + Pound 2.8 インストールと初期セットアップ

リバースプロキシ(Pound)CentOS8,Pound,SSLラッパー,リバースプロキシ,ロードバランサ

はじめに

リバースプロキシロードバランサー(以下、LB)、SSLラッパーで有名なアプライアンス製品といえばF5 BIG-IPやCitrix ADC、A10 Thunder等で、いずれも高機能・高パフォーマンスではありますが非常に高価格で個人開発や低予算システムで気軽に導入することは難しい製品です。

そこで、機能面やパフォーマンスは上記の製品に比べると見劣りするものの、基本的な負荷分散やSSLラッパー機能が使えるソフトウェアベースのPoundを紹介します。

Poundとは

PoundはLinux上で動作するミドルウェアです。機能や特徴は下記の通りです。

  • リバースプロキシサーバとして動作させ、HTTPリクエストをバックエンドサーバーに転送することが可能。
  • ロードバランサとして動作させ、HTTPリクエストを複数のバックエンドサーバに分散転送させることが可能。またセッション維持機能(パーシステンス機能)と、バックエンドサーバに障害が発生した場合、障害サーバへのリクエスト転送を停止させる機能が備わっている。
  • SSL/TLSを終端し、SSLラッパーとして動作可能。
  • Poundの特徴として非常に軽量に動作する。

Poundの著作権は現在スイスに本拠地を置くApsis Gmbhという企業が保有しているようです(2020年11月時点)。GNU GPLのソフトウェアライセンスなので誰でも使用可能です。

なお現在のPoundのバージョンは2.8.xが最新です。2.8未満は脆弱性が発見されているようなので使用しないことをお勧めします。

JVNDB-2018-016443
Pound における HTTP リクエストスマグリングに関する脆弱性
https://jvndb.jvn.jp/ja/contents/2018/JVNDB-2018-016443.html

構成

今回はCentOS8でPoundをリバースプロキシとして動作させます。PoundはインターネットからHTTPS/TCP443のリクエストを受けます。続いて、Poundはインターネット側から受け取ったリクエストをバックエンドのWebサーバにHTTP/TCP8080でリクエストを転送します。※ポート番号の変換をします。

Poundのインストール

早速ですが、PoundのインストールをCentOS8で行います。

EPELリポジトリの追加

Pound2.8はEPELで公開されています。すでにEPELを導入している場合はスキップして問題ありません。

# dnf -y install epel-release

通常のdnfやyumコマンドでEPELリポジトリを参照させないようにします。

# vi /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
#baseurl=https://download.fedoraproject.org/pub/epel/$releasever/Everything/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-$releasever&arch=$basearch&infra=$infra&content=$
contentdir
#enabled=1     #コメントアウトします。
enabled=0     #本行を追加します。(0がEPELの参照を無効にする)
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8

Pound 2.8のインストール

次にPoundのインストールをします。

# dnf --enablerepo=epel -y install Pound

※インストール完了後、下記コマンドでバージョン2.8であることをチェックします。

# pound -V
starting...
Version 2.8-patrodyne-20191230
  Configuration switches:
Exiting...
#

Pound設定ファイルの編集

14行目のCertはSSL/TLSの暗号化通信をする際の証明書を指定します。当方はFujiSSLで有料の証明書を発行し設定してますが、poundをインストールすると「/etc/pki/tls/certs/pound.pem」が生成されるのでそちらを指定しても問題ございません。(自己証明書型なのでサイトにアクセスすると警告画面が表示されます)

# cp -p /etc/pound.cfg /etc/pound.cfg_backup

# vi /etc/pound.cfg

User "pound"
Group "pound"
Control "/var/lib/pound/pound.cfg"

Alive 30

ListenHTTPS
  Address 192.168.200.12     #外部からリクエストを受ける自身のIPアドレスを指定する。
  Port    443                #TCP443で待ち受ける
  Cert    "/etc/pki/tls/certs/www.lab-infra.com.pem"
  xHTTP 0
   Service
     HeadRequire "Host:.*www.lab-infra.com"
     BackEnd
       Address 192.168.201.21     #バックエンドサーバのIPアドレスを指定
       Port    8080               #バックエンドサーバの待ち受けポート番号を指定
       TimeOut 30
       Disabled 0                 #当該バックエンドサーバの有効/無効。0=有効、1=無効
     End
   End
End

サービスの自動起動の有効化

# systemctl enable --now pound

動作確認

サイトへアクセスし表示できること、及び証明書を読み込んでいることを確認しました。

続いて、Poundのサーバでtcpdumpを実施し、外部からのリクエスト通信(ポート443)とバックエンドサーバへの通信(ポート8080)を確認してみました。問題なく、機能しています。

[root@centos8lb-01 ~]# tcpdump -i any -nn "port 443 or port 8080"

13:52:56.492028 IP 61.26.65.179.25567 > 192.168.200.12.443: Flags [S], seq 4233592463, win 64240, options [mss 1414,nop,wscale 8,nop,nop,sackOK], length 0
13:52:56.492054 IP 192.168.200.12.443 > 61.26.65.179.25567: Flags [S.], seq 1458986948, ack 4233592464, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
13:52:56.499670 IP 61.26.65.179.25567 > 192.168.200.12.443: Flags [.], ack 1, win 513, length 0
13:52:56.501106 IP 61.26.65.179.25567 > 192.168.200.12.443: Flags [P.], seq 1:550, ack 1, win 513, length 549
13:52:56.501114 IP 192.168.200.12.443 > 61.26.65.179.25567: Flags [.], ack 550, win 237, length 0
13:52:56.501248 IP 192.168.200.12.443 > 61.26.65.179.25567: Flags [P.], seq 1:100, ack 550, win 237, length 99
13:52:56.510914 IP 61.26.65.179.25567 > 192.168.200.12.443: Flags [P.], seq 550:1133, ack 100, win 513, length 583
13:52:56.511174 IP 192.168.200.12.443 > 61.26.65.179.25567: Flags [P.], seq 100:352, ack 1133, win 246, length 252
13:52:56.512049 IP 61.26.65.179.25566 > 192.168.200.12.443: Flags [P.], seq 1410682191:1410683106, ack 439244026, win 513, length 915
13:52:56.512144 IP 192.168.201.12.38760 > 192.168.201.21.8080: Flags [P.], seq 3022474640:3022475590, ack 194707817, win 364, options [nop,nop,TS val 2507371813 ecr 53660681], length 950: HTTP: GET / HTTP/1.1
13:52:56.512257 IP 192.168.201.21.8080 > 192.168.201.12.38760: Flags [.], ack 950, win 285, options [nop,nop,TS val 53664856 ecr 2507371813], length 0
13:52:56.525902 IP 61.26.65.179.25567 > 192.168.200.12.443: Flags [P.], seq 1133:1191, ack 352, win 512, length 58
13:52:56.526051 IP 192.168.200.12.443 > 61.26.65.179.25567: Flags [P.], seq 352:591, ack 1191, win 246, length 239
13:52:56.552253 IP 192.168.200.12.443 > 61.26.65.179.25566: Flags [.], ack 915, win 305, length 0
13:52:56.589303 IP 61.26.65.179.25567 > 192.168.200.12.443: Flags [.], ack 591, win 511, length 0
13:52:56.637432 IP 192.168.201.21.8080 > 192.168.201.12.38760: Flags [.], seq 1:10137, ack 950, win 285, options [nop,nop,TS val 53664981 ecr 2507371813], length 10136: HTTP: HTTP/1.1 200 OK
<以下、略>

以上、Poundのインストールと基本設定の説明でした。