コンテンツにスキップ

sing-boxを使用した通信中継:サーバー編

sing-box は、複数のプロキシプロトコルやルーティング設定をひとつの設定ファイルで扱える汎用プロキシプラットフォームです。この記事ではサーバー側の構成に焦点を当て、sing-box の基本的な考え方、インストール方法、最小構成の設定を紹介します。


sing-box とは

sing-box は、中継サーバーを構築・運用するためのツールです。中継サーバーとは、HTTP プロキシサーバーのように、クライアントとインターネット上の宛先の間に入り、通信を受け取って転送するサーバーです。一般的な HTTP プロキシとの大きな違いは、sing-box が単一のプロトコル実装ではなく、複数の通信方式をサポートし、inbound と outbound を組み合わせて柔軟に通信を中継できる点です。

対応しているプロトコルとしては、例えば shadowsockstrojanvlesstuicsockshttp などがあります。sockshttp などのおなじみのプロトコル以外は、ほとんどの方からすると聞いたことがないものばかりだと思います。これらの中には、インターネット検閲への対策を意識して開発されたものもあります。日本ではそのような用途が前面に出ることは多くありませんが、ネットワークエンジニアにとって興味深いプロトコルが多いので、また別途紹介します。

今回は、以下の構成を想定します。クライアント側では、なんらかのツールを使用して、対象の通信をいったん 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
relay IN A 1.2.3.4

設定後、手元の端末またはサーバー上で名前解決を確認します。

1
2
$ dig relay.example.com +short
1.2.3.4

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
sudo mkdir -p /etc/apt/keyrings &&
   sudo curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc &&
   sudo chmod a+r /etc/apt/keyrings/sagernet.asc &&
   echo '
Types: deb
URIs: https://deb.sagernet.org/
Suites: *
Components: *
Enabled: yes
Signed-By: /etc/apt/keyrings/sagernet.asc
' | sudo tee /etc/apt/sources.list.d/sagernet.sources &&
   sudo apt-get update &&
   sudo apt-get install sing-box

インストール後、バージョンを確認します。

1
2
3
4
5
6
7
$ sing-box version
sing-box version 1.13.11

Environment: go1.25.9 linux/amd64
Tags: with_gvisor,with_quic,with_dhcp,with_wireguard,with_utls,with_acme,with_clash_api,with_tailscale,with_ccm,with_ocm,with_naive_outbound,badlinkname,tfogo_checklinkname0,with_musl
Revision: 553cfa1f9f99f4da6118f93d507294e580db00d7
CGO: enabled

2026年4月末現在、GitHub Releases では 1.13.11 が latest stable として公開されています。

sing-box コンフィグの作成

sing-box のコンフィグファイルは、デフォルトで以下の場所にあります。

1
/etc/sing-box/config.json

このファイルに、サーバーとしての待ち受け設定、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
{
  "log": {
    "level": "info"
  },
  "dns": {
    "servers": [
      {
        "type": "tls",
        "tag": "google",
        "server": "8.8.8.8"
      }
    ]
  },
  "inbounds": [
    {
      "type": "hysteria2",
      "listen": "::",
      "listen_port": 46357,
      "users": [
        {
          "name": "nogawa",
          "password": "Some_Random_Password"
        }
      ],
      "tls": {
        "enabled": true,
        "alpn": [
          "h3"
        ],
        "server_name": "relay.example.com",
        "acme": {
          "domain": [
            "relay.example.com"
          ],
          "disable_http_challenge": true,
          "disable_tls_alpn_challenge": false,
          "email": "admin@relay.example.com",
          "provider": "letsencrypt"
        }
      }
    }
  ],
  "outbounds": [
    {
      "type": "direct"
    }
  ],
  "route": {
    "rules": [
      {
        "port": 53,
        "action": "hijack-dns"
      }
    ]
  }
}

relay.example.comadmin@relay.example.comSome_Random_Password は、自分の環境に合わせて変更してください。

特に password は、実運用では十分に長いランダムな文字列にしてください。記事中の値は例示用です。

コンフィグファイルを確認する

コンフィグを書いたら、起動する前に文法チェックを行います。

1
sudo sing-box check -c /etc/sing-box/config.json

問題がなければ、何も出力されません。

sing-box の起動

sing-boxを起動します。デフォルトでは enabled になっているため、サーバーを再起動する場合も自動的に起動します。

1
2
sudo systemctl start sing-box
systemctl status sing-box

systemd サービスなので、ログは journalctl で確認できます。

1
journalctl -u sing-box -f