Curl を使用して異なるポートにアクセスする方法

LinuxBeginner
オンラインで実践に進む

はじめに

Curl は、HTTP、FTP、SFTP など、さまざまなプロトコルを使用してデータを転送できる強力なコマンドラインツールです。このチュートリアルでは、Curl を使用してサーバーまたはネットワーク上の異なるポートにアクセスする方法を学びます。これにより、接続の問題をトラブルシューティングし、ポートの可用性をテストできます。

この実践的な実験(Lab)では、ポートアクセスに関する基本的および高度な Curl コマンドについて説明し、さまざまなポートでネットワークサービスがどのように動作するかを理解するのに役立ちます。この実験(Lab)の終わりには、さまざまなポートで実行されているサービスと自信を持って対話するために Curl を使用できるようになります。

Curl の始め方

"Client URL" の略である Curl は、サーバーとの間でデータを転送するためのコマンドラインツールです。HTTP、HTTPS、FTP、SFTP など、多数のプロトコルをサポートしています。ポート固有の操作に入る前に、Curl の基本的な使用法を理解していることを確認しましょう。

基本的な Curl コマンド

ターミナルを開き、次のコマンドを入力して、Curl がシステムにインストールされているかどうかを確認します。

curl --version

Curl のバージョンとサポートされている機能を示す、次のような出力が表示されるはずです。

curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl/zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.13
Release-Date: 2022-01-05
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets zstd

次に、Web サイトへの簡単な Curl リクエストを試してみましょう。次のコマンドを入力します。

curl https://example.com

このコマンドは、example.com の HTML コンテンツをダウンロードし、ターミナルに表示します。出力は次のようになります。

<!doctype html>
<html>
  <head>
    <title>Example Domain</title>
    <!-- More HTML content -->
  </head>
  <body>
    <div>
      <h1>Example Domain</h1>
      <p>This domain is for use in illustrative examples in documents...</p>
      <!-- More HTML content -->
    </div>
  </body>
</html>

HTTP ポートの理解

Web サーバーは通常、特定のポートで実行されます。

  • HTTP (非セキュア) のポート 80
  • HTTPS (セキュア) のポート 443

ポートを指定せずに Web サイトにアクセスすると、ブラウザは自動的にこれらのデフォルトポートを使用します。ただし、Curl では、接続するポートを明示的に指定できます。

標準 HTTP ポート (ポート 80) で Web サイトにアクセスしてみましょう。

curl http://example.com:80

出力は、前の Curl コマンドと同様になるはずです。ポート 80 は HTTP のデフォルトであるためです。

次に、HTTPS ポート (ポート 443) で同じ Web サイトにアクセスしてみましょう。

curl https://example.com:443

ここでも、出力は同様になるはずです。ポート 443 は HTTPS のデフォルトであるためです。

これらの例では、protocol://domain:port の形式を使用して、URL でポートを明示的に指定しました。この構文は、非標準ポートでサービスを操作する場合に重要です。

さまざまなポートでの Curl の使用

Curl とポート指定の基本を理解したところで、さまざまなポートとの対話方法を探ってみましょう。

非標準 Web ポートへのアクセス

Web サーバーは、80 および 443 以外のポートで実行できます。テスト目的で、Python の組み込み HTTP サーバーを使用して、ポート 8000 でシンプルな Web サーバーをセットアップしてみましょう。

まず、提供するシンプルな HTML ファイルを作成します。

echo "<html><body><h1>Hello from port 8000!</h1></body></html>" > ~/project/test.html

次に、ファイルを含むディレクトリに移動し、ポート 8000 でシンプルな HTTP サーバーを起動します。

cd ~/project
python3 -m http.server 8000 &

コマンドの末尾にある & は、サーバーをバックグラウンドで実行します。次のような出力が表示されるはずです。

Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

次に、Curl を使用して、このサーバーにポート 8000 でアクセスします。

curl http://localhost:8000/test.html

