EN JA
NC(1)
NC(1) FreeBSD General Commands Manual NC(1)

名称

nc任意の TCP と UDP の接続と listen (接続を受け付け)

書式

nc [ -46DdEhklNnrStUuvz][ -e  IPsec_policy][ -I  length][ -i  interval][ --no-tcpopt][ -O  length][ -P  proxy_username][ -p  source_port][ -s  source][ -T  toskeyword][ -V  rtable][ -w  timeout][ -X  proxy_protocol][ -x proxy_address[ : port]][ destination][ port]

解説

nc (または、 netcat) ユーティリティは、ほとんど何にでも TCP、UDP、または UNIX ドメインソケットに関連する世界中で使用されます。それは、TCP 接続をオープンして、UDP パケットを送信して、任意の TCP と UDP ポート上で listen (接続を受け付け) して、ポートスキャンをして、そして IPv4 と IPv6 の両方を処理することができます。 telnet(1) と異なって、 nc は、うまくスクリプトにして、何らかを行う telnet(1) のように、エラーメッセージを標準出力に送る代わりに標準エラーに分離します。

一般的な用途は、次を含みます:

  • 単純な TCP プロキシ
  • HTTP クライアントとサーバに基づくシェルスクリプト
  • ネットワークデーモンのテスト
  • ssh(1) (セキュアシェル) のための SOCKS または HTTP ProxyCommand
  • そして多く、さらに多く

オプションは、次の通りです:

-4
nc に強制的に IPv4 アドレスだけを使用させます。
-6
nc に強制的に IPv6 アドレスだけを使用させます。
-D
ソケットでデバッグを有効にします。
-d
stdin から読み込むことを試みません。
-E
両方向への IPsec ESP 転送モードを有効にする、“ -e 'in ipsec esp/transport//require' -e 'out ipsec esp/transport//require'”の短縮形です。
-e
IPsec サポートが利用可能であるなら、それは、 ipsec_set_policy(3) で記述された構文を使用することで IPsec ポリシを指定することができます。このフラグは、一般的に各方向で 1 つのポリシが必要とされるように 2 回まで指定することができます。
-h
nc ヘルプを印刷します。
-I length
TCP 受信バッファのサイズを指定します。
-i interval
テキスト送受信の行の間の遅延時間の間隔を指定します。また、複数のポートに接続する間に遅延時間が生じます。
-k
nc に、現在の接続が終了した後に別の接続を listen (接続の受け付け) したままにすることを強制します。 -l オプションなしでこのオプションを使用するとエラーとなります。 -u オプションとともに使用されるとき、サーバソケットは、接続されず、複数のホストから UDP データグラムを受信することができます。
-l
nc が、リモートホストに接続を開始するよりむしろ着信接続を listen (接続の受け付け) するべきであることを指定するために使用されます。 -p, -s または -z オプションと同時にこのオプションを使用すればエラーとなります。さらに、 -w オプションで指定されたどんなタイムアウトも無視されます。
-N
入力で EOF の後にネットワークソケットを shutdown(2) します。いくつかのサーバは、それらの作業を終了するために、これに要求します。
-n
任意の指定されたアドレス、ホスト名またはポートで、 DNS かサービス検索は、行えません。
--no-tcpopt
ブール値 TCP_NOOPT ソケットオプションを設定することによって、ソケットで TCP オプションの使用を無効にします。
-O length
TCP 送信バッファのサイズを指定します。
-P proxy_username
認証を必要とするプロキシサーバに提示するユーザ名を指定します。ユーザ名が指定されないなら、認証は、試みられません。プロキシ認証は、現在のところ、HTTP CONNECT プロキシのためだけにサポートされています。
-p source_port
特権制限と利用可能性にしたがって、 nc が使用すべきである発信元 (始点) ポートを指定します。 -l オプションと同時にこのオプションを使用すればエラーとなります。
-r
発信元 (始点) そして/または宛先 (終点) ポートが、範囲内で連続しているか、またはシステムがそれらを割り当てる順序の代わりにランダムに選択すべきであることを指定します。
-S
RFC 2385 TCP MD5 シグネチャ (署名) オプションを有効にします。
-s source
パケットを送信するために使用される IP インタフェースを指定します。 UNIX ドメインデータグラムソケットのために、データグラムを受信することができるように、作成して、使用するローカルの一時的なソケットファイルを指定します。 -l オプションと同時にこのオプションを使用すればエラーとなります。
-T toskeyword
IPv4 TOS 値を変更します。 toskeyword は、 critical, inetcontrol, lowdelay, netcontrol, throughput, reliability の 1 つ、または次の DiffServ Code Points の 1 つを指定できます: ef, af11 ... af43, cs0 ... cs7;または 16 進数か 10 進数の数値。
-t
nc は、RFC 854 DO と WILL 要求対して RFC 854 DON'T と WON'T 応答を送るようにします。これで、 nc が telnet セッションでスクリプトを使用することが可能になります。
-U
UNIX ドメインソケットを使用するために指定します。
-u
TCP のデフォルトのオプションの代わりに UDP を使用します。 UNIX ドメインソケットに関して、ストリームソケットの代わりにデータグラムソケットを使用します。 UNIX ドメインソケットが使用されていて、 -s フラグが与えられないなら、一時的な受信ソケットは、 /tmp に作成されます。
-V rtable
使用される経路表 (routing table) の (“FIB”) を設定します。デフォルトは、0 です。
-v
nc により冗長な出力を生じさせます。
-w timeout
確立することができないか、または timeout 秒の後にアイドルとなるタイムアウトの接続。 -w フラグは、 -l オプションで効果がありません、すなわち、 nc は、 -w フラグのあるなしにかかわらず、いつまでも接続を listen (接続を受け付け) します。デフォルトでは、タイムアウトはありません。
-X proxy_protocol
プロキシサーバと通信するとき、 nc は、指定されたプロトコルを使用するべきであるということを要求します。サポートされているプロトコルは、“4” (SOCKS v.4), “5” (SOCKS v.5) と“connect” (HTTPS プロキシ) です。プロトコルが指定されないなら、SOCKS バージョン 5 が使用されます。
-x proxy_address[ : port]
ncproxy_addressport でプロキシを使用して destination に接続すべきであることを要求します。 port が指定されないなら、プロキシプロトコルのためによく知られているポート (SOCKS のために 1080、HTTPS のために 3128) が使用されます。
-z
nc が任意のデータをそれらに送信しないでデーモンを listen (接続を受け付け) するためだけにスキャンすべきであることを要求します。 -l オプションと同時にこのオプションを使用すればエラーとなります。

