nc, netcat - 任意の TCP および UDP の接続と待機
nc -h
nc [-46Cdnrtuvz] [-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] [-M sla-prop] hostname port_list
nc -l [-46CDdEFnrtuvzZ] [-i interval] [-T dspc] [-e program] [-b bufsize] [-q timeout] [-R address/port[/proto]] [-m bytes] [-L timeout] [-I bufsize] [-O bufsize] [-M sla-prop] [hostname] port
nc -l [-46CDEFdnrtuvzZ] [-i interval] [-T dspc] [-e program] [-b bufsize] [-q timeout] [-R address/port[/proto]] [-m bytes] [-L timeout] [-I bufsize] [-O bufsize] [-M 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 として実行して同じオプションを使用することもできます。
サポートしているオプションは、次のとおりです。
nc が IPv4 アドレスのみを使用するよう強制します
nc が IPv6 アドレスのみを使用するよう強制します
読み取り操作のバッファーサイズを指定します
デフォルト値は 1024 バイトです
完全な TCP セグメントを送信できないかぎり、データを一切送出しません
TCP 以外のプロトコルでこのオプションを使用することは、エラーです
ソケット上でのデバッグを有効にします
stdin からの読み取りを試みません
排他バインドを使用して TCP または UDP ソケットを待機します。
–l オプションを指定せずにこのオプションを使用すると、エラーになります
このオプションは、–U オプションと同時に使用しても何の効果もありません
接続の受け入れまたは実行後に外部プログラムを実行します。実行前に、stdin,stdout,stderr がネットワーク記述子にリダイレクトされます。このオプションでは、1 つのポートのみを使用できます
このオプションを –R、–k、または –i オプションと同時に使用すると、エラーになります
stdin で EOF を表示したあと、書き込みのためにネットワークソケットを閉じないでください
nc のヘルプを出力します
受信する (入力) ソケットのバッファーサイズを設定します
このオプションは、–U オプションと同時に使用しても何の効果もありません
テキスト行の送受信間隔 (interval) の遅延時間を指定します。
この間隔は秒で指定します (小数も可)。
このオプションを使用すると複数のポートへの接続で遅延が発生するため、ポートスキャンモードにも影響が及びます
現在の接続が閉じられたら、nc が別の接続を待機するよう強制します
–l オプションを指定せずにこのオプションを使用すると、エラーになります
このオプションを –e オプションと同時に使用すると、エラーになります
閉じる操作を遅らせます。ネットワーク記述子が閉じられたあとにメッセージが送信されるのを、指定した時間 (秒) だけ待機します
リモートホストへの接続を開始せずに、着信する接続を待機します
このオプションを –s または –z オプションと同時に使用すると、エラーになります
–l オプションをワイルドカードソケット (IP アドレスとホスト名の指定はなし) とともに使用し、–4/–6 オプションを指定しない場合は、IPv4 接続と IPv6 接続の両方が受け入れられます
少なくとも byte_count バイトを受信したあとに終了します。–l オプションとともに使用すると、byte_count はクライアントから受信したバイト数と比較されます
byte_count は 0 より大きく INT_MAX より小さい値である必要があります。
ファイルをパターンで指定して UDP ポートをスキャンします。このファイルの内容は、放出された各 UDP パケットのペイロードとして使用されます
–u オプションと –z オプションを指定せずにこのオプションを使用すると、エラーになります
アドレス、ホスト名、またはポートに対して名前およびサービスの検索を行いません。
このオプションを使用すると、hostname 引数と port 引数は数値に制限されます。
–v オプションとともに使用すると、引数に対する制限に加えて、すべてのアドレスとポートが数値形式で出力されます。このオプションは、–U オプションと同時に使用しても何の効果もありません。
送信 (出力) ソケットのバッファーサイズを設定します。
このオプションは、–U オプションと同時に使用しても何の効果もありません。
認証を要求するプロキシサーバーに渡されるユーザー名 (proxy_username) を指定します。proxy_username を指定しない場合、認証は行われません。現時点では、HTTP CONNECT プロキシのプロキシ認証のみがサポートされています。
このオプションを –l オプションと同時に使用すると、エラーになります。
–l オプションを指定せずに使用する場合は、nc が使用する発信元ポートを特権の制限と使用条件に従って指定します。–l オプションと同時に使用する場合は、待機ポートを設定します。
このオプションと –l オプションの組み合わせは、グローバルなポート引数が指定されていない場合にのみ使用できます。
stdin で EOF を受信したあとに、指定した秒数待機してから終了します。
指定した host と port へのポートリダイレクトを実行します。
接続が受け入れられると、nc はリモートの host/port に接続し、クライアントとリモートホスト間ですべてのデータを受け渡しします。リダイレクト指定の proto (プロトコル) 部分は、tcp と udp のどちらかにできます。proto が指定されていない場合、redirector はサーバーと同じプロトコルを使用します。
このオプションを –z オプションと同時に使用すると、エラーになります。
port_list 引数で指定されたすべてのポートの中から着信先ポートを (順番にではなく) ランダムに選択します。
このオプションを –l オプションと同時に使用すると、エラーになります。
パケットの送信に使用するインタフェースの IP を指定します。
このオプションを –l オプションと同時に使用すると、エラーになります。
ソケットが参加する MAC フローの指定、ソケットの MAC フローのプロパティーの指定、またはその両方を行います。sla-prop には「name=value」をコンマで区切ったプロパティーリストを指定します。
現在サポートされているプロパティー名は maxbw、priority、flow、および inherit です。
maxbw と priority は flowadm(8) で定義されているプロパティーから取得され、そのフローの最大帯域幅と優先度を示します。maxbw に指定できる値は整数とオプションの接尾辞 (デフォルトでは Mega) です。priority は「high」、「medium」、および「low」のいずれかの値を取ることができます。
flow は引数としてフロー名を取ります。フローがまだ存在していない場合は作成されます。
フローの作成では、flow、maxbw、または priority の少なくとも 1 つを指定する必要があります。
inherit は「on」および「off」のどちらかの値を取ることができ、デフォルト値は「off」です。デフォルトでは、(accept(3C) から返される) 受け入れられた/新しいソケットはリスナーソケットのプロパティーを継承しません。それが「on」に設定されていると、新しいソケットはリスナーソケットのプロパティーを継承します。これは、それらのプロパティーを新しいソケットに強制する必要がある場合に –l オプションで役立ちます。
このオプションでは、SYS_FLOW_CONFIG 特権が必要です。このオプションでは、IP アドレスまたはホスト名を指定する必要もあります。
接続用の差別化サービスコードポイントを指定します。
IPv4 の場合、IP Type of Service (ToS) IP ヘッダーフィールドが指定されます。この引数の有効な値は文字列トークンで、lowdelay、throughput、reliability、または 0x の後に 8 ビットの 16 進数値が付いた値になります。
IPv6 (トラフィッククラス) の場合、16 進数値のみが使用できます。
RFC 854 の DO および WILL 要求に対して、nc が RFC 854 の DON'T および WON'T 応答を送信します。これにより、nc を使用して telnet セッションをスクリプト化できるようになります。
UNIX ドメインソケットの使用を指定します。–l を指定せずにこのオプションを指定すると、nc は AF_UNIX クライアントになります。このオプションを –l オプションと同時に指定すると、AF_UNIX サーバーが作成されます。
このオプションを使用する場合は、ホスト名やポートではなく、有効な UNIX ドメインパスからなる単独の引数を nc に指定する必要があります。
デフォルトのオプションである TCP の代わりに UDP を使用します。
詳細出力を指定します。
接続と stdin のアイドル状態が timeout 秒を超えた場合に、メッセージを表示せずに接続を閉じます。
デフォルトはタイムアウトなしです。
クライアントモードで接続確立フェーズにある場合、またはサーバーモードで接続を待機している場合、このオプションの効果はありません。
プロキシサーバーとの通信時に、指定したプロトコルを使用します。サポートされるプロトコルは、4 (SOCKS v.4)、5 (SOCKS v.5)、および connect (HTTP プロキシ) です。プロトコルを指定しなかった場合は、SOCKS v. 5 が使用されます。
このオプションを –l オプションと同時に使用すると、エラーになります。
proxy_address および port で指定されたプロキシを使用して、hostname への接続を要求します。port を指定しなかった場合は、プロキシプロトコルのウェルノウンポート (SOCKS の場合は 1080、HTTP の場合は 3128) が使用されます。
このオプションを –l オプションと同時に使用すると、エラーになります。
このオプションは、IPv6 アドレスの数値表現では機能しません。
待機モードで、SO_ALLZONES ソケットオプションを使用して、すべてのゾーンでアドレス/ポートにバインドします。
このオプションでは、SYS_NET_CONFIG 特権が必要です。
ポートスキャンを実行します。 TCP ポート (デフォルト) の場合、データが送信されずに接続スキャン (3 方向のフルハンドシェーク) が試行されます。UDP (–u) の場合、空の UDP パケットがデフォルトで送信されます。UDP ペイロードを指定するには、 –N オプションを使用できます。
UDP スキャンモードでは、否定応答 (ICMP 着信先ポート未達メッセージ) が受信されない場合は、ポートが開かれているものと推定します。このモードでは、–w オプションで設定したタイムアウトを使用して、リモートノードからの ICMP メッセージまたはデータを待機します。–v を指定すると、すべての受信データが 16 進数バイト値として stderr にダンプされます。
ほとんどのオペレーティングシステムが、入力パケットに対する ICMP メッセージの送信に速度制限を課しているため、UDP スキャンを実行するときに –i オプションを使用しないと、結果が信頼性のないものになります。
このオプションを –l オプションと同時に使用すると、エラーになります。
次のオペランドがサポートされています。
ホスト名を指定します。
hostname には、数値 IP アドレスまたは記号ホスト名 (–n オプションを指定していない場合のみ) を指定できます。
一般に、hostname を指定する必要があるのは、–l オプションを指定しない場合か、–U を使用しない場合です (その場合、この引数はパスになります)。hostname 引数を –l オプションを同時に指定した場合、port 引数も指定する必要があり、nc はそのアドレスとポートにバインドしようとします。hostname 引数を –l オプションと同時に指定しなかった場合、nc は指定されたポートのワイルドカードソケットで待機しようとします。
パス名を指定します。
ポートを指定します。
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
使用方法の 1 つとして、inetd(8) を使用して単純なサービスを作成することが考えられます。
次の例では、ホスト 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
特権ポート番号にバインドするには、nc に net_privaddr 特権を付与する必要があります。Solaris Trusted Extensions が構成され、nc が待機するポートがマルチレベルポートとして構成されている場合は、net_bindmlp 特権も必要です。
特権をユーザーまたは役割に直接割り当てるには、user_attr(5) にアカウントのデフォルトの特権セットを指定します。ただし、このユーザーまたは役割が起動したアプリケーションにもこれらの特権が追加されます。nc が起動されたときにだけ特権 (privileges(7)) を付与するには、rbac(7) 権利プロファイルを作成して割り当てることをお勧めします。詳細は、「使用例」を参照してください。
ポート 3141 を発信元ポートとして使用し、タイムアウトを 5 秒に設定して、host.example.com のポート 42 への TCP 接続を開きます。
$ nc -p 3141 -w 5 host.example.com 42
ポート 7777 の host.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) で使用することもできます。
$ 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(5) を使用してこの権利プロファイルを割り当てると、そのユーザーまたは役割は、任意のポートで待機できる 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(7) を参照してください。
|
パッケージ名は「確実」です。–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), user_attr(5), attributes(7), privileges(7), rbac(7), inetadm(8), inetconv(8), inetd(8)
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 オプションを使用します。