yassy's note

なんかかきます

pfileからspfileの復旧手順

先日参加したOracleDBA(Bronze)の勉強会にて、初期化パラメータの設定をミスってDBが起動しなくなるトラブルが発生した。
その際の復旧手順をメモしておく。

  • バージョン
    OracleDB 19c

事前準備

まずはOracleDBの初期化パラメータをいじって起動しないようにしておく。
ここでは、SGA_MAX_SIZEを1TBという無茶な値にした。

SQL> startup
ORA-00844: Parameter not taking MEMORY_TARGET into account
ORA-00851: SGA_MAX_SIZE 1099511627776 cannot be set to more than MEMORY_TARGET 771751936.
ORA-01078: failure in processing system parameters

復旧

まずは、現在のSPFILE(バイナリファイル)からPFILE(テキストファイル)を作成する。
PFILEの格納先はどこでも良い。

SQL> create pfile='/u01/app/oracle/oradata/ORCL/controlfile/pfile' from spfile;

File created.

ファイル内容を確認すると、初期化パラメータの一覧がテキスト形式で出力されている。

SQL> host cat /u01/app/oracle/oradata/ORCL/controlfile/pfile
orcl.__data_transfer_cache_size=0
orcl.__db_cache_size=230686720
orcl.__inmemory_ext_roarea=0
orcl.__inmemory_ext_rwarea=0
orcl.__java_pool_size=4194304
orcl.__large_pool_size=4194304
orcl.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
orcl.__pga_aggregate_target=268435456
orcl.__sga_target=503316480
orcl.__shared_io_pool_size=16777216
orcl.__shared_pool_size=234881024
orcl.__streams_pool_size=0
orcl.__unified_pga_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='/u01/app/oracle/oradata/ORCL/controlfile/o1_mf_k0hbrgw6_.ctl','/u01/app/oracle/fast_recovery_area/ORCL/controlfile/o1_mf_k0hbrgxm_.ctl'
*.db_block_size=8192
*.db_create_file_dest='/u01/app/oracle/oradata'
*.db_domain='us.oracle.com'
*.db_name='orcl'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=8256m
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.memory_target=734m
*.open_cursors=300
*.pga_aggregate_target=104857600
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_max_size=1099511627776
*.undo_tablespace='UNDOTBS1'

ここで、PFILEの中身を正しいものに修正する。
今回はSGA_MAX_SIZEを元々の736MBに戻す。

SQL> host vi /u01/app/oracle/oradata/ORCL/controlfile/pfile
SQL>
SQL> host cat /u01/app/oracle/oradata/ORCL/controlfile/pfile
(中略)
*.sga_max_size=736M
*.undo_tablespace='UNDOTBS1'

PFILEの修正後はstartupオプションにpfileを指定して起動する。
こうすることで、PFILEが読み込まれて起動する。

SQL> startup pfile='/u01/app/oracle/oradata/ORCL/controlfile/pfile'
ORACLE instance started.

Total System Global Area  771748536 bytes
Fixed Size                  8901304 bytes
Variable Size             511705088 bytes
Database Buffers          247463936 bytes
Redo Buffers                3678208 bytes
Database mounted.
Database opened.

最後に、PFILEからSPFILEを作成すればOK。
こうすることで、再起動時は正しい設定のSPFILEを読み込むため、無事起動する。

SQL> create spfile from pfile='/u01/app/oracle/oradata/ORCL/controlfile/pfile';

File created.

Guacamoleコンソールの文字化け解消

環境はCentOS7、Guacamole1.3.0。
Guacamoleでコンソールを使う際、デフォルトだと以下のように文字化けする。
日本語だけでなく、アルファベットも妙なサイズとなってしまう。

f:id:yassy_225:20211013182413p:plain

これを解消するためには、等幅フォントを設定する必要がある。
今回はdejavu-sans-mono-fontsと日本語対応としてvlgothic-fontsを使用する。

# yum install dejavu-sans-mono-fonts vlgothic-fonts

インストール後、fc-cacheコマンドでフォント一覧を更新する。

