netcat(nc)コマンド
なにかと便利なnetcatの覚書です。
全般
コマンド名について
nc
でもnetcat
でも同じ。リンク先が一緒。以下はubuntuでの結果。
$ ls -la /bin/nc /bin/netcat /etc/alternatives/nc /etc/alternatives/netcat /bin/nc.openbsd lrwxrwxrwx 1 root root 20 9月 15 23:58 /bin/nc -> /etc/alternatives/nc lrwxrwxrwx 1 root root 24 9月 15 23:58 /bin/netcat -> /etc/alternatives/netcat lrwxrwxrwx 1 root root 15 9月 15 23:58 /etc/alternatives/nc -> /bin/nc.openbsd lrwxrwxrwx 1 root root 15 9月 15 23:58 /etc/alternatives/netcat -> /bin/nc.openbsd -rwxr-xr-x 1 root root 35312 5月 14 21:24 /bin/nc.openbsd
Verbose(-v)について
-vオプションがないと挙動ががわからない時があるので常に付与しておいたほうがよさそう。以下はその例。
# -v オプションがないと何も表示されず。うまく繋がったかわからない。 $ nc 127.0.0.1 1235 $ # -v オプションを付与すると把握できる。 $ nc -v 127.0.0.1 1235 nc: connect to 127.0.0.1 port 1235 (tcp) failed: Connection refused $
IPのバージョンの明示( -4 / -6 )
$ nc -v -4 127.0.0.1 3000 # IPv4 127.0.0.1(localhost) の TCPポート3000へ接続 $ nc -v -6 ::1 3000 # IPv6 ::1(localhost) の TCPポート3000へ接続
ローカルの IPの明示( -s) と ポートの明示(-p) ※1
※1 v1.10-41 では、サーバー(-l)動作時に、ローカルIPとPORTを明示しないと動作しなかった。(2018/10/17)
$ nc -vl -s 127.0.0.1 -p 3000 # 127.0.0.1のTCPポート3000でリッスン
環境について
TCP関係
TCPクライアント
$ nc -v 127.0.0.1 1234 # 127.0.0.1(localhost) の TCPポート1234へ接続
TCPサーバ(-l) ※1
$ nc -v -l 127.0.0.1 1234 # 127.0.0.1でbindしてTCPポート1234をリッスン $ nc -v -l 0.0.0.0 1234 # 0.0.0.0(anywhere)でbindしてTCPポート1234をリッスン
TCPサーバで複数セッション(-k) ※1
上記の-lオプションだけだと、1セッションのみ受け付ける挙動となりセッションが切れるとnetcatプロセスも終了する。-kオプションも付与すると同時に複数セッションを受け付けるようになる。
$ nc -v -l -k 127.0.0.1 1234
TCPクライアント/サーバーの実行時の様子 ※1
①サーバ側でコマンド実行
②クライアント側でコマンド実行
③クライアント側からキーボード入力
④サーバー側からキーボード入力
⑤クライアンの側でCTL-Cで終了
【 サーバー側ターミナル】
①$ nc -v -l 127.0.0.1 1234 ①Listening on [127.0.0.1] (family 0, port 1234) ②Connection from localhost 52710 received! ③1.from client ④2.from server ⑤$
【 クライアント側ターミナル】
②$ nc -v 127.0.0.1 1234 ②Connection to 127.0.0.1 1234 port [tcp/*] succeeded! ③1.from client ④2.from server ⑤^C ⑤$
http GET リクエスト
$ echo -en "GET / HTTP/1.1\n\n" | nc -v 127.0.0.1 80
ポートスキャン(-z)
$ nc -v -z 127.0.0.1 1-65535
UDP関係
UDPクライアント(-u)
$ nc -v -u 127.0.0.1 5678 # 127.0.0.1(localhost) の UDPポート5678へ接続
UDPサーバ(-lu) ※1
$ nc -v -l -u 127.0.0.1 5678 # 127.0.0.1でbindしてUDPポート5678をオープン $ nc -v -l -u 0.0.0.0 5678 # 0.0.0.0(anywhere)でbindしてUDPポート5678をオープン
※1 v1.10-41 では、サーバー(-l)動作時に、ローカルIPとPORTを明示しないと動作しなかった。(2018/10/17)
UDPクライアント/サーバーの実行時の様子 ※1
①サーバ側でコマンド実行
②クライアント側でコマンド実行(echoでパイプ入力)
③クライアンの側でCTL-Cで終了
【 サーバー側ターミナル】
①$ nc -v -l -u 0.0.0.0 5678 ①Listening on [0.0.0.0] (family 0, port 5678) ②Connection from localhost 33959 received! ②XXXXX ②UDP test data sendding... ② from client
【 クライアント側ターミナル】
②$ echo -en "\nUDP test data sendding...\n from client\n" | nc -v -u 127.0.0.1 5678 ②Connection to 127.0.0.1 5678 port [udp/*] succeeded! ③^C ③$
【注釈】
※1 v1.10-41 では、サーバー動作時に、ローカルIPとPORTを明示しないと動作しなかった。
ー以上ー