Go to main content
マニュアルページ セク ション 1: ユー ザーコマンド

印刷ビューの終了

更新: 2016年12月6日
 
 

nc(1)

名前

nc, netcat - 任意の TCP および UDP の接続と待機

形式

nc -h

nc [-46dnrtuvz] [-i interval] [-P proxy_username] [-p port] 
   [-s source_ip_address] [-T dspc] [-w timeout]
   [-X proxy_protocol] [-x proxy_address[:port]][-L timeout]
   [-e program] [-b bufsize] [-q timeout] [-m bytes]
   [-I bufsize][-O bufsize] [-S sla-prop] hostname port_list
nc -l [-46DdEFnrtuvzZ] [-i interval] [-T dspc] [-e program]
   [-b bufsize] [-q timeout] [-R address/port[/proto]] [-m bytes]
   [-L timeout] [-I bufsize] [-O bufsize] [-S sla-prop] [hostname] port
nc -l [-46DEFdnrtuvzZ] [-i interval] [-T dspc] [-e program]
   [-b bufsize] [-q timeout] [-R address/port[/proto]] [-m bytes]
   [-L timeout] [-I bufsize] [-O bufsize]
   [-S sla-prop] -p port [hostname]
nc -U [-Ddtvz] [-i interval] [-w timeout] [-e program]
   [-b bufsize] [-q timeout] [-m bytes] path
nc -Ul [-46DdktvZ] [-i interval]  [-e program] [-b bufsize]
   [-q timeout] [-R address/port[/proto]] [-m bytes] path

説明

nc (または netcat) ユーティリティーは、TCP または UDP に関連付けられたさまざまなタスクに使用できます。nc は、TCP 接続を開き、UDP パケットを送信し、任意の TCP および UDP ポートで待機し、ポートスキャンを実行し、IPv4 と IPv6 の両方に対応します。telnet(1) とは異なり、nc は簡単にスクリプト化でき、エラーメッセージを標準出力に送信するのではなく標準エラーに分割します。

    nc コマンドは、多くの場合、次のタスクに使用されます。

  • 単純な TCP プロキシ

  • シェルスクリプトベースの HTTP クライアントおよびサーバー

  • ネットワークデーモンのテスト

  • ssh(1) 用の SOCKS または プロキシコマンド (ProxyCommand)

nc コマンドは、netcat として実行して同じオプションを使用することもできます。

オプション

サポートしているオプションは、次のとおりです。

–4

nc が IPv4 アドレスのみを使用するよう強制します。

–6

nc が IPv6 アドレスのみを使用するよう強制します。

–b bufsize

読み取り操作のバッファーサイズを指定します。

デフォルト値は 1024 バイトです。

–D

ソケット上でのデバッグを有効にします。

–d

stdin からの読み取りを行いません。

–E

排他バインドを使用して、TCP または UDP ソケットを待機します。

–l オプションを指定せずにこのオプションを使用すると、エラーになります。

このオプションは、–U オプションと同時に使用しても何の効果もありません。

–e program

接続の受け入れまたは実行後に外部プログラムを実行します。実行前に、stdin,stdout,stderr がネットワーク記述子にリダイレクトされます。このオプションでは、1 つのポートのみを使用できます。

このオプションを –R–k、または –i オプションと同時に使用すると、エラーになります。

–F

stdinEOF を表示したあと、書き込みのためにネットワークソケットを閉じないでください。

–h

nc のヘルプを表示します。

–I bufsize

受信する (入力) ソケットのバッファーサイズを設定します。

このオプションは、–U オプションと同時に使用しても何の効果もありません。

–i interval

テキスト行の送受信間隔 (interval) の遅延時間を指定します。

間隔は適切な小数で指定します (秒単位)。

このオプションを使用すると複数のポートへの接続で遅延が発生するため、ポートスキャンモードにも影響が及びます。

–k

現在の接続が閉じられたら、nc が別の接続を待機するよう強制します。

–l オプションを指定せずにこのオプションを使用すると、エラーになります。