[root@ip-172-31-38-88 lib]# fc-cache -fv
/usr/share/fonts: caching, new cache contents: 0 fonts, 2 dirs
/usr/share/fonts/dejavu: caching, new cache contents: 13 fonts, 0 dirs
/usr/share/fonts/vlgothic: caching, new cache contents: 1 fonts, 0 dirs
/usr/share/X11/fonts/Type1: caching, new cache contents: 13 fonts, 0 dirs
/usr/share/X11/fonts/TTF: skipping, no such directory
/usr/local/share/fonts: skipping, no such directory
/root/.local/share/fonts: skipping, no such directory
/root/.fonts: skipping, no such directory
/usr/share/fonts/dejavu: skipping, looped directory detected
/usr/share/fonts/vlgothic: skipping, looped directory detected
/usr/lib/fontconfig/cache: cleaning cache directory
/root/.cache/fontconfig: not cleaning non-existent cache directory
/root/.fontconfig: not cleaning non-existent cache directory
/usr/bin/fc-cache-64: succeeded

fc-listコマンドでインストールしたフォントが登録されていることを確認する。

[root@ip-172-31-38-88 lib]# fc-list | grep -e VL-Gothic-Regular.ttf -e DejaVuSansMono.ttf
/usr/share/fonts/dejavu/DejaVuSansMono.ttf: DejaVu Sans Mono:style=Book
/usr/share/fonts/vlgothic/VL-Gothic-Regular.ttf: VL Gothic:style=regular

OS側のフォント導入完了後、Guacamole側に設定を行う。
以下のように、接続設定のフォント名を設定する。

f:id:yassy_225:20211013184537p:plain

実は、フォント名は複数設定可能であるため、今回インストールしたdejavu-sans-mono-fontsとvlgothic-fontsをカンマ区切りで設定する。
ここで設定するフォント名は、fc-listコマンドで表示されるフォントから、拡張子ttfを取ったものとなる。

例えば、/usr/share/fonts/dejavu/DejaVuSansMono.ttf: DejaVu Sans Mono:style=Bookであれば、DejaVuSansMono
/usr/share/fonts/vlgothic/VL-Gothic-Regular.ttf: VL Gothic:style=regularであれば、VL-Gothic-Regularとなる。

設定後、コンソールにログインすると以下のように文字化けが解消されている。 f:id:yassy_225:20211013184528p:plain

DNS名前解決時のタイムアウト

qiita.com

この記事を読んで、これマ?と思ったので実際にやってみた。
環境はCentOS7。

事前準備

こんな感じで適当な名前解決先を指定しておく。
どれも無効なIPなので失敗します。

/etc/resolv.conf

; generated by /usr/sbin/dhclient-script
search ap-northeast-1.compute.internal
nameserver 8.8.8.9
nameserver 8.8.8.10
nameserver 8.8.8.11

やってみた

まずは、デフォルト設定である、timeout:5、attempts:2から。
必要なところだけ抜き出している。

[root@ip-172-31-43-45 ~]# strace route

poll([{fd=4, events=POLLIN}], 1, 5000)  = 0 (Timeout)
poll([{fd=5, events=POLLIN}], 1, 3000)  = 0 (Timeout)
poll([{fd=6, events=POLLIN}], 1, 6000)  = 0 (Timeout)

poll([{fd=4, events=POLLIN}], 1, 5000)  = 0 (Timeout)
poll([{fd=5, events=POLLIN}], 1, 3000)  = 0 (Timeout)
poll([{fd=6, events=POLLIN}], 1, 6000)  = 0 (Timeout)

待ち時間はpollの第4引数が示している。単位はミリ秒。
今回はnameserverを3台設定しているので、1台めは5秒、2台めは3秒、3台めは6秒待機している。
attemptsは2を指定しているので、これを2セット行っている。

この辺は最初に挙げた記事の内容と合致している。

1回目の問い合わせ時は、options timeout:nの秒数をセットして問い合わせる。
2回目の問い合わせ時は、1回目のタイムアウト秒を2倍した値を、登録してあるnameserverの数で割った値で問い合わせる。
3回目以降の問い合わせ時は、2回目の問い合わせ時の2倍の値を使う。

これを1セットとし、options attempts:nの回数分繰り返す。

以上のことから、名前解決のエラーが返ってくるまで14×2=28秒かかると計算できる。
こちらについても、timeコマンドを使用して測定してみる。

[root@ip-172-31-43-45 ~]# time route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 eth0
172.31.32.0     0.0.0.0         255.255.240.0   U     0      0        0 eth0

