コンテンツにスキップ

ネットワーク系@パッケージ

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. dig

digとは

正引きの名前解決を実行する

$ dig yahoo.co.jp

# Header
# 各セクションのステータスやフラグが表示される。
; <<>> DiG 9.10.6 <<>> yahoo.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23877 # 『NOERROR』は、正引きが成功したことを表す。
;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512

# Questionセクション
;; QUESTION SECTION:
;yahoo.co.jp.                   IN      A # Aレコードを問い合わせたことを表す。

# Answerセクション
# DNSレコード
;; ANSWER SECTION:
yahoo.co.jp.            35      IN      A       182.22.28.252 # 正引きで返却されたIPアドレスを表す。
yahoo.co.jp.            35      IN      A       182.22.16.251
yahoo.co.jp.            35      IN      A       183.79.217.124
yahoo.co.jp.            35      IN      A       183.79.219.252
yahoo.co.jp.            35      IN      A       183.79.250.123
yahoo.co.jp.            35      IN      A       182.22.25.124
yahoo.co.jp.            35      IN      A       183.79.250.251
yahoo.co.jp.            35      IN      A       182.22.25.252

# 正引きにかかった時間を表す。
;; Query time: 7 msec
# 正引きに利用したDNSサーバーを表す。
# digコマンドのパラメーターでDNSサーバーを指定しない場合、digコマンドの実行元によって、異なるDNSサーバーが利用される。
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon May 30 22:33:44 JST 2022
;; MSG SIZE  rcvd: 168


-x

逆引きの名前解決を実行する。

$ dig -x 182.22.28.252

; <<>> DiG 9.10.6 <<>> -x 182.22.28.252
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 9847
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;252.28.22.182.in-addr.arpa.    IN      PTR

# AUTHORITYセクション
# 権威DNSサーバーを表す。ドメイン名がわかる。
;; AUTHORITY SECTION:
28.22.182.in-addr.arpa. 663     IN      SOA     yahoo.co.jp. postmaster.yahoo.co.jp. 2202070000 1800 900 1209600 900

;; Query time: 7 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon May 30 22:47:07 JST 2022
;; MSG SIZE  rcvd: 113


02. dnsutils/bind-utils

インストール

▼ aptリポジトリから

$ apt install dnsutils
$ apt-get install dnsutils

▼ yumリポジトリから

$ yum install -y bind-utils


nslookup

▼ nslookupとは

正引き/逆引きによる名前解決を実行する。

もしドメイン名に複数のIPアドレスが割り当てられている場合、正引きを実行すると、全てのIPアドレスが返却される。

▼ オプション無し

*例*

# 正引き
$ nslookup google.co.jp

# 非権威DNSサーバー (キャッシュDNSサーバー) からの返信
Non-authoritative answer:
Server:  UnKnown
Address:  2400:2650:7e1:5a00:1111:1111:1111:1111

Name:  google.co.jp
Addresses:  2404:6800:4004:80f::2003 # IPv6アドレス
            172.217.175.3            # IPv4アドレス
# 逆引き
$ nslookup 172.217.175.3

Server:  UnKnown
Address:  2400:2650:7e1:5a00:1111:1111:1111:1111

Name:  nrt20s18-in-f3.1e100.net # IPv4アドレスにマッピングされたドメイン名
Address:  172.217.175.3 # IPv4アドレス

権威DNSサーバーを使用して名前解決する場合、引数なしでnslookupコマンドを実行する。

$ nslookup

# 入力を求められるため、権威DNSサーバーを指定する。
>  server ns1.google.com
Default server: ns1.google.com
Address: 216.239.32.10#53
Default server: ns1.google.com
Address: 2001:4860:4802:32::a#53

# 入力を求められるため、権威DNSサーバーにドメインを問い合わせる。
> google.co.jp
Server:         ns1.google.com
Address:        216.239.32.10#53

Name:   google.co.jp
Address: 142.251.42.131

▼ -type

正引き/逆引きによる名前解決を行い、この時に指定したDNSレコードタイプのレコード値を返却させる。

*例*

名前解決を行い、NSレコード値を返却させる。

$ nslookup -type=NS google.co.jp

Non-authoritative answer:
Server:  UnKnown
Address:  2400:2650:7e1:5a00:1111:1111:1111:1111

google.co.jp    nameserver = ns3.google.com
google.co.jp    nameserver = ns4.google.com
google.co.jp    nameserver = ns2.google.com
google.co.jp    nameserver = ns1.google.com

ns1.google.com  AAAA IPv6 address = 2001:4860:4802:32::a
ns2.google.com  AAAA IPv6 address = 2001:4860:4802:34::a
ns3.google.com  AAAA IPv6 address = 2001:4860:4802:36::a
ns4.google.com  AAAA IPv6 address = 2001:4860:4802:38::a
ns1.google.com  internet address = 216.239.32.10
ns2.google.com  internet address = 216.239.34.10
ns3.google.com  internet address = 216.239.36.10
ns4.google.com  internet address = 216.239.38.10
(root)  ??? unknown type 41 ???


03. net-tools

インストール

▼ aptリポジトリから

$ apt install net-tools
$ apt-get install net-tools

▼ yumリポジトリから

$ yum install -y net-tools


接続状態の一覧


netstat

▼ -plunt

オプション (-p-l-u-n-t) の組み合わせ。各プロセスが開放しているポート番号、ポート番号で受信するプロトコル、接続状態、などの一覧を取得する。

$ netstat -plunt

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:15090           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:15090           0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:15000         0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:15001           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:15001           0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:15004         0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:15006           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:15006           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:15021           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:15021           0.0.0.0:*               LISTEN      -
tcp6       0      0 :::9000                 :::*                    LISTEN      1/php-fpm: master p
tcp6       0      0 :::15020                :::*                    LISTEN      -


04. speedtest-cli

インストール

▼ aptリポジトリから

$ apt install speedtest-cli

▼ brewリポジトリから

$ brew install speedtest-cli


speedtest-cliとは

SPEEDTESTのAPIを使用して、ダウンロード (下り) とアップロード (上り) のスループットを解析する。

$ speedtest-cli

Testing download
Download: 168.61 Mbit/s # ダウンロード速度

Testing upload
Upload: 182.00 Mbit/s # アップロード速度


05. tcpdump

インストール

▼ aptリポジトリから

$ apt install tcpdump
$ apt-get install tcpdump

▼ yumリポジトリから

$ yum install -y tcpdump


tcpdumpとは

今現在処理されているパケット (インバウンド通信とアウトバウンド通信) の情報を取得する。

パケットの送信元と宛先から、送信元からのリクエスト (pingnccurl、など) が届いているかを確認する。

最初の3行はスリーウェイハンドシェイクを表す。

$ tcpdump

[時間] IP [送信元IPアドレス].[シーケンス番号] > [宛先サーバー].[ポート番号]: [パケットの説明]

インバウンド通信のみ、あるいはアウトバウンド通信のみのパケットを取得するのはやや面倒である。

*例*

スリーウェイハンドシェイクのパケットの例。

# クライアントからサーバーへのSYNCリクエスト
09:36:20.760358 IP 10.0.1.23.65428 > 93.184.216.119.http: Flags [S], seq 2250708012, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 938288017 ecr 0,sackOK,eol], length 0

# サーバーからクライアントへのACKリクエストとSYNリクエスト
09:36:20.885412 IP 93.184.216.119.http > 10.0.1.23.65428: Flags [S.], seq 1676582138, ack 2250708013, win 14600, options [mss 1400,nop,nop,sackOK,nop,wscale 6], length 0

# クライアントからサーバーへのACKリクエスト
09:36:20.885482 IP 10.0.1.23.65428 > 93.184.216.119.http: Flags [.], ack 1, win 16384, length 0


awkコマンドやgrepコマンドと組み合わせると、特定のIPアドレスを送信元/宛先としたパケットがあるか否かを検出できる。

$ tcpdump <コマンド/オプション> \
    | awk -F ' ' '{print $3}' \
    | grep <特定のIPアドレス>

*例*

pingコマンドの宛先で、通信を受信できていることを確認する。

# デフォルトでは、eth0のパケットを確認する。
$ tcpdump icmp -i eth0


-i <ネットワークインターフェース名>

指定したネットワークインターフェースにて、パケットを取得する。-iオプションを使用しない場合、全てのネットワークインターフェースが扱うパケットを取得することになる。

$ tcpdump -i eth0


-nn <プロトコル名>

全てのネットワークインターフェースにて、指定したプロトコルを使用したパケットを取得する。

$ tcpdump -nn ip


-nn

▼ port

全てのネットワークインターフェースにて、指定したポート番号に対するパケットを取得する。

$ tcpdump -nn port 80


dst

▼ dst

パケットを宛先情報でフィルタリングし、パケットを取得する。

▼ port

指定したポート番号を宛先とするパケットのみを取得する。

$ tcpdump dst port 80


src

▼ src

パケットを送信元情報でフィルタリングし、パケットを取得する。

▼ port

指定したポート番号を送信元とするパケットのみを取得する。

$ tcpdump src port 80


06. traceroute

tracerouteとは

宛先にUDPプロトコル/ICMPプロトコル (デフォルトはUDPプロトコル) でパケットを送信し、通信の送信元から宛先までに通過するルーターの送信元IPアドレスを取得する。

traceroute

*例*

