【Linux】ncat (nc, netcat) コマンドの使い方とオプション | SEの道標
Linux基礎

【Linux】ncat (nc, netcat) コマンドの使い方とオプション

ncat のインストール

nmap に内包されています。

[root@localhost ~]# dnf -y install nmap

上記でインストールすると nc のソフトリンクとして ncat が指定されます。つまり、nc と ncat は同じコマンドになります。

ncat (nc) コマンドの基本的な使い方

ncat はネットワークを使ってデータを送ったり待ち受けたりすることのできるコマンドです。ネットワークの疎通確認で使われて利します。

使い方① クライアントの ncat にてサーバの開放ポート確認

例えば Web サーバへの疎通を確認したいとき、Ping では tcp 80 や 443 が開いているか分かりません。ncat コマンドで以下のようにすれば、 tcp の 80 や 443 ポートが開いているかどうかを確認することができます。

例えば 192.168.1.1 において 80 は開いていて 443 は開いていない場合、以下のような挙動になります。

[root@localhost ~]# ncat -v -z 192.168.1.1 80
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.1:80.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
[root@localhost ~]# ncat -v -z 192.168.1.1 443
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connection refused.

-z は Zero I/O モードと呼ばれるものです。通常の ncat コマンドではキーボードの文字列を ASCII 文字列として送信します (Ctrl + C で TCP FIN にてコネクション終了する) が、-z を付けた場合は 3way handshake を確立した後にすぐ TCP FIN でコネクション終了します。疎通確認時によく使われます。

-v は何が起きているかを表示してくれます。上記の例では Connected to 192.168.1.1:80 にて 80/tcp のコネクション確立が出来たことを表示し、 Connection refused にて 443/tcp の接続に失敗したことを表示しています。

使い方② ncat 同士で通信 (FW の疎通確認などに利用)

2 台の Linux 間で通信を行い、FW の疎通確認などを行うことができます。

例えば Lin2 にて ncat をサーバ (Listen) モードで起動します。ncat ではデフォルトポート 31337 で Listen するようになります。firewalld は一時停止しましょう。

[root@Lin2 ~]# systemctl stop firewalld
[root@Lin2 ~]# ncat -v -l &
[root@Lin2 ~]# ss -nltp
State    Recv-Q   Send-Q     Local Address:Port      Peer Address:Port  Process
LISTEN   0        10               0.0.0.0:31337          0.0.0.0:*      users:(("ncat",pid=24588,fd=4))
~~~

そして Lin1 から 31337/tcp で接続します。

[root@Lin1 ~]# ncat 192.168.1.212
test
TEST

上記で Lin1 にて test[改行]TEST[改行]と入力しましたが、これが ASCII 文字列として Lin2 に伝わり、標準出力に先ほどの文字列が出力されます。

Lin1 のクライアント側で Ctrl + C で停止すると TCP コネクションが終了します。すると Lin2 側のサーバ (Listen) モードも終了します。デフォルトでは、1 度コネクションを受け付け、そのコネクションが終了したらコマンド自体も終了する仕組みになっています。これを回避するためにはサーバモード起動時に -k オプションを付けます。

また、-p オプションを使うことで任意のポートを指定することができます。これにより、中間にある FW の動作試験を実施できたりします。

例えばポートを 25/tcp で Listen するようには -p 25 オプションを加えます。

[root@Lin2 ~]# ncat -vklp 25 &

-k では Listen を Keep し続けます。

Lin1 から 25/tcp で接続します。宛先ポートを指定する場合は IP アドレスの直後にポート番号を入力します。

[root@Lin1 ~]# ncat 192.168.1.212 25

Lin2 側で「Connection from 192.168.1.211.」というような送信元 IP が表示されます。

使い方③ ssh を使わずリモートの Linux サーバをコマンド操作

ncat ではリモート操作もできます。

Lin2 上で -e "/bin/sh" オプションでサーバモードで起動します。

[root@Lin2 ~]# ncat -vklp 25 -e "/bin/sh"

そして Lin1 から Lin2 へ接続し、 hostname コマンドを打ってみます。

[root@Lin1 ~]# ncat -v 192.168.1.212 25
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.212:25.
hostname
Lin2

Lin2 が返ってきました。これは hostname の文字列が Lin2 に渡され、Lin2 では /bin/sh に hostname が渡され、その結果が Lin1 に戻ってきた、ということです。つまり、ssh 接続をせずにリモートにある Lin2 を操作し、その結果を Lin1 で得られたことになります。

オプション

-v

詳細を標準出力に表示する。起動時にバージョン情報を表示したり、接続不可の場合に「Connection Refused」を表示したりするなど。

[root@localhost ~]# ncat -v 192.168.1.1 80
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.1:80.

-vv

Debug レベルで詳細を表示する。

[root@localhost ~]# ncat -vv 192.168.1.1 80
Ncat: Version 7.70 ( https://nmap.org/ncat )
NCAT DEBUG: Using system default trusted CA certificates and those in /usr/share/ncat/ca-bundle.crt.
NCAT DEBUG: Unable to load trusted CA certificates from /usr/share/ncat/ca-bundle.crt: error:02001002:system library:fopen:No such file or directory
libnsock nsock_iod_new2(): nsock_iod_new (IOD #1)
libnsock nsock_connect_tcp(): TCP connection requested to 192.168.1.1:80 (IOD #1) EID 8
libnsock nsock_trace_handler_callback(): Callback: CONNECT SUCCESS for EID 8 [192.168.1.1:80]
Ncat: Connected to 192.168.1.1:80.
libnsock nsock_iod_new2(): nsock_iod_new (IOD #2)
libnsock nsock_read(): Read request from IOD #1 [192.168.1.1:80] (timeout: -1ms) EID 18
libnsock nsock_readbytes(): Read request for 0 bytes from IOD #2 [peer unspecified] EID 26

-z

Zero-I/O mode。TCP であれば 3way handshake の後にすぐ TCP FIN でコネクションをクローズする。UDP であれば null バイト (0x00) の 1 Byte のみ送信を行う。

-l

サーバ (Listen) モードで起動する。(このオプションが無い場合はクライアントモードで起動し、指定した IP に接続しにいく。)

-p

送信元ポートを指定する。-l と一緒に使えば待ち受けポートの指定となる。
宛先ポートを指定する場合はオプションではなく、IP アドレスの後にポート番号を指定する。

サーバモードで Listen 110/tcp を指定

[root@Lin2 ~]# ncat -l -p 110

クライアントモードで宛先 110/tcp を指定

[root@Lin1 ~]# ncat 192.168.1.212 110

-u

ncat はデフォルトでは TCP を使うが、UDP を使いたい場合は -u を指定する。-l と一緒に使えば UDP 31337 で Listen するし、さらに -p と合わせれば任意の UDP ポートで Listen できる。

-e

接続相手から受け取った文字列を -e の後に指定したコマンドへ標準入力として渡す。絶対パスで記載する必要あり。-e "/bin/sh" が良く使われる。

-c

接続時にコマンドを実行し相手に返す。例えば Lin2 を以下のようにサーバモードで起動し、

[root@Lin2 ~]# ncat -lc "echo hello"

Lin1 から接続すると、Lin1 には hello と表示される。

[root@Lin1 ~]# ncat -v 192.168.1.212
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.1.212:25.
hello

コメント

タイトルとURLをコピーしました