このオプションを –e オプションと同時に使用すると、エラーになります。

–L timeout

閉じる操作を遅らせます。ネットワーク記述子が閉じられたあとにメッセージが送信されるのを、指定した時間 (秒) だけ待機します。

–l

リモートホストへの接続を開始せずに、着信する接続を待機します。

このオプションを –s または –z オプションと同時に使用すると、エラーになります。

–l オプションをワイルドカードソケット (IP アドレスとホスト名の指定はなし) とともに使用し、–4/–6 オプションを指定しない場合は、IPv4 接続と IPv6 接続の両方が受け入れられます。

–m byte_count

少なくとも byte_count バイトを受信したあとに終了します。–l オプションとともに使用すると、byte_count はクライアントから受信したバイト数と比較されます。

byte_count0 より大きく INT_MAX より小さい値である必要があります。

–N file

ファイルをパターンで指定して UDP ポートをスキャンします。このファイルの内容は、放出された各 UDP パケットのペイロードとして使用されます。

–u オプションと –z オプションを指定せずにこのオプションを使用すると、エラーになります。

–n

アドレス、ホスト名、またはポートに対して名前およびサービスの検索を行いません。

このオプションを使用すると、hostname 引数と port 引数は数値に制限されます。

–v オプションとともに使用すると、引数に対する制限に加えて、すべてのアドレスとポートが数値形式で出力されます。このオプションは、–U オプションと同時に使用しても何の効果もありません。

–O bufsize

送信 (出力) ソケットのバッファーサイズを設定します。

このオプションは、–U オプションと同時に使用しても何の効果もありません。

–P proxy_username

認証を要求するプロキシサーバーに渡されるユーザー名 (proxy_username) を指定します。proxy_username を指定しない場合、認証は行われません。現時点では、HTTP CONNECT プロキシのプロキシ認証のみがサポートされています。

このオプションを –l オプションと同時に使用すると、エラーになります。

–p port

–l オプションを指定せずに使用する場合は、nc が使用する発信元ポートを特権の制限と使用条件に従って指定します。–l オプションと同時に使用する場合は、待機ポートを設定します。

このオプションと –l オプションの組み合わせは、グローバルなポート引数が指定されていない場合にのみ使用できます。

–q timeout

stdinEOF を受信したあとに、指定した秒数待機してから終了します。

–R addr/port[/proto]

指定した hostport へのポートリダイレクトを実行します。

接続が受け入れられると、nc はリモートの host/port に接続し、クライアントとリモートホスト間ですべてのデータを受け渡しします。リダイレクト指定の proto (プロトコル) 部分は、tcpudp のどちらかにできます。proto が指定されていない場合、redirector はサーバーと同じプロトコルを使用します。

このオプションを –z オプションと同時に使用すると、エラーになります。

–r

port_list 引数で指定されたすべてのポートの中から着信先ポートを (順番にではなく) ランダムに選択します。

このオプションを –l オプションと同時に使用すると、エラーになります。

–s source_ip_address

パケットの送信に使用するインタフェースの IP を指定します。

このオプションを –l オプションと同時に使用すると、エラーになります。

–S sla-prop

ソケット用に作成された MAC フローのプロパティーを指定します。sla-prop はプロパティーの「name=value」をコンマで区切ったリストとして指定されます。

現在サポートされているプロパティー名は maxbwpriority、および inherit です。

maxbw および priority は flowadm(1M) で定義されたプロパティーから取得され、そのフローの最大の帯域幅および優先度を示します。maxbw に指定できる値は整数とオプションの接尾辞 (デフォルトでは Mega) です。priority は「high」、「medium」、および「low」のいずれかの値を取ることができます。

フローの作成では、maxbw および priority を少なくとも 1 つ指定する必要があります。

inherit は「on」および「off」のどちらかの値を取ることができ、デフォルト値は「off」です。デフォルトでは、(accept(3C) から返される) 受け入れられた/新しいソケットはリスナーソケットのプロパティーを継承しません。それが「on」に設定されていると、新しいソケットはリスナーソケットのプロパティーを継承します。これは、それらのプロパティーを新しいソケットに強制する必要がある場合に –l オプションで役立ちます。