destination は、 ( -n オプションが与えられないなら) 数値 IP アドレスまたはシンボリックなホスト名を指定できます。一般的に、宛先は、 -l オプションが与えられないなら (その場合、ローカルホストが使用されます) 指定されなければなりません。 UNIX ドメインソケットに関して、宛先は、要求され、接続 (または、 -l オプションが与えられるなら、listen (接続を受け付け)) するソケットのパスです。

port は、単一の整数か、またはポートの範囲を指定できます。範囲は、形式 nn-mm です。一般的に、宛先 (終点) ポートは、 -U オプションが与えられないなら、指定されなければなりません。

クライアント/サーバモデル

nc を使用する、たいへん基本的なクライアント/サーバモデルを構築することはとても簡単です。 1 つ目のコンソールで、接続のために特定のポート上で nc の listen (接続を受け付け) を開始します。例えば:

$ nc -l 1234

nc は、現在、接続のためにポート 1234 で listen (接続を受け付け) されます。 2 つ目のコンソール (または、2 つ目のマシン) で、次で listen (接続を受け付け) されるマシンとポートに接続します。

$ nc 127.0.0.1 1234

現在、ポートの間に接続があるべきです。 2 つ目のコンソールでタイプされたものは、最初のものに連結されます、そして逆もまた同様です。接続がセットアップされた後に、 nc は、どちら側が‘サーバ’として使用されているか、そしてどちら側が‘クライアント’として使用されているかを本当に気にしません。接続は、 EOF (‘^D’) を使用して終了されます。

データ転送

前のセクションの例は、基本的データ転送モデルを構築するために拡張することができます。接続の一つの端への入力された任意の情報は、他の端に出力され、そして入力と出力は、ファイル転送をエミュレートするために容易にキャプチャ (捕獲) されます。

ファイル中にキャプチャ (捕獲) された出力で特定のポートで listen (接続を受け付け) するために nc を使用することによって、開始します。

$ nc -l 1234 > filename.out

2 つ目のマシンを使用して、転送されるファイルを供給して、 listen (接続を受け付け) する nc プロセスに接続します:

$ nc host.example.com 1234 < filename.in

ファイルが転送された後に、接続は、自動的にクローズされます。

