hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

tcpdumpの使い方(パケットファイルの切り替え方法)

1 はじめに

tcpdumpを実行すると、採取したパケットがパケットファイルに保存されます。 保存するディレクトリには容量の制限があるため、そのままtcpdumpを実行し続けることはできません。 また、途中でtcpdumpを終了すると、採取したいパケットがパケットファイルに保存できません。 そのため、パケットファイルをリングバッファのように順次切り替えながら使う必要があります。 ここでは、パケットファイルを時間で切り替える方法とサイズで切り替える方法について説明します。

なお、tcpdumpの基本的な使い方は、tcpdumpの使い方(基本編) - hana_shinのLinux技術ブログを参照してください。

2 検証環境

2. 1 ネットワーク構成

サーバとクライアントの2台構成です。図中のens33はNICの名前です。

                          192.168.2.0/24
client(ens33) -------------------------------------(ens33) server
        .115                                       .120

2.2 版数

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

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

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

2.3 tcpdumpの版数

コマンドの確認方法がわからないので、パッケージ版数を以下に示します。

[root@server ~]# rpm -qa|grep tcpdump
tcpdump-4.9.2-4.el7_7.1.x86_64

3 時間でパケットファイルを切り替える方法

一定の時間が経過したら、tcpdumpが出力するパケットファイルを切り替える方法について説明します。

3.1 事前準備

パケットファイルを保存するディレクトリを作成します。

[root@server ~]# mkdir /tcpdump

ディレクトリの所有者をtcpdumpに変更します。

[root@server ~]# chown tcpdump:tcpdump /tcpdump

ディレクトリの所有者を確認します。 ディレクトリの所有者がtcpdumpになっていることがわかります。

[root@server ~]# ls -ld /tcpdump/
drwxr-xr-x. 2 tcpdump tcpdump 6 12月 24 18:30 /tcpdump/

次に、ディレクトリに保存できるパケットファイルの数を3に制限するシェルスクリプトを作成します。

[root@server ~]# vi /usr/local/bin/tcpdump_time_limit.sh
[root@server ~]# cat /usr/local/bin/tcpdump_time_limit.sh
#!/usr/bin/bash
file_num=$(ls /tcpdump/tcpdump*.cap|wc -l)

if [ $file_num -gt 3 ]; then
  file_name=$(ls -tr /tcpdump/tcpdump*.cap|head -n 1)
  rm -f $file_name
fi

シェルスクリプトの所有者をtcpdumpに変更します。

[root@server ~]# chown tcpdump:tcpdump /usr/local/bin/tcpdump_time_limit.sh

シェルスクリプトパーミッションを744に変更します。

[root@server ~]# chmod 744 /usr/local/bin/tcpdump_time_limit.sh

シェルスクリプトの所有者、パーミッションを確認します。

[root@server ~]# ls -l /usr/local/bin/tcpdump_time_limit.sh
-rwxr--r--. 1 tcpdump tcpdump 165 12月 24 18:31 /usr/local/bin/tcpdump_time_limit.sh

3.2 実験結果

tcpdumpディレクトリに移動します。

[root@server ~]# cd /tcpdump/
[root@server tcpdump]#

tcpdumpを実行します。 このとき、-Gオプションを指定して、5秒毎にパケットファイルを切り替えます。

[root@server tcpdump]# tcpdump -i ens33 -G 5 -w tcpdump_%Y%m%d_%H%M%S.cap -z /usr/local/bin/tcpdump_time_limit.sh

もう1つターミナルを開きます。lsコマンドを実行します。 パケットファイルの末尾2桁が秒を表しています。

[root@server tcpdump]# ls -l
合計 8
-rw-r--r--. 1 tcpdump tcpdump 1860 12月 24 18:44 tcpdump_20211224_184426.cap
-rw-r--r--. 1 tcpdump tcpdump  766 12月 24 18:44 tcpdump_20211224_184431.cap
-rw-r--r--. 1 tcpdump tcpdump    0 12月 24 18:44 tcpdump_20211224_184437.cap

再度lsコマンドを実行します。 5秒毎にパケットファイルが切り替わっていることがわかります。

[root@server tcpdump]# ls -l
合計 8
-rw-r--r--. 1 tcpdump tcpdump 1860 12月 24 18:44 tcpdump_20211224_184426.cap
-rw-r--r--. 1 tcpdump tcpdump  766 12月 24 18:44 tcpdump_20211224_184431.cap
-rw-r--r--. 1 tcpdump tcpdump    0 12月 24 18:44 tcpdump_20211224_184437.cap

4 サイズでパケットファイルを切り替える方法

パケットファイルのサイズが指定したサイズになったら、パケットファイルを別のパケットファイルに切り替える方法について説明します。

4.1 事前準備

パケットファイルを保存するディレクトリを作成します。

[root@server ~]# mkdir /tcpdump

ディレクトリの所有者をtcpdumpに変更します。

[root@server ~]# chown tcpdump:tcpdump /tcpdump

ディレクトリの所有者を確認します。 ディレクトリの所有者がtcpdumpになっていることがわかります。

[root@server ~]# ls -ld /tcpdump/
drwxr-xr-x. 2 tcpdump tcpdump 6 12月 24 19:33 /tcpdump/

次に、ディレクトリに保存できるパケットファイルの数を3に制限するシェルスクリプトを作成します。 3章で作成したシェルスクリプトとパケットファイルの指定方法が微妙に違うので注意してください。

[root@server ~]# vi /usr/local/bin/tcpdump_size_limit.sh
[root@server ~]# cat /usr/local/bin/tcpdump_size_limit.sh
#!/usr/bin/bash
file_num=$(ls /tcpdump/tcpdump.cap* | wc -l)

if [ $file_num -gt 3 ]; then
  file_name=$(ls -tr /tcpdump/tcpdump.cap* | head -n 1)
  rm -f $file_name
fi

シェルスクリプトの所有者をtcpdumpに変更します。

[root@server ~]# chown tcpdump:tcpdump /usr/local/bin/tcpdump_size_limit.sh

シェルスクリプトパーミッションを744に変更します。

[root@server ~]# chmod 744 /usr/local/bin/tcpdump_size_limit.sh

シェルスクリプトの所有者、パーミッションを確認します。

[root@server ~]# ls -l /usr/local/bin/tcpdump_size_limit.sh
-rwxr--r--. 1 tcpdump tcpdump 165 12月 24 19:34 /usr/local/bin/tcpdump_size_limit.sh

4.2 実験結果

tcpdumpディレクトリに移動します。

[root@server ~]# cd /tcpdump/
[root@server tcpdump]#

tcpdumpを実行します。 このとき、-Cオプションを指定して、パケットファイルのサイズ(M単位)を指定します。 ここでは、パケットファイルのサイズを1Mに指定しています。

[root@server tcpdump]# tcpdump -i ens33 -C 1 -w tcpdump.cap -z /usr/local/bin/tcpdump_size_limit.sh

サーバに対してflood pingを実行します。 pingの使い方は、 pingコマンドの使い方 - hana_shinのLinux技術ブログを参照ください。

[root@client ~]# ping -f 192.168.2.100
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.

lsコマンドを実行します。 パケットファイルのサイズが1Mであることがわかります。 なお、サイズを指定した場合、パケットファイルの拡張子が"cap数字"となってしまいます。 拡張子をcapにできる方法をご存じの方がいましたら、教えてください。

[root@server tcpdump]# ls -l
合計 2408
-rw-r--r--. 1 tcpdump tcpdump 1000070 12月 24 20:08 tcpdump.cap16
-rw-r--r--. 1 tcpdump tcpdump 1000066 12月 24 20:08 tcpdump.cap17
-rw-r--r--. 1 tcpdump tcpdump  458752 12月 24 20:08 tcpdump.cap18
[root@server tcpdump]# ls -l
合計 2012
-rw-r--r--. 1 tcpdump tcpdump 1000110 12月 24 20:09 tcpdump.cap22
-rw-r--r--. 1 tcpdump tcpdump 1000086 12月 24 20:09 tcpdump.cap23
-rw-r--r--. 1 tcpdump tcpdump   53248 12月 24 20:09 tcpdump.cap24

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

tasksetコマンドの使い方

1 tasksetコマンドとは?

指定したCPUでプロセスを起動したり、動作中のプロセスが使用しているCPUを変更したりすることができるコマンドです。

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

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

仮想マシンの搭載CPU数を確認します。搭載CPU数は4個であることがわかります。

[root@server ~]# cat /proc/cpuinfo |grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

3 インストール方法

util-linuxパッケージをインストールします。

[root@server ~]# yum -y install util-linux

tasksetコマンドの版数を確認します。

[root@server ~]# taskset --version
taskset from util-linux 2.23.2

4 オプション一覧

[root@server ~]# taskset -h
使い方: taskset [オプション] [mask | cpu-list] [pid|cmd [引数...]]

Options:
 -a, --all-tasks         operate on all the tasks (threads) for a given pid
 -p, --pid               operate on existing given pid
 -c, --cpu-list          display and specify cpus in list format
 -h, --help              display this help
 -V, --version           output version information

The default behavior is to run a new command:
    taskset 03 sshd -b 1024
You can retrieve the mask of an existing task:
    taskset -p 700
Or set it:
    taskset -p 03 700
List format uses a comma-separated list instead of a mask:
    taskset -pc 0,3,7-11 700
Ranges in list format can take a stride argument:
    e.g. 0-31:2 is equivalent to mask 0x55555555

詳細情報は、taskset(1) を確認してください。

5 指定したCPUでプロセスを起動する方法

tasksetコマンドの書式は以下のとおりです。

# taskset -c X <コマンド>
    (*) XはCPUの番号(0,1,2...)を指定する。

5.1 単一CPUでプロセスを起動する方法

stressプロセスをCPU0で起動してみます。 なお、stressコマンドの使い方はstressコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# taskset -c 0 stress -c 1 -q &
[1] 4415

psコマンドを使って、プロセスが使用しているCPUを確認します。 stressの親プロセス、子プロセスともにCPU0を使用していることがわかります。 また親プロセスはdo_waitカーネル関数を呼び出してスリープしています。 do_waitカーネル関数はwaitシステムコールの延長で呼び出されるカーネル関数です。 そのため、CPU使用率は0%となっています。 一方、子プロセスはCPU使用率が100%になっています。 psコマンドの使い方はこちらを参照してください。 なお、WCHANでカーネル関数を表示するには、kernel-debuginfoパッケージをインストールする必要があります。

[root@server ~]# ps -C stress -o comm,pid,ppid,psr,%cpu,wchan
COMMAND            PID   PPID PSR %CPU WCHAN
stress            4415   2146   0  0.0 do_wait
stress            4416   4415   0  100 -

このとき、子プロセスが何をしているか確認します。 まず、straceを使ってどのようなシステムコールを実行しているか確認します。 straceの実行結果が出力されないので、システムコールを実行していないことがわかります。 なお、straceコマンドの使い方は、straceコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# strace -p 4416
strace: Process 4416 attached

次に、ltraceを実行します。stressプロセスはrand関数を実行していることがわかります。 ltraceはプロセスが実行する関数(glibc等)を出力するコマンドです。 なお、システムコールと関数は次の点で全く違います。 システムコールを実行すると、プロセスがユーザモードとカーネルモードを切り替えて動作しますが、 関数を実行すると、プロセスはユーザモードだけで動作します。