このオプションでは、SYS_FLOW_CONFIG 権限が必要です。このオプションでは、IP アドレスまたはホスト名を指定する必要もあります。

–T dscp

接続用の差別化サービスコードポイントを指定します。

IPv4 の場合、IP Type of Service (ToS) IP ヘッダーフィールドが指定されます。この引数の有効な値は文字列トークンで、lowdelaythroughputreliability、または 0x の後に 8 ビットの 16 進数値が付いた値になります。

IPv6 (トラフィッククラス) の場合、16 進数値のみが使用できます。

–t

RFC 854DO および WILL 要求に対して、ncRFC 854DON'T および WON'T 応答を送信します。これにより、nc を使用して telnet セッションをスクリプト化できるようになります。

–U

UNIX ドメインソケットの使用を指定します。–l を指定せずにこのオプションを指定すると、ncAF_UNIX クライアントになります。このオプションを –l オプションと同時に指定すると、AF_UNIX サーバーが作成されます。

このオプションを使用する場合は、ホスト名やポートではなく、有効な UNIX ドメインパスからなる単独の引数を nc に指定する必要があります。

–u

デフォルトのオプションである TCP の代わりに UDP を使用します。

–v

詳細出力を指定します。

–w timeout

接続と stdin のアイドル状態が timeout 秒を超えた場合に、メッセージを表示せずに接続を閉じます。

デフォルトはタイムアウトなしです。

クライアントモードで接続確立フェーズにある場合、またはサーバーモードで接続を待機している場合、このオプションの効果はありません。

–X proxy_protocol

プロキシサーバーとの通信時に、指定したプロトコルを使用します。サポートされるプロトコルは、4 (SOCKS v.4)、5 (SOCKS v.5)、および connect (HTTP プロキシ) です。プロトコルを指定しなかった場合は、SOCKS v. 5 が使用されます。

このオプションを –l オプションと同時に使用すると、エラーになります。

–x proxy_address[:port]

proxy_address および port で指定されたプロキシを使用して、hostname への接続を要求します。port を指定しなかった場合は、プロキシプロトコルのウェルノウンポート (SOCKS の場合は 1080HTTP の場合は 3128) が使用されます。

このオプションを –l オプションと同時に使用すると、エラーになります。

このオプションは、IPv6 アドレスの数値表現では機能しません。

–Z

待機モードで、SO_ALLZONES ソケットオプションを使用して、すべてのゾーンでアドレス/ポートにバインドします。

このオプションでは、SYS_NET_CONFIG 権限が必要です。

–z

ポートスキャンを実行します。 TCP ポート (デフォルト) の場合、データが送信されずに接続スキャン (3 方向のフルハンドシェーク) が試行されます。UDP (–u) の場合、空の UDP パケットがデフォルトで送信されます。UDP ペイロードを指定するには、 –N オプションを使用できます。

UDP スキャンモードでは、否定応答 (ICMP 着信先ポート未達メッセージ) が受信されない場合は、ポートが開かれているものと推定します。このモードでは、–w オプションで設定したタイムアウトを使用して、リモートノードからの ICMP メッセージまたはデータを待機します。–v を指定すると、すべての受信データが 16 進数バイト値として stderr にダンプされます。

ほとんどのオペレーティングシステムが、入力パケットに対する ICMP メッセージの送信に速度制限を課しているため、UDP スキャンを実行するときに –i オプションを使用しないと、結果が信頼性のないものになります。

このオプションを –l オプションと同時に使用すると、エラーになります。

オペランド

次のオペランドがサポートされています。

hostname

ホスト名を指定します。

hostname には、数値 IP アドレスまたは記号ホスト名 (–n オプションを指定していない場合のみ) を指定できます。

