下記の systemd を使った版です。
下記のように systemd-socket-proxyd を使えば簡単にできますが、あえて netcat でやってみました。
.socketファイルと.serviceファイルを作ります。
/etc/systemd/system/http-proxy.socket
[Socket]
ListenStream = 0.0.0.0:80
Accept = yes
/etc/systemd/system/http-proxy@.service
[Service]
ExecStart = /usr/bin/nc -w 5 192.0.2.123 80
StandardInput = socket
StandardOutput = socket
StandardError = journal
daemon-reload して .socket の方を起動します。
sudo systemctl daemon-reload
sudo systemctl start http-proxy.socket
あとはアクセスするだけ。
ポイントは次のとおりです。
- socket では Accept = yes を指定する
- デフォルトの No だとサービスにはリッスンソケットが渡されるだけになる
- Yes にすれば systemd が accept したソケットがサービスに渡される
- service はテンプレートユニットにする
- Accept = yes の場合はそうしなければならない
- 接続ごとのサービスになるから
- StandardInput/StandardOutput に socket に指定する
- systemd が accept したソケットが標準入出力に設定される
- StandardError に journal を指定しているけど何もしなければ StandardOutput と同じになる