web-dev-qa-db-ja.com

HTTPポート80にTelnetするにはどうすればよいですか?

グーグルで検索した後、httpポートにtelnetをWebサーバーに接続し、GETを使用してHTMLページを取得できることがわかりました。

例:

$ telnet web-server-name 80

しかし、これがどのようにして可能であるのか理解できません。

ポート80がhttpサーバー用である場合、ポート80はhttpリクエストのみをリッスンすると思いました。しかし、どのようにしてtelnetHTTPポートに変換できますか?

telnetHTTPは2つの異なるプロトコルではありませんか?

16
sps

おめでとうございます。ポートとプロトコルが相互に直接接続されていないことを理解することで、ネットワークレイヤーの概念を掘り下げました。他の人が言っているように、telnetはTCPポートに接続するために使用できます。しかし、これが可能である理由を理解するには、ネットワーク層について少し理解する必要があります。 OSI 7層モデル これは、telnetを使用して別のポートに接続できるようにするものです。インターネット上では、4つの層と呼ばれ、その層と呼ばれます インターネットプロトコルスイート 。ネットワーキングのレイヤーがない場合、各プログラムは独自のプロトコルを理解するだけでなく、独自のIPアドレス指定スキームとポートシステムを定義する必要があります。つまり、各ルーターはこれらのスキームをルーティングする方法と異なる方法を理解する必要があります。簡単に言えば、インターネットはレイヤーなしではほとんど機能しません。

気になるのは、トランスポート層とアプリケーション層です。トランスポート層には、TCPおよびUDPのようなポート番号がそれぞれ1から65535の範囲のインターネットプロトコルがあります。アプリケーション層には、HTTP、SMTP、DNSなどのプロトコルがあります。通常、各インターネットプロトコルを定義する標準ドキュメントでは、デフォルトのTCPまたはプロトコルがデフォルトで使用するUDPポートを指定しています。たとえば、TCP HTTPの場合はポート80、TCP SMTPの場合はポート25、DNSの場合はUDPポート53、およびTCPポート23。Telnetプログラムは実際にTELNETプロトコルを話します。これは 標準protocol 、しかし現在の標準ではほとんどが古代のプロトコルです。そのプロトコルシーケンスは8ビット文字から作成されているため、プロトコル自体はほとんど表示されず、HTTPやSMTPなどの人間を使用する他のより近代的なプロトコルと比較すると、ほとんどが透過的ですASCII GET、POST、HELO、LOGINなどの表示可能な単語.

プロトコルは一般に表示されないため、Telnetは他のTCPポートに接続し、ユーザーがプロトコルを手動で入力できるようにするための適切なツールになっています。一部のネットワーク管理者は、診断のためにこの手法を使用しますサーバーに関する問題です。ただし、Telnetプログラムには独自のプロトコルがあり、余分なビットのデータが送信される場合があるため、この手法で問題が発生する可能性があります。Telnetを使用すると、アプリケーション層でも実際に「接続」が行われますトランスポート層として。他のアプリケーション層プロトコルがほとんどの診断でそれを介して正常に機能し、telnetプロトコルに干渉しない場合があります。呼び出されたnc(Net Cat。 catコマンドのネットワークベースのバージョンであることが原因です)。

$ nc www.stackexchange.com 80

Ncプログラムはアプリケーション層プロトコルを一切話さず、それを使って接続するときは、インターネット層(IPアドレス)とトランスポート層(TCPまたはUDP)でのみ「接続」しています。つまり、使用するアプリケーション層プロトコルを制御するということです。バイナリプロトコルでさえ、ほとんど何でも公正なゲームです。これにより、ファイルを破損することなくファイルを転送したり、ポートで着信トラフィックをリッスンしたりするなど、便利なことも実行できます。

nc -l 9000 < movie.mp4  (Your friend runs this)

nc friends.computer.hostname 9000 > movie.mp4  (you run this)

そして、movie.mp4は、アプリケーション層プロトコル(FTPなど)をまったく使用せずにネットワーク経由で転送されます。アプリケーションプロトコルは、実際にはあなたの友人であり、コマンドを実行する準備ができていることを伝えます。

ncは、UDPパケットとUNIXドメインソケットも処理できます。それを聞いて使うのも面白いかもしれません。

nc -l 12345