一般に、hostname を指定する必要があるのは、–l オプションを指定しない場合か、–U を使用しない場合です (その場合、この引数はパスになります)。hostname 引数を –l オプションを同時に指定した場合、port 引数も指定する必要があり、nc はそのアドレスとポートにバインドしようとします。hostname 引数を –l オプションと同時に指定しなかった場合、nc は指定されたポートのワイルドカードソケットで待機しようとします。

path

パス名を指定します。

port
port_list

ポートを指定します。

port_list には、1 つの整数、整数の範囲、あるいはその両方の組み合わせを指定できます。範囲は nn-mm の形式で指定します。port_list には 1 つ以上のメンバーを指定する必要があり、複数のポートまたは範囲をコンマで区切って指定できます。

一般に、着信先ポートを指定する必要があるのは、–U オプションを指定しない場合です。そのオプションを指定した場合は、hostname の代わりに Unix ドメインソケットのパスを指定する必要があります。

複数のポートが含まれているポート一覧を -e オプションと同時に使用すると、エラーになります。

使用法

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

nc を使用すると、非常に基本的なクライアント/サーバーモデルをきわめて簡単に構築できます。1 つ目のコンソールで、特定のポートで接続を待機する nc を起動します。次に例を示します。


$ nc -l 1234

これは、ポート 1234 で接続を待機します。2 つ目のコンソール (または 2 つ目のマシン) で、nc が待機しているマシンとポートに接続します。


$ nc 127.0.0.1 1234

これで、ポート間の接続が確立されます。2 つ目のコンソールで入力した内容が、1 つ目のコンソールで入力した内容に連結されます (その逆も同様)。接続が設定されると、nc はどちら側がサーバーとして使用され、どちら側がクライアントとして使用されているかを区別しません。接続を終了するには EOF (Ctrl-D) を使用します。

データ転送

前のセクションの例を応用すると、基本的なデータ転送モデルを作成できます。接続の一方の側に入力された情報がもう一方の側に出力されるため、入力と出力を簡単に取り込んでファイル転送をエミュレートできます。

最初に、nc を使用して特定のポートで待機し、出力をファイルに取り込みます。


$ nc -l 1234 > filename.out

2 つ目のマシンを使用して、待機中の nc プロセスに接続し、転送するファイルを入力します。

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

ファイルの転送が完了すると、接続は自動的に終了します。

サーバーとの通信

ユーザーインタフェースを使用せずに手動でサーバーと通信したほうが便利な場合があります。この方法は、トラブルシューティングで、クライアントが実行したコマンドに対応してサーバーがどのようなデータを送信しているのかを確認する必要がある場合などに役立ちます。

たとえば、Web サイトのホームページを取得するには、次のコマンドを使用します。

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

これにより、Web サーバーが送信したヘッダーも表示されます。表示された内容は、sed(1) などのツールを使用すると、必要に応じてフィルタ処理できます。

サーバーが求める要求形式がわかっている場合は、より複雑な例を作成できます。もう 1 つの例として、電子メールを SMTP サーバーに送信するには、次を使用します。


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

ポートスキャン

ターゲットマシン上のどのポートが開き、サービスを実行しているかがわかると便利な場合があります。–z フラグを使用すると、接続を開始せずに、開いているポートを報告するよう nc に指示できます。

上記の例では、


$ 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-2.0-Sun_SSH_1.1
Protocol mismatch.
220 host.example.com IMS SMTP Receiver Version 0.84 Ready

inetd の機能

考えられる用途の 1 つに、inetd(1M) を使った簡単なサービスの作成があります。

次の例では、ホスト realwww 上で TCP ポート 8080 からポート 80 へのリダイレクトを作成しています。


