sing-boxを使用した通信中継:サーバー編
sing-box は、複数のプロキシプロトコルやルーティング設定をひとつの設定ファイルで扱える汎用プロキシプラットフォームです。この記事ではサーバー側の構成に焦点を当て、sing-box の基本的な考え方、インストール方法、最小構成の設定を紹介します。
sing-box とは
sing-box は、中継サーバーを構築・運用するためのツールです。中継サーバーとは、HTTP プロキシサーバーのように、クライアントとインターネット上の宛先の間に入り、通信を受け取って転送するサーバーです。一般的な HTTP プロキシとの大きな違いは、sing-box が単一のプロトコル実装ではなく、複数の通信方式をサポートし、inbound と outbound を組み合わせて柔軟に通信を中継できる点です。
対応しているプロトコルとしては、例えば shadowsocks、trojan、vless、tuic、socks、http などがあります。socks や http などのおなじみのプロトコル以外は、ほとんどの方からすると聞いたことがないものばかりだと思います。これらの中には、インターネット検閲への対策を意識して開発されたものもあります。日本ではそのような用途が前面に出ることは多くありませんが、ネットワークエンジニアにとって興味深いプロトコルが多いので、また別途紹介します。
今回は、以下の構成を想定します。クライアント側では、なんらかのツールを使用して、対象の通信をいったん hysteria2 というプロトコルでカプセル化します。そして、今回構築する sing-box サーバーで、この hysteria2 の通信を受け取り、カプセル化を解除して本来の宛先へ転送します。
graph TD
Client["クライアント"]
Server["sing-boxサーバー"]
Internet["目的サーバー"]
Client -->|hysteria2プロトコル| Server
Server -->|HTTPなどの本来のプロトコル| Internet
事前準備
サーバーの準備
sing-box 用のサーバーとして、クラウドでサーバー(AWS EC2、Azure VM、Google Compute Engine など)を作成します。OS は、今回は Ubuntu を使用しますが、他の OS も多数サポートされています。
クラウド側のファイアウォールや Security Group において、対象ポートを開放しておきます。
| プロトコル | ポート | 用途 |
|---|---|---|
| TCP | 22 | SSH によるリモート管理 |
| TCP | 443 | Let's Encrypt の TLS-ALPN-01 チャレンジ用 |
| UDP | 46357 | sing-box の inbound ポートで、自由に設定可能 |
インターネットから到達できる必要があるため、作成したクラウドサーバーに対して、固定のパブリック IP(AWS: Elastic IP / Azure: Public IP Address (Static) / Google: Static External IP)を付与します。
UDP 46357 は、今回 sing-box が実際に中継用に待ち受けるポートです。この番号に特別な意味はありません。実運用では、他のサービスと衝突しない任意の UDP ポートを使用できます。また、TCP ではなく UDP を使用する理由は、hysteria2 が UDP ベース、より正確には QUIC ベースのプロトコルだからです。
ドメイン名の準備
2026 年 1 月に、Let's Encrypt は IP アドレス証明書の一般提供を開始しました。そのため、現在ではドメイン名は必須ではなくなっています。
ただし、ドメイン名なしの設定はまだやや煩雑で、古いバージョンのツールでは互換性問題が出る可能性もあります。そのため、ここでは引き続きドメイン名ありの前提とします。
例えば example.com というドメインを持っていて、今回の中継サーバーを relay.example.com とすることを前提とします。
example.com ゾーンにおいて、以下のレコードを追加します。
| レコードの種類 | 名称 | 値 |
|---|---|---|
| A | relay |
作成したクラウドサーバーのパブリック IP |
ゾーンファイル風に書くと、以下のようになります。
1 | |
設定後、手元の端末またはサーバー上で名前解決を確認します。
1 2 | |
sing-box の設定では、この relay.example.com を TLS 証明書の対象名として使います。そのため、DNS が正しく引ける状態になってから次へ進みます。
sing-box のインストール
クラウドサーバーに SSH でログインし、sing-box をインストールします。
インストールは、公式リポジトリを使う方法が扱いやすいため、ここではその方法を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
インストール後、バージョンを確認します。
1 2 3 4 5 6 7 | |
2026年4月末現在、GitHub Releases では 1.13.11 が latest stable として公開されています。
sing-box コンフィグの作成
sing-box のコンフィグファイルは、デフォルトで以下の場所にあります。
1 | |
このファイルに、サーバーとしての待ち受け設定、DNS 設定、ルーティング設定、アウトバウンド設定を書きます。
sing-box の JSON 設定では、主に次のブロックを意識すると読みやすくなります。
| ブロック | 役割 |
|---|---|
log |
ログ出力の設定 |
dns |
sing-box 内部で使う DNS 設定 |
inbounds |
外部から通信を受け付ける入口 |
outbounds |
通信を外部へ出す出口 |
route |
通信の振り分けルール |
今回の設定は、hysteria2 で受け付けて、direct で外へ出す単純な構成です。1行ずつの解説は省略しますが、詳細は sing-box の公式マニュアルを参照してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | |
relay.example.com、admin@relay.example.com、Some_Random_Password は、自分の環境に合わせて変更してください。
特に password は、実運用では十分に長いランダムな文字列にしてください。記事中の値は例示用です。
コンフィグファイルを確認する
コンフィグを書いたら、起動する前に文法チェックを行います。
1 | |
問題がなければ、何も出力されません。
sing-box の起動
sing-boxを起動します。デフォルトでは enabled になっているため、サーバーを再起動する場合も自動的に起動します。
1 2 | |
systemd サービスなので、ログは journalctl で確認できます。
1 | |