作成した HTML コンテンツが表示されるはずです。

<html>
  <body>
    <h1>Hello from port 8000!</h1>
  </body>
</html>

サーバーが完了したら、そのプロセス ID を見つけて終了することで停止できます。

ps aux | grep "python3 -m http.server"

これにより、次のような出力が表示されます。

labex     1234  0.0  0.1 235368 12312 pts/0    S    10:00   0:00 python3 -m http.server 8000
labex     1235  0.0  0.0  12345  1234 pts/0    S+   10:01   0:00 grep --color=auto python3 -m http.server

2 番目の列のプロセス ID (この例では 1234) に注意し、プロセスを終了します。

kill $(pgrep -f "python3 -m http.server")

さまざまな HTTP メソッドの使用

Curl では、-X フラグを使用してさまざまな HTTP メソッドを指定できます。POST リクエストを試してみましょう。

curl -X POST http://example.com

これにより、example.com に POST リクエストが送信されます。ほとんどの Web サイトは、POST リクエストには異なるデータが必要であることを示すメッセージで応答します。

リクエストへのヘッダーの追加

API または特定のサービスを操作する場合、カスタムヘッダーを送信する必要があることがよくあります。これは、-H フラグを使用して行うことができます。

curl -H "Content-Type: application/json" http://example.com

これにより、JSON コンテンツタイプヘッダーを含むリクエストが送信されます。応答は、サーバーがこのヘッダーをどのように処理するかに依存します。

レスポンスヘッダーの表示

コンテンツとともにレスポンスヘッダーを表示するには、-i フラグを使用します。

curl -i http://example.com

これにより、次のような出力が表示されます。

HTTP/1.1 200 OK
Content-Encoding: gzip
Accept-Ranges: bytes
Age: 558039
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Wed, 07 Jun 2023 12:34:56 GMT
Etag: "3147526947+gzip"
Expires: Wed, 14 Jun 2023 12:34:56 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (dcb/7F5B)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256

<!doctype html>
<html>
<head>
    <title>Example Domain</title>
    <!-- More HTML content -->
</head>
<!-- More HTML content -->
</html>

ヘッダーは、サーバー、コンテンツタイプ、キャッシュポリシーなどに関する貴重な情報を提供します。

Curl を使用した高度なポートアクセス

さまざまなポートでの Curl の基本的な使用方法を理解したところで、ポートアクセスとテストに関するより高度なテクニックを探ってみましょう。

ポートの可用性のテスト

Curl を使用して、サーバーで特定のポートが開いているかどうかを確認できます。ポートが開いている場合、Curl は接続を確立し、データを受信する可能性があります。ポートが閉じている場合、Curl はエラーを報告します。

いくつかの一般的なポートをテストしてみましょう。

## Test if port 80 (HTTP) is open
curl -s -o /dev/null -w "%{http_code}\n" http://example.com:80

このコマンドは、HTTP ステータスコード (ポートが開いていてサーバーが正しく応答している場合は通常 200) を表示します。-s フラグは Curl をサイレントにし、-o /dev/null は出力をどこにもリダイレクトせず、-w "%{http_code}\n" は HTTP ステータスコードのみを出力します。

もう少しポートを試してみましょう。

## Test if port 443 (HTTPS) is open
curl -s -o /dev/null -w "%{http_code}\n" https://example.com:443

これは、200 または別の HTTP ステータスコードを返し、ポート 443 が開いていることを示します。

次に、おそらく閉じているポートをテストしてみましょう。

## Test if port 81 (uncommon) is open
curl -s --connect-timeout 5 http://example.com:81

このコマンドは、次のようなエラーメッセージで失敗する可能性があります。

curl: (7) Failed to connect to example.com port 81: Connection refused

または、5 秒後にタイムアウトする可能性があります ( --connect-timeout で指定)。

curl: (28) Connection timed out after 5001 milliseconds

FTP サーバーへのアクセス

Curl は、FTP を含む複数のプロトコルをサポートしています。FTP サーバーへのアクセス方法を見てみましょう。