# cat << EOF >> /etc/services
wwwredir    8080/tcp    # WWW redirect
EOF
# cat << EOF > /tmp/wwwredir.conf
wwwredir stream tcp nowait nobody /usr/bin/nc /usr/bin/nc -w 3 realwww 80
EOF
# inetconv -i /tmp/wwwredir.conf
wwwredir -> /var/svc/manifest/network/wwwredir-tcp.xml
Importing wwwredir-tcp.xml ...Done
# inetadm -l wwwredir/tcp
SCOPE    NAME=VALUE
name="wwwredir"
endpoint_type="stream"
proto="tcp"
isrpc=FALSE
wait=FALSE
exec="/usr/bin/nc -w 3 realwww 80"
arg0="/usr/bin/nc"
user="nobody"
default  bind_addr=""
default  bind_fail_max=-1
default  bind_fail_interval=-1
default  max_con_rate=-1
default  max_copies=-1
default  con_rate_offline=-1
default  failrate_cnt=40
default  failrate_interval=60
default  inherit_env=TRUE
default  tcp_trace=TRUE
default  tcp_wrappers=FALSE

特権

特権ポート番号にバインドするには、ncnet_privaddr 特権を付与する必要があります。Solaris Trusted Extensions が構成され、nc が待機するポートがマルチレベルポートとして構成されている場合は、net_bindmlp 特権も必要です。

特権をユーザーまたは役割に直接割り当てるには、user_attr(4) にアカウントのデフォルトの特権セットを指定します。ただし、このユーザーまたは役割が起動したアプリケーションにもこれらの特権が追加されます。nc が起動されたときにだけ特権 (privileges(5)) を付与するには、rbac(5) 権利プロファイルを作成して割り当てることをお勧めします。詳細は、「使用例」を参照してください。

使用例 1 nc を使用する

ポート 3141 を発信元ポートとして使用し、タイムアウトを 5 秒に設定して、host.example.com のポート 42 への TCP 接続を開きます。


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

ポート 7777host.example.com への TCP 接続を開き、ソケット上に 50M ビット/秒の最大帯域幅を設定します。

    
$ nc -M maxbw=50M host.example.com 7777
    
  

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

ポートとポート範囲の一覧を使用して、さまざまなポートでポートスキャンを実行します。


$ nc -z host.example.com 21-25,53,80,110-120,443

UNIX ドメインソケットを作成して、待機します。


$ nc -lU /var/tmp/dsocket

関連付けられたポート 8888 を使用して UDP ソケットを作成し、待機します。


$ nc -u -l -p 8888

これは次と同じです。


$ nc -u -l 8888

関連付けられたポート 2222 を使用して TCP ソケットを作成して待機し、アドレス 127.0.0.1 にのみバインドします。


$ nc -l 127.0.0.1 2222

関連付けられたポート 2222 を使用して TCP ソケットを作成して待機し、リスナーおよび接続されたソケット上に優先度の高い MAC フローを作成します。

    
$ nc -l -M priority=high,inherit=on host.example.com 2222
    
  

遅延オプションを設定してタイムアウトを 0 に設定すると、TCP ポートに接続し、データを送信し、(従来の TCP クロージングハンドシェークではなく) TCP RST セグメントを使用して接続を終了します。

$ echo "foo" | nc -L 0 host.example.com 22

ローカルポート 4545 からホスト host.example.com 上のポート 22 へのポートリダイレクトを実行します。

$ nc -R host.example.com/22 -l 4545

これにより、ssh(1) クライアントを実行し、上記のコマンドを実行している host redir.example.com を使用して host.example.com に接続できるようになります。

$ ssh -oStrictHostKeyChecking=no -p 4545 redir.example.com

TCP ポート上で nc を待機させ、TCP データストリームを UDP に変換することもできます (またはその逆も可能です)。

$ nc -R host.example.com/53/udp -l 4666

10.2.3.4、ポート 8080 の HTTP プロキシを使用して host.example.com のポート 42 に接続します。この例は ssh(1) で使用することもできます。詳細は、ssh_config(4)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

基本的な UDP ポートスキャンは、次のように効率的に実行できます。

$ nc -z -w 3 -u -i 0.5 host.example.com 11-100

2 つの各ポート間で 0.5 秒間一時停止し (これにより、ICMP メッセージの速度制限が回避されます)、最大で 3 秒間返信を待機します。返信がない場合、そのポートは開かれている可能性があります。