[root@server ~]# ltrace -p 4416
rand()                                                                    = 1174652688
rand()                                                                    = 1686559875
rand()                                                                    = 938217751

なお、rand関数のパラメータが空白になっていますが、(多分)glibcのdebuginfoパッケージをインストールするとパラメータが表示されると思います。

5.2 指定した複数CPUでプロセスを起動する方法

複数CPUでプロセスを起動する書式は以下のようになります。

# taskset -c X,Y,Z... <コマンド>
    (*) X,Y,ZはCPUの番号(0,1,2...)を指定する。

stressプロセスをCPU0,2で動作させてみます。

[root@server ~]# taskset -c 0,2 stress -c 1 -q &
[1] 7741

psコマンドを使って、プロセスが動作しているCPUを確認します。 stressの親プロセスがCPU0、子プロセスがCPU2で動作していることがわかります。

[root@server ~]# ps -C stress -o comm,pid,ppid,psr,wchan
COMMAND            PID   PPID PSR WCHAN
stress            7741   6329   0 do_wait
stress            7742   7741   2 -

後始末をします。

[root@server ~]# pkill stress
[1]+  Terminated              taskset -c 0,2 stress -c 1 -q

6 動作中プロセスが使用しているCPUを変更する方法

stressコマンドを実行して、stressプロセスを4つ生成します。 生成するプロセスはrand()を繰り返し実行し、ユーザ空間のCPU使用率が100%程度になります。

[root@server ~]# stress -c 4 -q&
[1] 8137

psコマンドを使って、プロセスが動作しているCPUを確認します。 stressの親プロセスがCPU1,子プロセスがCPU0,1,2,3でそれぞれ動作していることがわかります。

[root@server ~]# ps -C stress -o comm,pid,ppid,psr,wchan
COMMAND            PID   PPID PSR WCHAN
stress            8137   6329   1 do_wait  ★親プロセス
stress            8138   8137   2 -              ★子プロセス
stress            8139   8137   1 -              ★子プロセス
stress            8140   8137   0 -              ★子プロセス
stress            8141   8137   3 -              ★子プロセス

子プロセス(PID=8138)をCPU2からCPU0で動作するように変更してみます。

[root@server ~]# taskset -pc 0 8138
pid 8138's current affinity list: 0-3
pid 8138's new affinity list: 0

psコマンドを使って、プロセスが動作しているCPUを確認します。 子プロセス(PID=8138)がCPU2からCPU0に移動したことがわかります(★印)。

[root@server ~]# ps -C stress -o comm,pid,ppid,psr,wchan
COMMAND            PID   PPID PSR WCHAN
stress            8137   6329   1 do_wait
stress            8138   8137   0 - ★
stress            8139   8137   1 -
stress            8140   8137   2 -
stress            8141   8137   3 -

後始末をします。

[root@server ~]# pkill stress
[1]+  Terminated              stress -c 4 -q

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

sshdのポート番号変更方法

1 はじめに

sshdのポート番号を22番(デフォルト)から22222番に変更してみます。 ここでは、例として22222番ポートを使用してみます。 ポート番号変更は、セキュリティ対策が主な目的です。

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

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

SELinuxは、サーバ/クライアントともに有効にしています。

[root@server ~]# getenforce
Enforcing

3 サーバの設定変更

3.1 空きポート番号の確認

lsofコマンドを実行します。22222番ポートが使用されていないことを確認します。 もし他のアプリが22222番ポートを使用していたら、使用していないポート番号をlsofコマンドで探してください。 他のアプリが使用するポート番号と重複しないように注意してください。 なお、lsofコマンドの使い方は、lsofコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# lsof -i:22222
[root@server ~]#

3.2 sshdの設定ファイル変更

sshdの設定ファイル(sshd_config)を以下のように変更します。 ポート番号をデフォルトの22番から22222番に変更します。

[root@server ~]# cat /etc/ssh/sshd_config
#Port 22
Port 22222

設定ファイルの構文チェックをします。

[root@server ~]# sshd -t
[root@server ~]#

3.3 SELinuxの設定変更

設定ファイルに下記説明があります。

[root@server ~]# cat /etc/ssh/sshd_config
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#

上記説明にしたがって、ポート番号を変更したら、semanageコマンドを実行します。

[root@server ~]# semanage port -a -t ssh_port_t -p tcp 22222
[root@server ~]# 

3.4 設定ファイルの再読み込み

設定ファイルを変更したので、設定ファイルを再読み込みします。

[root@server ~]# systemctl reload sshd.service

sshdのポート番号を確認します。 sshdが22222番ポートでListenしていることがわかります。

[root@server ~]# lsof -i4:22222 -a -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1084 root    3u  IPv4  46759      0t0  TCP *:22222 (LISTEN)

3.5 ポートの開放

新しく定義した22222番ポートへのアクセスを許可するため、 firewall-cmdコマンドを使って、22222番ポートを開放します。

[root@server ~]# firewall-cmd --permanent --add-port=22222/tcp
success

次に、パーマネントルールをランタイムルールに展開します。

[root@server ~]#  firewall-cmd --reload
success

最後に、ポート番号を確認します。 22222番ポートへのアクセスが許可されていることがわかります。

[root@server ~]# firewall-cmd --list-ports
22222/tcp

3.6 ポートのクローズ

sshdのポート番号を確認します。sshdはデフォルトで22番ポートを使用しています。

[root@server ~]# firewall-cmd --list-services
dhcpv6-client ssh

なお、dhcpv6-clientやsshはサービス名です。 サービス名は/etc/servicesで確認することができます。 たとえば、sshは以下のように定義されています。

[root@server ~]# cat /etc/services 
ssh             22/tcp                          # The Secure Shell (SSH) Protocol

22番ポートは、もう必要ないのでクローズします。

[root@server ~]# firewall-cmd --remove-service=ssh
success

ポート番号を確認します。

[root@server ~]# firewall-cmd --list-services
dhcpv6-client

4 サーバにsshでログイン

4.1 その1(-p ポート番号)

[root@client ~]# ssh -p 22222 root@192.168.2.100
root@192.168.2.100's password:
Last login: Thu Dec 23 18:34:40 2021 from desktop-mb6g4ki
[root@server ~]#

サーバ側でTCPコネクションの状態を確認してみます。 クライントがサーバの22222番ポートでTCPコネクションを確立していることがわかります。

[root@server ~]# lsof -i:22222 -a -nP
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1084 root    3u  IPv4  46759      0t0  TCP *:22222 (LISTEN)
sshd    1084 root    4u  IPv6  46761      0t0  TCP *:22222 (LISTEN)
sshd    3299 root    3u  IPv4  47023      0t0  TCP 192.168.2.100:22222->192.168.2.105:38496 (ESTABLISHED)

4.2 その2(-o Port=ポート番号)

[root@client ~]# ssh -o Port=22222 root@192.168.2.100
root@192.168.2.100's password:
Last login: Thu Dec 23 20:21:45 2021 from 192.168.2.105
[root@server ~]#

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

digコマンドの使い方

1 digコマンドとは?

digコマンドは、DNSサーバ(*)に対して問い合わせを行い、その結果を表示します。 権威DNSサーバに問い合わせをする場合は、+norecurseオプションを指定します。

(*) キャッシュDNSサーバ、および権威DNSサーバのことを意味します。

その他、以下の記事も作成しました。
BINDの使い方(ゾーン転送) - hana_shinのLinux技術ブログ
BINDの使い方(TSIG) - hana_shinのLinux技術ブログ
DNSSECコマンドの使い方 - hana_shinのLinux技術ブログ

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

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

検証で使用したキャッシュDNSサーバのIPアドレスは192.168.2.1です。