Webブラウザーで http:// localhost:12345 / にアクセスすると、ncセッションでブラウザーのGET / HTTP/1.1リクエストが表示されます。この時点で、何かを入力してCtrl-Dを押すと、ブラウザにプレーンテキストで表示されます(HTMLを表示する場合は、適切なHTTPプロトコル応答に続いてHTMLコードを送信する必要があります)。

場合によっては、HTTPなどの1つのプロトコルをネイティブに話すプログラムが、別のプロトコル用のポートに接続できることがあります。一部のポートへの接続が制限されているため、通常GUIブラウザーでこれを実行することはできませんが、curlなどのプログラムを使用してポート25(メール送信用のSMTP)に接続すると、おそらくいくつかのポートが表示されます。プロトコル違反に関するエラー。

$ curl yourispsmtpserverhost.com:25
220 yourispsmtpserverhost.com ESMTP Postfix
221 2.7.0 Error: I can break rules, too. Goodbye.

これは、curlが通常はHTTPプロトコルを話すために発生し、TCPハンドシェイクを確立した後、次のようにデータの送信を開始します。

GET / HTTP/1.1
Host: yourispsmtpserverhost.com:25
User-agent: curl

しかし、SMTPサーバーが期待しているのは、次のようなSMTPです。

HELO myhomecomputername.local

その時点で、サーバーは識別行を送り返します。

250 yourispsmtpserverhost.com

つまり、curlがSMTPサーバーとのトランスポート層接続を確立するのを妨げるものは何もないことがわかります。プロトコルは話せません。しかし、Telnetなどのプログラムを使用して、自分でプロトコルを話すことができます。

25
deltaray

telnetは、任意のTCPポートに接続できるツールです。

デフォルトでは、Telnetポート(23)に接続しますが、httpポート(80)またはsmtpポート(25)などに接続するように指示できます。

ただし、リモートサーバーがそのポートで待機しているプロトコルを「話す」方法を知っている必要があります。

たとえば、Webサイトのヘッダーを取得したい場合(ドメイン名などは、有罪を保護するために変更されます):

$ telnet www.example.com 80
Trying xxx.xxx.xxx.xxx...
Connected to www.example.com.
Escape character is '^]'.
HEAD http://www.example.com/ HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 30 Oct 2015 09:28:58 GMT
Server: Apache/2.4.17 (Debian)
Last-Modified: Sun, 14 Nov 2010 06:30:26 GMT
ETag: "843-494fd75830480"
Accept-Ranges: bytes
Content-Length: 2115
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

Connection closed by foreign Host.

HEAD行は、接続に入力したものです。 httpプロトコルでは、HEADまたはGETまたはその他の要求の終わりを示すために空白行を送信する必要があります。これはHEADの直後の空白行です。 =リクエスト。

7
cas

両方のプロトコルの最初のネゴシエーションはテキストコマンドを使用するため、接続してコマンドの入力を開始できます。これは、SMTPなどの他のoldプロトコルにも当てはまり、Telnetは接続のトラブルシューティングに長い間使用されてきましたそれぞれのサービスに。

例えば

プロトコルは、通信するポートから独立しています。ほとんどすべての実装は、任意のポートでリッスンするように構成できます。

一部のプロトコル(HTTPSなど)は、ネゴシエーションにテキストコマンドを使用しません。ただし、(通常は)サーバーがリッスンするportに接続できますが、有用なことは何もしません。

3
Thomas Dickey

理解の一部は正しく、一部は正しくありません。通常、ポート80はHTTP用に予約されていますが、これは単なる慣例です。どのプログラムも、システム上の開いているポートをリッスンできます。接続しているシステムのポート80でリッスンしているWebサーバーがある場合は、HTTPを使用して通信する必要があります。

telnetはプロトコルではなく、任意のポートの任意のホストに生のテキストを送信できるプログラムです。リモートホストは、どのプログラムが接続しているかはわかりません。それが見ることができるすべてはそれに送られているパケットです。リモートホストが予期しているプロトコルに準拠するパケットを送信するプログラムはすべて機能するため、telnetを使用して、テキストベースのプロトコルで通信できます。

GET /path/to/a/file HTTP/1.1の行に沿って何かを送信しました。これは有効な HTTP 1.1コマンド であり、Webブラウザーによって送信されるリクエストと同じに見えるため、正常に動作します。

3
Michael Mrozek