kWatanabe 記事一覧へ

kWatanabe の 技術帖

某企業でOSや仮想化の研究をやっているインフラ系エンジニア。オンプレとクラウドのコラボレーションなど、興味ある技術を綴る。

systemdで多段プロキシ・リバースプロキシを作る

  • systemd だけを使って、多段プロキシやリバースプロキシを作る
  • 用途はいろいろあるけど、深く突っ込んじゃイケない

背景

ユースケースはあえて挙げないけど、多段プロキシできるフォワードプロキシとか、一時的なリバースプロキシなど、便利なプロキシサーバが時たま必要になる。

Squidやnginxなどの汎用のものから、Poundやdelegateなどの専用のものまでいろいろな方法があるけども、諸事情*1でこれらが使えない時もある。

そんな時には systemd が使える。systemd は Linux の比較的新しい*2 init システムだが、 init とは思えないほど多機能*3で、実はプロキシサーバが作れてしまう。その手順をまとめる。

検証環境

systemd でプロキシサーバを作る

socket ファイル

まず、リクエストを受け付けるための socket のユニットファイルを用意する。

ListenStreamにリクエストを待ち受けるインタフェースのIPアドレスとポート番号を指定する。

$ sudo vim /etc/systemd/system/proxy.socket
[Unit]
Description=HTTP Proxy Socket

[Socket]
ListenStream=0.0.0.0:80

service ファイル

次に、実際にリクエストを経由する service のユニットファイルを用意する。

ExecStartsystemd-socket-proxydのパスを指定し、第一引数に転送先(多段プロキシなら次のプロキシサーバ、リバースプロキシなら内側のWebサーバ)のIPアドレスとポート番号を指定する。

注意点としては、2つのユニットファイル名はそろえておかないとダメ。(今回は proxy

$ sudo vim /etc/systemd/system/proxy.service
[Unit]
Description=HTTP Proxy Service

[Service]
ExecStart=/usr/lib/systemd/systemd-socket-proxyd 192.168.1.1:5963
PrivateTmp=yes

起動

後はお約束。

systemdをリフレッシュして、

$ sudo systemctl daemon-reload

socketを起動して、

$ sudo systemctl start proxy.socket

うまくいっているようなら、永続化する。

$ sudo systemctl enable proxy.socket

まとめ

  • systemd 単体で多段プロキシもしくはリバースプロキシとして使える、プロキシサーバを構築した

*1:手間をかけたくない場合や、顧客の環境で余計なソフトを入れられない場合、など、いろいろと。

*2:sysvinitやupstartと比べて

*3:プロキシのほかに systemd 単体で Docker みたいなコンテナを作れたりもする。systemd-nspawn とかでググるとよろしい。