real    0m28.036s
user    0m0.000s
sys     0m0.008s

確かに、机上計算と一致している。

他のパラメータでやってみる

次に、attempts:3、timeout:7で試してみる。

机上計算では、
1回目:7000ミリ
2回目:7000×2÷3=4666.666...
3回目:4666.666...×2=9333.333...
となり、合計タイムアウト値は20999×3=62997ミリ秒=62.997秒と考えられる。

こちらも実際に確認してみる。

[root@ip-172-31-43-45 ~]# strace route

poll([{fd=4, events=POLLIN}], 1, 7000)  = 0 (Timeout)
poll([{fd=5, events=POLLIN}], 1, 4000)  = 0 (Timeout)
poll([{fd=6, events=POLLIN}], 1, 9000)  = 0 (Timeout)

poll([{fd=4, events=POLLIN}], 1, 7000)  = 0 (Timeout)
poll([{fd=5, events=POLLIN}], 1, 4000)  = 0 (Timeout)
poll([{fd=6, events=POLLIN}], 1, 9000)  = 0 (Timeout)

poll([{fd=4, events=POLLIN}], 1, 7000)  = 0 (Timeout)
poll([{fd=5, events=POLLIN}], 1, 4000)  = 0 (Timeout)
poll([{fd=6, events=POLLIN}], 1, 9000)  = 0 (Timeout)
[root@ip-172-31-43-45 ~]# time route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 eth0
172.31.32.0     0.0.0.0         255.255.240.0   U     0      0        0 eth0

real    1m0.056s
user    0m0.002s
sys     0m0.002s

ほう。
straceの結果を見ると、端数は百の位で切り捨てされるということが分かる。
そのため、実際の待ち時間は(7000+4000+9000)×3=20000×3=60000ミリ秒=60秒
となり、timeコマンドの結果と一致する。

うーん、勉強になった。

trapコマンドでのシグナル受信

シェルスクリプトは、毎回正常に終了するとは限らない。
例えば実行した誰かが[Ctrl + C]で中断してしまうかもしれないし、オペミス等でkill(TERM)されてしまうかもしれない。

この時、一時ファイル等を作成していたとするとそのファイルがそのまま残ってしまう。
対処として、trapコマンドを使うという方法がある。
(自分が経験した現場ではそういった事象に備え、スクリプト起動時にrm -fで削除しているところもあったが…)

trapコマンドは

trap '実行コマンド' <シグナル名>

のように書くことで、特定のシグナルを受信した際に指定したコマンドを実行できる。

例えば、シェルスクリプト実行中、何らかの原因で異常終了した場合にメッセージを出力したいとする。
その場合、このように書く。

#!/bin/bash

trap 'echo "異常終了しました。"' HUP INT QUIT TERM

<処理内容>

シグナルは数字でも記述できるが、可読性を考えるとちゃんと文字列で書いた方がいいと思う。
各シグナルの説明は以下のmanページに記載されている。

linuxjm.osdn.jp

応用として、シェルスクリプトの中でコマンドが失敗した場合にエラーを出す使い方もできる。

#!/bin/bash

set -e

trap 'echo "コマンドが失敗しました"' ERR

<処理内容>

set -eは、コマンドが失敗した場合に処理を即停止させるオプション。
trapで指定しているERRはコマンドのエラーを検知するためのもの。
エラーといっても、実際にはコマンドの戻り値を見ており、0以外であればエラー判定される。
例えばgrepなどは文字列検知時に0を返すが、非検知時には1を返すため、エラー判定されやすい問題がある。

この辺は「ハマリポイント」して有名であるようで、if文の条件式に含めたり、一時的にset +eする等の対処方法がある。
以下の記事がとても参考になった。

sousaku-memo.net

他のハマリポイントや、もっと細かく知りたければ以下が参考になる。

qiita.com

シェルスクリプトって奥が深いなぁと思いました。

【おまけ】シグナルとは

シグナルとは、発生したイベントをプロセスに通知するために使用するものである。
killコマンドでプロセスを終了させたことがあると思うが、あれもプロセスにシグナル(デフォルトはTERM)を送っている。
ちなみにTERMは終了シグナル。

シェルスクリプトで一時ファイルを作成する

