Help us understand the problem. What is going on with this article?

ncコマンドの使い方

0 ncコマンドとは?

簡易なクライアント、サーバのプロセスを起動するコマンドです。
たとえば、TCPのエコーサーバを起動することができます。
他にUDPやUNIXドメインのサーバを起動することもできます。

私の場合、サーバ、クライアントの2台構成で、
TCPのコネクション確立/開放やTCP状態遷移等を確認するための実験に使っています。

1 環境

VMware Workstation 12 Player上の仮想マシンを使っています。
仮想マシンはサーバとクライアントの2台構成です。
サーバ、クライアントともに下記版数です。

カーネル版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

[root@server ~]# uname -r
3.10.0-514.el7.x86_64

サーバ、クライアントともに下記設定です。

hostsファイル
[root@server ~]# cat /etc/hosts
192.168.0.100 server
192.168.0.110 client

ネットワーク構成は以下のとおりです。

ネットワーク構成
                     192.168.0.0/24
      .110                               .100
client ------------------------------------- server 

2 ncコマンドのインストール方法

[root@server ~]# yum -y install nmap-ncat
[root@server ~]# nc --version
Ncat: Version 6.40 ( http://nmap.org/ncat )

[root@client ~]# yum -y install nmap-ncat
[root@client ~]# nc --version
Ncat: Version 6.40 ( http://nmap.org/ncat )

3 オプション一覧

[root@server ~]# nc --help
Ncat 6.40 ( http://nmap.org/ncat )
Usage: ncat [options] [hostname] [port]

Options taking a time assume seconds. Append 'ms' for milliseconds,
's' for seconds, 'm' for minutes, or 'h' for hours (e.g. 500ms).
  -4                         Use IPv4 only
  -6                         Use IPv6 only
  -U, --unixsock             Use Unix domain sockets only
  -C, --crlf                 Use CRLF for EOL sequence
  -c, --sh-exec <command>    Executes the given command via /bin/sh
  -e, --exec <command>       Executes the given command
      --lua-exec <filename>  Executes the given Lua script
  -g hop1[,hop2,...]         Loose source routing hop points (8 max)
  -G <n>                     Loose source routing hop pointer (4, 8, 12, ...)
  -m, --max-conns <n>        Maximum <n> simultaneous connections
  -h, --help                 Display this help screen
  -d, --delay <time>         Wait between read/writes
  -o, --output <filename>    Dump session data to a file
  -x, --hex-dump <filename>  Dump session data as hex to a file
  -i, --idle-timeout <time>  Idle read/write timeout
  -p, --source-port port     Specify source port to use
  -s, --source addr          Specify source address to use (doesn't affect -l)
  -l, --listen               Bind and listen for incoming connections
  -k, --keep-open            Accept multiple connections in listen mode
  -n, --nodns                Do not resolve hostnames via DNS
  -t, --telnet               Answer Telnet negotiations
  -u, --udp                  Use UDP instead of default TCP
      --sctp                 Use SCTP instead of default TCP
  -v, --verbose              Set verbosity level (can be used several times)
  -w, --wait <time>          Connect timeout
      --append-output        Append rather than clobber specified output files
      --send-only            Only send data, ignoring received; quit on EOF
      --recv-only            Only receive data, never send anything
      --allow                Allow only given hosts to connect to Ncat
      --allowfile            A file of hosts allowed to connect to Ncat
      --deny                 Deny given hosts from connecting to Ncat
      --denyfile             A file of hosts denied from connecting to Ncat
      --broker               Enable Ncat's connection brokering mode
      --chat                 Start a simple Ncat chat server
      --proxy <addr[:port]>  Specify address of host to proxy through
      --proxy-type <type>    Specify proxy type ("http" or "socks4")
      --proxy-auth <auth>    Authenticate with HTTP or SOCKS proxy server
      --ssl                  Connect or listen with SSL
      --ssl-cert             Specify SSL certificate file (PEM) for listening
      --ssl-key              Specify SSL private key (PEM) for listening
      --ssl-verify           Verify trust and domain name of certificates
      --ssl-trustfile        PEM file containing trusted SSL certificates
      --version              Display Ncat's version information and exit

See the ncat(1) manpage for full options, descriptions and usage examples

4 事前準備(ポート番号の開放)

テストに使うためのポート番号(TCP/UDPの11111番ポート)を解放します。
サーバ側で実施します。
なお、firewall-cmdの使い方は、ここ(firewall-cmdコマンドの使い方)を参照してください。

TCPポート番号(11111)の開放
[root@server ~]# firewall-cmd --add-port=11111/tcp
success
UDPポート番号(11111)の開放
[root@server ~]# firewall-cmd --add-port=11111/udp
success

5 INETドメインソケットの使い方

5.1 TCPソケットの使い方

サーバ側で、ncコマンドを実行します。
ncプロセスが、11111番ポートでListenするようにします。
-kは複数クライアントとTCPコネクションを同時に確立するためのオプションです。

サーバ側
[root@server ~]# nc -kl 11111

もう1つターミナルを開きます。そして、lsofコマンドを実行します。
ncプロセスがLISTEN状態(★)であることがわかります。
LISTEN状態は、TCPの状態のうちの1つです。詳細は、TCPの各種状態の作り方を参照してください。
なお、lsofの使い方は、ここ(lsofコマンドの使い方)を参照してください。

サーバ側
[root@server ~]# lsof -i4:11111 -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      1433 root    4u  IPv4  26753      0t0  TCP *:11111 (★LISTEN)

クライアントからサーバにTCPコネクションを確立します。

クライアント側
[root@client ~]# nc server 11111

ポート番号を確認します。
クライアントとTCPコネクションが確立されたことがわかります(★)。

サーバ側
[root@server ~]# lsof -i4:11111 -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      1433 root    4u  IPv4  26753      0t0  TCP *:11111 (LISTEN)
nc★    1433 root    5u  IPv4  24299      0t0  TCP server:11111->client:56884 (ESTABLISHED)

クライアントからサーバにデータ(12345)を送信します。

クライアント側
[root@client ~]# nc server 11111
12345

クライアントから受信した文字列が表示されることがわかります。

サーバ側
[root@server ~]# nc -kl 11111
12345

5.2 UDPソケットの使い方

クライアントからのUDPパケットを11111番ポートで待ちます。

サーバ側
[root@server ~]# nc -u -l 11111

lsofコマンドを実行します。
UDPの11111番ポートで受信待ちであることがわかります。

サーバ側
[root@server ~]# lsof -i4:11111 -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      1677 root    4u  IPv4  35796      0t0  UDP *:11111

クライアントからサーバの11111番ポートにデータを送信します。

クライアント側
[root@client ~]# nc -u server 11111
12345

クライアントから受信した文字列が表示されることがわかります。

サーバ側
[root@server ~]# nc -u -l 11111
12345

5.3 送信元ポート番号を指定する方法(-p)

サーバ側は、TCPの11111番ポートでListenします。

サーバ
[root@server ~]# nc -kl 11111

サーバにデータを送信します。
このとき、送信元ポート番号(-p)として22222を指定します。

クライアント
[root@client ~]# nc server 11111 -p 22222
12345

ポート番号を確認します。
クライアントがサーバに送信するTCPパケットの送信元ポート番号が22222であることがわかります。
なお、tcpdumpの使い方は、ここ(tcpdumpの使い方)を参照してください。

サーバで採取したtcpdump
[root@server ~]# tcpdump -i eth0 port 11111 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
08:19:09.980690 IP 192.168.3.20.22222 > 192.168.3.50.11111: Flags [S], seq 2815580362, win 29200, options [mss 1460,sackOK,TS val 1503403 ecr 0,nop,wscale 7], length 0
08:19:09.980732 IP 192.168.3.50.11111 > 192.168.3.20.22222: Flags [S.], seq 2200663011, ack 2815580363, win 28960, options [mss 1460,sackOK,TS val 3643703 ecr 1503403,nop,wscale 7], length 0
08:19:09.981214 IP 192.168.3.20.22222 > 192.168.3.50.11111: Flags [.], ack 1, win 229, options [nop,nop,TS val 1503403 ecr 3643703], length 0
08:19:13.812045 IP 192.168.3.20.22222 > 192.168.3.50.11111: Flags [P.], seq 1:7, ack 1, win 229, options [nop,nop,TS val 1507234 ecr 3643703], length 6
08:19:13.812134 IP 192.168.3.50.11111 > 192.168.3.20.22222: Flags [.], ack 7, win 227, options [nop,nop,TS val 3647534 ecr 1507234], length 0

5.4 送信元アドレスを指定する(-s)

サーバ側は、TCPの11111番ポートでListenします。

サーバ
[root@server ~]# nc -kl 11111

サーバにデータを送信します。
このとき、送信元IPアドレス(-s)として192.168.3.20を指定します。
指定するIPアドレスは、送信元の仮想マシンが持っているIPアドレスの中から選択します。

クライアント
[root@client ~]# nc server 11111 -s 192.168.3.20
12345

クライアントが送信したデータが、サーバで受信できたことがわかります。

サーバ
[root@server ~]# nc -kl 11111
12345

6 UNIXドメインソケットの使い方

ターミナルを2つオープンします。
それぞれ、ターミナル1、ターミナル2と呼びます。

UNIXドメインのソケットを作成します。

ターミナル1
[root@server ~]# nc -U -l /tmp/sock -vv
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on /tmp/sock

ターミナル2で12345と入力する。

ターミナル2
[root@server ~]# nc -U /tmp/sock
12345

ターミナル2で入力した文字が、ターミナル1で表示されたことがわかる。

ターミナル1
[root@server ~]# nc -U -l /tmp/sock -vv
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on /tmp/sock
Ncat: Connection from a client on Unix domain socket.
Ncat: Connection from .
12345

あと始末をする。

ターミナル1
[root@server ~]# rm /tmp/sock
rm: ソケット `/tmp/sock' を削除しますか? y

7 IPv6の使い方

ここでは、IPv6環境でのncコマンドの使い方を説明します。
サーバ、クライアントのIPv6アドレスは以下のとおりです。
ともに、リンクローカルアドレスです。

環境
client(eth0) -----------------------------------------------------(eth0)server
  fe80::20c:29ff:fef0:6ea2/64                        fe80::20c:29ff:fea8:bf66/64

7.1 TCPの場合

サーバ側は、11111番ポートでListenします。

サーバ側
[root@server ~]# nc -6 -kl 11111

クライアント側では、宛先を次のように指定します。
<サーバのIPv6アドレス>%<インタフェース名>

次に、クライアントで"12345"と入力します。

クライアント側
[root@client ~]# nc -6 fe80::20c:29ff:fea8:bf66%eth0 11111
12345

クライアントで入力した文字列を受信したことがわかります。

サーバ側
[root@server ~]# nc -6 -kl 11111
12345

サーバ側で、TCPコネクションを確認します。

サーバ側
[root@server ~]# lsof -c nc -a -i6 -nP
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      1341 root    3u  IPv6  24631      0t0  TCP *:11111 (LISTEN)
nc      1341 root    4u  IPv6  22639      0t0  TCP [fe80::20c:29ff:fea8:bf66]:11111->[fe80::20c:29ff:fef0:6ea2]:43438 (ESTABLISHED)

クライアント側で、TCPコネクションを確認します。

クライアント側
[root@client ~]# lsof -c nc -a -i6 -nP
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      1278 root    3u  IPv6  22736      0t0  TCP [fe80::20c:29ff:fef0:6ea2]:43438->[fe80::20c:29ff:fea8:bf66]:11111 (ESTABLISHED)

7.2 UDPの場合

11111番ポートで受信待ちします。

サーバ側
[root@server ~]# nc -6 -lu 11111

宛先は次のように指定します
<サーバのIPv6アドレス>%<インタフェース名>
次に、クライアントで"12345"と入力する。

クライアント側
[root@client ~]# nc -6 -u fe80::20c:29ff:fea8:bf66%eth0 11111
12345

クライアントで入力した文字列を受信したことがわかる。

サーバ側
[root@server ~]# nc -6 -lu 11111
12345

サーバ側でtcpdumpを実行します。
UDPパケットが送信されていることがわかります。

サーバ側
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
19:54:21.310707 IP6 fe80::20c:29ff:fef0:6ea2.57010 > fe80::20c:29ff:fea8:bf66.11111: UDP, length 3

8 proxyオプションの使い方

ncプロセスをHTTP proxyサーバとして使ってみます。

ncプロセスは、8080番ポートでListenします。
[root@server ~]# nc -l 8080 --proxy-type http

8080番ポートへのアクセスを許可します。
[root@server ~]# firewall-cmd --add-port=8080/tcp
success

lsofコマンドを実行する。ncプロセスが8080番ポートでListenしていることがわかる。
[root@server ~]# lsof -i4:8080 -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      1739 root    4u  IPv4  27342      0t0  TCP *:8080 (LISTEN)

curlコマンドを実行する。curlのアクセス先は、proxy(ncプロセス)経由で東京都のHPにアクセスする。
[root@client ~]# curl -I -x http://server:8080 http://www.metro.tokyo.jp/
HTTP/1.0 200 OK
Date: Fri, 10 Nov 2017 14:17:39 GMT
Last-Modified: Fri, 10 Nov 2017 12:03:45 GMT
ETag: "722351-4c8e-55d9fb667ea40"
Accept-Ranges: bytes
Content-Length: 19598
Content-Type: text/html
X-Pad: avoid browser bug
Via: 1.1 ID-0002262070470144 uproxy-2
X-Frame-Options: SAMEORIGIN
Connection: close

クライアントからproxy経由で東京都のHPにアクセスするときの状況を確認する。
東京都のwwwサーバのIPアドレスを確認する。wwwサーバのIPは27.110.42.248であることがわかる。
[root@client ~]# dig www.metro.tokyo.jp +short
27.110.42.248

straceコマンドを実行する。proxy(ncプロセス)がTCPコネクションを確立する相手を確認する。
TCPコネクション確立先のIPが27.110.42.248(★)であることがわかる。
[root@server ~]# strace -ttT -f -e trace=connect -p 1739
-略-
[pid  1828] 23:22:42.614667 connect(0, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("★27.110.42.248")}, 16) = 0 <0.018794>

9 sslオプションの使い方

9.1 サーバ証明書のチェックなしの方法

ncコマンドを実行する。443番ポートでListenする。
[root@server ~]# nc --ssl -kl 443

クライアントからサーバの443番ポートにTCPコネクションを確立する。コネクション確立後、12345と入力する。
[root@client ~]# nc --ssl server 443
12345

クライアントから受信したデータが表示できたことがわかる。
クライアントで12345と入力したあと、Ctrl + c でコネクションを終了する。
[root@server ~]# nc --ssl -kl 443
12345

以下は、tcpdumpで採取したキャプチャデータをwiresharkで表示したものです。
なぜか、クライアントからサーバにACKパケットではなく、RSTパケットが送信されています。なぜ???
ssl.png

9.2 サーバ証明書をチェックする方法

事前準備(秘密鍵、サーバ証明書の作成)
秘密鍵を作成する。
[root@server tls]# openssl genrsa 2048 > server.key
Generating RSA private key, 2048 bit long modulus
...+++
.........................................................................................................................................................................................................+++
e is 65537 (0x10001)

ファイルを確認する。秘密鍵(server.key)が作成できたことがわかる。
[root@server tls]# ls
server.key

証明書署名要求を作成する。
[root@server tls]# openssl req -new -key server.key > server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Machida
Organization Name (eg, company) [Default Company Ltd]:X
Organizational Unit Name (eg, section) []:X
Common Name (eg, your name or your server's hostname) []:server
Email Address []:.

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:.
An optional company name []:.

ファイルを確認する。証明書署名要求(server.csr)が作成できたことがわかる。
[root@server tls]# ls
server.csr  server.key

サーバ証明書を作成する。
[root@server tls]# openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
Signature ok
subject=/C=JP/ST=Tokyo/L=Machida/O=X/OU=X/CN=server
Getting Private key

自己署名したサーバ証明書(server.crt)を確認する。
[root@server tls]# ls
server.crt  server.csr  server.key

server.csrは不要なので削除する。
[root@server tls]# rm server.csr
rm: 通常ファイル `server.csr' を削除しますか? y

[root@server tls]# ls
server.crt  server.key
動作確認
ncコマンドを実行する。サーバ証明書、秘密鍵を指定して、443番ポートでListenする。
[root@server tls]# nc --ssl-cert server.crt --ssl-key server.key -kl 443 -vv

サーバの443番ポートにTCPコネクションを確立する。コネクション確立後、文字列(12345)を送信する。
[root@client tls]# nc --ssl-verify --ssl-trustfile server.crt server 443
12345

クライアントが送信した文字列が表示されたことがわかる。
[root@server tls]# nc --ssl-cert server.crt --ssl-key server.key -kl 443 -vv
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::443
Ncat: Listening on 0.0.0.0:443
Ncat: Connection from 192.168.0.110.
Ncat: Connection from 192.168.0.110:42702.
12345

10 ファイルの送信方法

10.1 単純な送信方法

クライアントからのファイル受信を待ち受けます。

サーバ側
[root@server ~]# nc -kl 11111 > file.dat

サーバに送信するファイル(10M)を作成します。

クライアント側
[root@client ~]# fallocate -l 10M 10M.dat
[root@client ~]# ls -l 10M.dat
-rw-r--r-- 1 root root 10485760 11月 13 21:20 10M.dat

作成したファイルのチェックサム値を確認します。
[root@client ~]# md5sum 10M.dat
f1c9645dbc14efddc7d8a322685f26eb  10M.dat

クライアントからサーバにファイルを送信します。

クライアント側
[root@client ~]# nc server 11111 < 10M.dat
[root@client ~]#

ncコマンドを終了します(Ctrl +c押下)。

サーバ側
[root@server ~]# nc -kl 11111 > file.dat
^C

受信したファイルサイズとチェックサム値を確認します。
ファイルサイズ、およびチェックサム値ともに、クライアントで
確認した値と同じであることがわかる。

サーバ側
[root@server ~]# ls -l file.dat
-rw-r--r-- 1 root root 10485760 11月 13 21:21 file.dat

[root@server ~]# md5sum file.dat
f1c9645dbc14efddc7d8a322685f26eb  file.dat

10.2 送信間隔を指定する方法(-d)

パケットの送信間隔を指定することができます。
1ミリ秒単位で指定することができるようです。

送信用のファイルを作成します。

クライアント
[root@client ~]# fallocate -l 100M 100M.dat
[root@client ~]# ls -l 100M.dat
-rw-r--r--. 1 root root 104857600  3月 18 22:00 100M.dat

11111番ポートでTCPコネクション確立を待ちます。

サーバ
[root@server ~]# nc -l 11111 > file.dat

サーバ側でもう1つターミナルを開いて、tsharkコマンドを実行します。
このとき、tsharkが表示するパケットとパケットとの時間差(-t dd)を確認してみます。
tsharkは、ここ(tsharkコマンドの使い方)を参照してください。

サーバ
[root@server ~]# tshark -i eth0 -t dd -n -Y 'tcp.dstport==11111'

クライアントからサーバに1秒間隔でパケットを送信してます。

クライアント(1秒間隔で送信)
[root@client ~]# nc -d 1 server 11111 < 100M.dat

tsharkの実行結果を確認すると、
クライアントからパケットを1秒間隔で受信していることがわかります。
なお、tsharkの最初の3行は無視してください。最初の3行はTCP 3way handshakeです。
ここでやりとりするパケットの送信間隔はあらかじめ決まっているので、
アプリが変更することはできません。

サーバ
[root@server ~]# tshark -i eth0 -t dd -n -Y 'tcp.dstport==11111'
-snip-
772 0.000000000 192.168.3.50 -> 192.168.3.20 TCP 74 51600 > 11111 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=2467494 TSecr=0 WS=128
774 0.000294344 192.168.3.50 -> 192.168.3.20 TCP 66 51600 > 11111 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=2467495 TSecr=2465206
859 1.002561863 192.168.3.50 -> 192.168.3.20 TCP 8258 51600 > 11111 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=8192 TSval=2468498 TSecr=2465206
910 1.002131381 192.168.3.50 -> 192.168.3.20 TCP 8258 51600 > 11111 [PSH, ACK] Seq=8193 Ack=1 Win=29312 Len=8192 TSval=2469500 TSecr=2466209
916 1.001510391 192.168.3.50 -> 192.168.3.20 TCP 8258 51600 > 11111 [PSH, ACK] Seq=16385 Ack=1 Win=29312 Len=8192 TSval=2470501 TSecr=2467211
-snip-

次に、クライアントからサーバに0.1秒間隔で送信してみます。

クライアント(0.1秒間隔で送信)
[root@client ~]# nc -d 0.1 server 11111 < 100M.dat

tsharkの実行結果を確認すると、
クライアントからパケットを0.1秒間隔で受信していることがわかります。

サーバ
[root@server ~]# tshark -i eth0 -t dd -n -Y 'tcp.dstport==11111'
-snip-
830 0.000000000 192.168.3.50 -> 192.168.3.20 TCP 74 51602 > 11111 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=2681266 TSecr=0 WS=128
832 0.000512415 192.168.3.50 -> 192.168.3.20 TCP 66 51602 > 11111 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=2681267 TSecr=2678978
845 0.100562926 192.168.3.50 -> 192.168.3.20 TCP 8258 51602 > 11111 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=8192 TSval=2681367 TSecr=2678978
849 0.100684208 192.168.3.50 -> 192.168.3.20 TCP 8258 51602 > 11111 [PSH, ACK] Seq=8193 Ack=1 Win=29312 Len=8192 TSval=2681468 TSecr=2679079
851 0.100875511 192.168.3.50 -> 192.168.3.20 TCP 8258 51602 > 11111 [PSH, ACK] Seq=16385 Ack=1 Win=29312 Len=8192 TSval=2681569 TSecr=2679179
853 0.101132441 192.168.3.50 -> 192.168.3.20 TCP 8258 51602 > 11111 [PSH, ACK] Seq=24577 Ack=1 Win=29312 Len=8192 TSval=2681670 TSecr=2679280
-snip-

11 サーバ側でコマンドを実行する方法(-e)

サーバ側
[root@server ~]# nc -kl 11111 -e /usr/bin/bash

hostnameコマンドを実行する。サーバのホスト名が表示されることがわかる。

クライアント側
[root@client ~]# nc server 11111
hostname
server

12 改行コードを変更する方法(-C)

送信パケットの改行コードを変更する方法について説明します。
デフォルトでは、改行コードは0x0aですが、オプションを指定すると0x0d 0x0aになります。

12.1 デフォルトの場合

11111番ポートでTCPコネクション確立待ち
[root@server ~]# nc -kl 11111
パケットの中身をASCII表示
[root@server ~]# tcpdump -i eth0 dst port 11111 -x
サーバにTCPコネクション確立
[root@client ~]# nc server 11111
サーバに送信
[root@client ~]# nc server 11111
5

パケットの最後をみると、0x0aでおわっていることがわかります。

ASCII表示
08:27:45.900244 IP client.47950 > server.vce: Flags [P.], seq 4:6, ack 1, win 229, options [nop,nop,TS val 404940 ecr 375379], length 2
        0x0000:  4500 0036 bf84 4000 4006 f3a6 c0a8 0332
        0x0010:  c0a8 0314 bb4e 2b67 2593 cbb0 fd95 fa04
        0x0020:  8018 00e5 016e 0000 0101 080a 0006 2dcc
        0x0030:  0005 ba53 350a

12.2 オプション指定時

クライアント側で-Cオプションを指定してみます。
このとき、改行コードが0x0d 0x0aにかわることを確認してみます。

11111番ポートでTCPコネクション確立待ち
[root@server ~]# nc -kl 11111
パケットの中身をASCII表示
[root@server ~]# tcpdump -i eth0 dst port 11111 -x

-Cオプションを指定してncコマンドを実行する。

サーバに1バイト送信
[root@client ~]# nc -C server 11111
5

パケットの最後2バイトをみると、0x0d 0x0aで終わっていることがわかります。

ASCII表示
08:28:38.148653 IP client.47954 > server.vce: Flags [P.], seq 0:3, ack 1, win 229, options [nop,nop,TS val 457188 ecr 458065], length 3
        0x0000:  4500 0037 c652 4000 4006 ecd7 c0a8 0332
        0x0010:  c0a8 0314 bb52 2b67 4823 2dbc 15bb 1d27
        0x0020:  8018 00e5 286b 0000 0101 080a 0006 f9e4
        0x0030:  0006 fd51 350d 0a

13 TCPコネクションの同時接続数を指定する方法(-m)

13.1 TCPコネクションを1つに制限した場合

ncサーバが同時に接続できるクライアント数を1に制限してみます。

サーバ側(ターミナル1)
[root@server ~]# nc -m 1 -kl 11111

クライアントを2つ起動してみます。

クライアント側
[root@client ~]# nc server 11111
^Z
[10]+  停止                  nc server 11111
[root@client ~]# nc server 11111

もう1つ、サーバ側でターミナルをオープンします。
TCPコネクションを確認すると、1つしか確立できていないことがわかります。
なお、lsofコマンドは、ここ(lsofコマンドの使い方)を参照してください。

サーバ側(ターミナル2)
[root@server ~]# lsof -i:11111 -a -i4
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      22576 root    4u  IPv4  65459      0t0  TCP *:vce (LISTEN)
nc      22576 root    5u  IPv4  65505      0t0  TCP server:vce->client:53088 (ESTABLISHED)

13.2 TCPコネクションを2つに制限した場合

ncサーバが同時に接続できるクライアント数を2に制限してみます。

サーバ側(ターミナル1)
[root@server ~]# nc -m 2 -kl 11111

クライアントを3つ起動してみます。

クライアント側
[root@client ~]# nc server 11111
^Z
[13]+  停止                  nc server 11111
[root@client ~]# nc server 11111
^Z
[14]+  停止                  nc server 11111
[root@client ~]# nc server 11111

もう1つ、サーバ側でターミナルをオープンします。
TCPコネクションを確認すると、2つしか確立できていないことがわかります。

サーバ側(ターミナル2)
[root@server ~]# lsof -i:11111 -a -i4
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      23125 root    4u  IPv4  74753      0t0  TCP *:vce (LISTEN)
nc      23125 root    5u  IPv4  74755      0t0  TCP server:vce->client:53104 (ESTABLISHED)
nc      23125 root    6u  IPv4  74756      0t0  TCP server:vce->client:53106 (ESTABLISHED)

X 参考情報

Ncat Users' Guide
Useful netcat examples on Linux
オレオレ証明書をopensslで作る(詳細版)
ncatでSSLを使う方法
Lesson3:実際の通信はどうなってる?やりとりの詳細を見てみよう

hana_shin
写真は淡路島SAから明石海峡大橋を撮影したものです('19夏撮影)。'20年夏も3年連続で四国、大阪に行く予定!毎回車でいってます。今から楽しみぃ~。次は、四国の四万十川に行ってみたいけど、ちょっと遠いかな?最近はネットワークに力を入れてます。保有国家資格:ネットワークスペシャリスト、オンライン情報処理技術者。メールは hana.shin.2018@gmail.com まで。
https://hana-shin.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした