らっちゃいブログ

日々の学びと気づきを発信するブログ

socat で簡易プロキシサーバーを立てよう

スポンサーリンク

今日は socat コマンドのご紹介です。

表題の通り、コマンドラインだけで簡易プロキシサーバーを立てることができるというものです。

さっそく見ていきましょう。

インストール

今回は ubuntu 環境にインストールします。

$ sudo apt-get install socat

これだけで準備OKです。

起動してみる

その前に簡単に使い方を説明します。

$ socat <options> <address> <address>

一つ目の address が入力で、二つ目の address が出力と思ってもらえればいいです。

具体的には以下のように指定します。

$ socat tcp-listen:80,reuse,fork tcp-connect:localhost:8080

これだけで80番ポートで待ち受け、8080へ中継する動作となります。

reusefork のような属性を付与することで、細かく動作をカスタマイズすることも可能です。

実際に使う場合は、さらにオプションを指定することが多いですね。

以下は warn レベルのログをsyslogに出力するオプションを追加したものです。

$ socat -ly -d -d tcp-listen:80,reuse,fork tcp-connect:localhost:8080

-d を増やすごとにログレベルがより詳細になります。

SSLを試してみる

もちろん SSL にも対応しています。

さきほどは tcp-listen を使いましたが、SSL を利用したい場合は openssl-listen を指定します。

openssl-listen と言っているくらいですから、openssl をインストールする必要があります。

コマンドでサクッとインストールしちゃいましょう。

$ sudo apt-get install openssl

次は、SSL ということなので当然サーバー証明書秘密鍵が必要です。

サーバー証明書を持っていない方は、せっかくですのでこちらの記事を参考に自分で作ってみてもよいかと思います。

racchai.hatenablog.com

サーバー証明書が準備できたら、以下の socat コマンドを実行してみましょう。

$ socat -ly -d -d openssl-listen:443,reuse,fork,cert=<証明書ファイル>,key=<秘密鍵ファイル> tcp-connect:localhost:8080

openssl-listen に対して certkey 属性を指定することで SSL で受け付けてくれるようになります。

たったこれだけで SSL を終端した上で 8080 ポートへプロキシしてくれるサーバーが起動できるなんていい時代ですね。

さらにログレベルを上げて通信すれば SSL ハンドシェイクの内容を確認することだって可能です。

わざわざ Wireshark を引っ張り出してきてパケットキャプチャする必要もありません。

いろんなパターンのパケットキャプチャを取って比較するのって、意外と手間なので助かりますね。

まとめ

socat はサービスの本番運用で使うようなことはあまりないかもしれませんが、ちょっとプロキシが必要になったときに大変重宝しますので、ぜひ一度お試しください!