【OSPF】GTSM(Generalized TTL Security Mechanism)

GTSM(Generalized TTL Security Mechanism)は、IP パケットの TTL を使って、離れた場所から送られてきたパケットを拒否するセキュリティ機能です。OSPF で GTSM を有効にすると、ルータは OSPF パケットを TTL 255 で送り、受け取るときは TTL が 255 のまま届いたパケットだけを受け付けます。ルータを経由するたびに TTL は1ずつ減るので、TTL が 255 を下回ったパケットは、離れた場所から送られてきたもの(なりすましの可能性があるもの)として捨てられます。

この記事でわかること
  1. OSPF パケットの TTL の既定値と、GTSM を有効にしたときの TTL
  2. 片側だけ GTSM を有効にするとネイバーがダウンすること(INIT 状態)
  3. ttl-security all-interfaces の設定と確認のしかた

検証構成

R1 と R2 を 192.168.12.0/24 でつなぎ、エリア0で OSPF のネイバーにしておきます。

Area 0 R1R2 Lo0 1.1.1.1/32Lo0 2.2.2.2/32 .1.2 192.168.12.0/24
図1 検証構成
R2R1遠くの送信元 (GTSM 有効)(GTSM 有効) (ルータを経由) TTL 255 隣から直接 → 受け取る TTL 254 以下 途中で減っている → 捨てる GTSM:TTL が 255 のまま届いた OSPF パケットだけを受け取る
図2 GTSM の考え方(TTL が 255 のまま届いたパケットだけを受け取る)

OSPF パケットの TTL(既定値)

OSPF のパケットは、既定では TTL 1 で送られます。R2 が送った OSPF パケットをキャプチャすると、TTL は 1 です。

画面イメージについて

この記事の画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。

パケットキャプチャ(Wireshark):R2 が送った OSPF パケット画面イメージ
▾ Internet Protocol Version 4, Src: 192.168.12.2, Dst: 224.0.0.5    0100 .... = Version: 4    .... 0101 = Header Length: 20 bytes (5)  ▸ Differentiated Services Field: 0xc0 (DSCP: CS6, ECN: Not-ECT)    Total Length: 80    Identification: 0x043e (1086)  ▸ Flags: 0x0000    Fragment offset: 01    Time to live: 1    Protocol: OSPF IGP (89)    Header checksum: 0x07a8 [validation disabled]    [Header checksum status: Unverified]    Source: 192.168.12.2    Destination: 224.0.0.5▸ Open Shortest Path First
図3 GTSM を有効にする前の OSPF パケット(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Time to live: 1OSPF パケットの TTL の既定値。隣のルータまでしか届かない

GTSM の設定

R1 で GTSM を有効にする

OSPF のプロセスで ttl-security all-interfaces を設定すると、OSPF を動かしているすべてのインターフェースで GTSM が有効になります。まず R1 だけで有効にします。

R1

R1(config)# router ospf 1
R1(config-router)# ttl-security all-interfaces

R1 の OSPF パケットの TTL が 255 に変わります。

パケットキャプチャ(Wireshark):R1 が送った OSPF パケット画面イメージ
▾ Internet Protocol Version 4, Src: 192.168.12.1, Dst: 224.0.0.5    0100 .... = Version: 4    .... 0101 = Header Length: 20 bytes (5)  ▸ Differentiated Services Field: 0xc0 (DSCP: CS6, ECN: Not-ECT)    Total Length: 76    Identification: 0x038f (911)  ▸ Flags: 0x0000    Fragment offset: 01    Time to live: 255    Protocol: OSPF IGP (89)    Header checksum: 0x0a5b [validation disabled]    [Header checksum status: Unverified]    Source: 192.168.12.1    Destination: 224.0.0.5▸ Open Shortest Path First
図4 GTSM を有効にした R1 の OSPF パケット(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Time to live: 255GTSM を有効にすると、OSPF パケットを TTL の最大値 255 で送る

ネイバーがダウンすることを確認する

しばらくすると、R1 で R2 とのネイバーが Dead タイマーの満了でダウンします。

R1#
*Jul 19 04:48:56.615: %OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on FastEthernet0/0.12 
from FULL to DOWN, Neighbor Down: Dead timer expired

R1 にはネイバーがいなくなり、R2 では R1 が INIT のままになっています。

R1

R1# show ip ospf neighbor
R1#

R2

R2# show ip ospf neighbor

Neighbor ID     Pri   State           Dead Time   Address         Interface
1.1.1.1           1   INIT/DROTHER    00:00:38    192.168.12.1    FastEthernet0/0.12

INIT は、相手の Hello は受け取っているものの、まだ双方向(2-WAY)になっていない状態です。R1 から届く Hello に R2 自身のルータ ID が入っていない、つまり R1 が R2 の Hello を受け取れていないことを表します。

debug で原因を見る

R1 で debug ip ospf adj を有効にすると、R2 から届いた TTL 1 の OSPF パケットを捨てていることがわかります。GTSM を有効にした R1 は TTL 255 のパケットだけを受け取るので、これは正しい動きです。

R1# debug ip ospf adj     
OSPF adjacency debugging is on
R1#
*Jul 19 04:58:49.919: OSPF-1 ADJ   Fa0/0.12: Drop packet from 192.168.12.2 with TTL: 1

R2 でも GTSM を有効にする

GTSM は、ネイバーになる両方のルータで有効にする必要があります。R2 でも有効にすると、隣接関係が FULL に戻ります。

R2

R2(config)# router ospf 1
R2(config-router)# ttl-security all-interfaces
R2(config-router)#
*Jul 19 05:03:15.123: %OSPF-5-ADJCHG: Process 1, Nbr 1.1.1.1 on FastEthernet0/0.12 
from LOADING to FULL, Loading Done

まとめ

項目内容
設定router ospf で ttl-security all-interfaces(ネイバーの両側で設定)
送るパケットOSPF パケットを TTL 255 で送る(既定は TTL 1)
受け取るパケット既定(hops 1)では、隣のルータから TTL 255 のまま届いたパケットだけ
片側だけ有効にすると有効にした側が相手の Hello を捨てるので、相手側ではネイバーが INIT のままになる

これで、ルータを経由して届いた OSPF パケットは拒否され、離れた場所からなりすました OSPF パケットを送り込まれるのを防げます。なお、ttl-security all-interfaces は仮想リンクやシャムリンクには効かないので、それらは area virtual-link などのコマンドで個別に設定します。

 

コメント