curl ftp://ftp.gnu.org/gnu/

このコマンドは、ftp.gnu.org のディレクトリの内容を一覧表示します。出力は次のようになります。

drwxr-xr-x    8 1003     1003         4096 Dec 16  2020 0ad
drwxr-sr-x    5 1003     1003         4096 Nov 09  2020 8sync
drwxr-xr-x    2 1003     1003         4096 Jun 05  2015 GNUinfo
drwxr-xr-x    3 1003     1003         4096 Jan 23  2022 GNUnet
...

シンプルなポートスキャナーの作成

サーバー上のポートの範囲をスキャンするシンプルな Bash スクリプトを作成しましょう。プロジェクトディレクトリに port_scanner.sh という新しいファイルを作成します。

nano ~/project/port_scanner.sh

ファイルに次の内容を追加します。

#!/bin/bash

## Simple port scanner using curl
## Usage: ./port_scanner.sh <hostname> <start_port> <end_port>

hostname=$1
start_port=$2
end_port=$3

echo "Scanning ports $start_port to $end_port on $hostname..."
echo

for port in $(seq $start_port $end_port); do
  ## Try to connect with a short timeout
  curl -s --connect-timeout 1 "$hostname:$port" > /dev/null

  ## Check if the connection was successful
  if [ $? -eq 0 ]; then
    echo "Port $port is OPEN"
  else
    echo "Port $port is closed"
  fi
done

echo
echo "Scan complete!"

Ctrl+XYEnter の順に押してファイルを保存します。

スクリプトを実行可能にします。

chmod +x ~/project/port_scanner.sh

次に、スクリプトを実行して、example.com のポート 80 ~ 85 をスキャンします。

~/project/port_scanner.sh example.com 80 85

出力には、どのポートが開いていて、どのポートが閉じているかが表示されます。

Scanning ports 80 to 85 on example.com...

Port 80 is OPEN
Port 81 is closed
Port 82 is closed
Port 83 is closed
Port 84 is closed
Port 85 is closed

Scan complete!

このシンプルなスクリプトは、Curl を基本的なポートスキャンツールとして使用できることを示しています。実際のシナリオでは、より包括的なネットワークスキャンには nmap などの専門ツールを使用することをお勧めしますが、この例は Curl の汎用性を示しています。

HTTPS とセキュア接続の操作

このステップでは、Curl を HTTPS で使用し、さまざまなセキュリティ関連オプションを処理する方法を探ります。

HTTPS 接続の理解

HTTPS 接続は、SSL/TLS プロトコルを使用してデータ送信を保護します。Curl を使用して HTTPS サイトに接続すると、デフォルトでサーバーの SSL 証明書が検証されます。

セキュアな Web サイトに接続してみましょう。

curl https://www.google.com

このコマンドは、Google の HTTPS サーバーに接続し、HTML コンテンツを返します。

SSL 証明書検証の処理

場合によっては、自己署名証明書または無効な証明書を持つサーバーに接続する必要がある場合があります。そのような場合は、-k または --insecure オプションを使用して、証明書の検証をスキップできます。

curl -k https://www.google.com

このコマンドは、証明書を検証できない場合でも、サイトに接続します。出力は、前のコマンドと同様になるはずです。

証明書情報の表示

Web サイトの SSL 証明書を調べるには、-v (verbose) オプションを使用します。

curl -v https://www.google.com > /dev/null

このコマンドは、実際のコンテンツを /dev/null に送信しながら、SSL ハンドシェイクと証明書に関する詳細情報を表示します。出力には、証明書の詳細が含まれます。

* Server certificate:
*  subject: CN=www.google.com
*  start date: ...
*  expire date: ...
*  subjectAltName: ...
*  issuer: CN=GTS CA 1C3; O=Google Trust Services LLC; C=US
*  SSL certificate verify ok.

特定の TLS バージョンの使用

