GTSM(Generalized TTL Security Mechanism)は、IP パケットの TTL を使って、離れた場所から送られてきたパケットを拒否するセキュリティ機能です。OSPF で GTSM を有効にすると、ルータは OSPF パケットを TTL 255 で送り、受け取るときは TTL が 255 のまま届いたパケットだけを受け付けます。ルータを経由するたびに TTL は1ずつ減るので、TTL が 255 を下回ったパケットは、離れた場所から送られてきたもの(なりすましの可能性があるもの)として捨てられます。
- OSPF パケットの TTL の既定値と、GTSM を有効にしたときの TTL
- 片側だけ GTSM を有効にするとネイバーがダウンすること(INIT 状態)
ttl-security all-interfacesの設定と確認のしかた
検証構成
R1 と R2 を 192.168.12.0/24 でつなぎ、エリア0で OSPF のネイバーにしておきます。
OSPF パケットの TTL(既定値)
OSPF のパケットは、既定では TTL 1 で送られます。R2 が送った OSPF パケットをキャプチャすると、TTL は 1 です。
この記事の画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
▾ 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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Time to live: 1 | OSPF パケットの 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 に変わります。
▾ 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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Time to live: 255 | GTSM を有効にすると、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 などのコマンドで個別に設定します。
コメント