最近シェルスクリプトを書く機会があった。
その中で一時ファイルを作成し、スクリプトの終了時に削除するように書いていた。こんな感じ。

touch /tmp/.lockfile
(いろいろな処理)
rm -f /tmp/.lockfile

で、もっとスマートな方法はないかなと探していたらmktempなるコマンドが存在することを知った。

mktempは名前の通り、/tmpに一時ファイルを作成するコマンドで、「/tmp/tmp.SX2rckOzx9」のようにtmp.<ランダム文字列>が作成される。
また、作成されるファイルの権限は600なのでセキュリティも考慮されている。

[root@ip-172-31-32-196 ~]# mktemp
/tmp/tmp.SX2rckOzx9
[root@ip-172-31-32-196 ~]#
[root@ip-172-31-32-196 ~]# ll /tmp/
-rw-------. 1 root root    0 Sep 15 06:17 tmp.SX2rckOzx9

もちろん、生成されるファイル名はある程度は変更できるため、以下のようにホスト名を含むことも可能。

[root@ip-172-31-32-196 ~]# mktemp /tmp/`hostname -s`_XXXXXX.tmp
/tmp/ip-172-31-32-196_Bu64v3.tmp
[root@ip-172-31-32-196 ~]#
[root@ip-172-31-32-196 ~]# ll /tmp/
-rw-------. 1 root root    0 Sep 15 06:20 ip-172-31-32-196_Bu64v3.tmp

XXXXXXはランダム文字列をどこに充てるかを指定している。
手元の環境(CentOS 7)では、最低3文字を指定する必要があるようだ。

TEMPLATE must contain at least 3 consecutive 'X's in last component.

mktempを使って最初に提示したスクリプトを修正すると、以下のようになる。

TEMP=`mktemp /tmp/.lockfile_XXXXXX`
(いろいろな処理)
rm -f $TEMP

ちなみに、-dオプションを使用するとディレクトリが作成される。

[root@ip-172-31-32-196 ~]# mktemp -d `hostname -s`_XXXXXX.tmp
ip-172-31-32-196_g4GFkO.tmp
[root@ip-172-31-32-196 ~]#
[root@ip-172-31-32-196 ~]# ll
drwx------. 2 root root    6 Sep 15 06:41 ip-172-31-32-196_g4GFkO.tmp

nmapのスキャン方法

最近趣味でCTFの勉強したりしているが、よく使用するのがnmap。
nmapはポートスキャンツールとして知られているが、実際にどういう原理で動作しているのかは知らなかったので、今回勉強したことをまとめる。

nmapでよく使用されるスキャン方法は以下のようなものがある。カッコ内はnmapでのオプション。

  • TCP Connectスキャン(-sT)
  • TCP SYNスキャン(-sS) ※ハーフスキャン、ハーフオープンスキャンとも呼ばれる
  • UDP スキャン(-sU)
  • TCP Nullスキャン(-sN)
  • TCP FINスキャン(-sF)
  • TCP クリスマススキャン(-sX)

なお、nmapのデフォルトスキャン方法はユーザの権限によって異なり、
特権ユーザの場合はTCP SYNスキャン、特権でない場合はTCP Connectスキャンとなる。

nmapドキュメントより

-sS (TCP SYN scan) SYN scan is the default and most popular scan option for good reasons.

-sT (TCP connect scan) TCP connect scan is the default TCP scan type when SYN scan is not an option. This is the case when a user does not have raw packet privileges.

TCP Connectスキャン

3ウェイハンドシェイクにより、コネクションを確立させることでポートが開いているかを確認するスキャン方法。

f:id:yassy_225:20210802201252p:plain

対象サーバからSYN/ACKが返ってくれば、そのポートは開いていると判断できる。
もしポートが開いていないならば、対象サーバからはRSTが返ってくる。

この仕様はRFC793で定義されている。

  1. If the connection does not exist (CLOSED) then a reset is sent in response to any incoming segment except another reset. In particular, SYNs addressed to a non-existent connection are rejected by this means.
    1.もし接続が存在しないなら(CLOSED)、リセット以外どんな入ってくる セグメントに対しても、リセットが送られる。特に、非実在の接続へのSYNs がこの手段によって拒絶される。

実際にwiresharkで挙動を確認するのが分かりやすい。
まずはポートが開いていた場合。