サーバとの対話

ユーザインタフェースを通してよりむしろ“手動で”サーバと通信することは、時々役に立ちます。クライアントによって発行されたコマンドに応答してどんなデータがサーバに送信されているかを確認する必要があるかもしれないときに、トラブルシューティング (障害点検) で助けとなります。例えば、ウェブサイトのホームページを検索するために:

$ printf "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80

また、これは、ウェブサーバによって送られたヘッダを表示することに注意してください。必要なら、 sed(1), などのツールを使用して、それらをフィルタすることができます。

ユーザが、サーバによって要求された要求 (リクエスト) の形式を知っているとき、より複雑な例を構築することができます。別の例として、メールは、次を使用して SMTP サーバに投稿できます:

$ nc localhost 25 << EOF 
HELO host.example.com 
MAIL FROM:<user@host.example.com> 
RCPT TO:<user2@host.example.com> 
DATA 
Body of email. 
. 
QUIT 
EOF

ポートスキャン

ターゲットマシン上でどのポートがオープンされ、サービスを実行しているかを知るために役に立ちます。接続を開始するよりは、むしろオープンしたポートを報告するように nc に伝えるために -z フラグを使用することができます。例えば:

$ nc -z host.example.com 20-30 
Connection to host.example.com 22 port [tcp/ssh] succeeded! 
Connection to host.example.com 25 port [tcp/smtp] succeeded!

ポート範囲は、ポート 20 - 30 への検索を制限するために指定されます。

代わりに、それは、どのサーバソフトウェアが実行しているか、そして、どのバージョンかを知るために役に立つかもしれません。この情報は、あいさつバナーの中にしばしば含まれています。これらを検索するために、最初に接続を確立する必要があり、次に、バナーが検索された時に、接続を切る必要があります。 -w フラグで小さいタイムアウトを指定することによって、または恐らくサーバに“ QUIT”コマンドを発行することによって、これを達成することができます:

$ echo "QUIT" | nc host.example.com 20-30 
SSH-1.99-OpenSSH_3.6.1p2 
Protocol mismatch. 
220 host.example.com IMS SMTP Receiver Version 0.84 Ready

使用例

5 秒のタイムアウトで、発信元 (始点) ポートとしてポート 31337 を使用して、 host.example.com のポート 42 へ TCP 接続をオープンします:

$ nc -p 31337 -w 5 host.example.com 42

host.example.com のポート 53 へ UDP 接続をオープンします:

$ nc -u host.example.com 53

接続のローカルの終りの IP として 10.1.2.3 を使用して、 host.example.com のポート 42 へ TCP 接続をオープンします:

$ nc -s 10.1.2.3 host.example.com 42

着信と発信トラフィックのための IPsec ESP を使用して、 host.example.com のポート 42 へ TCP 接続をオープンします:

$ nc -E host.example.com 42

発信トラフィックだけのための IPsec ESP を使用して、 host.example.com のポート 42 へ TCP 接続をオープンします:

$ nc -e 'out ipsec esp/transport//require' host.example.com 42

UNIX ドメインストリームソケットを作成して、listen (接続を受け付け) します:

$ nc -lU /var/tmp/dsocket

10.2.3.4 のポート 8080 の HTTP プロキシを通して host.example.com のポート 42 へ接続します。 ssh(1) によって、この例を使用することもできます。詳細については、 ssh_config(5)ProxyCommand ディレクティブを参照してください。

$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42

再び同じ例ですが、今回は、プロキシが必要とするなら、ユーザ名“ruser”でプロキシ認証を有効にします:

$ nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42

終了ステータス

The nc utility exits 0 on success, and >0 if an error occurs.

関連項目

cat(1), setfib(1), ssh(1), tcp(4)

作者

オリジナルの実装は、*Hobbit* <hobbit@avian.org>によります。
 
Eric Jackson <ericj@monkey.org>によって IPv6 サポートのために書き直されました。

警告

フラグの -uz の組み合わせを使用する UDP ポートスキャンは、常にターゲットマシンの状態に関係なく成功を報告します。しかしながら、ターゲットマシンまたは中間のデバイスのいずれかでトラフィックのスニファ (訳注: ネットワークをモニタするプログラム) とともに、 -uz の組み合わせは、通信の診断に役に立つことができます。生成された UDP トラフィックの量は、ハードウェアのリソースおよび/または設定により、制限されているかもしれないことに注意してください。
July 7, 2012 FreeBSD