#
ドキュメント

Document

自分のための備忘録です。

ネットワークコマンド

UbuntuおよびDebianネットワーク関連コマンドインストール

$ apt update && apt install -y iproute2 iputils-ping net-tools tcpdump traceroute lsof

arp

ARPキャッシュを操作する。 ARPキャッシュとはIPアドレスとMACアドレスの対応

$ arp -n
// or
$ arp -an
  • a:Use alternate BSD style output format( $man arp
  • n:IPアドレスをドメインに変換しない

dig

以下どちらも正常に動作する(※ またリソースレコード名(例 MX は大文字・小文字のどちらでも良い)。

  • dig {{ドメイン}} MX
  • dig {{ドメイン}} -t MX

ネームサーバー( NS )を指定して問い合わせする。

$ dig {{ドメイン}} @{{name server}} MX
// 例
$ dig example.com @8.8.8.8 A

以下に注意する。

  • +noedns digで解決できなず(ANSWER SECTIONがない)、WARNING: EDNS query returned status FORMERR - retry with '+noedns'と表示されることがある。これはEDNSEDNS0という拡張プロトコルにフルサービスリゾルバが対応していない(ちなみにRTX 830に搭載されているフルサービスリゾルバは対応していない)ことが原因。+noednsをつけることで解決できる
  • +multiline SOA の問い合わせなどを行単位で詳細に表示する

ref.

$ dig example.com
//  レコードタイプを省略した場合はAレコード

※ Macでは-tオプションは省略できる。

Aレコードを知りたい

$ dig example.com -t A

NSを知りたい

$ dig example.com -t NS

TXTレコードをしりたい

$ dig example.com -t TXT

全レコードの設定を知りたい。

$ dig example.com -t ANY

名前解決に使用するNSを指定したい。

$ dig @ネームサーバー example.com
// 全レコードを知りたい
$ dig @ネームサーバー example.com -t ANY

名前解決をトレースしたい。

$ dig +trace example.com

逆引き

$ dig -x {{IPアドレス}}

whois

$ whois example.com

netns

ip netns

nc

nc(Netcat)はサーバ・クライアント方式の接続コマンド。 lオプションでポート番号を指定してサーバとして稼働する。
ポートはTCPのポート番号として稼働する。

サーバ側を稼働する。

$ nc -lnv 127.0.0.1 54321
Listening on 127.0.0.1 54321

クライアント側を稼働(サーバに接続)する。

$ nc 127.0.0.1 54321

サーバ側で接続を確認する。

$  nc -lnv 127.0.0.1 54321
Listening on 127.0.0.1 54321
Connection received on 127.0.0.1 33804

クライアント側でデータ送信する。

$ nc 127.0.0.1 54321
Hello World

サーバ側でデータ受信を確認する。

nc -lnv 127.0.0.1 54321
Listening on 127.0.0.1 54321
Connection received on 127.0.0.1 33804
Hello World
  • u:UDPで通信
  • l:サーバとして稼働
  • n:IPアドレスを名前解決しない
  • v:詳細を表示

UDPの例

サーバをUDPで稼働する。

$  nc -ulnv 127.0.0.1 54321
Listening on 127.0.0.1 54321

クライアントからUDPでデータ送信

$ nc -u 127.0.0.1 54321
Hello World

ss

  • ss:socket statistics

nampsslsofの違いは以下のとおり。

  • nmapは開いているポートをすべて表示
  • ss -atunLISTENしているポートを表示
  • lsof -iは実際にプロセスが使用しているポートを表示

ref. https://www.linuxmaster.jp/linux_skill/2009/02/linux-4.html

ss は socket statistics の略で、netstatに替わる Linux標準のネットワークの状態確認コマンドです。初期はバグが多いと話題になっていたようですが、現状では netstat と大きな違いはありません。

-- linux【ss/netstat】コマンドの見方/オプション~Recv-Q/Send-Qやポート確認(Listen/Estab/Unconn),プロセス表示等~

sudo ss -autnp


Netid            State                 Recv-Q             Send-Q                               Local Address:Port                                   Peer Address:Port
udp              UNCONN                0                  0                                    127.0.0.53%lo:53                                          0.0.0.0:*
udp              UNCONN                0                  0                                   10.0.0.1%eth0:68                                          0.0.0.0:*
tcp              LISTEN                0                  128                                  127.0.0.53%lo:53                                          0.0.0.0:*
tcp              LISTEN                0                  128                                        0.0.0.0:22                                          0.0.0.0:*
tcp              SYN-RECV              0                  0                                        10.0.0.1:22                                     203.0.113.15:36334
tcp              SYN-RECV              0                  0                                        10.0.0.1:22                                     203.0.113.15:53488
tcp              ESTAB                 0                  36                                       10.0.0.1:22                                   203.0.113.8:60827
tcp              SYN-RECV              0                  0                                        10.0.0.1:22                                     203.0.113.15:15598
tcp              LISTEN                0                  511                                              *:80                                                *:*
tcp              LISTEN                0                  128                                           [::]:22                                             [::]:*
tcp              LISTEN                0                  511                                              *:443                                               *:*
tcp              TIME-WAIT             0                  0                               [::ffff:10.0.0.1]:80                           [::ffff:xxx.xxx.xxx.xxx]:35642
tcp              TIME-WAIT             0                  0                               [::ffff:10.0.0.1]:80                           [::ffff:xxx.xxx.xxx.xxx]:41732

[::]はIPv6の00.00.00.00

-n : ポート番号をサービス名変換しない(例えば:httpと表示せず:80と表示する)
-l : Listen(待ち受け)ポートのみを表示する
-t : TCP を表示する
-u : UDP を表示する

linux【ss/netstat】コマンドの見方/オプション~Recv-Q/Send-Qやポート確認(Listen/Estab/Unconn),プロセス表示等~

-a, --all
Display both listening and non-listening (for TCP this means established connections) sockets.
-l, --listening
Display only listening sockets (these are omitted by default).
-p, --processes
Show process using socket.

-- man ss

lsof

iオプションはポートが開いていてもプロセスが使用していない場合は表示しない。

nampsslsofの違いは以下のとおり。

  • nmapは開いているポートをすべて表示
  • ss -atunLISTENしているポートを表示
  • lsof -iは実際にプロセスが使用しているポートを表示

ref. https://www.linuxmaster.jp/linux_skill/2009/02/linux-4.html

オープンしているファイルを一覧表示する

https://atmarkit.itmedia.co.jp/ait/articles/1904/18/news033.html

Linuxはすべてをファイルとして扱うのでどのポートが開いているかを調べることができる。

$ nc -l 127.0.0.1 54321
$ lsof -i:54321 -P -n
COMMAND   PID    USER   FD   TYPE            DEVICE SIZE/OFF NODE NAME
nc      20582 ubuntu    3u  IPv4 235529      0t0  TCP *:54321 (LISTEN)

-P ポート番号をサービス名に変換しない
-c プロセス名を指定する
-i ネットワークソケットファイルを指定する
-n IPアドレスを表示する(名前解決しない)
-p プロセスIDを指定する
-u ユーザー名を指定する

-- lsofコマンド入門

以下で実際にプロセスが使用しているポート番号を確認できる。

$ lsof -i -P -n
COMMAND    PID            USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd-n  394 systemd-network   19u  IPv4  20033      0t0  UDP 10.3.0.183:68
systemd-r  396 systemd-resolve   12u  IPv4  20061      0t0  UDP 127.0.0.53:53
systemd-r  396 systemd-resolve   13u  IPv4  20062      0t0  TCP 127.0.0.53:53 (LISTEN)
nginx      536            root    6u  IPv4  24029      0t0  TCP *:80 (LISTEN)
nginx      536            root    7u  IPv6  24030      0t0  TCP *:80 (LISTEN)
nginx      541        www-data    6u  IPv4  24029      0t0  TCP *:80 (LISTEN)
nginx      541        www-data    7u  IPv6  24030      0t0  TCP *:80 (LISTEN)
sshd       668            root    3u  IPv4  24936      0t0  TCP *:22 (LISTEN)
sshd       668            root    4u  IPv6  24947      0t0  TCP *:22 (LISTEN)
sshd      1058            root    4u  IPv4  28296      0t0  TCP 10.3.0.183:22->115.38.8.48:49527 (ESTABLISHED)
sshd      1164          ubuntu    4u  IPv4  28296      0t0  TCP 10.3.0.183:22->115.38.8.48:49527 (ESTABLISHED)
docker-pr 1242            root    4u  IPv4  29530      0t0  TCP *:8080 (LISTEN)
docker-pr 1247            root    4u  IPv6  29536      0t0  TCP *:8080 (LISTEN)
docker-pr 1382            root    4u  IPv4  30221      0t0  TCP *:8000 (LISTEN)
docker-pr 1388            root    4u  IPv6  30230      0t0  TCP *:8000 (LISTEN)

netstat

netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships

-- man netstat

$ netstat -autnp
  • a:listenしていないものも表示(listenしていないものとはコネクションが確立(ESTABLISHED)したものやSYN_RECVのもの)
  • n:IPアドレスをドメインに変換しない
  • p:プログラムのPIDを表示
  • r:カーネルルーティングテーブルを表示
  • t:TCPを表示
  • u:UTPを表示
  • w:ICMP・RAWを表示

例1 Listen状態のポート番号およびコネクションを表示

$ netstat -anptw
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address              State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*                    LISTEN      -
tcp        0      0 10.xxx.xxx.xxx:22       xxx.xxx.xxx.xxx:xxxx         SYN_RECV    -
tcp        0      0 10.xxx.xxx.xxx:22       124.xxx.xxx.xxx:xxxxx        ESTABLISHED -
tcp        0      0 10.xxx.xxx.xxx:22       yyyy.yyyy.yyyy.yyyy:xxxxx    SYN_RECV    -
tcp        0      0 10.xxx.xxx.xxx:22       yyyy.yyyy.yyyy.yyyy:xxxxx    SYN_RECV    -
tcp6       0      0 :::80                   :::*                         LISTEN      -
tcp6       0      0 :::22                   :::*                         LISTEN      -
tcp6       0      0 :::443                  :::*                         LISTEN      -
tcp6       0      0 10.xxx.xxx.xxx:80       zzz.zzz.zzz.zzz:xxxxx        TIME_WAIT   -
tcp6       0      0 10.xxx.xxx.xxx:80       zzz.zzz.zzz.zzz:xxxxx       TIME_WAIT   -
.....
.....

ref. netstatで表示される状態表示文字列の意味は?

SYN_RECV

SYN_RECV(SYN_RECEIVED)は、TCPの3ウェイハンドシェイクでSYN/ACKを送信したあとにACKを受信していない状態を表す。

今までクライアントとなるPCの話でしたが、インターネットに公開しているサーバーでもnetstatコマンドは使えます。インターネット上でWEBサーバーを稼働させている場合はクライアントとの通信で「ESTABLISHED」の状態がいくつかできるのですが、たまに「SYN_RECV」という中途半端な状態にさせられるときがあります(「SYN_RECV」は「ESTABLISHED」になる前の状態)。これはTCPで通信を始める際に3ウェイハンドシェイクという3回のやりとりをサーバーとクライアントで行うのですが、クライアントが途中でやりとりを中断してしまうことで起きます。そうするとサーバーはずっとクライアントからの返事を待ち続けサーバーのリソースを使い続けます。クライアントはこの状態をいくつも作らせサーバー側のリソースを枯渇させます。SYN flood攻撃 と呼ばれるものです。WEBサーバーで「SYN_RECV」を見つけたら、攻撃されていることを考えたほうがいいかもしれません。

-- netstatで外部との不正な通信を見極める(Linux)。

SYN floodなどで意図的にSYN_RECVになっている場合をハーフスキャンと呼ぶことがある。

TIME_WAIT

接続終了待ちの状態を指す。しばらくすると、CLOSEDへ移行する。
ref.https://www.itmedia.co.jp/help/tips/linux/l0610.html

ぜんぶTIME_WAITのせいだ!

例2)デフォルトゲートウェイを表示

実際にはデフォルトゲートウェイだけでなくルートテーブルを表示

$ netstat -rn

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.0.0.1        0.0.0.0         UG        0 0          0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
10.0.0.1        0.0.0.0         255.255.255.255 UH        0 0          0 eth0

ref. https://docs.oracle.com/cd/E19620-01/805-5857/troubleshoot6-19973/index.html

iptables

  • NetfilterというLinuxのネットワーク処理フレームワークのフロントエンドのひとつです。 -- TCP/IPネットワーク入門 p.151

  • 特定のパケットの転送を拒否または許可するための機能で、ファイアーウォールを実現する方法のひとつです。 -- TCP/IPネットワーク入門 p.151

// NATの設定を確認
$ iptables -t nat -L
  • t:ターゲット
  • L:設定内容表示

コマンド一覧

名前 意味
ifconfig ネットワークの概要
traceroute 経路取得
nslookup ドメインからIPアドレス取得
nslookup example.com Aレコード取得
nslookup -type=mx example.com MXレコード取得
nslookup -type=ns example.com NSサーバー取得
arp -a キャッシュしているMACアドレス一覧を表示します。
ping 【調査】
netstat 【調査】
traceroute traceroute example.com
route -n get example.com デフォルトゲートウェイを調べる
nmap 空いているポートを調べる 例:自身を調べる $nmap 127.0.0.1

逆引き

同一セグメントのホストを調べる

$ arp -a

デフォルトゲートウェイを調べる

デフォルトゲートウェイを調べるにはルートテーブルを調べる