UDPプロトコルを使用して、パケットを送信する。

もし、tracerouteコマンドが終了すれば、全てのルーターを経由できていることを表す。

$ traceroute google.com

traceroute to google.com (173.194.38.98), 30 hops max, 60 byte packets # 最大30ホップ数 (ルーター数)
 1  example.com (aaa.bbb.ccc.ddd)  1.016 ms  2.414 ms  2.408 ms # 最初のルーターの送信元IPアドレス

 ...

 8  209.85.251.239 (209.85.251.239)  2.357 ms  2.595 ms  2.475 ms # 最後のルーターの送信元IPアドレス
 9  nrt19s18-in-f2.1e100.net (173.194.38.98)  1.812 ms  1.849 ms  1.955 ms # 宛先のサーバー
$ traceroute 173.194.38.98

traceroute to 173.194.38.98 (173.194.38.98), 30 hops max, 60 byte packets # 最大30ホップ数 (ルーター数)
 1  example.com (aaa.bbb.ccc.ddd)  1.016 ms  2.414 ms  2.408 ms # 最初のルーターの送信元IPアドレス

 ...

 8  209.85.251.239 (209.85.251.239)  2.357 ms  2.595 ms  2.475 ms # 最後のルーターの送信元IPアドレス
 9  nrt19s18-in-f2.1e100.net (173.194.38.98)  1.812 ms  1.849 ms  1.955 ms # 宛先のサーバー

アスタリスクは検証が実行中であることを表し、アスタリスクのまま変わらない場合は、それ以降のルーターに通信が届いていない可能性がある。

$ traceroute google.com

traceroute to google.com (173.194.38.98), 30 hops max, 60 byte packets
 1  example.com (aaa.bbb.ccc.ddd)  1.016 ms  2.414 ms  2.408 ms # 最初のルーターの送信元IPアドレス

...

 4  b-4ea-b13-1-e-0-1-0.interq.or.jp (210.172.131.149)  2.227 ms  2.218 ms  # このルーターまでは届く
 5  *  *  *                                                                 # その後失敗
 6  *  *  *
...


-I

ICMPプロトコルを使用して、パケットを送信する。

TCPプロトコルの一種である。

*例*

$ traceroute -I -n google.com -p 443

$ traceroute -I -n *.*.*.* -p 443


-n

IPアドレスの名前解決を実行せずに、ルーターの送信元IPアドレスをそのまま取得する。

ネットワークの境目がわかりやすくなる。

*例*

$ traceroute -n google.com

traceroute to google.com (173.194.38.105), 30 hops max, 60 byte packets
 1  157.7.140.2  0.916 ms  1.370 ms  1.663 ms # 最初のルーターの送信元IPアドレス
 2  210.157.9.233  0.633 ms  0.735 ms  0.740 ms # ここで、異なるネットワーク領域に入った可能性
 3  210.157.9.209  0.718 ms  0.722 ms  0.761 ms
 4  210.172.131.149  1.520 ms  1.894 ms  1.892 ms
 5  210.172.131.118  0.652 ms  0.645 ms  0.619 ms
 6  210.171.224.96  1.499 ms  1.705 ms  1.587 ms
 7  209.85.243.58  1.575 ms  1.558 ms  1.557 ms # ここで、異なるネットワーク領域に入った可能性
 8  209.85.251.239  2.383 ms  2.740 ms  2.400 ms
 9  173.194.38.105  2.165 ms  1.719 ms  1.840 ms # 最後のルーター


-p

ポート番号を指定する。

デフォルト値は、33434番ポートである。

*例*

$ traceroute *.*.*.* -p 9000


-T

宛先にTCPスリーウェイハンドシェイクを実行したり、HTTPやHTTPSでパケットを送信する。

その後、通信の送信元から宛先までに通過するルーターの送信元IPアドレスを取得する。

tracerouteコマンドではUDPプロトコルで送信するため、ネットワークが正常でもそれ以外 (ファイアウォールなど) のところで通信できない場合がある。

*例*

$ traceroute google.com -T -p 443

$ traceroute *.*.*.* -T -p 443


06-02. tracerouteの代わり

tracepath

*例*

$ tracepath -n google.com

1: [LOCALHOST]                                       pmtu 9001
1:  *.*.*.*                                           0.200ms pmtu 1500
1:  no reply
2:  no reply
3:  no reply
4:  no reply
5:  no reply


tcptraceroute

▼ tcptracerouteとは

tracerouteコマンドのバージョンによっては、-Tオプションがない場合があり、代わりとしてtcptracerouteコマンドを使用する。

*例*

$ tcptraceroute google.com 443

▼ -s、-p

送信元のIPアドレスやポート番号を指定する。

宛先ではないことに注意する。

$ tcptraceroute *.*.*.* -p 80