ncコマンドでサービスの接続疎通確認

#はじめに
サービスの接続疎通確認はインフラ構築に必須作業内容です。
以前はping、telnetなどコマンドを利用しますが、セキュリティ制限など使えない場合があります。
ncコマンドを使うと便利です。
また、サーバのポート状況確認にはssコマンドも便利です。

http,httpsの確認はcurl、wgetなどのコマンドでHTMLを見えますので、良いと思います。
その以外はncコマンドで良いと思います。

#ncとは
ncはNetcatです。
Netcatは、Unix系OSコマンドラインアプリケーションの一つ。TCPやUDPのパケットを読み書きするバックエンドとして機能するツールです。

#インストール
Ubuntuなどは標準入っていますが、もし入っていない場合はインストール:
Ubuntuの例：
`apt -y install netcat`

#使い方
```shell
root@ubuntu:~# nc -help
OpenBSD netcat (Debian patchlevel 1.187-1ubuntu0.1)
usage: nc [-46CDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl]
          [-m minttl] [-O length] [-P proxy_username] [-p source_port]
          [-q seconds] [-s source] [-T keyword] [-V rtable] [-W recvlimit] [-w timeout]
          [-X proxy_protocol] [-x proxy_address[:port]]           [destination] [port]
        Command Summary:
                -4              Use IPv4
                -6              Use IPv6
                -b              Allow broadcast
                -C              Send CRLF as line-ending
                -D              Enable the debug socket option
                -d              Detach from stdin
                -F              Pass socket fd
                -h              This help text
                -I length       TCP receive buffer length
                -i interval     Delay interval for lines sent, ports scanned
                -k              Keep inbound sockets open for multiple connects
                -l              Listen mode, for inbound connects
                -M ttl          Outgoing TTL / Hop Limit
                -m minttl       Minimum incoming TTL / Hop Limit
                -N              Shutdown the network socket after EOF on stdin
                -n              Suppress name/port resolutions
                -O length       TCP send buffer length
                -P proxyuser    Username for proxy authentication
                -p port         Specify local port for remote connects
                -q secs         quit after EOF on stdin and delay of secs
                -r              Randomize remote ports
                -S              Enable the TCP MD5 signature option
                -s source       Local source address
                -T keyword      TOS value
                -t              Answer TELNET negotiation
                -U              Use UNIX domain socket
                -u              UDP mode
                -V rtable       Specify alternate routing table
                -v              Verbose
                -W recvlimit    Terminate after receiving a number of packets
                -w timeout      Timeout for connects and final net reads
                -X proto        Proxy protocol: "4", "5" (SOCKS) or "connect"
                -x addr[:port]  Specify proxy address and port
                -Z              DCCP mode
                -z              Zero-I/O mode [used for scanning]
        Port numbers can be individual or ranges: lo-hi [inclusive]
```

#MongoDBの27017ポートを接続できるかのコマンド
##失敗例
```shell
root@ubuntu:~# nc -v -w 1 172.18.98.153 27017
nc: connect to 172.18.98.153 port 27017 (tcp) failed: Connection refused
```
##成功例
```shell
root@ubuntu:~# nc -v -w 1 172.18.98.153 27017
Connection to 172.18.98.153 9000 port [tcp/*] succeeded!
```

#ファイルの送信、受信
##サーバに監視
```shell
nc -l 1234 > filename.out
```

##クライアントから送付
```shell
echo test > test.txt

nc -N 172.18.98.1531234 < test.txt
```

サーバ側のfilename.outを見ると、testというデータが受信できました。

#サーバにポートの確認
##ssコマンド
`ss -antu`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/5b932029-ea80-e6e0-c308-e81794a1694a.png)

これでサーバのポート状況を確認できます。ssコマンドは使いやすいですね。

```shell
root@ubuntu:~# ss -help
Usage: ss [ OPTIONS ]
       ss [ OPTIONS ] [ FILTER ]
   -h, --help          this message
   -V, --version       output version information
   -n, --numeric       don't resolve service names
   -r, --resolve       resolve host names
   -a, --all           display all sockets
   -l, --listening     display listening sockets
   -o, --options       show timer information
   -e, --extended      show detailed socket information
   -m, --memory        show socket memory usage
   -p, --processes     show process using socket
   -i, --info          show internal TCP information
   -s, --summary       show socket usage summary
   -b, --bpf           show bpf filter socket information
   -E, --events        continually display sockets as they are destroyed
   -Z, --context       display process SELinux security contexts
   -z, --contexts      display process and socket SELinux security contexts
   -N, --net           switch to the specified network namespace name

   -4, --ipv4          display only IP version 4 sockets
   -6, --ipv6          display only IP version 6 sockets
   -0, --packet        display PACKET sockets
   -t, --tcp           display only TCP sockets
   -S, --sctp          display only SCTP sockets
   -u, --udp           display only UDP sockets
   -d, --dccp          display only DCCP sockets
   -w, --raw           display only RAW sockets
   -x, --unix          display only Unix domain sockets
       --vsock         display only vsock sockets
   -f, --family=FAMILY display sockets of type FAMILY
       FAMILY := {inet|inet6|link|unix|netlink|vsock|help}

   -K, --kill          forcibly close sockets, display what was closed
   -H, --no-header     Suppress header line

   -A, --query=QUERY, --socket=QUERY
       QUERY := {all|inet|tcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|packet|netlink|vsock_stream|vsock_dgram}[,QUERY]

   -D, --diag=FILE     Dump raw information about TCP sockets to FILE
   -F, --filter=FILE   read filter information from FILE
       FILTER := [ state STATE-FILTER ] [ EXPRESSION ]
       STATE-FILTER := {all|connected|synchronized|bucket|big|TCP-STATES}
         TCP-STATES := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|closed|close-wait|last-ack|listening|closing}
          connected := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing}
       synchronized := {established|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing}
             bucket := {syn-recv|time-wait}
                big := {established|syn-sent|fin-wait-{1,2}|closed|close-wait|last-ack|listening|closing}
```

##netstatコマンド(歴史長い)
```shell
netstat -antu
```

-a：現在のすべての接続を表示する
-n：一切の名前解決を行わない
-t：TCPポートを表示する
-u：UDPポートを表示する



参考URL：http://manpages.ubuntu.com/manpages/bionic/man1/nc_openbsd.1.html

以上