--tlsv1.X オプションを使用して、使用する TLS バージョンを指定できます。

## Force TLS 1.2
curl --tlsv1.2 https://www.google.com > /dev/null

これにより、Curl が接続に TLS 1.2 を使用することが保証されます。

ファイルの安全なダウンロード

Curl は、HTTPS ソースからファイルをダウンロードできます。-o オプションを使用して、ファイルをダウンロードして保存してみましょう。

curl -o ~/project/google_logo.png https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png

このコマンドは、Google のロゴをダウンロードし、プロジェクトディレクトリに google_logo.png として保存します。ファイルが存在するかどうかを確認します。

ls -l ~/project/google_logo.png

次のような出力が表示されるはずです。

-rw-r--r-- 1 labex labex 5969 Jun 7 12:34 /home/labex/project/google_logo.png

HTTPS のカスタムヘッダーの指定

セキュア API を操作する場合、多くの場合、認証ヘッダーを含める必要があります。その方法は次のとおりです。

curl -H "Authorization: Bearer your_token_here" https://api.example.com

your_token_here を、実際のトークン (お持ちの場合) に置き換えます。それ以外の場合、このコマンドは、サーバーからエラーまたは未承認メッセージを返す可能性があります。

非標準ポートでの HTTPS へのアクセス

HTTPS サービスは、443 以外のポートで実行できます。そのようなサービスにアクセスするには、URL でポートを指定します。

curl https://example.com:8443

このコマンドは、ポート 8443 で HTTPS サービスに接続しようとします。example.com にはこのポートのサービスがないため、エラーが表示される可能性があります。

curl: (7) Failed to connect to example.com port 8443: Connection refused

これは、Curl が任意のプロトコルを使用して任意のポートに接続を試みることができることを示しており、ネットワークサービスのテストに役立つ多用途ツールであることを示しています。

包括的なポートチェックスクリプトの作成

この最終ステップでは、Curl を使用してターゲットサーバー上の一般的なサービスをチェックする、より洗練されたスクリプトを作成します。

一般的なサービスポートの理解

さまざまなサービスは、通常、標準ポートで実行されます。

  • Web (HTTP): ポート 80
  • セキュア Web (HTTPS): ポート 443
  • FTP: ポート 21
  • SSH: ポート 22
  • SMTP (メール): ポート 25
  • DNS: ポート 53
  • データベース (MySQL): ポート 3306
  • データベース (PostgreSQL): ポート 5432

指定されたホストでこれらの一般的なポートをチェックするスクリプトを作成しましょう。

サービスチェッカースクリプトの作成

プロジェクトディレクトリに service_checker.sh という新しいファイルを作成します。

nano ~/project/service_checker.sh

ファイルに次の内容を追加します。

#!/bin/bash

## Service checker script using curl
## Usage: ./service_checker.sh <hostname>

hostname=$1

if [ -z "$hostname" ]; then
  echo "Error: Please provide a hostname."
  echo "Usage: ./service_checker.sh <hostname>"
  exit 1
fi

echo "Checking common services on $hostname..."
echo

## Function to check a port with appropriate protocol
check_port() {
  local port=$1
  local service=$2
  local protocol=$3
  local timeout=2

  echo -n "Checking $service (Port $port): "

  ## Use the appropriate protocol based on the service
  if [ "$protocol" = "http" ]; then
    curl -s --connect-timeout $timeout "http://$hostname:$port" > /dev/null
  elif [ "$protocol" = "https" ]; then
    curl -s --connect-timeout $timeout "https://$hostname:$port" > /dev/null
  else
    ## For non-HTTP protocols, just try to connect to the port
    curl -s --connect-timeout $timeout "$hostname:$port" > /dev/null
  fi

  ## Check the result
  if [ $? -eq 0 ]; then
    echo "AVAILABLE"
  else
    echo "Not available"
  fi
}

## Check common services
check_port 80 "Web Server (HTTP)" "http"
check_port 443 "Web Server (HTTPS)" "https"
check_port 21 "FTP Server" "tcp"
check_port 22 "SSH Server" "tcp"
check_port 25 "SMTP Server" "tcp"
check_port 53 "DNS Server" "tcp"
check_port 3306 "MySQL Database" "tcp"
check_port 5432 "PostgreSQL Database" "tcp"
check_port 8080 "Alternative Web Server" "http"
check_port 8443 "Alternative Secure Web Server" "https"

echo
echo "Service check complete!"

Ctrl+XYEnter の順に押してファイルを保存します。

スクリプトを実行可能にします。

chmod +x ~/project/service_checker.sh

サービスチェッカーの実行

次に、スクリプトを実行して、よく知られている Web サイトでサービスをチェックします。

~/project/service_checker.sh example.com

次のような出力が表示されます。

Checking common services on example.com...

Checking Web Server (HTTP) (Port 80): AVAILABLE
Checking Web Server (HTTPS) (Port 443): AVAILABLE
Checking FTP Server (Port 21): Not available
Checking SSH Server (Port 22): Not available
Checking SMTP Server (Port 25): Not available
Checking DNS Server (Port 53): Not available
Checking MySQL Database (Port 3306): Not available
Checking PostgreSQL Database (Port 5432): Not available
Checking Alternative Web Server (Port 8080): Not available
Checking Alternative Secure Web Server (Port 8443): Not available

Service check complete!

この出力は、example.com がポート 80 および 443 で Web サーバーを実行していることを示していますが、他の一般的なサービスは公開されていません。

結果の理解

スクリプトからの結果は、貴重な情報を提供します。

  1. 利用可能なサービス: これらのポートは開いており、リクエストに応答しているため、対応するサービスが実行されていてアクセス可能であることを示しています。

  2. 利用できないサービス: これらのポートは、次のいずれかの可能性があります。

    • 閉じている (サービスが実行されていない)
    • ファイアウォールによってフィルタリングされている
    • 実行されているが、一般的なリクエストに応答しないように構成されている

この情報は、以下に役立ちます。

  • ネットワーク管理者がサービスの可用性を確認する
  • セキュリティ専門家が最初の偵察を行う
  • 開発者がサービスが適切に構成されていることを検証する

スクリプトの変更

追加のポートまたはサービスをチェックするようにスクリプトを自由に修正してください。たとえば、次のチェックを追加できます。

  • Redis (ポート 6379)
  • MongoDB (ポート 27017)
  • RDP (ポート 3389)

新しいサービスチェックを追加するには、check_port 関数を使用して別の行を追加するだけです。

check_port 6379 "Redis Database" "tcp"

これは、ネットワークサービスのテストと監視のためのツールとしての Curl の柔軟性を示しています。

まとめ

このチュートリアルでは、Curl を使用してサーバーとネットワーク上のさまざまなポートにアクセスする方法を学習しました。以下のことを行いました。

  • Curl の基本と、URL でポートを指定する方法を学習しました。
  • Curl を使用して、標準および非標準ポート上の Web サーバーと対話しました。
  • さまざまな HTTP メソッドとヘッダーを調べました。
  • HTTPS とセキュア接続を操作しました。
  • ポートの可用性とサービスの状態をチェックするスクリプトを作成しました。

これらのスキルは、ネットワークのトラブルシューティング、システム管理、およびセキュリティテストに役立ちます。Curl の汎用性により、コマンドラインツールキットに不可欠なツールとなっています。

さらに練習するには、以下を試してください。

  • Curl を使用して REST API と対話する
  • さまざまな接続タイムアウトと再試行オプションをテストする
  • Cookie、フォーム送信、プロキシ設定など、より高度な Curl の機能を調べる
  • サービスチェッカースクリプトを、追加のプロトコルとエラー処理で強化する

Curl はテストと基本的なスキャンに強力ですが、Nmap などの専門ツールは、専門的な使用のために、より包括的なネットワークスキャン機能を提供することに注意してください。