Telnet は、コンピュータにリモート アクセスするために使用されるネットワーク プロトコルであり、テキストベースの双方向通信を提供します。したがって、相互に通信するには Telnet サーバーとクライアントが必要です。
Telnet は、長い間その目的を果たしてきた、人気のある Linux/Windows ユーティリティの 1 つです。
最新のシステムにおける Telnet の主な問題は、安全ではないことです。 Telnet でのすべての通信はプレーン テキストで行われ、すべてのネットワーク トラフィックは暗号化されません。基本的に、適切なアクセス権とツールを持っている人は誰でも、ネットワーク トラフィックを覗き見してこのトラフィックを読み取ることができます。そのため、最新の Linux オペレーティング システムのほとんどには Telnet がプリインストールされておらず、他のオペレーティング システムでは Telnet の使用を推奨していません。
Telnet の暗号化された代替品以上の SSH または Secure Shell プロトコルの出現により、本来の目的での Telnet の使用は時代遅れになって久しいです。しかし、多くのシステム管理者や技術愛好家が今でも使用している Telnet の別の使用法があり、それはリモート TCP ポートの接続をチェックすることです。
telnet コマンドを使用して、リモート TCP ポートが正しくリッスンし、応答しているかどうかを簡単に確認できます。以下のスニペットは、 HTTP/HTTPS
接続をチェックすることでgoogle.com
稼働しているかどうかを確認する方法を示しています。
$ telnet google.com 80
Trying 142.250.183.206...
Connected to google.com.
Escape character is '^]'.
^]
telnet> quit
Connection closed.
$
$ telnet google.com 443
Trying 142.250.183.206...
Connected to google.com.
Escape character is '^]'.
^]
telnet> quit
Connection closed.
$
開いていないかアクセスできない TCP ポートは、 telnet
で確認すると次のように動作します。
$ telnet google.com 22
Trying 142.250.193.174...
^C
$
これにより、 ping
、 traceroute
またはtracepath
、 netstat
などのコマンドと組み合わせて、単純なネットワーク接続の問題のトラブルシューティングが容易になります。
RHEL 8 (または古いバージョンの RHEL/CentOS) を使用している場合は、多くのネットワーク診断関連オプションをサポートする nc (または Ncat または Network Connector) を使用するオプションがあります。このツールを RHEL8 および同様のシステムにインストールして使用する方法について説明します。
NCとは何ですか?
nc (または Ncat) は、ネットワーク上のデータの読み取り、書き込み、リダイレクト、暗号化を行うための一般的な汎用コマンド ライン ツールです。元々はnmap
プロジェクト用に作成されましたが、現在では複数の Netcat 実装が利用可能です。 IPv4 と IPv6 の TCP と UDP の両方で動作し、無限の潜在的なユースケースを提供します。
以下は、 nc
ユーティリティの主な機能の一部です。
-
ncats
を連鎖させる機能 - TCP、UDP、および SCTP ポートの他のサイトへのリダイレクト
- SSL対応による通信の暗号化
- SOCK4/5 または HTTP プロキシ経由のプロキシ サポート (認証を含む)
- Windows、Linux、macOS を含む複数のプラットフォームをサポート
NCの取り付け
nc
RHEL システムのデフォルト リポジトリの一部として利用できます。 RHEL 7 システムにインストールするには、ターミナルで次のコマンドを発行するだけです。
$ sudo yum install -y nc
RHEL 8 システムの場合、 dnf
次のように使用できます。
$ sudo dnf install -y nc
TCP接続を確認する
nc
アプリケーション全体で多くの使用例をサポートする多数の機能を提供しますが、一般的な機能の 1 つは、ネットワークのトラブルシューティング中にtelnet
の代わりに使用されるものです。
nc
TCP ポートに到達できるかどうかを表示します。構文は次のとおりです。
$ nc -vz <IP/DNS> <Port>
例として、 http
またはhttps
経由で にアクセスできるかどうかを確認したいとします。以下に示すようにnc
を使用してそれを確認できます (ポート80
はhttp
用で、ポート443
はhttps
用です)。
$ nc -vz .com 80
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connected to 104.26.11.88:80.
Ncat: 0 bytes sent, 0 bytes received in 0.02 seconds.
$
$ nc -vz .com 443
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connected to 104.26.10.88:443.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
$
同様に、到達不能またはブロックされたポートには次のような出力が表示されます ( DNS が複数の IP をポイントしているため、複数のアドレスがチェックされます)。
$ nc -vz .com 22
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connection to 172.67.70.213 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection to 104.26.11.88 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection to 104.26.10.88 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection to 2606:4700:20::681a:a58 failed: Network is unreachable.
Ncat: Trying next address...
Ncat: Connection to 2606:4700:20::681a:b58 failed: Network is unreachable.
Ncat: Trying next address...
Ncat: Network is unreachable.
$
$ dig .com +short
104.26.10.88
172.67.70.213
104.26.11.88
$
UDP 接続を確認する
telnet
リモート TCP ポートとの通信のみを確認できますが、 nc
では TCP および UDP 接続を確認できます。
nc
以下を使用して、デフォルトの TCP パケットの代わりに UDP パケットを送信することができます。
$ nc -vzu <IP/DNS> <Port>
ただし、UDP は TCP とは異なりセッションレス プロトコルであるため、リモート エンドのリッスン プロセスが UDP パケットを送信しない限り、一方の端で UDP パケットを送信するだけでは、考えられるすべてのシナリオでエンドツーエンドの UDP 接続を確認することはできません。何らかの応答があった場合、 nc
は送信したパケットが宛先に到着したかどうかを判断できません。ただし、 nc
リモート サーバー上の CLI に適切にアクセスできることを前提として、UDP リスナーを起動してエンドツーエンドの UDP 接続を判断する代替手段を提供します。
したがって、 nc
を使用して DNS 用の 2 つの Linux ホスト間の UDP 接続を確認する必要があると仮定すると、これを行う簡単な方法は、必要なポートでリッスンするnc
サーバーを起動することです。
$ sudo nc -ul <Port>
DNS の場合、ポート53
をチェックする必要があります。これにより、上記のコマンドは次のようになります。
$ nc -ul 53
クライアント側では、UDP パケットをサーバーに送信する別のnc
プロセスを起動する必要があります。
$ nc -u <IP/DNS> <Port>
これにより、次のコマンドが作成されます。
$ nc -u <IP/DNS> 53
これら 2 台のマシン間のポート53
の UDP トラフィックをブロックするものがないことを考慮すると、1 台のマシンで入力したものはすべて、双方向チャットのように他のホストにも表示されるはずです。そうでない場合は、ファイアウォールによってこれら 2 つのシステム間の接続がブロックされています。
nc
を使用したサーバーおよびクライアント モデルは、ホスト間のこの種の単純な接続チェックでは問題なく機能します。上記の UDP チェックと同様に、 nc
特定のポートで TCP パケットをリッスンすることもできます。
$ sudo nc -l <Port>
クライアント側では、通常、TCP パケットを送信して接続を確認できます。
$ nc <IP/DNS> <Port>
TCP 接続の場合は、接続指向のプロトコルであり、確認応答で動作するため、上記のサーバー/クライアントnc
メソッドは必要ありません (UDP とは異なります)。 TCP 上で動作するリッスン プロセスはすべて、 nc
TCP パケットに直接応答します。
まとめ
この記事では、 nc
ユーティリティが、ポート接続の確認に関して、最新の Linux システムにおけるtelnet
の直接の代替としてどのように機能し、ネットワークの問題を診断して解決する際にエンドユーザーにより多くの機能を提供するかを要約します。
nc
ヘルプには、 nc -h
コマンドを使用してアクセスできます。
$ nc -h
Ncat 7.70 ( https://nmap.org/ncat )
Usage: ncat [options] [hostname] [port]
Options taking a time assume seconds. Append 'ms' for milliseconds,
's' for seconds, 'm' for minutes, or 'h' for hours (e.g. 500ms).
-4 Use IPv4 only
-6 Use IPv6 only
-U, --unixsock Use Unix domain sockets only
-C, --crlf Use CRLF for EOL sequence
-c, --sh-exec <command> Executes the given command via /bin/sh
-e, --exec <command> Executes the given command
--lua-exec <filename> Executes the given Lua script
-g hop1[,hop2,...] Loose source routing hop points (8 max)
-G <n> Loose source routing hop pointer (4, 8, 12, ...)
-m, --max-conns <n> Maximum <n> simultaneous connections
-h, --help Display this help screen
-d, --delay <time> Wait between read/writes
-o, --output <filename> Dump session data to a file
-x, --hex-dump <filename> Dump session data as hex to a file
-i, --idle-timeout <time> Idle read/write timeout
-p, --source-port port Specify source port to use
-s, --source addr Specify source address to use (doesn't affect -l)
-l, --listen Bind and listen for incoming connections
-k, --keep-open Accept multiple connections in listen mode
-n, --nodns Do not resolve hostnames via DNS
-t, --telnet Answer Telnet negotiations
-u, --udp Use UDP instead of default TCP
--sctp Use SCTP instead of default TCP
-v, --verbose Set verbosity level (can be used several times)
-w, --wait <time> Connect timeout
-z Zero-I/O mode, report connection status only
--append-output Append rather than clobber specified output files
--send-only Only send data, ignoring received; quit on EOF
--recv-only Only receive data, never send anything
--allow Allow only given hosts to connect to Ncat
--allowfile A file of hosts allowed to connect to Ncat
--deny Deny given hosts from connecting to Ncat
--denyfile A file of hosts denied from connecting to Ncat
--broker Enable Ncat's connection brokering mode
--chat Start a simple Ncat chat server
--proxy <addr[:port]> Specify address of host to proxy through
--proxy-type <type> Specify proxy type ("http" or "socks4" or "socks5")
--proxy-auth <auth> Authenticate with HTTP or SOCKS proxy server
--ssl Connect or listen with SSL
--ssl-cert Specify SSL certificate file (PEM) for listening
--ssl-key Specify SSL private key (PEM) for listening
--ssl-verify Verify trust and domain name of certificates
--ssl-trustfile PEM file containing trusted SSL certificates
--ssl-ciphers Cipherlist containing SSL ciphers to use
--ssl-alpn ALPN protocol list to use.
--version Display Ncat's version information and exit
See the ncat(1) manpage for full options, descriptions and usage examples
$
nc
コマンドの詳細については、そのマニュアル ページを参照してください。
$ man nc