この記事の最終更新日: 2026年5月29日

WebRTC、ビデオ通話、音声通話、オンラインゲーム、P2P通信などを調べていると、STUNサーバーという言葉が出てくることがあります。
STUNサーバーは、特にNAT越えと深く関係しています。
ただ、初心者にとっては少しわかりにくい用語です。
「STUNサーバーって何をするサーバーなの?」
「普通のWebサーバーと何が違うの?」
「なぜNAT越えに必要なの?」
「TURNサーバーとは何が違うの?」
この記事では、STUNサーバーの役割を初心者向けにわかりやすく解説します。
STUNサーバーとは?
STUNサーバーとは、簡単に言うと、
自分がインターネット側からどのIPアドレス・ポート番号に見えているかを教えてくれるサーバー
です。
STUNは、現在では主に
Session Traversal Utilities for NAT
の略として使われます。
NAT環境では、自宅や会社の端末はプライベートIPアドレスを使っています。
たとえば、自宅のPCには次のようなIPアドレスが割り当てられます。
192.168.1.10
しかし、このIPアドレスはインターネット上では直接使えません。
インターネット側から見ると、通信元はルーターのグローバルIPアドレスや、NATによって変換されたポート番号に見えます。
たとえば、外部からは次のように見えるかもしれません。
203.0.113.10:62001
STUNサーバーは、この
外から見た自分のIPアドレスとポート番号
を教えてくれるサーバーです。
なぜ「外から見た自分の住所」を知る必要があるのか?
通常のWebサイト閲覧では、STUNサーバーはほとんど意識しません。
たとえば、ブラウザでWebサイトを見る場合、通信は次のように始まります。
自分のPC → Webサーバー
自分のPCから外に向かって通信を開始するため、NATがあっても問題になりにくいです。
しかし、P2P通信やビデオ通話では話が変わります。
たとえば、端末Aと端末Bが直接通信したいとします。
端末A ←→ 端末B
このとき、端末Aも端末BもNATの内側にいる場合があります。
端末A
↓
家庭Aのルーター
↓
インターネット
↓
家庭Bのルーター
↓
端末B
この状態では、お互いの端末が自分のプライベートIPアドレスしか知らないと、直接通信できません。
端末Aが端末Bに対して、
192.168.1.10 に送ってください
と言っても、そのIPアドレスは家庭Aの中でしか意味がありません。
そこで必要になるのが、
インターネット側から見える自分の住所
です。
STUNサーバーは、この外向きの住所を確認するために使われます。
NAT環境で起きていること
NAT環境では、ルーターがIPアドレスやポート番号を変換します。
たとえば、自宅PCが外部に通信するとします。
自宅PC:192.168.1.10:50000
この通信がルーターを通ると、次のように変換されることがあります。
変換前:192.168.1.10:50000
変換後:203.0.113.10:62001
外部のサーバーから見ると、通信元は 192.168.1.10:50000 ではありません。
外部から見えるのは、次のようなアドレスです。
203.0.113.10:62001
この外部から見えるIPアドレスとポート番号を、サーバーリフレクシブアドレスと呼ぶことがあります。
初心者向けには、
NATを通ったあと、外から見えている自分の住所
と理解すれば十分です。
STUNサーバーの基本的な流れ
STUNサーバーを使った流れは、かなりシンプルです。
1. 端末がSTUNサーバーに問い合わせる
まず、自分の端末がSTUNサーバーに通信します。
自分の端末 → STUNサーバー
この通信は、自分の端末から外に向かう通信なので、NATを通過しやすいです。
2. STUNサーバーが通信元を確認する
STUNサーバーは、届いた通信を見て、
あなたは外から見ると 203.0.113.10:62001 に見えています
という情報を把握します。
3. STUNサーバーが結果を返す
STUNサーバーは、その情報を端末に返します。
STUNサーバー → 自分の端末
端末は、自分が外部からどのように見えているかを知ることができます。
図で見るSTUNの役割
イメージとしては、次のような流れです。
自宅PC
192.168.1.10:50000
↓
ルーターでNAT変換
↓
203.0.113.10:62001
↓
STUNサーバー
STUNサーバー:
「あなたは 203.0.113.10:62001 に見えています」
STUNサーバーは、通信を中継しているわけではありません。
あくまで、
外から見た自分のIPアドレスとポート番号を教えてくれる
という役割です。
STUNサーバーはなぜNAT越えで使われるのか?
NAT越えでは、NATの内側にある端末同士が通信できるようにする必要があります。
そのためには、まずお互いが
自分は外からどう見えているのか
を知る必要があります。
たとえば、端末Aと端末Bがビデオ通話をするとします。
それぞれがSTUNサーバーに問い合わせます。
端末A → STUNサーバー
端末B → STUNサーバー
すると、端末Aと端末Bはそれぞれ、外部から見た自分のアドレスを取得できます。
端末A:203.0.113.10:62001
端末B:198.51.100.20:53001
その後、端末Aと端末Bは、この情報を使って直接通信を試みます。
端末A ←→ 端末B
つまりSTUNサーバーは、NAT越えにおいて
直接通信を試すための住所確認
を担当していると考えるとわかりやすいです。
STUNサーバーは通信を中継しない
ここは非常に重要です。
STUNサーバーは、通信を中継するサーバーではありません。
たとえば、ビデオ通話の映像や音声データが、常にSTUNサーバーを通るわけではありません。
STUNサーバーの役割は、あくまで次の確認です。
外から見た自分のIPアドレスとポート番号を調べる
その後、実際の通信は端末同士で直接行われる可能性があります。
端末A ←→ 端末B
この点が、TURNサーバーとの大きな違いです。
TURNサーバーとの違い
STUNとよく混同されるのが、TURNサーバーです。
STUNとTURNの違いは、次のように整理できます。
| 項目 | STUNサーバー | TURNサーバー |
|---|---|---|
| 主な役割 | 外から見たIPアドレス・ポートを調べる | 通信を中継する |
| 実際のデータ通信 | 基本的には中継しない | 中継する |
| サーバー負荷 | 比較的軽い | 重い |
| 通信コスト | 低め | 高め |
| 使われる場面 | 直接通信できるか試すとき | 直接通信できないとき |
STUNは、直接通信を成立させるための補助役です。
一方、TURNは、直接通信できない場合の中継役です。
STUNだけでNAT越えできるのか?
STUNを使えば、必ずNAT越えできるわけではありません。
STUNは、自分の外部アドレスを知るための仕組みです。
しかし、外部アドレスがわかったからといって、相手からの通信が必ず届くとは限りません。
NATの種類やネットワーク環境によっては、通信がブロックされることがあります。
たとえば、次のような環境ではSTUNだけでは難しいことがあります。
- 厳しいNAT環境
- シンメトリックNAT
- 企業ネットワーク
- 学校や公共Wi-Fi
- UDP通信が制限されている環境
- 二重NAT
- CGNAT
- ファイアウォールが厳しい環境
この場合は、TURNサーバーを使って通信を中継する必要があります。
STUNとICEの関係
WebRTCでは、STUNサーバーは単体で使われるというより、ICEという仕組みの中で使われることが多いです。
ICEは、簡単に言うと、
どの通信経路が使えるかを試して、最適な経路を選ぶ仕組み
です。
ICEでは、通信候補をいくつか集めます。
代表的には、次のような候補です。
| 候補 | 意味 |
|---|---|
| host candidate | 自分のローカルIPアドレス |
| server reflexive candidate | STUNで取得した外部アドレス |
| relay candidate | TURNサーバー経由のアドレス |
STUNサーバーは、このうち
server reflexive candidate
を取得するために使われます。
つまり、WebRTCでは次のような流れになります。
1. ローカルIPを候補にする
2. STUNで外部から見たIP・ポートを取得する
3. TURNで中継用の候補も用意する
4. 相手と候補を交換する
5. 接続できる経路を試す
6. 最適な経路で通信する
STUNは、ICEの中で通信候補を増やすための重要な役割を持っています。
WebRTCでSTUNサーバーが使われる理由
WebRTCでは、ブラウザ同士が音声、映像、データを直接やり取りできます。
たとえば、次のような機能です。
- ビデオ通話
- 音声通話
- 画面共有
- P2Pファイル送信
- リアルタイムデータ通信
しかし、実際の利用者は多くの場合、NATの内側にいます。
ブラウザA
↓
家庭Aのルーター
↓
インターネット
↓
家庭Bのルーター
↓
ブラウザB
この状態で直接通信を成立させるには、外から見た自分のアドレスを知る必要があります。
そのため、WebRTCではSTUNサーバーがよく使われます。
STUNサーバーの通信例
WebRTCなどでSTUNを使う場合、設定として次のようなSTUNサーバーを指定することがあります。
const configuration = {
iceServers: [
{
urls: "stun:stun.example.com:3478"
}
]
};
ここで指定している stun:stun.example.com:3478 がSTUNサーバーです。
一般的にSTUNでは、3478 番ポートが使われることがあります。
ただし、実際にどのポートを使うかはサービスや設定によって変わります。
STUNサーバーを使ったからといって安全性が下がる?
STUNサーバーを使うこと自体が、ただちに危険というわけではありません。
ただし、STUNは外部から見たIPアドレスとポート番号を取得する仕組みです。
そのため、通信設計やログの扱いには注意が必要です。
特にサービス開発者は、次の点を意識する必要があります。
- 不要な情報をログに残しすぎない
- 信頼できるSTUN/TURNサーバーを使う
- 認証が必要なTURNサーバーは適切に保護する
- 通信内容の暗号化を前提にする
- ユーザーのIPアドレスが相手に見える可能性を理解する
WebRTCでは、P2P通信が成立すると相手にネットワーク情報が伝わる可能性があります。
そのため、プライバシー面も含めて設計を考える必要があります。
STUNサーバーを自分で用意する必要はある?
個人開発や小規模な検証であれば、まずは既存のSTUNサーバーを使って試すことが多いです。
ただし、本番サービスでは慎重に考える必要があります。
たとえば、次のような観点があります。
- 利用規約
- 安定性
- 可用性
- レイテンシ
- ログやプライバシー
- TURNとの組み合わせ
- 障害時の影響
- サービス規模
STUNサーバー自体の負荷はTURNに比べると軽いですが、サービスの重要な通信経路に関係するため、適当に選ぶべきではありません。
本番のWebRTCサービスでは、STUNだけでなくTURNサーバーも含めて、きちんと設計することが重要です。
STUNサーバーが不要なケース
すべての通信でSTUNサーバーが必要なわけではありません。
たとえば、一般的なWebアプリでは通常不要です。
ブラウザ → Webサーバー
このようなHTTP通信では、ブラウザからサーバーに向かって通信を開始するため、NAT越えの問題は起きにくいです。
STUNサーバーが必要になりやすいのは、次のようなケースです。
- 端末同士で直接通信したい
- P2P通信をしたい
- WebRTCを使う
- 音声通話やビデオ通話を作る
- オンラインゲームで低遅延通信をしたい
- IoT機器と外部から通信したい
つまり、STUNサーバーは主に
クライアント同士が直接つながりたい場面
で登場します。
STUNサーバーを一言で表すなら
STUNサーバーを一言で表すなら、次のようになります。
STUNサーバーとは、NATの外側から見た自分のIPアドレスとポート番号を教えてくれるサーバー
もう少し実務寄りに言うと、
P2P通信やWebRTCで、直接通信できる経路を探すために使われるサーバー
です。
重要なのは、STUNサーバーは通信を中継するものではないという点です。
通信を中継するのはTURNサーバーです。
初心者が押さえるべきポイント
STUNサーバーについて、初心者がまず押さえるべきポイントは次のとおりです。
- STUNはNAT越えで使われる技術
- STUNサーバーは外から見た自分のIPアドレスとポート番号を教えてくれる
- NAT環境では、自分のローカルIPだけでは相手と直接通信できない
- STUNは直接通信を試すための情報を取得する
- STUNサーバーは映像や音声を中継しない
- 直接通信できない場合はTURNサーバーが使われる
- WebRTCではICEの仕組みの中でSTUNが使われることが多い
- STUNだけで必ずNAT越えできるわけではない
まとめ
STUNサーバーは、NAT越えを理解するうえで非常に重要な存在です。
NATの内側にいる端末は、自分のプライベートIPアドレスしか知らないことがあります。
しかし、P2P通信やWebRTCでは、相手と直接通信するために、
外から見た自分のIPアドレスとポート番号
を知る必要があります。
その情報を教えてくれるのがSTUNサーバーです。
ただし、STUNサーバーは通信を中継するサーバーではありません。
直接通信できる可能性を探るための補助役です。
直接通信できない場合には、TURNサーバーのような中継サーバーが必要になります。
最後に、STUNサーバーの役割をもう一度まとめると、次のとおりです。
端末がSTUNサーバーに問い合わせる
↓
STUNサーバーが外から見たIPアドレス・ポート番号を返す
↓
その情報を使って、相手との直接通信を試す
↓
直接通信できない場合はTURNサーバーなどを使う
STUNサーバーは、WebRTC、ビデオ通話、音声通話、オンラインゲーム、P2P通信など、リアルタイム通信を支える重要な仕組みです。

大阪のエンジニアが書いているブログ。



コメント