$ sudo nmap -sT -p 80 10.10.149.87 -vv -Pn
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-02 20:02 JST
Initiating Parallel DNS resolution of 1 host. at 20:02
Completed Parallel DNS resolution of 1 host. at 20:02, 0.02s elapsed
Initiating Connect Scan at 20:02
Scanning 10.10.149.87 [1 port]
Discovered open port 80/tcp on 10.10.149.87
Completed Connect Scan at 20:02, 0.25s elapsed (1 total ports)
Nmap scan report for 10.10.149.87
Host is up, received user-set (0.25s latency).
Scanned at 2021-08-02 20:02:58 JST for 0s

PORT   STATE SERVICE REASON
80/tcp open  http    syn-ack

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.33 seconds

f:id:yassy_225:20210802200512p:plain

今回80番ポートは開いているので、サーバからSYN/ACKが返却された。
最後のRST/ACKについては、接続を張ったままとしないようにクライアントから送られたものだと考えられる。

次に、ポートが開いていなかった場合。

$ sudo nmap -sT -p 80 localhost -vv -Pn
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-02 20:21 JST
Warning: Hostname localhost resolves to 2 IPs. Using 127.0.0.1.
Initiating Connect Scan at 20:21
Scanning localhost (127.0.0.1) [1 port]
Completed Connect Scan at 20:21, 0.00s elapsed (1 total ports)
Nmap scan report for localhost (127.0.0.1)
Host is up, received user-set (0.00012s latency).
Other addresses for localhost (not scanned): ::1
Scanned at 2021-08-02 20:21:22 JST for 0s

PORT   STATE  SERVICE REASON
80/tcp closed http    conn-refused

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds

f:id:yassy_225:20210802202244p:plain

ローカルホストの80番ポートは開けていないため、RSTが返却されている。

f:id:yassy_225:20210802202553p:plain

ただし、一般的な構成ではファイアウォールを置いていることが多く、
その場合はパケットがドロップされる=対象サーバまで届かない=RSTが返却されない。

結果としてはSYNに対する応答が返ってこないため、nmapはフィルタリングされていると判断する。

$ sudo nmap -sT -p 85 10.10.149.87 -vv -Pn
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-02 20:28 JST
Initiating Parallel DNS resolution of 1 host. at 20:28
Completed Parallel DNS resolution of 1 host. at 20:28, 0.01s elapsed
Initiating Connect Scan at 20:28
Scanning 10.10.149.87 [1 port]
Completed Connect Scan at 20:28, 2.00s elapsed (1 total ports)
Nmap scan report for 10.10.149.87
Host is up, received user-set.
Scanned at 2021-08-02 20:28:18 JST for 2s

PORT   STATE    SERVICE    REASON
85/tcp filtered mit-ml-dev no-response

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 2.07 seconds

TCP SYNスキャン

TCP SYNスキャンはTCP Connectスキャンと似ているが、コネクションを成立させないという特徴がある。
以下の図のように、サーバからSYN/ACKが返却された後にRSTでコネクションを切断するのだ。

f:id:yassy_225:20210802203422p:plain

確かに、nmapからはSYN/ACKが返却された時点でポートが開いていることは判明しているので、
余計なやり取りをしなくて済む。
(我々が行いたいのはポートスキャンであって、コネクションの成立ではないのだ)

また、この方法では接続が成立していないため、サーバにログが残らないメリット(?)がある。
ただし、間のファイアウォールにはログが記録される可能性がある。

$ sudo nmap -sS -p 80 10.10.149.87 -vv -Pn
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-02 20:35 JST
Initiating Parallel DNS resolution of 1 host. at 20:35
Completed Parallel DNS resolution of 1 host. at 20:35, 0.03s elapsed
Initiating SYN Stealth Scan at 20:35
Scanning 10.10.149.87 [1 port]
Discovered open port 80/tcp on 10.10.149.87
Completed SYN Stealth Scan at 20:35, 0.29s elapsed (1 total ports)
Nmap scan report for 10.10.149.87
Host is up, received user-set (0.25s latency).
Scanned at 2021-08-02 20:35:34 JST for 0s

PORT   STATE SERVICE REASON
80/tcp open  http    syn-ack ttl 127

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.41 seconds
           Raw packets sent: 1 (44B) | Rcvd: 1 (44B)

