vz-shark:Dive2Deep

低予算を念頭にした「AI勉強/開発」「サービス開発/運用」。また記事に関連する「DIY」「備忘録」など。

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でリッスン

環境について

  • Ubuntu 18.04 LTS
  • netcat (Debian patchlevel 1.187-1ubuntu0.1)


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を明示しないと動作しなかった。

ー以上ー