前の記事では、SSH 鍵を作って GitHub につなぎました。ここから Lv4 です。Lv4 では、自分のパソコンの外にあるサーバーを使えるようになることを目指します。
私が初めて VPS(借りるサーバー)を契約したとき、管理画面に「IPv4 アドレス」「ポート 22」「DNS(=ドメイン名を IP アドレスに置きかえる、インターネットの電話帳のようなしくみ)」といった言葉が並んでいて、どれが何なのかさっぱりわかりませんでした。言われたとおりにコマンドを打っても、つながらないときに何を疑えばいいのかがわからなかったんです。
この記事では、サーバーを使う前に知っておきたい IP アドレス・ポート・DNS の3つを、自分のパソコンの中だけで確かめながら、ざっくり理解していきます。
- IP アドレス・ポート・DNS が、それぞれ「何を表しているか」
- 自分のパソコンの IP アドレスの見方(
hostname -I・ip) -
127.0.0.1(localhost)と、家の中の IP、インターネット側の IP のちがい -
pingとgetentで、名前から IP アドレスを調べる方法 -
ssで「どのポートで待っているか」を見る方法 - 練習用の Web サーバーを、自分のパソコンの中だけで動かす方法
- パイプ(
|)とgrepを使える -
curlで Web ページの中身やヘッダーを見られる -
Ctrl + Cでコマンドを止められる
まだの方は、前の記事「LinuxでGitを使う|SSH鍵を作ってGitHubにつなぐ【初心者向け】」と、Lv3 の curl の記事から読むのがおすすめです。
- パッケージ:ソフトをインストールしやすいように、ひとまとめにしたもの
- SSH:ネットワークの向こうのコンピューターに、暗号化して安全にログインし、操作するしくみ
- 鍵:SSH などでパスワードの代わりに使う、2つで1組のデータ。公開鍵は相手に渡す「錠前」、秘密鍵は自分だけが持つ「鍵」
- サーバー:ほかのパソコンやアプリにサービスを提供するコンピューター。24時間動かしておくことが多いです
用語で迷ったら、連載のまとめ記事の「よく出てくる用語ミニ辞典」でも確かめられます。
結論:住所・部屋番号・電話帳の3つで考える
| ことば | たとえ | 例 |
|---|---|---|
| IP アドレス | 建物の住所 | 192.168.1.20・203.0.113.10 |
| ポート | 建物の中の部屋番号 | 22(SSH)・80(HTTP)・443(HTTPS) |
| DNS | 名前から住所を調べる電話帳 | example.com → IP アドレス |
localhost(127.0.0.1) | 「自分の建物」 | 自分のパソコン自身 |
準備:練習用のディレクトリを作る
練習は ~/linux-practice/network-test の中で行います。この記事のコマンドは、ほとんどが「見るだけ」です。
- 1
- 2
- 3
mkdir -p ~/linux-practice/network-test
cd ~/linux-practice/network-test
pwdここから先の出力例は、Debian 13での実行例です(ユーザー名 kaito・パソコン名 demo のダミー環境)。UbuntuやWSL(=Windows の中で Linux を動かせる、Microsoft のしくみ)では、表示が少し違うことがあります。
(例)
- 1
- 2
- 3
- 4
kaito@demo:~$ mkdir -p ~/linux-practice/network-test
kaito@demo:~$ cd ~/linux-practice/network-test
kaito@demo:~/linux-practice/network-test$ pwd
/home/kaito/linux-practice/network-testIP アドレス:コンピューターの住所
まず、自分のパソコンの名前と IP アドレスを見てみましょう。
- 1
- 2
hostname
hostname -I(例)
- 1
- 2
- 3
- 4
kaito@demo:~/linux-practice/network-test$ hostname
demo
kaito@demo:~/linux-practice/network-test$ hostname -I
192.168.1.20IP アドレスは、ここでは 192.168.1.20 というダミーに置き換えています。
ip コマンドを使うと、もう少しくわしく見られます。-br は「短くまとめて」という意味です。
- 1
ip -br addr(例)
- 1
- 2
- 3
kaito@demo:~/linux-practice/network-test$ ip -br addr
lo UNKNOWN 127.0.0.1/8 ::1/128
enp0s3 UNKNOWN 192.168.1.20/24 fe80::a1b2:c3ff:fed4:e5f6/64enp0s3 が、このパソコンの有線の出入り口です(名前は環境によって eth0・wlan0 などになります)。IPv4・IPv6 のアドレスは、ダミーに置き換えています。検証環境は仮想の出入り口だったため、状態が UNKNOWN になっていますが、ふつうのパソコンや VPS では UP と表示されることが多いです。
lo は、自分自身を指す特別な出入り口です。127.0.0.1 はいつも「自分のパソコン」を表し、localhost とも呼ばれます。
3種類の IP アドレス
| 種類 | 例 | だれから見えるか |
|---|---|---|
localhost | 127.0.0.1 | 自分のパソコンの中だけ |
| 家や会社の中の IP(プライベート IP) | 192.168.x.x・10.x.x.x | 同じ Wi-Fi やネットワークの中だけ |
| インターネット側の IP(グローバル IP) | 203.0.113.10 のような数字 | インターネット全体 |
VPS を借りると、管理画面にグローバル IP が表示されます。インターネットのどこからでも、その住所にたどり着けるということです。
外への出口:デフォルトゲートウェイ
- 1
ip route(例)
- 1
- 2
- 3
- 4
kaito@demo:~/linux-practice/network-test$ ip route
default via 192.168.1.1 dev enp0s3
192.168.1.0/24 dev enp0s3 proto kernel scope link
192.168.1.0/24 dev enp0s3 proto kernel scope link src 192.168.1.20IP アドレスはダミーに置き換えています。192.168.1.0/24 の行が2つあるのは検証環境のネットワーク設定によるもので、ふつうは1行のことが多いです。
default via のあとの住所が、家の外へ出るための出口(多くの場合は Wi-Fi ルーター)です。「つながらない」ときは、まずここまで届いているかを確かめます。
DNS:名前から住所を調べる
ふだん私たちは、IP アドレスではなく example.com のような名前でサイトを開きます。名前を IP アドレスに変えてくれるのが DNS です。
- 1
getent hosts example.com(例)
- 1
- 2
kaito@demo:~/linux-practice/network-test$ getent hosts example.com
203.0.113.10 example.com検証環境では IPv4 の1行だけが表示されました(IP アドレスは、説明用の 203.0.113.10 に置き換えています)。環境によっては、IPv6 の行も含めて複数行が表示されます。
ping でも、名前がどの住所に変わったかと、そこまで届くかを確かめられます。-c 3 は「3回だけ」という意味です。
- 1
ping -c 3 example.comふつうは、64 bytes from …: icmp_seq=1 ttl=… time=… ms のような応答の行が3つ返り、最後に 3 packets transmitted, 3 received, 0% packet loss と集計されます。
今回の検証環境は、ping を外に出さない制約があったため、応答が返らず、次のように 100% packet loss になりました。この表示は検証環境の制約によるもので、ふつうの環境では応答が返ります。
(例)
- 1
- 2
- 3
- 4
- 5
kaito@demo:~/linux-practice/network-test$ ping -c 3 example.com
PING example.com (203.0.113.10) 56(84) bytes of data.
--- example.com ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2044msサーバーによっては、安全のために ping に答えない設定になっています。ping が返ってこなくても、ブラウザや curl では見られることがあります。「ping が通らない=止まっている」と決めつけないようにしましょう。
パソコンが使っている DNS と、hosts ファイル
- 1
- 2
cat /etc/resolv.conf
cat /etc/hosts(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
kaito@demo:~/linux-practice/network-test$ cat /etc/resolv.conf
nameserver 192.168.1.1
kaito@demo:~/linux-practice/network-test$ cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.1.1 demonameserver の IP アドレスは、ダミーに置き換えています。127.0.1.1 demo は、自分のパソコンの名前(demo)を自分自身に結びつける行で、Debian ではこの形が標準です。
/etc/resolv.conf には「どの電話帳(DNS サーバー)に聞くか」、/etc/hosts には「電話帳に聞く前に見る、自分用のメモ」が書かれています。localhost(=自分自身を指す特別な名前)が 127.0.0.1 になるのは、この hosts に書いてあるからです。
ポート:建物の中の部屋番号
1つのサーバーの中では、SSH・Web など、いくつものサービスが同時に動いています。どのサービスに用があるかを区別するのがポート番号です。
| ポート | よく使うサービス |
|---|---|
| 22 | SSH(リモートでログインする) |
| 80 | HTTP(暗号化なしの Web) |
| 443 | HTTPS(暗号化ありの Web) |
| 5678 | n8n(初期設定の場合) |
| 8000・8080 | 練習や開発でよく使う番号 |
今のパソコンで「お客さんを待っている(LISTEN している)ポート」は、ss で見られます。
- 1
ss -tln(例)
- 1
- 2
- 3
- 4
kaito@demo:~/linux-practice/network-test$ ss -tln
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 20 127.0.0.1:25 0.0.0.0:*
LISTEN 0 20 [::1]:25 [::]:*検証環境では、最初から待っていたのはメールのサービス(25番ポート)だけで、どちらも 127.0.0.1・[::1](自分の中からだけ)でした。入っているソフトによって、並ぶ行は変わります。
-
-t:TCP(Web や SSH で使うつなぎ方)だけ -
-l:待っているものだけ -
-n:名前ではなく番号で表示
127.0.0.1:… と表示されたものは「自分のパソコンの中からだけ」、0.0.0.0:… や *:… と表示されたものは「外からも受けつける」という意味です。
この「127.0.0.1 で待つか、0.0.0.0 で待つか」は、このあとの記事でも何度も出てきます。SSH(次の記事)は外から入るために 0.0.0.0:22 で待ち、Docker(=アプリを、必要なものごと「コンテナ」という箱に入れて動かす道具)や n8n の記事では、あえて 127.0.0.1 だけで待たせて、外から直接見られないようにします。ss -tln の結果を見たら、どの住所で待っているかも一緒に確かめるくせをつけておきましょう。
練習:自分のパソコンの中だけで Web サーバーを動かす
Python には、かんたんな Web サーバーが入っています。--bind 127.0.0.1 をつけて、自分のパソコンの中からだけ見られるようにして動かします。
- 1
- 2
- 3
cd ~/linux-practice/network-test
echo "kaito の練習用ページです" > index.html
python3 -m http.server 8000 --bind 127.0.0.1(例)
- 1
- 2
kaito@demo:~/linux-practice/network-test$ python3 -m http.server 8000 --bind 127.0.0.1
Serving HTTP on 127.0.0.1 port 8000 (http://127.0.0.1:8000/) ...このターミナルはそのままにして、もう1つターミナルを開いて、次を打ちます。
- 1
- 2
- 3
ss -tln | grep 8000
curl http://localhost:8000/
curl -I http://127.0.0.1:8000/(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
kaito@demo:~/linux-practice/network-test$ ss -tln | grep 8000
LISTEN 0 5 127.0.0.1:8000 0.0.0.0:*
kaito@demo:~/linux-practice/network-test$ curl http://localhost:8000/
kaito の練習用ページです
kaito@demo:~/linux-practice/network-test$ curl -I http://127.0.0.1:8000/
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.13.5
Date: Sat, 31 Oct 2026 18:29:32 GMT
Content-type: text/html
Content-Length: 34
Last-Modified: Sat, 31 Oct 2026 18:29:23 GMT127.0.0.1:8000 だけで待っているので、自分のパソコンの中からしか見られません。Date の時刻は世界標準時(GMT)なので、日本の時刻より9時間前になっています。
最初のターミナルに戻ると、アクセスがあったことが記録されています。確かめたら Ctrl + C で止めます。
(例)
- 1
- 2
- 3
- 4
127.0.0.1 - - [01/Nov/2026 03:29:30] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [01/Nov/2026 03:29:32] "HEAD / HTTP/1.1" 200 -
^C
Keyboard interrupt received, exiting.GET の行は curl、HEAD の行は curl -I でアクセスしたときの記録です。^C は、Ctrl + C を押したしるしです。
止めたあとは、ポートが空いたことも確かめておきましょう。
- 1
- 2
ss -tln | grep 8000
curl http://localhost:8000/(例)
- 1
- 2
- 3
kaito@demo:~/linux-practice/network-test$ ss -tln | grep 8000
kaito@demo:~/linux-practice/network-test$ curl http://localhost:8000/
curl: (7) Failed to connect to localhost port 8000 after 0 ms: Could not connect to serverss は何も表示せず、curl はつなげずにエラーになりました。
この「Could not connect to server(つなげなかった)」は、ここでは住所には届いたけれど、その部屋番号ではだれも待っていないという意味です。curl のバージョンや環境によっては、同じ状態が「Connection refused(断られた)」と表示されます。サーバーで「つながらない」ときによく見るメッセージなので、覚えておくと役に立ちます。
「つながらない」ときは、この記事の3つを、電話帳 → 住所 → 部屋番号の順に1つずつ確かめると、原因をしぼりこめます。
- 名前(DNS):
getent hosts 名前で IP アドレスが返るかを見ます。何も表示されないときや、curlが「Could not resolve host」と表示するときは、電話帳の段階でつまずいています(名前のつづりまちがいもよくあります)。普通の回線では、存在しない名前にcurlを打つとcurl: (6) Could not resolve host: 名前になります(出典:curl 公式マニュアルの EXIT CODES の「6 Could not resolve host.」)。 - 住所(IP アドレス):
ping -c 3 IPアドレスで届くかを見ます。ただし、上の箱のとおり、ping に答えないサーバーもあるので、返らなくても次へ進みます。 - 部屋番号(ポート):
curl -I http://IPアドレス:ポート/で確かめます。この記事で見た「Could not connect to server」「Connection refused」は、住所には届いたが、その部屋でだれも待っていない、つまりサービスが止まっているか、別のポートで動いている状態です。サーバーの中でss -tlnを打てば、待っているポートを確かめられます。いっぽう、しばらく待たされたあとに「timed out(時間切れ)」になるときは、ファイアウォール(=通信を、決めたルールで通したり止めたりする門番)などで途中で止められていることが多いです。--max-time 5をつけると、5秒であきらめてくれます。
エラーの文字は、curl のバージョンや環境によって少しずつちがいます。AI に聞くときは、表示された文字をそのまま(IP アドレスは伏せて)貼りましょう。
curl のエラーを、実際に見てみる
名前の段階と、時間切れのエラーを、実際に出してみます。example..com は、ドットが2つ続いている形がおかしい名前の例です。10.255.255.1 は、届かない相手の例として選んだ、家や会社の中向けの IP アドレスです。
- 1
- 2
- 3
- 4
curl -I http://example..com/
echo $?
curl -I --max-time 5 http://10.255.255.1/
echo $?(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
kaito@demo:~/linux-practice/network-test$ curl -I http://example..com/
curl: (6) Could not resolve host: example..com
kaito@demo:~/linux-practice/network-test$ echo $?
6
kaito@demo:~/linux-practice/network-test$ curl -I --max-time 5 http://10.255.255.1/
curl: (28) Operation timed out after 5002 milliseconds with 0 bytes received
kaito@demo:~/linux-practice/network-test$ echo $?
281つ目は、curl: (6) Could not resolve host と表示され、echo $? は 6 でした。ただし example..com は「形がおかしい名前の例」で、DNS に聞く前に、自分のパソコンの中で失敗しています。存在しない名前のときと同じ (6) の文が出ますが、つまずいている場所は少しちがいます。
2つ目は、5秒待ったところで curl: (28) Operation timed out と表示され、echo $? は 28 でした。(28) が時間切れのしるしです。環境によって文面が違うことがあります。
python3 -m http.server を --bind なしで動かすと、0.0.0.0(外からも受けつける)で待ち受け(=プログラムが、決まったポートで通信が来るのを待っている状態)ます。家の Wi-Fi ならまわりの機器から、VPS ならインターネットのだれからでも、そのフォルダの中身が見えてしまいます。ホームディレクトリなどで動かすと、鍵ファイルや個人のファイルまで見られるおそれがあります。この記事では試しません。練習では必ず --bind 127.0.0.1 をつけ、サーバーを外に公開するときは、ファイアウォール(Lv4 の VPS 初期設定の記事)を理解してからにしましょう。
🤖 詰まったらAIに聞こう:サーバーにつながらない
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
Linuxの初心者です。サーバー(または自分のパソコンの中のサービス)につながりません。
IPアドレス・DNS・ポートのどこに原因がありそうか、確かめる順番を教えてください。
コマンドの結果の読み方も、やさしく説明してください。
【使っている環境】例:自分のPCのDebian、VPSのUbuntu など
【つなぎたい相手】例:自分のVPS(IPアドレスは***に置き換え済み)のポート8080
【打ったコマンドと結果】ここに貼る(例:ping・getent hosts・curl -I・ss -tln)
【表示されたエラー】例:Connection refused、Could not resolve host などサーバーのグローバル IP アドレス、ドメイン名、ユーザー名、パスワード、SSH の鍵は、そのまま貼らないでください。IP アドレスは「203.0.113.10」のようなダミーや「***」に置き換えましょう。ip addr の結果に出る MAC アドレス(link/ether の行)も伏せておくと安心です。
後片づけ
- 1
- 2
- 3
- 4
cd ~/linux-practice
ls network-test
rm -r network-test
ls(例)
- 1
- 2
- 3
- 4
- 5
- 6
kaito@demo:~/linux-practice/network-test$ cd ~/linux-practice
kaito@demo:~/linux-practice$ ls network-test
index.html
kaito@demo:~/linux-practice$ rm -r network-test
kaito@demo:~/linux-practice$ ls
archive-test chmod-test edit-test find-test grep-test link-test perm-test redirect-testls に並ぶフォルダは、これまでの記事で作った練習用のものです。人によってちがいます。
よくある質問
Q. ifconfig と打ったら「command not found」になりました。
ifconfig は古いコマンドで、Debian では最初から入っていないことが多いです(net-tools というパッケージに入っています)。今は、この記事の ip addr・ip -br addr・ip route を使うのがふつうです。古い記事で ifconfig が出てきたら、ip addr に読みかえてください。
Q. ping と打ったら「command not found」になりました。
最小構成の Debian や、一部の環境では、ping が入っていないことがあります。sudo apt install iputils-ping で入れられます(パッケージ名は環境により異なります)。名前から住所を調べるだけなら、この記事の getent hosts でも確かめられます。
Q. WSL で hostname -I を打つと、Windows で見た IP アドレスとちがいます。
WSL2 の Linux は、Windows の中にある別の小さなネットワークにいることが多く、Windows とは別の IP アドレスになる場合があります(WSL のバージョンや設定など、環境により異なります)。この記事の練習は 127.0.0.1(自分自身)で動かしているので、IP アドレスがちがっても問題ありません。
Q. python3 -m http.server 8000 で「Address already in use」と表示されました。
同じポート(ここでは 8000)を、すでに別のプログラムが使っているという意味です。実際には、Traceback (most recent call last): から始まる長いエラーが出て、そのいちばん最後の行に OSError: [Errno 98] Address already in use と表示されます。
(例)1つ目のサーバーを動かしたまま、2つ目のターミナルで同じコマンドを打ったとき
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
kaito@demo:~/linux-practice/network-test$ python3 -m http.server 8000 --bind 127.0.0.1
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
…(途中省略)…
File "/usr/lib/python3.13/socketserver.py", line 478, in server_bind
self.socket.bind(self.server_address)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
OSError: [Errno 98] Address already in use
kaito@demo:~/linux-practice/network-test$ echo $?
1
kaito@demo:~/linux-practice/network-test$ ss -tln | grep 8000
LISTEN 0 5 127.0.0.1:8000 0.0.0.0:*Python のエラーは長くてびっくりしますが、長い Traceback は、いちばん最後の行を見るのがコツです。途中の行は「Python の中のどこで止まったか」の記録なので、最初は読み飛ばしてかまいません。echo $? が 1(失敗)なので、2つ目のサーバーは起動していません。1つ目のサーバーは、そのまま動いています。
前に動かしたサーバーを止め忘れていないか、ほかのターミナルを確かめましょう。ss -tln | grep 8000 で、待っているものがあるかどうかを見られます。急ぐときは、8001 のように別の番号で動かしてもかまいません。実際に python3 -m http.server 8001 --bind 127.0.0.1 と打つと、Serving HTTP on 127.0.0.1 port 8001 (http://127.0.0.1:8001/) ... と表示されて、ふつうに起動できました。
まとめ
- IP アドレスは住所、ポートは部屋番号、DNS は名前から住所を調べる電話帳
-
127.0.0.1(localhost)は自分自身。192.168.x.xは家の中、グローバル IP はインターネット全体から見える -
hostname -I・ip -br addr・ip routeで、自分の住所と出口を見る -
getent hosts・ping -c 3で、名前から住所を調べる -
ss -tlnで、待っているポートを見る。0.0.0.0は外からも受けつける - 「Could not connect to server」(「Connection refused」と出ることも)は、住所には届いたが、その部屋でだれも待っていない
次の記事では、この知識を使って、SSH でサーバーにログインします。パスワードではなく鍵でログインする、安全なやり方を練習します。
次に読む記事
関連する記事
- n8nとは?最初のワークフローを1本つくる:n8n の画面(ポート 5678)を開くしくみを知りたい方に
- 自動化スタック総覧|GAS・n8n・Python・Notionの使い分け:サーバーを使うべきか、クラウドのサービスで足りるかを考えたい方に
- Cursorにエラーを直してもらう5ステップ|エラーの渡し方・頼み方・直った後の確認まで:つながらないときのエラーを、AI に上手に渡したい方に