[root@server ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search flets-east.jp iptvf.jp
nameserver 192.168.2.1
nameserver 240b:11:4462:b10:6ab:18ff:fe77:63df

3 インストール方法

bind-utilsパッケージをインストールします。

[root@server ~]# yum -y install bind-utils

版数を確認します。

[root@server ~]# dig -v
DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8

4 オプション一覧

[root@server ~]#  dig -h
Usage:  dig [@global-server] [domain] [q-type] [q-class] {q-opt}
            {global-d-opt} host [@local-server] {local-d-opt}
            [ host [@local-server] {local-d-opt} [...]]
Where:  domain    is in the Domain Name System
        q-class  is one of (in,hs,ch,...) [default: in]
        q-type   is one of (a,any,mx,ns,soa,hinfo,axfr,txt,...) [default:a]
                 (Use ixfr=version for type ixfr)
        q-opt    is one of:
                 -4                  (use IPv4 query transport only)
                 -6                  (use IPv6 query transport only)
                 -b address[#port]   (bind to source address/port)
                 -c class            (specify query class)
                 -f filename         (batch mode)
                 -i                  (use IP6.INT for IPv6 reverse lookups)
                 -k keyfile          (specify tsig key file)
                 -m                  (enable memory usage debugging)
                 -p port             (specify port number)
                 -q name             (specify query name)
                 -t type             (specify query type)
                 -u                  (display times in usec instead of msec)
                 -x dot-notation     (shortcut for reverse lookups)
                 -y [hmac:]name:key  (specify named base64 tsig key)
        d-opt    is of the form +keyword[=value], where keyword is:
                 +[no]aaflag         (Set AA flag in query (+[no]aaflag))
                 +[no]aaonly         (Set AA flag in query (+[no]aaflag))
                 +[no]additional     (Control display of additional section)
                 +[no]adflag         (Set AD flag in query (default on))
                 +[no]all            (Set or clear all display flags)
                 +[no]answer         (Control display of answer section)
                 +[no]authority      (Control display of authority section)
                 +[no]badcookie      (Retry BADCOOKIE responses)
                 +[no]besteffort     (Try to parse even illegal messages)
                 +bufsize=###        (Set EDNS0 Max UDP packet size)
                 +[no]cdflag         (Set checking disabled flag in query)
                 +[no]class          (Control display of class in records)
                 +[no]cmd            (Control display of command line)
                 +[no]comments       (Control display of comment lines)
                 +[no]cookie         (Add a COOKIE option to the request)
                 +[no]crypto         (Control display of cryptographic fields in records)
                 +[no]defname        (Use search list (+[no]search))
                 +[no]dnssec         (Request DNSSEC records)
                 +domain=###         (Set default domainname)
                 +[no]dscp[=###]     (Set the DSCP value to ### [0..63])
                 +[no]edns[=###]     (Set EDNS version) [0]
                 +ednsflags=###      (Set EDNS flag bits)
                 +[no]ednsnegotiation (Set EDNS version negotiation)
                 +ednsopt=###[:value] (Send specified EDNS option)
                 +noednsopt          (Clear list of +ednsopt options)
                 +[no]expire         (Request time to expire)
                 +[no]fail           (Don't try next server on SERVFAIL)
                 +[no]header-only    (Send query without a question section)
                 +[no]identify       (ID responders in short answers)
                 +[no]idnin          (Parse IDN names)
                 +[no]idnout         (Convert IDN response)
                 +[no]ignore         (Don't revert to TCP for TC responses.)
                 +[no]keepopen       (Keep the TCP socket open between queries)
                 +[no]mapped         (Allow mapped IPv4 over IPv6)
                 +[no]multiline      (Print records in an expanded format)
                 +ndots=###          (Set search NDOTS value)
                 +[no]nsid           (Request Name Server ID)
                 +[no]nssearch       (Search all authoritative nameservers)
                 +[no]onesoa         (AXFR prints only one soa record)
                 +[no]opcode=###     (Set the opcode of the request)
                 +[no]qr             (Print question before sending)
                 +[no]question       (Control display of question section)
                 +[no]rdflag         (Recursive mode (+[no]recurse))
                 +[no]recurse        (Recursive mode (+[no]rdflag))
                 +retry=###          (Set number of UDP retries) [2]
                 +[no]rrcomments     (Control display of per-record comments)
                 +[no]search         (Set whether to use searchlist)
                 +[no]short          (Display nothing except short
                                      form of answer)
                 +[no]showsearch     (Search with intermediate results)
                 +[no]sigchase       (Chase DNSSEC signatures)
                 +[no]split=##       (Split hex/base64 fields into chunks)
                 +[no]stats          (Control display of statistics)
                 +subnet=addr        (Set edns-client-subnet option)
                 +[no]tcp            (TCP mode (+[no]vc))
                 +timeout=###        (Set query timeout) [5]
                 +[no]topdown        (Do +sigchase in top-down mode)
                 +[no]trace          (Trace delegation down from root [+dnssec])
                 +trusted-key=####   (Trusted Key to use with +sigchase)
                 +tries=###          (Set number of UDP attempts) [3]
                 +[no]ttlid          (Control display of ttls in records)
                 +[no]ttlunits       (Display TTLs in human-readable units)
                 +[no]unknownformat  (Print RDATA in RFC 3597 "unknown" format)
                 +[no]vc             (TCP mode (+[no]tcp))
                 +[no]zflag          (Set Z flag in query)
        global d-opts and servers (before host name) affect all queries.
        local d-opts and servers (after host name) affect only that lookup.
        -h                           (print help and exit)
        -v                           (print version and exit)

5 基本的な使い方(正引き)

正引きとは、ホスト名からIPアドレスを求めることを意味します。

5.1 正引きした結果を全て表示する方法

東京都のwww.metro.tokyo.jpというホスト名のIPアドレスを求めてみます。 実行結果のANSWER SECTIONを確認すると、www.metro.tokyo.jpのIPアドレスが、 27.110.42.78であることがわかります。

[root@server ~]# dig www.metro.tokyo.jp

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> www.metro.tokyo.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28696
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.metro.tokyo.jp.            IN      A

;; ANSWER SECTION:
www.metro.tokyo.jp.     3600    IN      A       27.110.42.78

;; Query time: 16 msec
;; SERVER: 192.168.2.1#53(192.168.2.1)
;; WHEN: 水 12月 22 20:28:57 JST 2021
;; MSG SIZE  rcvd: 63

なお、上記実行結果の;;SERVER: 192.168.2.1#53(192.168.2.1)の部分は、 /etc/resolv.confで指定するキャッシュDNSサーバのIPアドレスになります。

[root@server ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search flets-east.jp iptvf.jp
nameserver 192.168.2.1
nameserver 240b:11:4462:b10:6ab:18ff:fe77:63df

5.2 簡易表示する方法(+short)

ホスト名に対するIPアドレスだけを表示する場合は、+shortオプションを指定します。

[root@server ~]# dig www.metro.tokyo.jp +short
27.110.42.78

5.3 キャッシュDNSサーバを指定する方法(@キャッシュDNSサーバのIPアドレス)

次に、キャッシュDNSサーバのIPアドレスとして、googleGoogle Public DNS(8.8.8.8)を指定してみます。 キャッシュDNSサーバのIPアドレスを明に指定する場合は、@を使います。

実行結果のANSWER SECTIONを確認すると、www.metro.tokyo.jpのIPアドレスが、 27.110.42.78であることがわかります。

[root@server ~]# dig @8.8.8.8 www.metro.tokyo.jp

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> @8.8.8.8 www.metro.tokyo.jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7933
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.metro.tokyo.jp.            IN      A

;; ANSWER SECTION:
www.metro.tokyo.jp.     3567    IN      A       27.110.42.78

;; Query time: 15 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: 水 12月 22 20:40:23 JST 2021
;; MSG SIZE  rcvd: 63

6 タイプの使い方(-t)

6.1 NSレコードを取得する方法(-t NS)

NSレコードには、ドメインの権威DNSサーバのホスト名が登録されています。 ここでは、metro.tokyo.jpドメインの権威DNSサーバのホスト名を調べてみます。 digコマンドの実行結果よりmetro.tokyo.jpドメインには、下記4つの権威DNSサーバが動作していることがわかります。

・ns.metro.tokyo.jp. ・ns6.metro.tokyo.jp. ・ns4.metro.tokyo.jp. ・nameserver3.kvh.ne.jp.

[root@server ~]# dig -t NS metro.tokyo.jp

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> -t NS metro.tokyo.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18185
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;metro.tokyo.jp.                        IN      NS

;; ANSWER SECTION:
metro.tokyo.jp.         3600    IN      NS      ns.metro.tokyo.jp.
metro.tokyo.jp.         3600    IN      NS      ns6.metro.tokyo.jp.
metro.tokyo.jp.         3600    IN      NS      ns4.metro.tokyo.jp.
metro.tokyo.jp.         3600    IN      NS      nameserver3.kvh.ne.jp.

;; Query time: 16 msec
;; SERVER: 192.168.2.1#53(192.168.2.1)
;; WHEN: 水 12月 22 20:44:28 JST 2021
;; MSG SIZE  rcvd: 129

また、次のように+shortオプションを付けると権威DNSサーバのホスト名だけが表示されます。

[root@server ~]# dig -t NS metro.tokyo.jp +short
ns6.metro.tokyo.jp.
nameserver3.kvh.ne.jp.
ns.metro.tokyo.jp.
ns4.metro.tokyo.jp.

6.2 MXレコードを取得する方法(-t MX)

MXレコードには、ドメインのメールサーバのホスト名が登録されています。 ここでは、metro.tokyo.jpドメインのメールサーバを調べてみます。 digコマンドの実行結果よりmetro.tokyo.jpドメインには ml1.tisc.tokyo.jpという名前のメールサーバが動作していることがわかります。

[root@server ~]# dig -t MX metro.tokyo.jp +short
5 ml1.tisc.tokyo.jp.

ml1.tisc.tokyo.jp.の前の数字(5)は優先度を表します。 複数のメールサーバが動作している場合は、値が小さいものが優先度が高くなります。 DNSクライアントは、複数のメールサーバの中から優先度の高いメールサーバを選択します。

6.3 SPFレコードを取得する方法(-t TXT)

SPF(Sender Policy Framework)とは、送信ドメイン認証の仕組みです。 SPFというレコードはないため、SPFの情報はTXTレコードに登録されています。 東京都のmetro.tokyo.jpドメインには、SPFレコードは登録されていないようです。

[root@server ~]# dig -t TXT metro.tokyo.jp +short
[root@server ~]#

次に、富士通のjp.fujitsu.comドメインSPFレコードを調べてみます。 富士通SPFレコード(v=spf1...)が登録されています。 ip4:202.248.135.220/30等と記載されたIPアドレスのメールサーバからメールの送信が許可されていることがわかります。

[root@server ~]# dig -t TXT jp.fujitsu.com +short
"v=spf1 ip4:210.131.7.34/31 ip4:202.248.135.220/30 ip4:192.51.44.0/24 ip4:164.71.1.128/25 include:spf-in.fujitsu.co.jp include:aspmx.pardot.com mx:jp.fujitsu.com ?all"
"docusign=c70cb1ed-527f-4f12-9ae0-34c029eed387"
"MS=3A305C35F204C15598983DEDFDAE30633BD2A325"
"khi+KOAxPwLE0ByHNCVk0vvg7EAg0k8Nw635sha06rtdUyiBhlVItbqNrVTbzKmfR20Gz6DSt5Ry5o5c6VncIw=="
"nifty-dns-verify=d4b248be357dcb3f556af5b8c97088d0"

富士通からのメールを受信したメールサーバは、SPFレコードを使って、送信元ドメイン認証をおこなうことができます。

6.4 SOAレコードを取得する方法(-t SOA)

metro.tokyo.jpドメインSOAレコードを取得してみます。

[root@server ~]# dig -t SOA metro.tokyo.jp +noall +answer

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> -t SOA metro.tokyo.jp +noall +answer
;; global options: +cmd
metro.tokyo.jp.         3600    IN      SOA     ns.metro.tokyo.jp. postmaster.ns.metro.tokyo.jp. 2021121001 7200 1800 691200 900

以下に、SOAレコードの見方を示します。 ns.metro.tokyo.jpは、metro.tokyo.jpドメインのプライマリDNSサーバです。

また、SOAレコード中の各値の意味は次のとおりです。

6.5 AAAAレコードを取得する方法(-t AAAA)

AAAAレコードは、ホスト名に対するIPv6アドレスが登録されています。 ここでは、jprs.jpドメインで定義されているAAAAレコードを取得してみます。 デフォルトのキャッシュDNSサーバ(192.168.3.1)では、AAAAを取得できなかったので、googleGoogle Public DNS(8.8.8.8)を使用しました。

[root@server ~]# dig -t AAAA @8.8.8.8 jprs.jp +short
2001:218:3001:7::b0

6.6 全てのリソースレコードを取得する方法(-t ANY)

jprs.jpドメインの全てのリソースレコードを取得してみました。 jprs.jpドメインを選択したのは、色々なリソースレコード(DNSKEYやRRSIG等)があったからです。(あまり深い意味はありません)

[root@server ~]# dig -t ANY @8.8.8.8 jprs.jp

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> -t ANY @8.8.8.8 jprs.jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23405
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 25, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;jprs.jp.                       IN      ANY

;; ANSWER SECTION:
jprs.jp.                21600   IN      SOA     ns1.jprs.co.jp. postmaster.jprs.co.jp. 1639553472 3600 900 1814400 86400
jprs.jp.                21600   IN      RRSIG   SPF 8 2 86400 20220114063112 20211215063112 16929 jprs.jp. ARb5C+esI7kNA7BAOdZ9+H5cu3YuYGg2to+NXK0UJOfgV92WoIYulUZF EbFDSWisAp0QvVoB/RQZ73kbf68hNDomkxmkB1ORwvGp/dQVMuNlUZNr qR573R71C4SGW0r+ycti8nDSVD5pITvUWEVABHre3bcrto/t/z7e0WhW s74=
jprs.jp.                21600   IN      SPF     "v=spf1 ip4:202.11.17.32/27 ip4:202.11.16.144/28 ip4:117.104.133.128/28 ip6:2001:218:3001:17::/64 ip6:2001:df0:8:17::/64 include:spf.tricorn.net ?all"
jprs.jp.                0       IN      RRSIG   NSEC3PARAM 8 2 0 20220114063112 20211215063112 16929 jprs.jp. LGZSsxk+q+OLORpaHZYad5wDDiIwlKet6Eqr5P7yLKs2jsS2D5ZyLnrm GUbSa6icH4bSkj8yRnc59vnYQcZartnMD5mO42WdS2wJJRLhCgxdWMYj IRMkxSu4IULHrFmXROtUQ82E/sqXoLPsW8Hh2HfG89qH0zC/7EnLthOM r+A=
jprs.jp.                0       IN      NSEC3PARAM 1 0 8 C9F8D77C
jprs.jp.                21600   IN      RRSIG   DNSKEY 8 2 86400 20220114063112 20211215063112 59551 jprs.jp. I9T/hUBvaznl7B5r5bb8tBCOcqwFMxSIiGlt5kG6sTH8chk7k49+qI0P +NCx3wm3v0RNQVQ9wdQojRG7PuqKVNjiRFQQFIIDC3Wiu6j1Xz/6qFFa hQtQT178H+oh2zsdqJwvvJWlBhz9mPKaXtw8Lmgnymt4Nt3w92tGqJQ/ lGC9SXRxo+4nEdHxHumWu8ty+bIoSd3hc46zctd18yqAdvCTLD9HW1S1 /rk2lDqNLYXXV8A36KLBdNFvwnbuHsScKfvKuwopfaA4tfa1vyoXa/Rq R/64hxi8xzhIkt1YMWr1FYZnIzhasWWhGSMTyvWshFAl4CIomYwy6fBG LLTRYw==
jprs.jp.                21600   IN      DNSKEY  256 3 8 AwEAAbwhOOy9HraSkaHGCABzaE98ikAiFJjah+TypQ9tiiW5EojCIXr2 zz2UA8sZDVDJdW6cgdM/x0xBiCacERO1BJYcdLGIVHGetkeYUktFQfyg VKwOsSI0PTKLV1ZYJkAdLY1fJf24N1OQ8XM7dsBXuNHA1tbAP4dWLVyd IVhr6Dnt
jprs.jp.                21600   IN      DNSKEY  257 3 8 AwEAAbra/T97DN5jJRbB5GGs3xtONaJ3gcMHjkdYemjo6AxefvcSSr0q GrqnT9cd4XbnIEzxX6SyLo8dJRPpOPwz1LOJRNGiX0VdVDmMwAjVbbPd VSpcxnQ4XEmdWaWRYFIuPlVUgM/Sh+mSE4QOhae3Eaq4DY4PEY4uaVOL 8850pqEVATUQy6frhyr2q8x5efTOh+2S3QgjxllfN8/DPcAyL07XvCja nVAm1LuT5nzlhEpP3kHhcwkUrb/eEGVqfLUSUpmiWD3Hv+sHVbj4RTVz hReUt343AsqwG1O+BkQhVBT00PTGCqcx8MfzGta6pqsP64SkfU71XcYT /xF9gqvjw5M=
jprs.jp.                300     IN      RRSIG   AAAA 8 2 300 20220114063112 20211215063112 16929 jprs.jp. CVHdiVEN+S2GJXV0Yc8Jm5er6RvszyfDXDLqULdSRKC9j0wXYwBDqskn caTqJFZdpeFzgr2W0MuhtL49DMmmoOHOniLtWYNKZ9o7y734nTLDuZ2+ 8t4YXYbUqr1Sl8coKQIRtRVH5hii3ShU5fCdd/F7Vn4r3awKe22koh/A sfI=
jprs.jp.                300     IN      AAAA    2001:218:3001:7::b0
jprs.jp.                21600   IN      RRSIG   TXT 8 2 86400 20220114063112 20211215063112 16929 jprs.jp. tENN/WDa2f95vcWhmRd1l7LzEdaQgCqtJE157Ir5f3h0C0cVxEtP75rF vaQffeNpXh8Ymkoirn+hAJiLRZeQhp48M+sJ/W7zktI5Zsh5cdYxAA28 sSym1k+KgtezHrOnB3rzI45Yjpy28pA227ax4N77NBSCQ6mYB+IpaEO6 ens=
jprs.jp.                21600   IN      TXT     "v=spf1 ip4:202.11.17.32/27 ip4:202.11.16.144/28 ip4:117.104.133.128/28 ip6:2001:218:3001:17::/64 ip6:2001:df0:8:17::/64 include:spf.tricorn.net ?all"
jprs.jp.                300     IN      RRSIG   MX 8 2 300 20220114063112 20211215063112 16929 jprs.jp. hB4GOpTR/iFKSn83R/ODYl2R6CmfnJzis7tDwUKBNgvZkcalksYBiIRS TtTzQaUOjFUi8KU4McpECTtWUmFwC9frUUD0sEztXKZyicXozDv3IPLC zz/Dj40w58xAIzYtWZ6BM6eY1dGqBO2VWFOmuV93kUGqTfW0xzRuDT9n XqM=
jprs.jp.                300     IN      MX      40 off-mx42.tyo.jprs.co.jp.
jprs.jp.                300     IN      MX      20 off-mx42.osa.jprs.co.jp.
jprs.jp.                300     IN      MX      30 off-mx41.tyo.jprs.co.jp.
jprs.jp.                300     IN      MX      10 off-mx41.osa.jprs.co.jp.
jprs.jp.                300     IN      RRSIG   A 8 2 300 20220114063112 20211215063112 16929 jprs.jp. sJMlbJk7WzjAvy9y672tRAGWvKnrhh3k5YL4rpV3HeKCFnQjNYZO/m1A s/8te/BDyemy+nuDAEsms7YD/QoqjBcQmssqv48HO/h6uFUzXtkva2F3 gZzB8ywwEU1gz/C73AGnwHY+Zbdq2EK04yp1mDFk4mZc03UpLEgH6eHc Pzs=
jprs.jp.                300     IN      A       117.104.133.164
jprs.jp.                21600   IN      RRSIG   NS 8 2 86400 20220114063112 20211215063112 16929 jprs.jp. Vpr1yFovdWMAs0U963eI6lcO8WM7fADqth4wkMpWHTp7YHRxSyQOtSU2 GoTvH4K+gOjsp8yKZ4D17Lg/F2IATOIJTWjzJjSs4RRIoQkAkgYr9Bxv tG0SQsTgHThWlBspq/C9I+QAjhxKHKrvsZ8iK/Lw8ULv3u1dmgzBwJGT JnM=
jprs.jp.                21600   IN      NS      ns4.jprs.jp.
jprs.jp.                21600   IN      NS      ns2.jprs.jp.
jprs.jp.                21600   IN      NS      ns3.jprs.jp.
jprs.jp.                21600   IN      NS      ns1.jprs.jp.
jprs.jp.                21600   IN      RRSIG   SOA 8 2 86400 20220114063112 20211215063112 16929 jprs.jp. NgZfnUtaVGgJmpt4k+OuFbszF8AtW0tUg3gNJVpKAXf+D8HiF19oMLJB 9J3m0bow95s5UXeHy8Rq9jGik12C5Nz7fBpVlaErTMP0+QBSLrMhmciS L49FbEy4D18dvbhVOiMmGzKJIFf+49mCNJD82Xm+AkEpHGuof/jhzmFF 3Lw=

;; Query time: 23 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: 水 12月 22 21:28:21 JST 2021
;; MSG SIZE  rcvd: 2717

9 DNS応答を返すキャッシュDNSサーバの調べ方(+short +identify)

ホスト名www.metro.tokyo.jpのIPアドレスを返したキャッシュDNSサーバの IPアドレスが192.168.2.1であることがわかります。

[root@server ~]# dig www.metro.tokyo.jp +short +identify
27.110.42.78 from server 192.168.2.1 in 10 ms.

次に、キャッシュDNSサーバとして8.8.8.8を指定して、DNS問い合わせをしてみます。 ホスト名www.metro.tokyo.jpのIPアドレスを返したキャッシュDNSサーバの IPアドレスが8.8.8.8であることがわかります。

[root@server ~]# dig @8.8.8.8 www.metro.tokyo.jp +short +identify
27.110.42.78 from server 8.8.8.8 in 17 ms.

10 ドメインの権威DNSサーバを探す方法(+nssearch)

ドメインの権威DNSサーバとSOAレコードを表示するオプションです。 metro.tokyo.jpドメインの権威DNSサーバとSOAレコードを確認してみます。

[root@server ~]# dig metro.tokyo.jp +nssearch
SOA ns.metro.tokyo.jp. postmaster.ns.metro.tokyo.jp. 2021121001 7200 1800 691200 900 from server 61.120.195.102 in 9 ms.
SOA ns.metro.tokyo.jp. postmaster.ns.metro.tokyo.jp. 2021121001 7200 1800 691200 900 from server 61.120.205.112 in 10 ms.
SOA ns.metro.tokyo.jp. postmaster.ns.metro.tokyo.jp. 2021121001 7200 1800 691200 900 from server 61.120.205.177 in 9 ms.
SOA ns.metro.tokyo.jp. postmaster.ns.metro.tokyo.jp. 2021121001 7200 1800 691200 900 from server 202.222.250.38 in 33 ms.

metro.tokyo.jpドメインには、4つの権威DNSサーバが動作していることがわかります。 また、それぞれのSOAレコードも確認することができます。

11 見やすく表示する方法(+multiline)

+multilineオプションを使うと、SOAレコードを見やすく表示することでができます。

[root@server ~]# dig -t SOA metro.tokyo.jp +multiline

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> -t SOA metro.tokyo.jp +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14393
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;metro.tokyo.jp.                IN SOA

;; ANSWER SECTION:
metro.tokyo.jp.         3600 IN SOA ns.metro.tokyo.jp. postmaster.ns.metro.tokyo.jp. (
                                2021121001 ; serial
                                7200       ; refresh (2 hours)
                                1800       ; retry (30 minutes)
                                691200     ; expire (1 week 1 day)
                                900        ; minimum (15 minutes)
                                )

;; Query time: 16 msec
;; SERVER: 192.168.2.1#53(192.168.2.1)
;; WHEN: 水 12月 22 21:37:24 JST 2021
;; MSG SIZE  rcvd: 93

12 権威DNSサーバに問い合わせをする方法(+norecurse)

metro.tokyo.jpドメインのプライマリDNSサーバに、ホスト名www.metro.tokyoに対するIPアドレスを問い合わせをしてみます。

[root@server ~]# dig ns.metro.tokyo.jp +short
61.120.205.112
[root@server ~]#  dig @61.120.205.112 www.metro.tokyo.jp +norecurse

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> @61.120.205.112 www.metro.tokyo.jp +norecurse
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20040
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 4

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.metro.tokyo.jp.            IN      A

;; ANSWER SECTION:
www.metro.tokyo.jp.     3600    IN      A       27.110.42.78

;; AUTHORITY SECTION:
metro.tokyo.jp.         3600    IN      NS      ns6.metro.tokyo.jp.
metro.tokyo.jp.         3600    IN      NS      ns4.metro.tokyo.jp.
metro.tokyo.jp.         3600    IN      NS      ns.metro.tokyo.jp.
metro.tokyo.jp.         3600    IN      NS      nameserver3.kvh.ne.jp.

;; ADDITIONAL SECTION:
ns.metro.tokyo.jp.      3600    IN      A       61.120.205.112
ns4.metro.tokyo.jp.     3600    IN      A       61.120.205.177
ns6.metro.tokyo.jp.     3600    IN      A       202.222.250.38

;; Query time: 11 msec
;; SERVER: 61.120.205.112#53(61.120.205.112)
;; WHEN: 水 12月 22 21:44:52 JST 2021
;; MSG SIZE  rcvd: 197

13 キャッシュDNSサーバになって、非再帰問い合わせをして名前解決をする方法

通常、ホストの名前解決をする場合、キャッシュDNSサーバに名前解決を依頼します。 ここでは、自分自身がキャッシュDNSサーバとなり、権威DNSサーバに非再帰問い合わせを逐次実施することで、名前解決をしてみます。 名前解決するホスト名は、www.metro.tokyo.jpとします。

まず、ルートDNSサーバを調べます。 ルートDNSサーバは全部で13種類あることがわかります。

[root@server ~]# dig -t NS . +short
g.root-servers.net.
d.root-servers.net.
a.root-servers.net.
i.root-servers.net.
f.root-servers.net.
h.root-servers.net.
m.root-servers.net.
e.root-servers.net.
c.root-servers.net.
j.root-servers.net.
l.root-servers.net.
k.root-servers.net.
b.root-servers.net.

次に、適当なルートDNSサーバを選択します。 ここでは、a.root-servers.netに対して、www.metro.tokyo.jpの名前解決を問い合わせしてみます。 a.dns.jpからh.dns.jpまでの8つの権威DNSサーバを紹介されます。

[root@server ~]# dig @a.root-servers.net www.metro.tokyo.jp +norecurse
-snip-
;; AUTHORITY SECTION:
jp.                     172800  IN      NS      a.dns.jp.
jp.                     172800  IN      NS      b.dns.jp.
jp.                     172800  IN      NS      c.dns.jp.
jp.                     172800  IN      NS      d.dns.jp.
jp.                     172800  IN      NS      e.dns.jp.
jp.                     172800  IN      NS      f.dns.jp.
jp.                     172800  IN      NS      g.dns.jp.
jp.                     172800  IN      NS      h.dns.jp.
-snip-

次に、紹介された8つの権威DNSサーバから適当なDNSサーバを選択します。 h.dns.jpに対して、www.metro.tokyo.jpの名前解決を問い合わせしてみます。 h.dns.jpから下記4つの権威DNSサーバを紹介されます。

[root@server ~]# dig @h.dns.jp www.metro.tokyo.jp +norecurse
-snip-
;; AUTHORITY SECTION:
metro.tokyo.jp.         86400   IN      NS      ns6.metro.tokyo.jp.
metro.tokyo.jp.         86400   IN      NS      ns.metro.tokyo.jp.
metro.tokyo.jp.         86400   IN      NS      nameserver3.kvh.ne.jp.
metro.tokyo.jp.         86400   IN      NS      ns4.metro.tokyo.jp.
-snip-

最後に、上記4つの権威DNSサーバにwww.metro.tokyo.jpの名前解決を依頼してみます。 +shortオプションを使った実行結果を以下に示します。 いずれの結果も、www.metro.tokyo.jpのIPアドレスが27.110.42.78となっていることがわかります。

ns6.metro.tokyo.jpに問い合わせした結果を以下に示します。

[root@server ~]# dig @ns6.metro.tokyo.jp www.metro.tokyo.jp +norecurse +short
27.110.42.78

ns.metro.tokyo.jpに問い合わせした結果を以下に示します。

[root@server ~]# dig @ns.metro.tokyo.jp www.metro.tokyo.jp +norecurse +short
27.110.42.78

nameserver3.kvh.ne.jpに問い合わせした結果を以下に示します。

[root@server ~]# dig @nameserver3.kvh.ne.jp www.metro.tokyo.jp +norecurse +short
27.110.42.78

ns4.metro.tokyo.jp に問い合わせした結果を以下に示します。

[root@server ~]# dig @ns4.metro.tokyo.jp www.metro.tokyo.jp +norecurse +short
27.110.42.78

14 DNS問い合わせをトレースする方法(+trace)

13章では手動で権威DNSサーバに問い合わせをしましたが、+traceオプションを使うと、 手動で実施した作業をトレースすることができます。

[root@server ~]# dig www.metro.tokyo.jp +trace

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 <<>> www.metro.tokyo.jp +trace
;; global options: +cmd
.                       505495  IN      NS      b.root-servers.net.
.                       505495  IN      NS      m.root-servers.net.
.                       505495  IN      NS      j.root-servers.net.
.                       505495  IN      NS      e.root-servers.net.
.                       505495  IN      NS      h.root-servers.net.
.                       505495  IN      NS      l.root-servers.net.
.                       505495  IN      NS      a.root-servers.net.
.                       505495  IN      NS      d.root-servers.net.
.                       505495  IN      NS      g.root-servers.net.
.                       505495  IN      NS      f.root-servers.net.
.                       505495  IN      NS      i.root-servers.net.
.                       505495  IN      NS      k.root-servers.net.
.                       505495  IN      NS      c.root-servers.net.
.                       512844  IN      RRSIG   NS 8 0 518400 20220104050000 20211222040000 14748 . gLur3VxBhQOu1VFiobM/feJCwR1eLco6xr0B/o3GoitbRWyVRJND6PUp G5vp9egDIAezT3TbPCBaa2ZqHodyWhCTy2+PtSe4IrOgEdLWv3F259Lm bDci9metagLxa2z4E8J2juU/Up83qErUtQsFgbUcKYsMxTxXi5OkPVW0 Ep8hhtmupbnJ12oNp4eGA2PcgxgBVeZOYa+jlM5HaTD8SSZFNQFkEUwy 27YgFh82sKVcWXOETu6dOdS2D7RKeDwoI9giRrBtmm+qj8d2qBqHAgcJ S7z6oPKOg9phQW6lXO1ha+q7d6fvnwwos9WRxA8BhYKjLLJhLx4lF+26 qVf6ig==
;; Received 525 bytes from 192.168.2.1#53(192.168.2.1) in 11 ms

jp.                     172800  IN      NS      a.dns.jp.
jp.                     172800  IN      NS      b.dns.jp.
jp.                     172800  IN      NS      c.dns.jp.
jp.                     172800  IN      NS      d.dns.jp.
jp.                     172800  IN      NS      e.dns.jp.
jp.                     172800  IN      NS      f.dns.jp.
jp.                     172800  IN      NS      g.dns.jp.
jp.                     172800  IN      NS      h.dns.jp.
jp.                     86400   IN      DS      18100 8 2 C5242231AB0B249800926B3D700349CC76374B7505DD4101FEF8C54B BB464C6B
jp.                     86400   IN      RRSIG   DS 8 1 86400 20220104050000 20211222040000 14748 . h+qnixp8ZoaXTkFmip/3pAaaYqhbRy4MEXfXbTU6M9Nd5DvA7I2Luy99 Jl+dh5MDN9vxFCZ0qC4GuqclGAU6ginnPsErWSBZ9hXAoU79D2GENWwD q65MW2EZ/SG0+b8OrttBR8TvpY4cE72jLGvdkwnSk+FHtZtZyqIa009e hpsFV3W5Q71+wrkT8OsCU9UvRSftSzCtXWLYsxo2vPkW8vKR8wYrtXiS fmRyYHmy+JU6z0d97iJ11LBk6cQFe9Z/K3wYMAuJrv0u16fvF92Gq2rp jAOJ7drIazqss8+WlunC5o46td1UDGkb1/jbQsvUMJOJMRmUoNKxs65r ueo8iA==
;; Received 838 bytes from 198.97.190.53#53(h.root-servers.net) in 57 ms

metro.tokyo.jp.         86400   IN      NS      ns.metro.tokyo.jp.
metro.tokyo.jp.         86400   IN      NS      nameserver3.kvh.ne.jp.
metro.tokyo.jp.         86400   IN      NS      ns6.metro.tokyo.jp.
metro.tokyo.jp.         86400   IN      NS      ns4.metro.tokyo.jp.
82GO9K6HGU88GUTN0TLE0NNUQTJ2PA6U.jp. 900 IN NSEC3 1 1 8 6817291982 837A3O080SD5BQE9J3BHRS9AQ5GRARHT TXT RRSIG
82GO9K6HGU88GUTN0TLE0NNUQTJ2PA6U.jp. 900 IN RRSIG NSEC3 8 2 900 20220117174509 20211218174509 55413 jp. F9nY2RpnvoJEVboTPBa351S5JOoKFYZTzVz6t+k5evwz/QyTt0/kUlVq ksh3V0Jw1M8k8Rq49Juaj/Xn1EI1CuDNvXhsOp+06xJha57fMOcVVL6m BQBt8perri/XxoZHQ2Tx5pULx39OwMTQRqNzlgIGCJWwNNzx5NK7zK/3 Ml0=
DFD7V21F2CV3I1QRD4122SVN4UQMVAKQ.jp. 900 IN NSEC3 1 1 8 6817291982 DFQGT29IQMD095AKOE6NIL8KEH5P0G5D NS DS RRSIG
DFD7V21F2CV3I1QRD4122SVN4UQMVAKQ.jp. 900 IN RRSIG NSEC3 8 2 900 20220117174509 20211218174509 55413 jp. Gn5QKCcpniQ+N4lG1PRlVQk7Vc+UK62pNA4n/FRP4qhciWxqk/IUDidh BfxaI54jOqTZRTLKNctWxjw65kWnQJq3/FTltTmjLUNJq6EkEGf/jD4Z AA/TxF8MU0ie/c82ZyB9JNbGqhuEtV+iqWcWpUliZqN5yIv0GmrgKfi6 6nU=
;; Received 677 bytes from 2001:dc4::1#53(a.dns.jp) in 13 ms

www.metro.tokyo.jp.     3600    IN      A       27.110.42.78
metro.tokyo.jp.         3600    IN      NS      nameserver3.kvh.ne.jp.
metro.tokyo.jp.         3600    IN      NS      ns.metro.tokyo.jp.
metro.tokyo.jp.         3600    IN      NS      ns6.metro.tokyo.jp.
metro.tokyo.jp.         3600    IN      NS      ns4.metro.tokyo.jp.
;; Received 197 bytes from 202.222.250.38#53(ns6.metro.tokyo.jp) in 22 ms

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

ssh-keygenコマンドの使い方

1 ssh-keygenコマンドとは?

SSH秘密鍵,公開鍵のキーペアを作成するコマンドです。

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

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

3 オプション一覧

usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
                  [-N new_passphrase] [-C comment] [-f output_keyfile]
       ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
       ssh-keygen -i [-m key_format] [-f input_keyfile]
       ssh-keygen -e [-m key_format] [-f input_keyfile]
       ssh-keygen -y [-f input_keyfile]
       ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]
       ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
       ssh-keygen -B [-f input_keyfile]
       ssh-keygen -D pkcs11
       ssh-keygen -F hostname [-f known_hosts_file] [-l]
       ssh-keygen -H [-f known_hosts_file]
       ssh-keygen -R hostname [-f known_hosts_file]
       ssh-keygen -r hostname [-f input_keyfile] [-g]
       ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point]
       ssh-keygen -T output_file -f input_file [-v] [-a rounds] [-J num_lines]
                  [-j start_line] [-K checkpt] [-W generator]
       ssh-keygen -s ca_key -I certificate_identity [-h] [-n principals]
                  [-O option] [-V validity_interval] [-z serial_number] file ...
       ssh-keygen -L [-f input_keyfile]
       ssh-keygen -A
       ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]
                  file ...
       ssh-keygen -Q -f krl_file file ...

4 キーペアの作成方法(-t)

manによると、作成できるキーペアは、以下の5つあることがわかります。 dsa、ecdsa、ed25519、rsa、rsa1

デフォルトで作成するキーペアはrsaです。 作成するキーペアを明に指定する場合は、-tオプションを使います。

4.1 ecdsaキーペアの作成方法

ecdsaキーペアを作成してみます。 Enterキーを入力して、キーペアの作成場所(★1)はデフォルト(~/.ssh)、 パスフレーズ(★2)は設定しませんでした。 なお、パスフレーズは、他人に秘密鍵を解読されないようにするためのものです。

[root@server ~]# ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa): ★1
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): ★2
Enter same passphrase again: ★2
Your identification has been saved in /root/.ssh/id_ecdsa.
Your public key has been saved in /root/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:ipHbxPRlB6FX2bFdV3dvJP2w3PgTW5xXy8sWsqQA1g0 root@server
The key's randomart image is:
+---[ECDSA 256]---+
|        .E=..oooO|
|       o o +. o=O|
|      o o + ..o*O|
|     + . = . o+B*|
|    o o S . o +.B|
|     * .   . . *.|
|    o o       . .|
|                 |
|                 |
+----[SHA256]-----+
[root@server ~]#

作成したecdsaのキーペアを確認します。 秘密鍵(id_ecdsa)と公開鍵(id_ecdsa.pub)が作成されたことがわかります。

[root@server ~]# ls -l ~/.ssh/id_ecdsa*
-rw-------. 1 root root 227 12月 21 20:32 /root/.ssh/id_ecdsa
-rw-r--r--. 1 root root 173 12月 21 20:32 /root/.ssh/id_ecdsa.pub

4.2 ed25519キーペアの作成方法

4.1と同様な手順で、ed25519キーペアを作成してみます。

[root@server ~]# ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ed25519.
Your public key has been saved in /root/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:FQXiUvoKLPn/GJAHuHPu1MAfZ0/Gr1iIiivWWFsTUcQ root@server
The key's randomart image is:
+--[ED25519 256]--+
|      +oo oo.    |
|   . . E . .     |
|  . . + . .      |
|   = + o o       |
|  = O + S +      |
|   B X * = .     |
|  + * B . o .    |
|.o * o o o .     |
|..o.o o.o .      |
+----[SHA256]-----+

作成したed25519のキーペアを確認します。 秘密鍵(id_ed25519)と公開鍵(id_ed25519.pub)が作成されたことがわかります。

[root@server ~]# ls -l ~/.ssh/id_ed25519*
-rw-------. 1 root root 399 12月 21 20:33 /root/.ssh/id_ed25519
-rw-r--r--. 1 root root  93 12月 21 20:33 /root/.ssh/id_ed25519.pub

5 秘密鍵パスフレーズが設定されているかどうかの確認方法(-y)

-yオプションを使うと、秘密鍵から公開鍵を求めることができます。 manの抜粋を以下に示します。

 -y      This option will read a private OpenSSH format file and print an OpenSSH public key to stdout.

まず、パスフレーズが設定されていない場合について確認してみます。 -fオプションを使って、ecdsaの秘密鍵を指定すると、公開鍵が出力されます。 つまり、この場合、秘密鍵パスフレーズが設定されていないことになります。

[root@server ~]# ssh-keygen -y -f ~/.ssh/id_ecdsa
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCQwHap8UKRwowwT3red72j+nrSW7D+5pQXhRXLfJ5fVlQiVNeyrcwhEHRL1o2ahF2FriSm9XiKi1DeAhqy4bnI=

次に、パスフレーズを設定した場合について確認してみます。 事前準備として、秘密鍵パスフレーズを設定します。 ★1でパスフレーズ(hogehoge)を設定しました。

[root@server ~]# ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase): ★1
Enter same passphrase again: ★1
Your identification has been saved in /root/.ssh/id_ecdsa.
Your public key has been saved in /root/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:k9hZHghU5tbJZBSCyu85IqUH84KrVayDBoYt08OJ90o root@server
The key's randomart image is:
+---[ECDSA 256]---+
|     .oo+.=.     |
|      .+ B .     |
|   . .  + *      |
|.= oo  + = .     |
|*.B o.. S .      |
|o=o=. .  .       |
|.oE*.. .         |
|oo+o+ +          |
|+..+ . .         |
+----[SHA256]-----+

-fオプションを使って、ecdsaの秘密鍵を指定すると、パスフレーズの入力を求められます。 つまり、この場合、秘密鍵パスフレーズが設定されていることになります。

[root@server ~]# ssh-keygen -y -f ~/.ssh/id_ecdsa
Enter passphrase:

6 秘密鍵に設定されたパスフレーズの変更方法(-p)

6.1 事前準備

まず、ecdsaキーペアを作成します。このとき、パスフレーズにhogehogeと設定しました。

[root@server ~]# ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ecdsa.
Your public key has been saved in /root/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:7a8k0oPdqSMeNjMFyGOnxlxMp/ciVZefUKNnjjB2khw root@server
The key's randomart image is:
+---[ECDSA 256]---+
|      . . E .oo  |
|   . + o o +o. . |
|    = * o B ooo. |
|   + = + + = =o  |
|    = . S o . .  |
|   .   * + .     |
|      O = =      |
|     ..*.= .     |
|     ........    |
+----[SHA256]-----+

6.2 パスフレーズ変更

-Nオプションで新しいパスフレーズ、-fオプションで秘密鍵のファイル名を指定します。 ここでは、新しいパスフレーズとしてtesttestを指定しました。

[root@server ~]# ssh-keygen -p -f ~/.ssh/id_ecdsa
Enter old passphrase: ★古いパスフレーズ(hogehoge)入力
Enter new passphrase (empty for no passphrase):  ★新しいパスフレーズ(testtest)入力。
Enter same passphrase again:                                  ★もう一度、新しいパスフレーズ(testtest)入力。
Your identification has been saved with the new passphrase.

7 フィンガープリントを表示する方法(-l)

フィンガープリントとは、公開鍵をハッシュ関数でハッシュした値です。 以下の環境で、クライアントでサーバのフィンガープリントを確認してみます。 以下の環境で確認してみます。

                     192.168.2.0/24
client --------------------------------------- server
     .105                                     .100

クライアント側でknown_hostsの中身を確認します。 まだ、サーバと接続をしていないので、known_hostsの中身は空です。

[root@client ~]# cat /root/.ssh/known_hosts
[root@client ~]#

次にクライアントからサーバにログインします。このとき、フィンガープリントが表示されます。 フィンガープリントは、はじめて接続したときに表示されます。 以下のフィンガープリントは、ECDSAの公開鍵が、それぞれSHA256,MD5でハッシュされた値です。

[root@client ~]# ssh 192.168.2.100
The authenticity of host '192.168.2.100 (192.168.2.100)' can't be established.
ECDSA key fingerprint is SHA256:5i+bZoKNbptKMfQl4xzA6zSsyHiMjzsRsqRg84K9SDM.
ECDSA key fingerprint is MD5:80:68:92:b8:96:b8:fe:bc:03:dd:40:75:fd:07:12:67.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.100' (ECDSA) to the list of known hosts.
root@192.168.2.100's password:
Last login: Tue Dec 21 21:17:19 2021 from client
[root@server ~]#

次に、サーバのキーペアを確認します。 サーバのキーペアは/etc/ssh/配下に格納されています。 ECDSAの秘密鍵ssh_host_ecdsa_key、公開鍵はssh_host_ecdsa_key.pubになります。

[root@server ~]# ls -l /etc/ssh/ssh_host_*
-rw-r-----. 1 root ssh_keys  227 11月  9 20:33 /etc/ssh/ssh_host_ecdsa_key
-rw-r--r--. 1 root root      162 11月  9 20:33 /etc/ssh/ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys  387 11月  9 20:33 /etc/ssh/ssh_host_ed25519_key
-rw-r--r--. 1 root root       82 11月  9 20:33 /etc/ssh/ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys 1675 11月  9 20:33 /etc/ssh/ssh_host_rsa_key
-rw-r--r--. 1 root root      382 11月  9 20:33 /etc/ssh/ssh_host_rsa_key.pub

ssh-keygenコマンドを使って、サーバの公開鍵のハッシュ値を求めてみます。 サーバにログインしたときに表示されたハッシュ値と一致することがわかります。 つまり、意図したサーバにsshでログインしていることがわかります。

[root@server ~]# ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key
256 SHA256:5i+bZoKNbptKMfQl4xzA6zSsyHiMjzsRsqRg84K9SDM /etc/ssh/ssh_host_ecdsa_key.pub (ECDSA)

8 known_hostsファイルから公開鍵を削除する方法(-R)

以下の環境で確認してみます。

                     192.168.2.0/24
client --------------------------------------- server
     .105                                     .100

まず、クライアント側のknown_hostsファイルの中身を確認します。 何も情報が登録されていないことがわかります。

[root@client ~]# cat ~/.ssh/known_hosts
[root@client ~]#

サーバにsshログインします。

[root@client ~]# ssh-keygen -R 192.168.2.100
[root@client ~]# ssh 192.168.2.100
The authenticity of host '192.168.2.100 (192.168.2.100)' can't be established.
ECDSA key fingerprint is SHA256:5i+bZoKNbptKMfQl4xzA6zSsyHiMjzsRsqRg84K9SDM.
ECDSA key fingerprint is MD5:80:68:92:b8:96:b8:fe:bc:03:dd:40:75:fd:07:12:67.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.100' (ECDSA) to the list of known hosts.
root@192.168.2.100's password:
Last login: Tue Dec 21 21:13:44 2021 from client
[root@server ~]#

サーバからログアウトします。

[root@server ~]# exit
ログアウト
Connection to 192.168.2.100 closed.
[root@client ~]#

サーバからログアウトしたあと、known_hostsファイルの中身を確認してみます。 サーバのIPアドレス,公開鍵が登録されていることがわかります。

[root@client ~]# cat ~/.ssh/known_hosts
192.168.2.100 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAMB3bmXpN7uSkidRF204jRaGC2b6+T1LP6hOCrJGylBcXtgthIUEVjEHD01UmQMNpemf5L5UmSJg8cf4GFJ9Cw=

known_hostsファイルから、サーバ(192.168.2.100)の情報を削除します。

[root@client ~]# ssh-keygen -R 192.168.2.100
# Host 192.168.2.100 found: line 1
/root/.ssh/known_hosts updated.
Original contents retained as /root/.ssh/known_hosts.old

known_hostsファイルを確認します。サーバ(192.168.2.100)の情報が削除されたことがわかります。

[root@client ~]#  cat ~/.ssh/known_hosts
[root@client ~]#

9 フォーマットを変換する方法

-mオプションを使って、公開鍵のフォーマットを変換することができます。 変換できるフォーマットには、RFC4716,PKCS8,PEMの3つあります。

manの抜粋を以下にしめします。

-m key_format
             Specify a key format for the -i (import) or -e (export) conversion options.  The supported key formats are: “RFC4716” (RFC 4716/SSH2 public or
             private key), “PKCS8” (PEM PKCS8 public key) or “PEM” (PEM public key).  The default conversion format is “RFC4716”.

事前準備として、rsaキーペアを作成します。

[root@server ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:GGiO82eyHZPH/v6of7Nt6/itnbjhtqCAc4Jrb2peToU root@server
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|     .           |
|    o .          |
|   +  .o         |
|  o .E..S        |
|   o. oo         |
|   .o**oo  . .   |
|   o=B+=. ..=++o.|
|  ++=o. o*=o=@O+o|
+----[SHA256]-----+

RFC4716形式に変換してみます。

[root@server ~]# ssh-keygen -f ~/.ssh/id_rsa.pub -e -m RFC4716
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "2048-bit RSA, converted by root@server from OpenSSH"
AAAAB3NzaC1yc2EAAAADAQABAAABAQCbBsNbh8kqNPRGFSIvGZgVpoelFHSvpBdV5fw/Y5
/ihhWHsQzdMcuo/TdgUj2OAVwcFhZpwhVmNMN4ASdYP8WBX1Cy0LfdO+QiZVFKEWJCy6cd
dMjfnO8gLAxo9yXGrkhgWLxrEOSAfpPub1Rc81nxlmU+3aTVTZ/53zfGw6hnrlj20NZni4
k36LnoH7bMp8nVuqvFG/vf3NiICALAhhlx0mAK3Q6VoCfSTuWRpwsl5TOFFUvMsy29WZLQ
sBNifJQ9/wA0I+yjdyQd+fSIJN/mfCZQSzgmqSqknJbrTP8z4oD1h5c2ZAxRqkjD0JARBt
ciWalvn1Ifi/FlHW7IcXBp
---- END SSH2 PUBLIC KEY ----

次に、PKCS8形式に変換してみます。

[root@server ~]# ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmwbDW4fJKjT0RhUiLxmY
FaaHpRR0r6QXVeX8P2Of4oYVh7EM3THLqP03YFI9jgFcHBYWacIVZjTDeAEnWD/F
gV9QstC33TvkImVRShFiQsunHXTI35zvICwMaPclxq5IYFi8axDkgH6T7m9UXPNZ
8ZZlPt2k1U2f+d83xsOoZ65Y9tDWZ4uJN+i56B+2zKfJ1bqrxRv739zYiAgCwIYZ
cdJgCt0OlaAn0k7lkacLJeUzhRVLzLMtvVmS0LATYnyUPf8ANCPso3ckHfn0iCTf
5nwmUEs4JqkqpJyW60z/M+KA9YeXNmQMUapIw9CQEQbXIlmpb59SH4vxZR1uyHFw
aQIDAQAB
-----END PUBLIC KEY-----

最後に、PEM形式に変換してみます。

[root@server ~]# ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PEM
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAmwbDW4fJKjT0RhUiLxmYFaaHpRR0r6QXVeX8P2Of4oYVh7EM3THL
qP03YFI9jgFcHBYWacIVZjTDeAEnWD/FgV9QstC33TvkImVRShFiQsunHXTI35zv
ICwMaPclxq5IYFi8axDkgH6T7m9UXPNZ8ZZlPt2k1U2f+d83xsOoZ65Y9tDWZ4uJ
N+i56B+2zKfJ1bqrxRv739zYiAgCwIYZcdJgCt0OlaAn0k7lkacLJeUzhRVLzLMt
vVmS0LATYnyUPf8ANCPso3ckHfn0iCTf5nwmUEs4JqkqpJyW60z/M+KA9YeXNmQM
UapIw9CQEQbXIlmpb59SH4vxZR1uyHFwaQIDAQAB
-----END RSA PUBLIC KEY-----

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

数字の作り方

1 はじめに

数字の作り方についてまとめました。

2 検証環境

CentOS版数は次のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

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

3 連続に出力する方法(seqコマンド)

3.1 昇順に出力する方法

1から5までを昇順に出力してみます。

[root@server ~]# seq 1 5
1
2
3
4
5

3.2 降順に出力する方法

5から1までを降順に出力してみます。

[root@server ~]# seq 5 -1 1
5
4
3
2
1

3.3 増加数を指定する方法

10から15まで、2ずつ増やしながら出力してみます。

[root@server ~]# seq 10 2 15
10
12
14

3.4 桁数をそろえる方法(-w)

先頭を0で埋めて、数字の桁数をそろえてみます。

[root@server ~]# seq -w 10
01
02
03
04
05
06
07
08
09
10

3.5 書式を指定する方法

[root@server ~]# seq -f '%02g' 1 3
01
02
03
[root@server ~]# seq -f 'file%02g.txt' 1 3
file01.txt
file02.txt
file03.txt

3.6 セパレータの使い方(-s)

セパレータのデフォルトは改行(\n)です。 まず、セパレータに,を指定してみます。

[root@server ~]# seq -s ',' 1 5
1,2,3,4,5

次に、セパレータに:を指定してみます。

[root@server ~]# seq -s ':' 15 -1 10
15:14:13:12:11:10

3.7 16進数を表示する方法

seqには16進数を表示すオプションがないようなので、printfコマンドを使って16進数を表示します。

[root@server ~]# seq 10 16|xargs printf '%x\n'
a
b
c
d
e
f
10

4 連続に出力する方法(echoコマンド)

1から5までを昇順に出力してみます。

[root@server ~]# echo {1..5}
1 2 3 4 5

10から1まで、3ずつ降順に出力してみます。

[root@server ~]# echo {10..1..3}
10 7 4 1

5 ランダムに出力する方法

5.1 shufコマンドを使う方法

[root@server ~]# shuf -i 1-5
2
1
3
4
5

5.2 ファイルの中身をランダムに並び替える方法

ファイルを作成します。

[root@server ~]#  seq 10 14 > test.txt

ファイルの中身をランダムに並び替えてみます。

[root@server ~]# shuf test.txt
11
13
14
12
10

5.3 16進数の数字をランダムに表示する方法

[root@server ~]# shuf -i 10-20|xargs printf '%x\n'
a
b
11
e
d
13
10
14
f
c
12

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

pingコマンドの使い方

1 pingコマンドとは

宛先までIPパケットが到達するかどうかを確認するために使うコマンドです。

2 検証環境

サーバとクライアントの2台構成です。図中のeth0はNICの名前です。

                          192.168.2.0/24
client(eth0) -------------------------------------(eth0) server
        .105                                       .120

2.2 版数

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

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

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

2.3 pingの版数

pingの版数は以下のとおりです。

[root@server ~]# ping -V
ping utility, iputils-s20160308

3 オプション一覧

[root@server ~]# ping -h
Usage: ping [-aAbBdDfhLnOqrRUvV64] [-c count] [-i interval] [-I interface]
            [-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
            [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
            [-w deadline] [-W timeout] [hop1 ...] destination
Usage: ping -6 [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
             [-l preload] [-m mark] [-M pmtudisc_option]
             [-N nodeinfo_option] [-p pattern] [-Q tclass] [-s packetsize]
             [-S sndbuf] [-t ttl] [-T timestamp_option] [-w deadline]
             [-W timeout] destination

4 基本的な使い方

クライアントからサーバまでIPパケットが到達するかどうか確認をしてみます。 クライアントでpingを実行します。終了するときは、Ctrl + cを押下します。

[root@client ~]# ping 192.168.2.100
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
64 bytes from 192.168.2.100: icmp_seq=1 ttl=64 time=1.98 ms
64 bytes from 192.168.2.100: icmp_seq=2 ttl=64 time=0.655 ms
64 bytes from 192.168.2.100: icmp_seq=3 ttl=64 time=0.602 ms
^C
--- 192.168.2.100 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.602/1.081/1.987/0.641 ms

5 ICMP echo requestパケットの送信回数の指定方法(-c)

pingを実行すると、ICMP echo requestパケットが送信されます。 -cオプションは、送信するICMP echo requestパケット数を指定します。

ICMP echo requestパケットを1つだけ送信してみます。

[root@client ~]# ping -c 1 192.168.2.100
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
64 bytes from 192.168.2.100: icmp_seq=1 ttl=64 time=2.24 ms

--- 192.168.2.100 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.240/2.240/2.240/0.000 ms

次に、ICMP echo requestパケットを2つ送信してみます。

[root@client ~]# ping -c 2 192.168.2.100
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
64 bytes from 192.168.2.100: icmp_seq=1 ttl=64 time=0.886 ms
64 bytes from 192.168.2.100: icmp_seq=2 ttl=64 time=0.790 ms

--- 192.168.2.100 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.790/0.838/0.886/0.048 ms

5 タイムスタンプを表示する方法(-D)

タイムスタンプ(マイクロ秒単位)を表示してみます。 1秒間隔でサーバ(192.168.2.100)から応答を受信していることがわかります。

[root@client ~]# ping -D 192.168.2.100
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
[1639998814.956947] 64 bytes from 192.168.2.100: icmp_seq=1 ttl=64 time=1.13 ms
[1639998815.960743] 64 bytes from 192.168.2.100: icmp_seq=2 ttl=64 time=0.709 ms
[1639998816.966041] 64 bytes from 192.168.2.100: icmp_seq=3 ttl=64 time=0.771 ms
-snip-

6 ICMP echo requestパケットの送信間隔を指定する方法(-i)

クライアントからサーバにICMP echo requestを200ミリ秒間隔で送信してみます。サーバから200ミリ秒間隔で応答を受信していることがわかります。

[root@client ~]# ping -D -i 0.2 192.168.2.100
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
[1639998927.370328] 64 bytes from 192.168.2.100: icmp_seq=1 ttl=64 time=0.816 ms
[1639998927.585093] 64 bytes from 192.168.2.100: icmp_seq=2 ttl=64 time=0.664 ms
[1639998927.799582] 64 bytes from 192.168.2.100: icmp_seq=3 ttl=64 time=0.710 ms
-snip-

次に、ICMP echo requestを500ミリ秒間隔で送信してみます。 サーバ(192.168.2.100)から500ミリ秒間隔で応答を受信していることがわかります。

[root@client ~]# ping -D -i 0.5 192.168.2.100
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
[1639998972.566876] 64 bytes from 192.168.2.100: icmp_seq=1 ttl=64 time=1.32 ms
[1639998973.082046] 64 bytes from 192.168.2.100: icmp_seq=2 ttl=64 time=1.08 ms
[1639998973.595965] 64 bytes from 192.168.2.100: icmp_seq=3 ttl=64 time=0.794 ms
-snip-

7 パケットサイズを指定する方法(-s)

ICMPパケットは以下の構成になります。

|<- IP header(20byte) ->|<- ICMP header(8byte) ->|<------- Payload -------->|
+-----------------------+------------------------+--------------------------+
|                       |                        |                          |
|                       |                        |                          |
|                       |                        |                          |
+-----------------------+------------------------+--------------------------+

本オプションを使うと、ICMP echo requestのPayload長を指定することができます。 オプション未指定の場合、Payload長が56(byte)になります。 つまり、IPヘッダを含めたパケットサイズが84(byte)になります。

次に、pingを実行します。 このとき表示される56(84)は、56がICMPペイロード長を表します。 84はICMPペイロード長に、IP/ICMPヘッダ長を加えた値を表しています。

[root@server ~]# ping 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=7.57 ms
-snip-

次に、Payload長に0を指定してみます。 ICMPペイロード長が0、IP/ICMPヘッダにICMPペイロードを加えたサイズを表していることがわかります。

[root@server ~]# ping -s 0 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 0(28) bytes of data.
8 bytes from 192.168.2.1: icmp_seq=1 ttl=64
-snip-

最後に、ちょうどMTU長(本環境は1500byte)になるICMPパケットを送信してみます。

[root@server ~]#  ping -s 1472 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 1472(1500) bytes of data.
1480 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=3.15 ms
-snip-

8 送信インタフェースを指定する方法(-I)

ICMP echo requestパケットの送信インタフェースを指定するときに使います。 複数のインタフェースを持つサーバ等で使用します。

[root@server ~]# ping -I eth0 192.168.2.1
PING 192.168.2.1 (192.168.2.1) from 192.168.2.100 eth0: 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=33.9 ms
64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=5.38 ms
-snip-

9 Flood pingを実行する方法(-f)

Flood pingは、単位時間に大量のICMP echo requestパケットを送信する機能です。 クライアントからサーバに対してFlood pingを実行してみます。 そのときの様子をstraceコマンドを使って確認してみます。 1ミリ秒程度でsendtoシステムコールを繰り返し実行して、クライアントからサーバに、 ICMP echo requestが100(packet/s)程度送信されていることがわかります。 なお、straceの使い方は、ここ(straceコマンドの使い方)を参照してください。

[root@client ~]# strace -tt -s 0 -e trace=sendto ping -c 10 -f 192.168.2.100
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
19:15:45.246809 sendto(3, ""..., 64, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.2.100")}, 16) = 64
19:15:45.249444 sendto(3, ""..., 64, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.2.100")}, 16) = 64
19:15:45.251079 sendto(3, ""..., 64, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.2.100")}, 16) = 64
19:15:45.252611 sendto(3, ""..., 64, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.2.100")}, 16) = 64
19:15:45.253581 sendto(3, ""..., 64, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.2.100")}, 16) = 64
19:15:45.255097 sendto(3, ""..., 64, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.2.100")}, 16) = 64
19:15:45.256587 sendto(3, ""..., 64, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.2.100")}, 16) = 64
19:15:45.258229 sendto(3, ""..., 64, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.2.100")}, 16) = 64
19:15:45.258846 sendto(3, ""..., 64, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.2.100")}, 16) = 64
19:15:45.259518 sendto(3, ""..., 64, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("192.168.2.100")}, 16) = 64

10 応答を待たずにICMP Echo Requestパケットを送信する方法(-l)

ICMP echo requestに対する応答を受信してから、次のICMP echo requestを送信します。 しかし、本オプションを指定すると、応答を待たずに、次のICMP echo requestを送信できます。 本オプションは、応答を待たずに送信できるICMP echo requestのパケット数を指定します。

以下の例では、5つ目までは短い間隔でICMPパケットを受信していますが、 6つ目からは1秒間隔でICMPパケットを受信していることがわかります。

[root@client ~]# ping -D -l 5 192.168.2.100
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
[1640255841.972294] 64 bytes from 192.168.2.100: icmp_seq=1 ttl=64 time=0.706 ms
[1640255841.972329] 64 bytes from 192.168.2.100: icmp_seq=2 ttl=64 time=0.536 ms
[1640255841.972338] 64 bytes from 192.168.2.100: icmp_seq=3 ttl=64 time=0.848 ms
[1640255841.972345] 64 bytes from 192.168.2.100: icmp_seq=4 ttl=64 time=0.770 ms
[1640255841.972352] 64 bytes from 192.168.2.100: icmp_seq=5 ttl=64 time=0.701 ms
[1640255842.986215] 64 bytes from 192.168.2.100: icmp_seq=6 ttl=64 time=0.796 ms
[1640255843.979614] 64 bytes from 192.168.2.100: icmp_seq=7 ttl=64 time=0.699 ms
[1640255844.976921] 64 bytes from 192.168.2.100: icmp_seq=8 ttl=64 time=0.705 ms
[1640255845.983677] 64 bytes from 192.168.2.100: icmp_seq=9 ttl=64 time=0.731 ms
[1640255846.976107] 64 bytes from 192.168.2.100: icmp_seq=10 ttl=64 time=0.504 ms

11 ペイロードのパターンを指定する方法(-p)

ICMP Echo Requestパケットのペイロードを確認するため、サーバ側でtcpdumpを実行します。 なお、tcpdumpの使い方は、tcpdumpの使い方(基本編) - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# tcpdump -i eth0 icmp -x

クライアントからサーバに対してpingを1回実行します。 このとき、ペイロードを0xffで埋めたICMP Echo Requestパケットを送信してみます

[root@client ~]# ping -c 1 -p ff 192.168.2.100
PATTERN: 0xff
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
64 bytes from 192.168.2.100: icmp_seq=1 ttl=64 time=0.648 ms

--- 192.168.2.100 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.648/0.648/0.648/0.000 ms

サーバ側で受信したICMP Echo Requestパケットの中身を確認します。 ペイロードが0xffのICMP Echo Requestパケットを受信し、その応答としてICMP Echo Replyパケットを返信しているのがわかります。

[root@server ~]# tcpdump -i eth0 icmp -x
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:34:49.006655 IP 192.168.2.105 > server: ICMP echo request, id 1922, seq 1, length 64
        0x0000:  4500 0054 78f5 4000 4001 3b96 c0a8 0269
        0x0010:  c0a8 0264 0800 f4b7 0782 0001 b942 c461
        0x0020:  0000 0000 7e20 0000 0000 0000 ffff ffff
        0x0030:  ffff ffff ffff ffff ffff ffff ffff ffff
        0x0040:  ffff ffff ffff ffff ffff ffff ffff ffff
        0x0050:  ffff ffff
18:34:49.006721 IP server > 192.168.2.105: ICMP echo reply, id 1922, seq 1, length 64
        0x0000:  4500 0054 586e 0000 4001 9c1d c0a8 0264
        0x0010:  c0a8 0269 0000 fcb7 0782 0001 b942 c461
        0x0020:  0000 0000 7e20 0000 0000 0000 ffff ffff
        0x0030:  ffff ffff ffff ffff ffff ffff ffff ffff
        0x0040:  ffff ffff ffff ffff ffff ffff ffff ffff
        0x0050:  ffff ffff

12 タイムアウトを指定する方法(-W)

存在しないホストに対してpingを実行してみます。 pingコマンドがタイムアウトするまで3秒(★)かかっていることがわかります。

[root@server ~]# date;ping -c 1 192.168.2.200;date
2021年 12月 22日 水曜日 ★19:27:26 JST
PING 192.168.2.200 (192.168.2.200) 56(84) bytes of data.
From 192.168.2.36 icmp_seq=1 Destination Host Unreachable

--- 192.168.2.200 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

2021年 12月 22日 水曜日 ★19:27:29 JST

次に、1秒のタイムアウトを指定してみます。 コマンドが1秒(★)で完了していることがわかります。

[root@server ~]# date;ping -W 1 -c 1 192.168.2.200;date
2021年 12月 22日 水曜日 ★19:28:43 JST
PING 192.168.2.200 (192.168.2.200) 56(84) bytes of data.

--- 192.168.2.200 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

2021年 12月 22日 水曜日 ★19:28:44 JST

13 pingの実行結果を簡潔に表示する方法(-q)

pingの実行結果(統計情報)だけを表示します。 ここでは、デフォルトルータにpingを10回実行してみます。

[root@server ~]# ping -q -c 10 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.

--- 192.168.2.1 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9073ms
rtt min/avg/max/mdev = 2.220/3.224/5.763/1.309 ms

14 IPv6アドレスに対するping

検証環境のIPv6は以下のとおりです。ともに、リンクローカルアドレスです。

client(eth0) ---------------------------------------------------(eth0) server
fe80::3e2:a9c0:9fa6:a8ad/64                        fe80::174:936a:8876:8055/64

クライアントでpingを実行します。 pingに指定する宛先IPv6アドレスは、サーバのIPv6リンクローカルアドレスです。 このとき、IPv6パケットを送信するデバイス名を-Iオプションで指定します。

[root@client ~]# ping -6 -I eth0 fe80::174:936a:8876:8055
PING fe80::174:936a:8876:8055(fe80::174:936a:8876:8055) from fe80::3e2:a9c0:9fa6:a8ad%eth0 eth0: 56 data bytes
64 bytes from fe80::174:936a:8876:8055%eth0: icmp_seq=1 ttl=64 time=0.640 ms
64 bytes from fe80::174:936a:8876:8055%eth0: icmp_seq=2 ttl=64 time=0.781 ms
-snip-

15 Path MTU Discoveryの使い方(-M)

-Mオプションを使うと、宛先までの経路上で最小のMTUを見つけることができます。

15.1 環境構築

作成したネットワークは以下のようになります。 r1,r2間のMTUは1000になります。

          192.168.100.0/24             192.168.110.0/24           192.168.120.0/24
            MTU=1500                       MTU=1000                    MTU=1500
   h1 ------------------------ r1 ------------------------ r2 ------------------------ h2
   (veth1-h1)        (veth1-r1)  (veth2-r1)      (veth1-r2)   (veth2-r2)     (veth1-h2)
     .10                    .20   .10                   .20   .10                   .20

15.2 フラグメント禁止の指定方法(-M do)

1500(byte)のICMPパケットを送信してみます。1500(byte)の内訳は以下のとおりです。

・IPヘッダ:20(byte)

・ICMPヘッダ:8(byte)

・ICMPペイロード:1472(byte)

フラグメントを禁止にすることで、パケット長がMTUを超える場合、ICMP Packet Too Bigが返信されます。

[root@client ~]# ping -M do -s 1472 192.168.120.20
PING 192.168.120.20 (192.168.120.20) 1472(1500) bytes of data.
From 192.168.100.20 icmp_seq=1 Frag needed and DF set (mtu = 1000)
ping: local error: Message too long, mtu=1000
ping: local error: Message too long, mtu=1000
ping: local error: Message too long, mtu=1000
ping: local error: Message too long, mtu=1000
-snip-

オプションを指定していないと、途中のルータがパケットを分割して宛先まで転送していることがわかります。

[root@client ~]# ping -s 1472 192.168.120.20
PING 192.168.120.20 (192.168.120.20) 1472(1500) bytes of data.
1480 bytes from 192.168.120.20: icmp_seq=1 ttl=62 time=0.054 ms
1480 bytes from 192.168.120.20: icmp_seq=2 ttl=62 time=0.056 ms
1480 bytes from 192.168.120.20: icmp_seq=3 ttl=62 time=0.058 ms
-snip-

なお、宛先までの経路上の最小MTUは、tracerouteコマンドでも調べることができます。 tracerouteコマンドは、tracerouteコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