- ネットワーク
ポート開放確認の方法|閉じている原因をrefusedとtimeoutで見分ける
結論
ポートが開いているかは、「サーバー本体」「同じLANの別の機器」「外の回線(スマホのモバイル回線など)」の3か所から順に接続して確かめます。外から失敗したときは、すぐ断られる(Connection refused)か、待たされて終わる(timed out)かで、原因の場所を絞れます。
この記事でわかること
- ss・nc・curl・Test-NetConnection・確認サイトでのポート開放確認のやり方
- 待ち受けなし・ファイアウォール・転送なし・正しく開放の4状態の実際の出力
- 二重ルーター・CGNAT・UDP・家の中からの確認で判断を誤る理由と判断表
ポート開放(ポートフォワード)は、ルーター・サーバーのファイアウォール・サーバーのアプリの3か所がそろって初めて外からつながります。どこか1つが欠けると「閉じている」と表示されますが、表示だけでは欠けている場所が分かりません。この記事では、自分で作った小さなネットワークの中で4つの状態を作り、それぞれがどう見えるかを並べます。
flowchart TD
O[外の人] -->|グローバルIP:8080| R{ルーターの転送}
R -->|無い| X1[refused<br>か無反応]
R -->|有る| F{ファイア<br>ウォール}
F -->|止める| X2[timed out]
F -->|通す| L{待ち受け}
L -->|無い| X3[refused]
L -->|有る| OK[接続成功]
やりたいことから、いちばん早い方法を選べるように先にまとめます。
| やりたいこと | いちばん早い方法 | 詳しい節 |
|---|---|---|
| ポート開放 確認方法をすぐ知りたい | サーバー本体→LAN→外の回線の順に nc・curl で接続する | いちばん早い方法 |
| ポートが空いているか確認(待ち受け) | Linux は ss -ltnp、Windows は Get-NetTCPConnection -State Listen |
待ち受けているかを確認する |
| Windows でポートの疎通を確認 | Test-NetConnection 相手 -Port 番号 の TcpTestSucceeded を見る |
Test-NetConnectionと確認サイト |
| 外からポート開放を確認 | スマホのテザリングなど別回線から接続する。確認サイトはサーバーを起動してから | Test-NetConnectionと確認サイト |
| Connection refused と出た | 相手まで届いたが待ち受けが無い。アプリの起動・ポート番号・転送先を見る | refusedとタイムアウトの違い |
| タイムアウトになる | 途中で黙って捨てられている。ファイアウォール・ルーターを見る | refusedとタイムアウトの違い |
| 家の中からだと失敗する | NATループバックが無いルーターでは正常。外の回線で確かめる | 家の中から確かめても分からない理由 |
| 設定したのに開放できない | ルーターのWAN側IPとグローバルIPを比べ、CGNAT・二重ルーターを疑う | ポート開放できないとき |
| UDP のポートを確認したい | nc の「succeeded」は当てにならない。アプリで実際に通信して確かめる | UDPの確認が難しい理由 |
確認環境:Ubuntu 24.04.5 LTS(Linux 6.18)の上に ip netns で「外の人役」「ルーター役」「サーバー役」「家の中のPC役」のネットワーク名前空間(名前は t145-*)を作り、ルーター役の中だけで nftables 1.0.9 による NAT(ポートフォワードと送信元の変換)を、サーバー役の中だけでファイアウォールを設定しました。ホストのファイアウォールと設定は変えていません。アドレスは説明用に予約された 198.51.100.0/24・203.0.113.0/24 と、プライベートの 192.168.10.0/24、CGNAT 用の 100.64.0.0/10 を使っています。サーバーは Python 3.13 の http.server、接続の確認は OpenBSD netcat 1.226・curl 8.5.0・Python の socket・bash の /dev/tcp、待ち受けの確認は iproute2 6.1.0 の ss、パケットは tcpdump 4.99.4(作業場所に展開)で見ました。この環境のカーネルは IPv6 が無効のため、IPv6 は公式資料で確かめた範囲で書いています。Windows の Test-NetConnection・Get-NetTCPConnection・Windows ファイアウォールは Microsoft Learn、ルーターの画面はバッファローの公式 FAQ で確かめました。外部のポート確認サイトには接続していません(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「ポート開放確認の方法|閉じている原因をrefusedとtimeoutで見分ける」
ポート開放確認のいちばん早い方法(3か所から順に)
この節では、ポート開放の確認方法を、迷わない順番で手を動かせる形にまとめたものが分かります。
確認は「内側から外側へ」の順に進めます。いきなり外から確かめて「閉じている」と出ても、サーバーのアプリが止まっているのか、ルーターの設定が無いのかが区別できないためです。確かめる相手は、自分が管理しているサーバーと自宅のルーターだけにします。
サーバー本体で待ち受けを見る
Linux なら ss -ltnp、Windows なら Get-NetTCPConnection -State Listen で、使いたいポート番号が LISTEN になっているか、待ち受けのアドレスが 127.0.0.1 だけになっていないかを見る。
同じLANの別の機器から接続する
別のPCから nc -vz 192.168.x.x 番号 か Test-NetConnection 192.168.x.x -Port 番号。ここで失敗すればサーバーのファイアウォールか待ち受けのアドレスが原因。
ルーターの WAN 側 IP とグローバル IP を比べる
ルーターの管理画面に出る WAN 側(インターネット側)の IP アドレスと、外から見た自分のグローバル IP が同じか確かめる。違えば CGNAT か二重ルーター。
外の回線からグローバル IP に接続する
スマホのテザリングなど別の回線につないだPCから、グローバル IP とポート番号に接続する。家の Wi-Fi のままでは正しく判定できないことがある。
失敗の出方で原因の場所を決める
すぐ「Connection refused」なら相手まで届いて断られた。数秒〜2分待って「timed out」なら途中で捨てられた。この違いで次に見る場所が変わる。
手順4で使う確認サイトは、サイト側のサーバーから自分のグローバル IP に接続してみる仕組みです。サーバーのアプリを起動していないと、ルーターの設定が正しくても「閉じている」と表示されます。確認サイトを使う前に、手順1で待ち受けを見ておきます。
ポート開放(ポートフォワード)の仕組み
この節では、ポート開放で何が起きているのか、なぜ3か所の設定がそろう必要があるのかが分かります。
家庭のネットワークでは、PCやゲーム機はプライベート IP アドレス(192.168.x.x など)を持ち、インターネットからはルーターのグローバル IP アドレスだけが見えます。外から来た通信は、ルーターに「このポートに来たら、LAN のこの機器のこのポートへ渡す」という決まりが無い限り、どの機器に渡せばよいか分かりません。この決まりを作ることがポート開放(ポートフォワード、ポート変換、ポートマッピングとも呼ばれます)です。
実験では、ルーター役の中に次の nftables の設定を入れました。「WAN 側(wan0)から TCP 8080 に来たものを 192.168.10.20 の 8080 に渡す」という1行が、家庭用ルーターの画面で登録するポート開放の中身にあたります。
table ip t145nat {
chain prerouting { type nat hook prerouting priority dstnat; policy accept;
iifname "wan0" tcp dport 8080 dnat to 192.168.10.20:8080 comment "port-forward"
}
chain postrouting { type nat hook postrouting priority srcnat; policy accept;
oifname "wan0" ip saddr 192.168.10.0/24 masquerade
}
}
ルーターの入口(wan0)とサーバーの入口(eth0)で同じ接続を tcpdump で見ると、宛先だけが書き換わっていることが分かります。送信元(外の人の 198.51.100.2)はそのまま届くため、サーバーのアクセスログには外の人のアドレスが残りました。
[ルーターの WAN 側 wan0]
IP 198.51.100.2.54086 > 198.51.100.1.8080: Flags [S], seq 599487371, ...
IP 198.51.100.1.8080 > 198.51.100.2.54086: Flags [S.], seq 256143589, ack 599487372, ...
IP 198.51.100.2.54086 > 198.51.100.1.8080: Flags [.], ack 1, ...
[サーバーの eth0]
IP 198.51.100.2.54086 > 192.168.10.20.8080: Flags [S], seq 599487371, ...
IP 192.168.10.20.8080 > 198.51.100.2.54086: Flags [S.], seq 256143589, ack 599487372, ...
IP 198.51.100.2.54086 > 192.168.10.20.8080: Flags [.], ack 1, ...
[サーバーのアクセスログ(日時は省略)]
198.51.100.2 - - [...] "GET / HTTP/1.1" 200 -
家庭用ルーターの画面では、同じことを「Internet側のポート」「LAN側IPアドレス」「LAN側ポート」「プロトコル(TCP/UDP)」の欄に入れて登録します。バッファローの旧商品の画面では[ゲーム&アプリ]→[ポート変換]にあり、LAN 側 IP アドレスに「インターネットからのアクセス先となるプライベート IP アドレス」を入れる、と公式 FAQ に書かれています。転送先の機器の IP アドレスが変わると転送が外れるため、転送先の機器は IP アドレスを固定する(ルーターの DHCP で予約する)のが前提です。
ポート開放に要る3つ
ルーター:外のポートを LAN の機器へ渡す設定
サーバーのファイアウォール:そのポートの受信を許可
アプリ:そのポートで 0.0.0.0 などに待ち受け
よく混ざる別のもの
ポート番号一覧:どのサービスが何番を使うか
ポートを使っているプロセスの調査:誰が占有しているか
SSH のポートフォワード:SSH の中を通す別の仕組み
どのサービスが何番を使うかは関連記事「ポート番号一覧【2026年版】well-knownポートと確認コマンドの早見表」で扱っています。グローバル IP とプライベート IP、NAT の基本は関連記事「グローバルIPの確認方法|コマンド・プライベートIPとの違いとNATを実演」で扱っています。
4つの状態を作って確かめた結果
この節では、待ち受けなし・ファイアウォールで止まる・転送なし・正しく開いている、の4状態が、外からどう見えたかが一覧で分かります。
外の人役(198.51.100.2)から、ルーター役のグローバル IP(198.51.100.1)の TCP 8080 に、nc・curl・Python・bash の4通りで接続しました。タイムアウトはどれも3秒にそろえています。
| 状態 | nc -vz -w 3 | curl | かかった時間 | ルーターで見えたパケット |
|---|---|---|---|---|
| 1 待ち受けなし(転送あり) | Connection refused | (7) Couldn't connect to server | 0.008秒 | SYN → RST(サーバーが返す) |
| 2 サーバーのファイアウォールで drop | timed out: Operation now in progress | (28) Timeout was reached | 3.02秒 | SYN が1秒おきに再送、返事なし |
| 3a 転送なし(ルーターは素通し) | Connection refused | (7) Couldn't connect to server | 0.01秒未満 | SYN → RST(ルーターが返す) |
| 3b 転送なし(ルーターが無反応) | timed out: Operation now in progress | (28) Timeout was reached | 3.01秒 | SYN が再送、返事なし |
| 4 正しく開いている | succeeded! | 200 | 0.024秒 | SYN → SYN/ACK → ACK |
1外からは2種類にしか見えない
5つの状態は、外から見ると「すぐ断られる」「待たされる」「つながる」の3つに分かれるだけだった。原因の場所は外からの1回では決まらない。
2同じ refused でも返した機器が違う
状態1の RST はサーバーが、状態3a の RST はルーター自身が返していた。外から見たアドレスはどちらも 198.51.100.1。
3転送なしでも無反応になる
ルーターの受信を既定で捨てる設定(多くの家庭用ルーターに近い動き)にすると、転送が無いだけでもタイムアウトになった。
状態ごとの原文を並べます。まず状態1(転送はあるが、サーバーでアプリを起動していない)です。
## nc -vz -w 3 198.51.100.1 8080
nc: connect to 198.51.100.1 port 8080 (tcp) failed: Connection refused
-> exit=1 0.008s
## curl --noproxy '*' --connect-timeout 3 -sS -o /dev/null -w '%{http_code}' http://198.51.100.1:8080/
curl: (7) Failed to connect to 198.51.100.1 port 8080 after 0 ms: Couldn't connect to server
000
-> exit=7 0.014s
## python3 socket.create_connection timeout=3
ConnectionRefusedError [Errno 111] Connection refused
-> exit=0 0.042s
## bash /dev/tcp (timeout 3)
bash: connect: Connection refused
bash: line 1: /dev/tcp/198.51.100.1/8080: Connection refused
-> exit=1 0.009s
ルーターの WAN 側では、SYN(接続の申し込み)に対して、すぐに R(RST、リセット)が返っていました。TCP の仕様(RFC 9293)は、接続が存在しない(待ち受けていない)ポートに届いたセグメントには、リセットを返すと定めています。
23:30:09.075126 IP 198.51.100.2.48660 > 198.51.100.1.8080: Flags [S], seq 4007844308, win 64240, ...
23:30:09.075197 IP 198.51.100.1.8080 > 198.51.100.2.48660: Flags [R.], seq 0, ack 4007844309, win 0, length 0
状態2(サーバーで待ち受けているが、サーバーのファイアウォールが TCP 8080 を drop)では、どの道具も3秒待って終わりました。
## nc -vz -w 3 198.51.100.1 8080
nc: connect to 198.51.100.1 port 8080 (tcp) timed out: Operation now in progress
-> exit=1 3.019s
## curl --noproxy '*' --connect-timeout 3 -sS -o /dev/null -w '%{http_code}' http://198.51.100.1:8080/
curl: (28) Failed to connect to 198.51.100.1 port 8080 after 3002 ms: Timeout was reached
000
-> exit=28 3.027s
## python3 socket.create_connection timeout=3
TimeoutError timed out
-> exit=0 3.077s
## bash /dev/tcp (timeout 3)
-> exit=124 3.020s
23:30:20.265064 IP 198.51.100.2.35738 > 198.51.100.1.8080: Flags [S], seq 3412861057, ...
23:30:21.269727 IP 198.51.100.2.35738 > 198.51.100.1.8080: Flags [S], seq 3412861057, ...
23:30:22.293716 IP 198.51.100.2.35738 > 198.51.100.1.8080: Flags [S], seq 3412861057, ...
同じ seq の SYN が約1秒おきに送り直され、返事は一度もありません。bash の /dev/tcp は自分ではタイムアウトしないため、timeout 3 に止められて終了コード124になりました。
状態4(転送あり・ファイアウォールで許可・待ち受けあり)では、すべて成功しました。
## nc -vz -w 3 198.51.100.1 8080
Connection to 198.51.100.1 8080 port [tcp/http-alt] succeeded!
-> exit=0 0.024s
## curl ... -w '%{http_code}' http://198.51.100.1:8080/
200
-> exit=0 0.044s
## python3 socket.create_connection timeout=3
connected
## bash /dev/tcp (timeout 3)
open
待ち受けているかを確認する(ss・netstat・Get-NetTCPConnection)
この節では、サーバー本体でポートが空いているか(待ち受けているか)を確認する方法と、出力のどこを見るかが分かります。
Linux では ss -ltnp を使います。-l は待ち受け中だけ、-t は TCP、-n は番号のまま表示、-p はプロセスを表示する、という意味です(UDP は -u)。
$ ss -ltnp
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 5 0.0.0.0:8080 0.0.0.0:* users:(("python3",pid=4239,fd=3))
$ ss -ltn 'sport = :8080'
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 5 0.0.0.0:8080 0.0.0.0:*
$ ss -ltn 'sport = :9999'
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
待ち受けていないポートを指定すると、見出しの行だけが出ます。見るのは「Local Address」の左側(待ち受けのアドレス)です。同じアプリを --bind 127.0.0.1 で起動し直すと、次のようになりました。
$ ss -ltnp
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 5 127.0.0.1:8080 0.0.0.0:* users:(("python3",pid=4157,fd=3))
サーバー本体から 127.0.0.1:8080 → Connection to 127.0.0.1 8080 port [tcp/http-alt] succeeded!
LAN の PC から 192.168.10.20:8080 → nc: connect to 192.168.10.20 port 8080 (tcp) failed: Connection refused
外から 198.51.100.1:8080 → nc: connect to 198.51.100.1 port 8080 (tcp) failed: Connection refused
サーバー本体からはつながるのに、LAN からも外からも refused になります。開発用のサーバーや管理画面は、既定で 127.0.0.1 だけに待ち受けることが多く、ルーターとファイアウォールを正しく設定しても外からつながらない原因になります。外から使うときは 0.0.0.0(すべてのアドレス)か、LAN 側のアドレスで待ち受けます。
| Local Address の表示 | 意味 | 外からつながるか |
|---|---|---|
| 127.0.0.1:8080 | 自分の中からだけ受け付ける | つながらない(refused) |
| 0.0.0.0:8080 | すべての IPv4 アドレスで受け付ける | ファイアウォールと転送しだい |
| 192.168.10.20:8080 | LAN 側のアドレスだけで受け付ける | ファイアウォールと転送しだい |
| [::]:8080 や *:8080 | IPv6(設定によって IPv4 も)で受け付ける | ファイアウォールと転送しだい |
| 何も出ない | そのポートで誰も待ち受けていない | つながらない(refused) |
Windows では、PowerShell の Get-NetTCPConnection -LocalPort 8080 -State Listen で待ち受けを確かめられます(Microsoft Learn に -LocalPort と -State、State の値 Listen が載っています)。コマンドプロンプトでは netstat -ano の LISTENING の行を見ます。どのプロセスがポートを使っているかの調べ方は、関連記事「ポートを使っているプロセスの調べ方|ss・lsof・netstat比較」で扱っています。
nc・curlでポートが開いているか確認する
この節では、Linux・Mac で使える nc と curl でポートの開放を確認するときの書き方と、結果の読み方が分かります。
nc(netcat)は、指定したポートに TCP で接続できるかだけを確かめられます。-z はデータを送らずに接続だけ試す、-v は結果を表示する、-w 3 は3秒で諦める、という意味です。
nc -vz -w 3 192.168.10.20 8080 # LAN から
nc -vz -w 3 198.51.100.1 8080 # 外の回線から(グローバル IP)
| nc の表示 | 意味 | 次に見る場所 |
|---|---|---|
| succeeded! | TCP の接続ができた(開いている) | アプリの応答(curl など) |
| failed: Connection refused | 相手の機器まで届き、RST で断られた | 待ち受け・ポート番号・転送先 |
| timed out: Operation now in progress | 返事が無いまま時間切れ | ファイアウォール・ルーター |
| failed: No route to host | 経路が無い、または ICMP で拒否された | IP アドレス・ファイアウォールの reject |
| failed: Network is unreachable | そのアドレスへ出ていく経路が自分に無い | 宛先のアドレスの種類(プライベート・CGNAT) |
Web サーバーなら curl でも確かめられます。curl は接続できたあとに HTTP の応答まで見られるので、「ポートは開いているが、アプリがエラーを返している」も区別できます。プロキシの設定がある環境では --noproxy '*' を付けて、プロキシ経由にならないようにします。
curl --noproxy '*' --connect-timeout 3 -sS -o /dev/null -w '%{http_code}\n' http://198.51.100.1:8080/
| curl の結果 | 終了コード | 意味 |
|---|---|---|
| 200 など3桁の番号 | 0 | 開いていて、アプリも応答した |
| (7) Couldn't connect to server | 7 | refused・No route to host など、すぐ失敗 |
| (28) Timeout was reached | 28 | --connect-timeout の時間内に接続できない |
nc も curl も無い環境では、bash の /dev/tcp で接続だけ試せます。自分ではタイムアウトしないので、必ず timeout で包みます。
timeout 3 bash -c 'echo > /dev/tcp/192.168.10.20/8080' && echo open || echo closed
Python なら socket.create_connection((ホスト, ポート), timeout=3) で、ConnectionRefusedError と TimeoutError を分けて受け取れます。refused と timed out の違いをアプリのエラー処理で扱う方法は、関連記事「Connection refused・Read timed outの違いと直し方」で扱っています。
WindowsのTest-NetConnectionとポート開放確認サイト
この節では、Windows でポートの疎通を確認するコマンドと、外部のポート開放確認サイトを使うときの読み方が分かります。
Windows では、PowerShell の Test-NetConnection を使います。Microsoft Learn によると、-Port には「リモートコンピューターの TCP ポート番号」を指定し、結果の TcpTestSucceeded が True なら接続できています。-InformationLevel Quiet を付けると、True/False だけが返ります。
Test-NetConnection 192.168.10.20 -Port 8080
Test-NetConnection 192.168.10.20 -Port 8080 -InformationLevel Quiet
Test-NetConnection 192.168.10.20 -CommonTCPPort RDP
| TcpTestSucceeded | PingSucceeded | 読み方 |
|---|---|---|
| True | (どちらでも) | ポートに接続できた |
| False | True | 機器はあるが、そのポートに接続できない |
| False | False | 機器に届かないか、ping も止めている |
PingSucceeded が False でも、ポートが閉じているとは限りません。Windows ファイアウォールは、Microsoft Learn によると既定で「求められていない受信と、規則に合わない受信をすべて遮断」します。ping(ICMP)を止めているだけで、許可したポートには接続できる、ということがよくあります。-CommonTCPPort に指定できるのは HTTP・RDP・SMB・WINRM の4つです。Test-NetConnection は TCP だけを確かめるコマンドで、UDP の確認には使えません。
Mac には nc が入っているため、ターミナルで前の節の nc -vz を使えます。
ポート開放確認サイトの使い方
ポート開放確認サイトは、サイトのサーバーから「アクセスしてきた人のグローバル IP」の指定ポートに接続し、つながったかを表示する仕組みです。使うときは次の順にします。
- サーバー(ゲームのサーバー・NAS など)を起動し、本体で待ち受けを確かめる
- 確認サイトに、確かめたいポート番号を入れる(多くは TCP だけを確かめる)
- 「開いている」と出れば、ルーターからサーバーまで外の接続が届いている
- 「閉じている」と出たら、この記事の判断表で場所を絞る
確認サイトの「閉じている」は、この記事の状態1・2・3a・3b のどれでも同じ表示になり得ます。サイトに入れたグローバル IP は記録が残る可能性もあるため、信頼できる運営者のものを選び、自分の回線以外のアドレスは入れません。
Connection refusedとタイムアウトの違い
この節では、「すぐ断られる」と「待たされる」の違いが何を意味し、原因の場所をどう絞るかが分かります。
電話にたとえると
見分ける問い:「何秒で失敗したか」
失敗までの時間を実測すると、差がはっきり出ました。
タイムアウトを指定しないと、nc も curl も約2分待たされました。
$ nc -v 198.51.100.1 9090 </dev/null
nc: connect to 198.51.100.1 port 9090 (tcp) failed: Connection timed out
elapsed 133.456101206
$ curl --noproxy '*' -sS -o /dev/null http://198.51.100.1:9090/
curl: (28) Failed to connect to 198.51.100.1 port 9090 after 133383 ms: Couldn't connect to server
elapsed 133.452596355
Linux カーネルの公式ドキュメントは、tcp_syn_retries の既定値6で、接続の試みが最終的に約131秒でタイムアウトすると説明しています(この環境の値も6)。確認のときは -w 3 や --connect-timeout 3 を付けると、待ち時間が短く済みます。
ファイアウォールの設定でも、見え方は変わります。サーバー役のファイアウォールで、止め方だけを変えて試しました。
| nftables の規則 | nc の表示 | 家庭で近いもの |
|---|---|---|
| tcp dport 8080 drop | timed out: Operation now in progress | Windows ファイアウォール・多くのルーター |
| tcp dport 8080 reject | failed: Connection refused | 拒否を返す設定 |
| reject with tcp reset | failed: Connection refused | 拒否を返す設定 |
| reject with icmpx admin-prohibited | failed: No route to host | 管理上の拒否を返す設定 |
refused は「相手まで届いた」の目安ですが、ファイアウォールが reject で断っている場合も refused になります。refused が出たら、まず待ち受けを確かめ、待ち受けがあればファイアウォールの規則を見ます。Linux のファイアウォールの許可・削除の書き方は、関連記事「ufwとfirewalldの使い方|コマンド対応表とSSH締め出し対策」で扱っています。
家の中からグローバルIPで確かめても分からない理由
この節では、家の Wi-Fi のまま自分のグローバル IP に接続すると失敗する理由と、正しい確かめ方が分かります。
ポート開放を正しく設定した状態(状態4)で、LAN の PC 役から確かめました。
LAN の PC → サーバーのプライベート IP 192.168.10.20:8080
Connection to 192.168.10.20 8080 port [tcp/http-alt] succeeded!
LAN の PC → 自分のグローバル IP 198.51.100.1:8080
nc: connect to 198.51.100.1 port 8080 (tcp) failed: Connection refused
curl: (7) Failed to connect to 198.51.100.1 port 8080 after 0 ms: Couldn't connect to server
外の人 → グローバル IP 198.51.100.1:8080
Connection to 198.51.100.1 8080 port [tcp/http-alt] succeeded!
外からはつながるのに、家の中からグローバル IP あてに接続すると refused でした。ポート開放の規則は「WAN 側から入ってきた通信」にだけ働くため、LAN から来た通信はルーター自身が受け取り、そこに待ち受けが無いので断られます。家の中から自分のグローバル IP を使ってつながるようにする機能を NAT ループバック(ヘアピン NAT)と呼び、対応しているかはルーターによって違います。
ルーター役に、LAN から来た通信も転送する規則(ヘアピン NAT)を足すと、家の中からもつながりました。このとき、サーバーのログには外の人ではなくルーターのアドレス(192.168.10.1)が残りました。
LAN の PC → 198.51.100.1:8080(ヘアピン NAT あり)
Connection to 198.51.100.1 8080 port [tcp/http-alt] succeeded!
hello from t145-srv
[サーバーのアクセスログ(日時は省略)]
192.168.10.1 - - [...] "GET / HTTP/1.1" 200 -
このため、外からの確認は、スマホのテザリングなど家の回線と別の回線から行うのが確実です。家の中では、サーバーのプライベート IP あてに確かめます。
UDPのポート開放確認が難しい理由
この節では、ゲームなどで使う UDP のポートが開いているかを確認するとき、なぜ「成功」の表示を信じられないのかが分かります。
UDP には TCP のような接続の手順(SYN・SYN/ACK)がありません。届いたかどうかの返事は、アプリが返すか、待ち受けが無いときに ICMP の「到達できない」が返るかのどちらかです。ルーター役で UDP 9999 もサーバーに転送し、nc -vzu で確かめました。
| サーバーの状態 | nc -vzu -w 2 の表示 | 終了コード | 正しいか |
|---|---|---|---|
| 待ち受けあり(nc -lu 9999) | Connection to 198.51.100.1 9999 port [udp/*] succeeded! | 0 | 正しい |
| 待ち受けなし | (何も表示されない) | 1 | 正しい(ICMP で分かった) |
| 待ち受けなし+ファイアウォールで drop | Connection to 198.51.100.1 9999 port [udp/*] succeeded! | 0 | 誤り |
ファイアウォールで UDP を黙って捨てると、何も返ってこないことを「成功」と表示しました。nc は UDP で数バイトを送り、エラーが返ってこなければ成功とみなすためです(待ち受けありのとき、サーバー側には nc が送った「XXXX」が届いていました)。UDP のポート開放は、実際のアプリ(ゲームのクライアントなど)で外の回線から接続して確かめます。確認サイトの多くも TCP だけを確かめるため、UDP のポートは判定できません。
ポート開放できないとき(二重ルーター・CGNAT・IPv6)
この節では、設定が正しくても外からつながらない回線の事情と、その見分け方が分かります。
ルーターの設定・ファイアウォール・待ち受けをすべて確かめても外からつながらないときは、自宅のルーターの外側に、もう1つ NAT があることを疑います。CGNAT(キャリアグレード NAT)を再現するため、「プロバイダー役」のネットワーク名前空間を足し、自宅のルーター役の WAN 側に 100.64.0.2 を割り当てました。100.64.0.0/10 は RFC 6598 で CGNAT 用に決められた共有アドレスで、インターネットでは経路が無いアドレスです。
自宅ルーターの WAN 側の IP
wan0 UP 100.64.0.2/24
サーバーから「外から見た自分の IP」を返す仕組み(自作)に問い合わせた結果
203.0.113.1
外の人 → 203.0.113.1:8080(外から見えるグローバル IP)
nc: connect to 203.0.113.1 port 8080 (tcp) failed: Connection refused
外の人 → 100.64.0.2:8080(ルーターの WAN 側 IP)
nc: connect to 100.64.0.2 port 8080 (tcp) failed: Network is unreachable
プロバイダーの中 → 100.64.0.2:8080
Connection to 100.64.0.2 8080 port [tcp/http-alt] succeeded!
自宅のルーターのポート開放は正しく働いていて、プロバイダーの中からはつながります。しかし外の人が使えるのはプロバイダーの NAT のアドレス(203.0.113.1)だけで、そこには自宅向けの転送がありません。ルーターの画面に出る WAN 側 IP と、外から見た自分のグローバル IP が違えば、この状態です。
| 状況 | 見分け方 | 対処 |
|---|---|---|
| 二重ルーター(家の中に NAT が2段) | WAN 側 IP が 192.168.x.x などプライベート | 上のルーターでも転送する。片方をブリッジ(アクセスポイント)モードにする |
| CGNAT(プロバイダーの NAT) | WAN 側 IP が 100.64.0.0/10 の範囲 | 固定 IP・グローバル IP のオプションを契約先に確かめる |
| IPv4 over IPv6(MAP-E・DS-Lite など) | 契約の方式名で分かる | 使えるポートや可否が方式で違うため契約先の案内で確かめる |
| マンションの共用回線 | WAN 側 IP がプライベート | 建物の回線の管理者・契約先に確かめる |
| IPv6 で接続したい | 機器が 2001: などで始まるアドレスを持つ | ルーターの IPv6 フィルターで、その機器・ポートへの受信を許可する |
バッファローの公式 FAQ には、AP モード(ブリッジモード)の Wi-Fi ルーターではポート開放の画面が出ないため、上位の機器で設定する、と書かれています。二重ルーターでは、インターネットに近い側のルーターで設定するのが基本です。
IPv6 では、機器ごとにインターネットで使えるアドレスが付くため、IPv4 のような「ポートの転送」は使わず、ルーターの IPv6 の受信フィルターで許可する形になります。この環境ではカーネルの IPv6 が無効だったため、IPv6 は実際には試していません。家庭用ルーターでの IPv6 の受信の許可は、機種の公式マニュアルで確かめます。
自宅のネットワークの切り分けの順番は、関連記事「ネットワークの切り分け8選|pingは通るのに繋がらない」でも扱っています。
ゲーム機・NAS・自宅サーバーでの確認例
この節では、よくある用途ごとに、どのポートをどう確かめればよいかが分かります。
ゲームのサーバー
例:Minecraft Java版の自分のサーバーなら、server.properties の server-port に書かれた番号が対象。本体で ss -ltn、外の回線から nc か実際のゲームで確かめる。
UDP のゲームはアプリで確かめる
ゲーム機
各ゲームの公式ヘルプが案内するポート番号と TCP/UDP をそのまま使う。ゲーム機の接続テストの結果の読み方は、各社の公式ヘルプで確かめる。
転送先は本体の固定 IP
NAS
管理画面のポートは開放しない。外から使うならメーカーの公式の中継機能か VPN を使い、開放するポートを最小にする。
管理画面は外に出さない
自宅の Web サーバー
0.0.0.0 で待ち受け、サーバーのファイアウォールで 80・443 を許可し、外の回線から curl で HTTP の応答まで確かめる。
ステータスまで見る
Windows でリモートデスクトップを外から使うためにポートを開ける方法は、安全のために勧めません。外から使うときは VPN を使い、Windows の受信の許可は LAN 内に限ります。ルーターに「DMZ」の機能がある機種もありますが、指定した1台にすべてのポートを渡す設定のため、確認のための一時的な利用にとどめ、終わったら外します。
開けっぱなしの注意と閉じ方
この節では、開けたポートを安全に保つための確認項目と、使い終わったときの閉じ方が分かります。
開いたポートには、自分以外からも接続が届きます。インターネットには、開いているポートを探して回る通信が常にあります。開けるのは必要なポートだけにして、次の点を確かめます。
- 1開けるポートと転送先を1対1にするポートの範囲指定や DMZ で広く開けない。使うポート番号と TCP/UDP だけを登録する
- 2アプリを最新にし、パスワードを強くする外から届くのはアプリそのもの。初期パスワードのまま公開しない
- 3管理画面・リモートデスクトップ・ファイル共有は開けない外から使うなら VPN を通す
- 4アクセスログを見る知らないアドレスからの接続が多ければ、ポートを閉じるか接続元を絞る
- 5使い終わったら閉じるルーターの転送・ファイアウォールの許可・アプリの3か所すべてを戻す
閉じるときは、開けたときと逆の順に戻します。
| 場所 | 閉じ方 | 閉じたあとの確認 |
|---|---|---|
| ルーター | ポート開放(ポート変換)の登録を削除する | 外の回線から timed out か refused |
| Windows ファイアウォール | 自分で作った受信の規則を削除か無効にする | LAN から Test-NetConnection が False |
| Linux(nftables) | 許可した規則を削除する(ufw なら ufw delete) | LAN から nc が timed out |
| アプリ | 止めるか、127.0.0.1 だけで待ち受ける | ss -ltn に出ない |
Windows で受信の規則を作るときは、Microsoft Learn の New-NetFirewallRule で -DisplayName・-Direction Inbound・-Protocol TCP・-LocalPort・-Action Allow を指定します。名前を付けておくと、あとで同じ名前で探して消せます。
New-NetFirewallRule -DisplayName "t145 test 8080" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow
Remove-NetFirewallRule -DisplayName "t145 test 8080"
確かめ方でやってはいけないこと
確かめる相手は自分のサーバーと自分のルーターだけにする
よくあるエラーと判断表
この節では、表示されたエラーの原文から原因を引ける表と、どこで失敗したかで原因を決める判断表が分かります。
よくあるエラー(原文つき)
| 表示(原文) | 出る道具 | よくある原因 |
|---|---|---|
| failed: Connection refused | nc | アプリが止まっている・127.0.0.1 で待ち受け・ポート番号違い・転送先の IP 違い・家の中からグローバル IP |
| (7) Failed to connect ... Couldn't connect to server | curl | 上と同じ(refused・No route to host) |
| ConnectionRefusedError [Errno 111] | Python | 上と同じ |
| timed out: Operation now in progress | nc -w | ファイアウォールの drop・ルーターに転送が無い・CGNAT |
| (28) ... Timeout was reached | curl | 上と同じ |
| failed: No route to host | nc | 相手の IP が違う・ICMP の拒否 |
| failed: Network is unreachable | nc | プライベート IP や 100.64.x.x に外から接続した |
| TcpTestSucceeded : False | Test-NetConnection | refused と timed out のどちらか。PingSucceeded だけでは決めない |
どこで失敗したかで決める判断表
| サーバー本体 | LAN から | 外の回線から | 原因の場所 |
|---|---|---|---|
| 失敗 | 失敗(refused) | 失敗 | アプリが待ち受けていない・ポート番号違い |
| 成功 | 失敗(refused) | 失敗 | 127.0.0.1 だけで待ち受け(ss の Local Address) |
| 成功 | 失敗(timed out) | 失敗 | サーバーのファイアウォール |
| 成功 | 成功 | 失敗(refused か timed out) | ルーターの転送(転送先の IP・ポート・TCP/UDP) |
| 成功 | 成功 | 失敗(WAN 側 IP ≠ グローバル IP) | 二重ルーター・CGNAT |
| 成功 | 成功 | 成功 | 開放できている。家の中からの失敗は NAT ループバック |
判断表を上から順にたどると、次の順で見ることになります。
- 1アプリ:起動・ポート番号・待ち受けのアドレスss -ltnp か Get-NetTCPConnection
- 2サーバーのファイアウォール:受信の許可LAN から nc・Test-NetConnection
- 3ルーター:転送先の IP・ポート・TCP/UDP転送先の機器の IP が変わっていないか
- 4回線:WAN 側 IP とグローバル IP の一致違えば CGNAT・二重ルーター
- 5確かめ方:外の回線から、TCP は nc・curl、UDP はアプリで家の Wi-Fi のままグローバル IP に接続しない
よくある質問
Q. ポート開放の確認方法でいちばん簡単なのは?
A. スマホのテザリングなど家とは別の回線につないだPCから、Windows なら Test-NetConnection グローバルIP -Port 番号、Mac・Linux なら nc -vz -w 3 グローバルIP 番号 を実行します。その前に、サーバー本体で待ち受けていることを確かめておきます。
Q. ポートが空いているか確認するコマンドは?
A. 自分の機器で待ち受けているかは、Linux なら ss -ltnp、Windows なら Get-NetTCPConnection -State Listen か netstat -ano で見ます。ほかの機器から接続できるかは、nc・curl・Test-NetConnection で確かめます。
Q. 確認サイトで「閉じている」と出ました。ルーターの設定が間違っていますか? A. そうとは限りません。サーバーのアプリが起動していない、サーバーのファイアウォールが止めている、CGNAT で開放できない回線、のどれでも同じ表示になります。判断表の順に、内側から確かめます。
Q. Connection refused とタイムアウトはどちらが「惜しい」ですか? A. refused は相手の機器まで届いて断られた状態なので、多くはアプリの待ち受けか転送先の設定を直せばつながります。タイムアウトは途中のファイアウォールやルーターで止まっていることが多く、見る場所が違います。
Q. 家の中から自分のグローバル IP にアクセスするとつながりません。 A. ルーターが NAT ループバック(ヘアピン NAT)に対応していないと、正しく開放していても家の中からはつながりません。手元の実験でも、外からは成功し、家の中からは refused でした。外の回線から確かめます。
Q. UDP のポートが開いているかを nc で確かめられますか? A. 当てになりません。手元の実験では、ファイアウォールが UDP を黙って捨てているときにも nc は「succeeded」と表示しました。UDP は実際のアプリで、外の回線から通信できるかで確かめます。
Q. ポート開放を設定したのに、どうしても外からつながりません。 A. ルーターの WAN 側 IP と、外から見たグローバル IP を比べます。WAN 側 IP が 100.64.x.x〜100.127.x.x や 192.168.x.x なら、外側にもう1つ NAT があり、自宅のルーターの設定だけでは開放できません。
Q. ポート開放は危険ですか? A. 開けたポートの先にあるアプリに、誰でも接続できるようになります。必要なポートだけを開け、アプリを最新に保ち、管理画面やリモートデスクトップは開けず、使い終わったら閉じます。外から自分の機器を使うだけなら VPN のほうが安全です。
Q. ping が通らないのは閉じているからですか? A. いいえ。Windows ファイアウォールなどは ping を既定で止めていることがあり、ping が通らなくても許可したポートには接続できます。ポートの確認は、そのポートに接続して確かめます。
Q. 他人のサーバーのポートを確かめてもよいですか? A. 確かめる相手は、自分が管理するサーバーと自分のルーターに限ります。管理者の許可なく他人の機器へ接続を試すことは、この記事の対象外です。
まとめ
- ポート開放の確認は、サーバー本体→同じ LAN→外の回線の順に行う。外からの1回の結果だけでは、原因の場所は決まらない。
- Connection refused は「相手まで届いて断られた」(待ち受けなし・転送なし・reject)、timed out は「途中で捨てられた」(drop のファイアウォール・ルーター)。手元では refused は0.01秒前後、timed out は指定なしで約133秒かかった。
- 待ち受けは
ss -ltnpの Local Address を見る。127.0.0.1 だけで待ち受けていると、外からも LAN からも refused になる。 - 家の中から自分のグローバル IP に接続すると、NAT ループバックの無いルーターでは失敗する。外の確認はテザリングなど別回線から。UDP は nc の「succeeded」を信じず、アプリで確かめる。
- ルーターの WAN 側 IP とグローバル IP が違えば CGNAT・二重ルーター。開けるのは必要なポートだけにし、使い終わったらルーター・ファイアウォール・アプリの3か所を戻す。
参考・出典
確認日はいずれも 2026年10月29日です。
- Microsoft Learn「Test-NetConnection」:https://learn.microsoft.com/en-us/powershell/module/nettcpip/test-netconnection
- Microsoft Learn「Get-NetTCPConnection」:https://learn.microsoft.com/en-us/powershell/module/nettcpip/get-nettcpconnection
- Microsoft Learn「Windows Firewall overview」:https://learn.microsoft.com/en-us/windows/security/operating-system-security/network-security/windows-firewall/
- Microsoft Learn「New-NetFirewallRule」:https://learn.microsoft.com/en-us/powershell/module/netsecurity/new-netfirewallrule
- man7.org「ss(8)」:https://man7.org/linux/man-pages/man8/ss.8.html
- The Linux Kernel documentation「IP Sysctl」(tcp_syn_retries):https://docs.kernel.org/networking/ip-sysctl.html
- IETF「RFC 9293 Transmission Control Protocol (TCP)」3.5.2 Reset Generation:https://www.rfc-editor.org/rfc/rfc9293
- IETF「RFC 6598 IANA-Reserved IPv4 Prefix for Shared Address Space」:https://www.rfc-editor.org/rfc/rfc6598
- バッファロー「ポートを開放する方法(旧商品)」:https://www.buffalo.jp/support/faq/detail/15794.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「ポート開放確認の方法|閉じている原因をrefusedとtimeoutで見分ける」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。