f:id:yassy_225:20210802203656p:plain

ポートが開いていなかった場合の挙動は、TCP connectスキャンと同様に、サーバからRSTが返却される。

UDP スキャン

UDPTCPと異なり相手の応答を待たないため、ポートスキャンにおいては厄介である。
基本的には接続要求に対して応答を行わないため、nmapからはopen|filteredと判断される。(開いているのかドロップされているのか判断できないため)

$ sudo nmap -sU -p 80 10.10.149.87 -vv -Pn
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-02 20:49 JST
Initiating Parallel DNS resolution of 1 host. at 20:49
Completed Parallel DNS resolution of 1 host. at 20:49, 0.02s elapsed
Initiating UDP Scan at 20:49
Scanning 10.10.149.87 [1 port]
Completed UDP Scan at 20:49, 2.04s elapsed (1 total ports)
Nmap scan report for 10.10.149.87
Host is up, received user-set.
Scanned at 2021-08-02 20:49:08 JST for 2s

PORT   STATE         SERVICE REASON
80/udp open|filtered http    no-response

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 2.15 seconds
           Raw packets sent: 2 (84B) | Rcvd: 0 (0B)

ただし、ポートが閉じている場合にはICMPパケット(Destination unreachable(Port unreachable))が返却されるため、
閉じているポートについては判断できる。

$ sudo nmap -sU -p 80 localhost -vv -Pn
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-02 20:40 JST
Warning: Hostname localhost resolves to 2 IPs. Using 127.0.0.1.
Initiating UDP Scan at 20:40
Scanning localhost (127.0.0.1) [1 port]
Completed UDP Scan at 20:40, 0.03s elapsed (1 total ports)
Nmap scan report for localhost (127.0.0.1)
Host is up, received user-set (0.000052s latency).
Other addresses for localhost (not scanned): ::1
Scanned at 2021-08-02 20:40:16 JST for 0s

PORT   STATE  SERVICE REASON
80/udp closed http    port-unreach ttl 64

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.14 seconds
           Raw packets sent: 1 (42B) | Rcvd: 2 (112B)

f:id:yassy_225:20210802204837p:plain

TCP Nullスキャン

TCP Nullスキャンは、何のフラグも立てていないパケットを送信する方法。
コネクションの成立はできないため、UDPスキャンと同じく開いているポートの判断ができない。
しかし、閉じているポートからはRSTが返却されるため、閉じているポートが何かを調査する場合に使用する。

$ sudo nmap -sN -p 80 10.10.149.87 -vv -Pn
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-02 20:50 JST
Initiating Parallel DNS resolution of 1 host. at 20:50
Completed Parallel DNS resolution of 1 host. at 20:50, 0.01s elapsed
Initiating NULL Scan at 20:50
Scanning 10.10.149.87 [1 port]
Completed NULL Scan at 20:50, 2.04s elapsed (1 total ports)
Nmap scan report for 10.10.149.87
Host is up, received user-set.
Scanned at 2021-08-02 20:50:51 JST for 2s

PORT   STATE         SERVICE REASON
80/tcp open|filtered http    no-response

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 2.14 seconds
           Raw packets sent: 2 (80B) | Rcvd: 0 (0B)

wiresharkで確認すると、このように何のフラグも立っていないことが分かる。

f:id:yassy_225:20210802205601p:plain

TCP FINスキャン

TCP FINスキャンは、FINフラグのみを立てたパケットを送信する方法。
こちらもNullスキャンと同じく、コネクションの成立ができないため、閉じているポートが何かを調査する場合に使用する。

f:id:yassy_225:20210802210041p:plain

TCP クリスマススキャン

なんか楽しそうな名前であるが、FIN、URG(緊急に処理すべきデータを含んでいる)、PUSH(データを即座に上位層に渡す)フラグを立てたパケットを送信する方法。
こちらもNullスキャン、FINスキャンと同様に閉じているポートの調査に使用する。
名前の由来は、フラグがクリスマスツリーのごとく点灯しているように見えることから。

f:id:yassy_225:20210802210633p:plain

TCP Nullスキャン、FINスキャン、クリスマススキャンについては、特定のファイアウォールによるフィルタリングを回避するために使用される。