多くの特権を持つユーザーまたは役割 (デフォルトの root アカウントなど) として最小限の特権セットで nc を実行するには、 ppriv(1) も使用して起動します。たとえば、特権ポートにバインドするための特権だけで実行するように制限します。


$ ppriv -e -sA=basic,!file_link_any,!proc_exec,!proc_fork,\
!proc_info,!proc_session,net_privaddr nc -l 42

ユーザーまたは役割が net_privaddr 特権だけで nc を実行できるようにするには、権利プロファイルを作成する必要があります。


/etc/security/exec_attr
Netcat privileged:solaris:cmd:::/usr/bin/nc:privs=net_privaddr

/etc/security/prof_attr
Netcat privileged:::Allow nc to bind to privileged ports:help=None.html

user_attr(4) を使用してこの権利プロファイルを割り当てると、そのユーザーまたは役割は、任意のポートで待機できる nc を実行できるようになります。ユーザーまたは役割が nc を使用して特定のポートだけで待機できるようにするには、権利プロファイルにラッパースクリプトを指定するようにしてください。


/etc/security/exec_attr
Netcat restricted:solaris:cmd:::/usr/bin/nc-restricted:privs=net_privaddr

/etc/security/prof_attr
Netcat restricted:::Allow nc to bind to privileged ports:help=None.html


また、許可されるオプションを制限するシェルスクリプトを作成する必要があります。たとえば、ポート 42 - 64 (42 と 64 は除く) へのバインドのみを許可するものです。


/usr/bin/nc-restricted:

#!/bin/sh
[ $# -eq 1 ] && [ $1 -gt 42 -a $1 -lt 64 ] && /usr/bin/nc -l -p "$1"

これにより、ユーザーまたは役割がプロファイルシェルからラッパースクリプトを使用して nc を起動すると、追加の特権が付与されます。pfsh(1)pfksh(1)pfcsh(1)、および pfexec(1) を参照してください。

nc を直接起動したり、pfexec またはプロファイルシェルを使用せずに起動したりすると、追加の特権を使用して nc が実行されません。

属性

属性についての詳細は、マニュアルページの attributes(5) を参照してください。

属性タイプ
属性値
使用条件
network/netcat
インタフェースの安定性
下記を参照。

パッケージ名は「確実」です。–4–6–l–n–p–u–w の各オプションとその引数 (存在する場合) のコマンド行構文は「確実」です。name および port リスト引数は「確実」です。ポート範囲の構文は「不確実」です。ほかのすべてのコマンド行オプションとその引数に関しては、インタフェースの安定性レベルは「不確実」です。

関連項目

cat(1), pfcsh(1), pfexec(1), pfksh(1), pfsh(1), ppriv(1), sed(1), ssh(1), telnet(1), inetadm(1M), inetconv(1M), inetd(1M), ssh_config(4), user_attr(4), attributes(5), privileges(5), rbac(5)

著者

nc の最初の実装は Hobbit (hobbit@avian.org) によって作成されました。

IPv6 サポートに伴う nc の改訂は、Eric Jackson (ericj@monkey.org) によって行われました。

nc のインスタンスが (アドレスファミリ指定にかかわらず) ワイルドカードソケット上で待機している場合、別の nc プロセスを実在する IP アドレスにバインドしてこのアドレスへの接続を受け入れることもできます。たとえば、以下のプロセスを実行している場合、

$ nc -4 -l 5656

特定の IP アドレスおよび同じポート上で待機している別の nc プロセスを実行できます。

$ nc -4 -l 10.20.30.40 5656

アドレス 10.20.30.40 およびポート 5656 への TCP 接続はあとのプロセスによって受け入れられ、ポート 5656 および異なるアドレスへのすべての TCP 接続は前のプロセスによって受け入れられます。

また、IPv4 ワイルドカードソケットにバインドすることによって、(アドレスファミリを指定せずに) ワイルドカードソケット上で待機するプロセスから IPv4 接続を流用できます。この動作および上記の動作を無効にするには、–E オプションを使用します。