[OSPF] DRとBDRの話

最近になってOSPFでDRに関する認識が間違えていたことに気がついた。

ということでメモ。
何かというと, DRが落ちるとBDRがDRに昇格されるまでの間, そのネットワーク内ではルートが消失するということ。
正直, BDRがDB保持しているのでネイバーはそれを即時引き継ぐものだと思っていた。
しかし, とある環境で「なーんかメインの経路じゃないルータが落ちてPingロストするなー」なんて思って調べていて, わかったのがこれ。◯十年ネットワークエンジニアやっていたけど, この挙動は全く知なかったし意識したこともなかった。「障害ポイントによっては収束に時間がかかる場合があるよな」くらいの認識でした。
まだまだ知らないことばかり。
OSPF v2のRFC「https://www.ietf.org/rfc/rfc2328.txt」にも書いてありました。
Section 2 of this document discusses the directed graph
representation of an area. Router nodes are labelled with their
Router ID. Transit network nodes are actually labelled with the
IP address of their Designated Router. It follows that when the
Designated Router changes, it appears as if the network node on
the graph is replaced by an entirely new node. This will cause
the network and all its attached routers to originate new LSAs.
Until the link-state databases again converge, some temporary
loss of connectivity may result.
This may result in ICMP
unreachable messages being sent in response to data traffic.
For that reason, the Designated Router should change only
infrequently. Router Priorities should be configured so that
the most dependable router on a network eventually becomes
Designated Router.

改めて検証してみる。
ルータ3台でOSPFを組むシンプルな構成。
PC1からPC2の経路はRouter1~Router2となるようにOSPFのコストを調整する。その上で, Router 1のPriorityを0にしてDR選出から外し, 2のPriorityを50, 3のPriorityを100にする。これで, 通信経路はRouter2をメインとするが, DRはRouter3になる。

正常時のshow ip ospf neとshow ip ro の出力結果。設定どおり。

Router1のネイバー

IOU1#sh ip ospf ne

Neighbor ID Pri State Dead Time Address Interface
192.168.3.2 50 FULL/BDR 00:00:35 192.168.2.2 Ethernet0/0
192.168.3.3 100 FULL/DR 00:00:31 192.168.2.3 Ethernet0/0

IOU1#sh ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
+ - replicated route, % - next hop override

Gateway of last resort is not set

192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.1.0/24 is directly connected, Ethernet0/1
L 192.168.1.1/32 is directly connected, Ethernet0/1
192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.2.0/24 is directly connected, Ethernet0/0
L 192.168.2.1/32 is directly connected, Ethernet0/0
O 192.168.3.0/24 [110/110] via 192.168.2.2, 00:10:35, Ethernet0/0

Router 2のネイバー

IOU2#sh ip ospf ne
Neighbor ID Pri State Dead Time Address Interface
192.168.2.1 0 FULL/DROTHER 00:00:33 192.168.2.1 Ethernet0/0
192.168.3.3 100 FULL/DR 00:00:35 192.168.2.3 Ethernet0/0
IOU2#sh ip route 
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
+ - replicated route, % - next hop override

Gateway of last resort is not set

O 192.168.1.0/24 [110/110] via 192.168.2.1, 00:11:53, Ethernet0/0
192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.2.0/24 is directly connected, Ethernet0/0
L 192.168.2.2/32 is directly connected, Ethernet0/0
192.168.3.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.3.0/24 is directly connected, Ethernet0/1
L 192.168.3.2/32 is directly connected, Ethernet0/1

Router 3のネイバー

IOU3#sh ip ospf
*Apr 18 07:04:07.804: %SYS-5-CONFIG_I: Configured from console by console
IOU3#sh ip ospf ne

Neighbor ID Pri State Dead Time Address Interface
192.168.2.1 0 FULL/DROTHER 00:00:38 192.168.2.1 Ethernet0/0
192.168.3.2 50 FULL/BDR 00:00:34 192.168.2.2 Ethernet0/0
IOU3#sh ip route 
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
+ - replicated route, % - next hop override

Gateway of last resort is not set

O 192.168.1.0/24 [110/210] via 192.168.2.1, 00:12:06, Ethernet0/0
192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.2.0/24 is directly connected, Ethernet0/0
L 192.168.2.3/32 is directly connected, Ethernet0/0
192.168.3.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.3.0/24 is directly connected, Ethernet0/1
L 192.168.3.3/32 is directly connected, Ethernet0/1

と, ここまでやってCiscoでは収束が早くて事象が出ない。 たまにPingロスト起きるけどこれOSPF関係ないやつだ。

Debugとってみたらコンマ数秒で切り替わっていたのでCiscoはよく出来ているということがわかりました。


ということでVyOSで検証。

VyOSではBDRがいなくなるとルートアップデートしないというバグらしき挙動をするので構成はちょっと変えた。

VyOS1のステータス。VyOS3がDRでVyOS2がBDR。PC2への宛先はVyOS2に向いている。なお, Helloは5秒。Deadは15秒にした。

vyos1@vyos:~$ sh ip ospf ne

Neighbor ID Pri State Dead Time Address Interface RXmtL RqstL DBsmL
10.10.20.2 50 Full/Backup 11.994s 10.10.10.2 eth0:10.10.10.1 0 0 0
10.10.10.3 100 Full/DR 10.991s 10.10.10.3 eth0:10.10.10.1 0 0 0
vyos@vyos:~$ sh ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
I - ISIS, B - BGP, > - selected route, * - FIB route

O 10.10.10.0/24 [110/10] is directly connected, eth0, 00:17:16
C>* 10.10.10.0/24 is directly connected, eth0
O>* 10.10.20.0/24 [110/30] via 10.10.10.2, eth0, 00:00:08
O>* 10.10.30.0/24 [110/40] via 10.10.10.2, eth0, 00:00:08
C>* 127.0.0.0/8 is directly connected, lo
O 192.168.1.0/24 [110/10] is directly connected, eth3, 00:17:16
C>* 192.168.1.0/24 is directly connected, eth3
O>* 192.168.2.0/24 [110/40] via 10.10.10.2, eth0, 00:00:08

この時点で, PC1からPC2への経路はVyOS1~VyOS2~VyOS4となっている。VyOS3はバックアップラインとなっている。
ここで, 通信に影響の無いはずのVyOS3(DR)のインタフェースをDisableにする。
VyOS3

vyos3@vyos# set interfaces ethernet eth0 disable
[edit]
vyos@vyos# commit
[edit]
vyos@vyos#

VyOS1

vyos1@vyos:~$ sh ip ro
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
I - ISIS, B - BGP, > - selected route, * - FIB route

C>* 10.10.10.0/24 is directly connected, eth0
C>* 127.0.0.0/8 is directly connected, lo
O 192.168.1.0/24 [110/10] is directly connected, eth3, 00:33:43
C>* 192.168.1.0/24 is directly connected, eth3
vyos@vyos:~$
vyos@vyos:~$ sh ip ospf ne

Neighbor ID Pri State Dead Time Address Interface RXmtL RqstL DBsmL
10.10.20.2 50 Full/DR 14.753s 10.10.10.2 eth0:10.10.10.1 1 0 0

Pingの状態はというと・・・。

84 bytes from 192.168.2.10 icmp_seq=136 ttl=61 time=4.304 ms
84 bytes from 192.168.2.10 icmp_seq=137 ttl=61 time=5.105 ms
*192.168.1.1 icmp_seq=138 ttl=64 time=0.999 ms (ICMP type:3, code:0, Destination network unreachable)
*192.168.1.1 icmp_seq=139 ttl=64 time=0.832 ms (ICMP type:3, code:0, Destination network unreachable)
*192.168.1.1 icmp_seq=140 ttl=64 time=0.925 ms (ICMP type:3, code:0, Destination network unreachable)
*192.168.1.1 icmp_seq=141 ttl=64 time=1.416 ms (ICMP type:3, code:0, Destination network unreachable)
192.168.2.10 icmp_seq=142 timeout
*192.168.1.1 icmp_seq=143 ttl=64 time=1.184 ms (ICMP type:3, code:0, Destination network unreachable)
192.168.2.10 icmp_seq=144 timeout
*192.168.1.1 icmp_seq=145 ttl=64 time=1.185 ms (ICMP type:3, code:0, Destination network unreachable)
192.168.2.10 icmp_seq=146 timeout
*192.168.1.1 icmp_seq=147 ttl=64 time=1.224 ms (ICMP type:3, code:0, Destination network unreachable)
192.168.2.10 icmp_seq=148 timeout
*192.168.1.1 icmp_seq=149 ttl=64 time=0.886 ms (ICMP type:3, code:0, Destination network unreachable)
192.168.2.10 icmp_seq=150 timeout
192.168.2.10 icmp_seq=151 timeout
192.168.2.10 icmp_seq=152 timeout
84 bytes from 192.168.2.10 icmp_seq=153 ttl=61 time=3.531 ms

16秒ほどパケロスしていた。
VyOSなので, DRが切り替わってBDRが選出されるまでの間が通信断になっていると思われる。

OSPFの仕様ということでしょうがないのかもしれないが, アクティブなルートに関係ないところでDRが落ちると影響出るというのは設計時には要注意ですね。
アップデートの負荷が小さいのであれば, イーサネットでもPoint-to-Multipointにした方が良いのではないかと思いました。

CiscoルータでのVTI+IKEv2設定(NAT越し)~対VyOS編~

ということで,Cisco~VyOS間でも試した。

検証した結果わかったことは以下の通り。

・VyOS1.1.x台ではVTI+IKEv2ではVPNは張れない。
   いや, 張れるんだけど(Phase2まで上がるんだけど) 疎通が取れない。
・EC2のElastic IPで,末尾が0だと(サブネットゼロだと)Cisco側でネットワークアドレスとしてみなされるらくしPhase2で失敗する。(たとえ ip subnet-zero が入っていたとしても)
<追記>
・改めてCisco~VyOS間のトラフィックを確認したら, 正常にトラフィックが流れていないことに気がついた。VyOSからソースIFをVTI指定してのPingでないとトラフィックがトンネルを通らない。Beta版のバグなのかな。
なので, 現時点ではVPNは張れるがまともに使えないという状況。要調査。

VyOSのBeta版はこちらからダウンロードする。
https://downloads.vyos.io/?dir=rolling/current/amd64
今回のバージョンはvyos-999.201802070337-amd64.iso
参考までにアップグレード方法を。
本家にやり方ありますが一応。

$ conf
# set system name-server 8.8.8.8 (Google先生スミマセン)
# commit
# exit
$ sudo su
# wget beta版URL
# exit
$ add system image file
$ show system image
The system currently has the following image(s) installed:

1: 999.201802070337- (default boot)
2: 1.1.8 (running image)
$ reboot

これでオッケー。
なお,設定はVTIのときとほぼ同じで至ってシンプル。

set interfaces vti vti1 address '10.10.10.1/30'
~途中省略~
set vpn ipsec esp-group ESP compression 'disable'
set vpn ipsec esp-group ESP lifetime '3600'
set vpn ipsec esp-group ESP mode 'tunnel'
set vpn ipsec esp-group ESP pfs 'dh-group14'
set vpn ipsec esp-group ESP proposal 1 encryption 'aes256'
set vpn ipsec esp-group ESP proposal 1 hash 'sha256'
set vpn ipsec ike-group IKE ikev2-reauth 'no'
set vpn ipsec ike-group IKE key-exchange 'ikev2'
set vpn ipsec ike-group IKE lifetime '3600'
set vpn ipsec ike-group IKE proposal 1 dh-group '14'
set vpn ipsec ike-group IKE proposal 1 encryption 'aes256'
set vpn ipsec ike-group IKE proposal 1 hash 'sha256'
set vpn ipsec ipsec-interfaces interface 'eth0'
set vpn ipsec site-to-site peer B.B.B.B authentication id '10.200.10.20'
set vpn ipsec site-to-site peer B.B.B.B authentication mode 'pre-shared-secret'
set vpn ipsec site-to-site peer B.B.B.B authentication pre-shared-secret 'password'
set vpn ipsec site-to-site peer B.B.B.B authentication remote-id '192.168.1.2'
set vpn ipsec site-to-site peer B.B.B.B connection-type 'initiate'
set vpn ipsec site-to-site peer B.B.B.B default-esp-group 'ESP'
set vpn ipsec site-to-site peer B.B.B.B ike-group 'IKE'
set vpn ipsec site-to-site peer B.B.B.B ikev2-reauth 'inherit'
set vpn ipsec site-to-site peer B.B.B.B local-address '10.200.10.20'
set vpn ipsec site-to-site peer B.B.B.B vti bind 'vti1'
set vpn ipsec site-to-site peer B.B.B.B vti esp-group 'ESP'

これでトンネル間の疎通が取れた。

vyos@VPN1:~$ ping 10.10.10.2 interface vti1 PING 10.10.10.2 (10.10.10.2) from 10.10.10.1 vti1: 56(84) bytes of data. 64 bytes from 10.10.10.2: icmp_seq=1 ttl=255 time=6.92 ms 64 bytes from 10.10.10.2: icmp_seq=2 ttl=255 time=6.86 ms

ちなみにVyOS1.1.8(以前)の場合,show crypto session や show vpn ipsec sa でステータスがアップになるが,疎通が取れない。VyOS側で確認するとトンネルインタフェースがAdmin Down状態となってしまう。(原因不明)

vyos@VPN2:~$ sh int vti vti1
vti1@NONE: mtu 1500 qdisc noqueue state DOWN group default
link/ipip 10.200.10.20 peer B.B.B.B
inet 10.10.20.1/30 scope global vti1
valid_lft forever preferred_lft forever

RX: bytes packets errors dropped overrun mcast
0 0 0 0 0 0
TX: bytes packets errors dropped carrier collisions
0 0 0 0 0 0

VyOS1.1.x系はIKEv2に対してはlimited supportということで,今回は現時点で最新のベータバージョンを利用した。

CiscoルータでのVTI+IKEv2設定(NAT越し)

EC2にCisco1000vを立て, 自宅とVPNを張る。
以前, VyOSとでGRE over IPSecVTIと2パターンやったが, 今回はVTI+IKEv2でやる。
まずはCisco同士でトライ。

はじめに

「何故IKEv2でやろうとしたか」
単純にv2だからより安全なんだろうと思ったから。
IKEv1と何が違うのかは様々なサイトに詳しく書いてある。
・UNIVERGE IXシリーズ FAQ「IKEv2に関するFAQ
・Cisco IOS セキュリティ コンフィギュレーション ガ イド「Cisco IOS セキュリティ コンフィギュレーション ガ イドインターネット キー エクスチェンジ バージョ ン 2(IKEv2)の設定
個人的には設定の可視化レベルがcrypto mapよりは高いと感じた。P1のポリシーもピア毎に指定できるのでこのあたりは便利だと思う。(Site-to-Siteだとあまり恩恵は感じられないかもしれない)

構成概要

2台のルータでIPSecをVTI+IKEv2で張る。
それぞれのルータはNAT越しに通信する。
鍵交換はPSK。
暗号化周りはAES256, SHA2-256, DH 14。

構成概略図

前提条件

・EC2上にインスタンス作成済
・そのインスタンスにElastic IP割当済
・適切にセキュリティグループは設定済(UDP500・4500は許可等)
・自宅のGlobal IPは固定前提
・ブロードバンドルータでポートフォワーディング設定済

設定手順

Config上から流し込んでいくイメージでOK。
・IKEv2のプロポーザル設定
・IKEv2のポリシー設定
・IKEv2のKey設定
・IKEv2のプロファイル設定
・トランスフォームセット設定
・IPSECプロファイル設定
・トンネルインタフェース作成
・VTI適用

いざ設定

Configを抜粋。
基本的にこのまま流し込めばOK。

C841M
C1000v
!プロポーザル設定
crypto ikev2 proposal IKEv2_Proposal
encryption aes-cbc-256
integrity sha256
group 14

! ポリシー設定
crypto ikev2 policy IKEv2_Policy
proposal IKEv2_Proposal

!キー設定
crypto ikev2 keyring IKEv2_Key_Cisco
peer C1000V
address A.A.A.A
pre-shared-key password

! プロファイル設定
crypto ikev2 profile IKEv2_Profile_Cisco
match identity remote address 10.200.10.12 255.255.255.255
identity local address 192.168.1.2
authentication remote pre-share
authentication local pre-share
keyring local IKEv2_Key_Cisco
lifetime 3600

! トランスフォームセット設定
crypto ipsec transform-set IPSEC esp-aes 256 esp-sha256-hmac
mode tunnel

! IPSECプロファイル設定
crypto ipsec profile VTI_Cisco
set transform-set IPSEC
set ikev2-profile IKEv2_Profile_Cisco

! Tunnelインタフェース設定
interface Tunnel1
ip address 172.16.10.1 255.255.255.0
tunnel source G0/0
tunnel mode ipsec ipv4
tunnel destination A.A.A.A
tunnel protection ipsec profile VTI_Cisco
! プロポーザル設定
crypto ikev2 proposal IKEv2_Proposal
encryption aes-cbc-256
integrity sha256
group 14

! ポリシー設定
crypto ikev2 policy IKEv2_Policy
proposal IKEv2_Proposal

!キー設定
crypto ikev2 keyring IKEv2_Key_Cisco
peer C841M
address B.B.B.B
pre-shared-key password

! プロファイル設定
crypto ikev2 profile IKEv2_Profile_Cisco
match identity remote address 192.168.1.2 255.255.255.255
identity local address 10.1.1.10
authentication remote pre-share
authentication local pre-share
keyring local IKEv2_Key_Cisco
lifetime 3600

! トランスフォームセット設定
crypto ipsec transform-set IPSEC esp-aes 256 esp-sha256-hmac
mode tunnel

! IPSECプロファイル設定
crypto ipsec profile VTI_Cisco
set transform-set IPSEC
set ikev2-profile IKEv2_Profile_Cisco

! Tunnelインタフェース設定
interface Tunnel1
ip address 172.16.10.2 255.255.255.0
tunnel source G0/0
tunnel mode ipsec ipv4
tunnel destination B.B.B.B
tunnel protection ipsec profile VTI_Cisco

確認

c1000v#sh crypto ikev2 sa
IPv4 Crypto IKEv2 SA

Tunnel-id Local Remote fvrf/ivrf Status
1 10.1.1.10/4500 B.B.B.B/4500 none/none READY
Encr: AES-CBC, keysize: 256, PRF: SHA256, Hash: SHA256, DH Grp:14, Auth sign: PSK, Auth verify: PSK
Life/Active Time: 3600/2111 sec

IPv6 Crypto IKEv2 SA

c1000v#sh crypto ipsec sa

interface: Tunnel1
Crypto map tag: Tunnel1-head-0, local addr 10.1.1.10

protected vrf: (none)
local ident (addr/mask/prot/port): (0.0.0.0/0.0.0.0/0/0)
remote ident (addr/mask/prot/port): (0.0.0.0/0.0.0.0/0/0)
current_peer B.B.B.B port 4500
PERMIT, flags={origin_is_acl,}
#pkts encaps: 10, #pkts encrypt: 10, #pkts digest: 10
#pkts decaps: 10, #pkts decrypt: 10, #pkts verify: 10
#pkts compressed: 0, #pkts decompressed: 0
#pkts not compressed: 0, #pkts compr. failed: 0
#pkts not decompressed: 0, #pkts decompress failed: 0
#send errors 0, #recv errors 0

local crypto endpt.: 10.1.1.10, remote crypto endpt.: B.B.B.B
plaintext mtu 1422, path mtu 1500, ip mtu 1500, ip mtu idb GigabitEthernet1
current outbound spi: 0x3478CA01(880331265)
PFS (Y/N): N, DH group: none

inbound esp sas:
spi: 0x9AF7C1FF(2599928319)
transform: esp-256-aes esp-sha256-hmac ,
in use settings ={Tunnel UDP-Encaps, }
conn id: 2068, flow_id: CSR:68, sibling_flags FFFFFFFF80000048, crypto map: Tunnel1-head-0
sa timing: remaining key lifetime (k/sec): (4607998/1485)
IV size: 16 bytes
replay detection support: Y
Status: ACTIVE(ACTIVE)

inbound ah sas:

inbound pcp sas:

outbound esp sas:
spi: 0x3478CA01(880331265)
transform: esp-256-aes esp-sha256-hmac ,
in use settings ={Tunnel UDP-Encaps, }
conn id: 2067, flow_id: CSR:67, sibling_flags FFFFFFFF80000048, crypto map: Tunnel1-head-0
sa timing: remaining key lifetime (k/sec): (4607999/1485)
IV size: 16 bytes
replay detection support: Y
Status: ACTIVE(ACTIVE)

outbound ah sas:

outbound pcp sas:

c1000v#sh crypto session
Crypto session current status

Interface: Tunnel1
Profile: IKEv2_Profile
Session status: UP-ACTIVE
Peer: B.B.B.B port 4500
Session ID: 6
IKEv2 SA: local 10.1.1.10/4500 remote B.B.B.B/4500 Active
IPSEC FLOW: permit ip 0.0.0.0/0.0.0.0 0.0.0.0/0.0.0.0
Active SAs: 2, origin: crypto map

以上, お疲れ様でした。

CiscoのAPPFWのログをfilebeat→logstash→elasticsearchからのkibanaでMap表示させる

昨年からダラダラと座学に取り組んできたものが年を超えてようやく形になったのでメモ。
もともとSplunkに変わる大体手段として何かないかなーと探していたところ, ELKでお試しという試みだったけど, 諸々の事情(後でやるやる詐欺)でこんなにも時間がかかった。

全体像

1. CiscoからSyslogを飛ばし, Rsyslogで受け取る。
2. Filebeatで該当ファイルをLogstashへ送る。
3. LogstashでパースしてElasticsearchへ送る。
4. Kibanaで表示。

全体像

オールインワン構成とした。

FilebeatからElasticsearchへ直接という方法もあるようだけど, インデックス作成周りでよくわからないことに陥りそうだから, Webでよく見るfluentd+logstash構成に習った。
なお, 有償のX-packは使わない。

一連の流れ

1. インスタンス作成, 事前準備
2. 各種インストール・設定
3. 詳細設定
4. 動作確認

1. インスタンス作成, 事前準備

はじめにELKを立てるインスタンスを準備する。
インデックス作成にJavaを使うということで, このJavaがリソースを結構持っていくのでリソースは多めに割り当てた。CentOS7でvcpu: 4 mem: 12GB disk: 60GB。
$ openstack flavor create --ram 12288 --disk 60 --vcpus 4 elastic-flavor
$ openstack server create --flavor elastic-flavor --image CentOS7 --key-name elastic-key elastic

インスタンスができたらrsyslogの設定。(※florting IPの設定は省略)
<Syslog方針>
– Cisco側はfacility local3でサーバへ渡す。
– Local3で受信したログは /var/log/rsyslog/ 配下に”hostname.log”で作成させる。

@Cisco

logging facility local3

vi /etc/rsyslog.conf

$template DynFile,"/var/log/rsyslog/%HOSTNAME%.log
local3.* -?DynFile

*.info;mail.none;authpriv.none;cron.none;local3.none /var/log/messages

続いてJDKのインストール。

# yum install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-debug.x86_64 java-1.8.0-openjdk-devel.x86_64

オールインワン構成だけど, IP指定で構成するのとCiscoの名前解決必要なのでhostsファイルを編集する。
/etc/hosts 編集

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

172.16.10.50 elastic
192.168.10.1 local-c841m

2. 各種インストール・設定

オフィシャルのオンラインマニュアルを参考にインストールできる。
Elasticsearch手順
https://www.elastic.co/guide/en/elasticsearch/reference/6.1/rpm.html
Kibana手順
https://www.elastic.co/guide/en/kibana/6.1/rpm.html
Logstash手順
https://www.elastic.co/guide/en/logstash/6.1/installing-logstash.html
Filebeat手順
https://www.elastic.co/guide/en/beats/filebeat/6.1/filebeat-installation.html

2.1 リポジトリ登録

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

/etc/yum.repos.d/elasticsearch.repo 作成

[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md


2.2 インストール

yum install elasticsearch kibana logstash
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.1.1-x86_64.rpm
yum install ./filebeat-6.1.1-x86_64.rpm

2.3 Elasticsearch設定
とりあえず動作確認までこぎつけるため, 基本的な設定のみを実施。(Cluster.nameやnetwork.hostは気分で変えた)
/etc/elasticsearch/elasticsearch.yml

cluster.name: elastichome
node.name: elastic
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200

起動設定。

systemctl enable elasticsearch
systemctl start elasticsearch

2.4 Logstash設定
filebeat用の設定ファイルは後にして一通り設定を済ます。
(ログ読み込まないなー等うまくいかない時はここで自動読み込み設定ONにしてlogレベルを適宜変更するとよい。)

path.data: /var/lib/logstash
path.config: /etc/logstash/conf.d/*.conf
config.reload.automatic: true
config.reload.interval: 5s
log.level: info
path.logs: /var/log/logstash

起動設定。

systemctl enable logstash
systemctl start logstash

2.5 Kibana設定
ここもほぼ基本的な設定のみ。
/etc/kibana/kibana.yml

server.port: 5601
server.host: "172.16.10.50"
server.name: "elastic"
elasticsearch.url: "http://172.16.10.50:9200"
elasticsearch.username: "kibana"
elasticsearch.password: "kibanapassword"
logging.dest: /var/log/kibana/kibana.log

起動設定。

systemctl enable kibana
systemctl start kibana

2.6 Filebeat設定
監視対象のログ指定と出力先をlogstashにする設定を入れる。
logstashでのフィルタ条件で利用するtagの設定も入れる。

filebeat.prospectors:
- type: log
paths:
- /var/log/rsyslog/*.log
fields:
log_type : ciscolog
fields_under_root: true
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: true
reload.period: 10s
index.number_of_shards: 3
index.codec: best_compression
_source.enabled: false
setup.dashboards.enabled: false
output.logstash:
hosts: ["172.16.10.50:5044"]
index: "filebeat"
username: "logstash_internal"
password: "logstashpassword"
logging.level: debug

起動設定。

systemctl enable filebeat
systemctl start filebeat

3 フィルタリングとかインデックスとか設定

3.1 設定ファイル作成
Filebeat用のlogstash設定ファイルを /etc/logstash/conf.d/beat.conf として作成する。

input {
beats {
port => 5044
}
}
filter {
if [log_type] == "ciscolog" {
grok {
match => {
"message" => "%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:log_host} %{NUMBER:unixtimestamp}: %{SYSLOGTIMESTAMP:ciscotimestamp} %{WORD:timezone}: %{GREEDYDATA:facility}: %{DATA:application} %{GREEDYDATA:msg_1} - %{WORD:protocol} %{WORD:msg_2} %{IP:src_ip}:%{NUMBER:src_port} %{IP:dst_ip}:%{NUMBER:dst_port} %{GREEDYDATA:msg_3}"
}
}
geoip {
source => "dst_ip"
}
mutate {
convert => {
"src_port" => "integer"
"dst_port" => "integer"
}
}
}
}
output {
elasticsearch {
hosts => [ "http://172.16.10.50:9200" ]
index => "myfilebeat-%{+YYYY.MM}"
}
}

※補足説明
7行目:   if [log_type] == “ciscolog” {

filebeatの設定で /var/log/rsyslog/*.log に対してciscologというlog_typeというフィールドを付与したので, ここで条件マッチングさせている。
他にもログを捕捉する場合はこのあたりで適宜フールドを追加して処理を変える目的。
ここでは省略しているけど, audit.log等も対象としていたのでこの設定入れた。

10行目:  “message” => “%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:log_host} %{NUMBER:unixtimestamp}: %{SYSLOGTIMESTAMP:ciscotimestamp} %{WORD:timezone}: %{GREEDYDATA:facility}: %{DATA:application} %{GREEDYDATA:msg_1} – %{WORD:protocol} %{WORD:msg_2} %{IP:src_ip}:%{NUMBER:src_port} %{IP:dst_ip}:%{NUMBER:dst_port} %{GREEDYDATA:msg_3}”
CiscoルータのゾーンベースのFWログフォーマットを見ながらパーシングしたい箇所を切り出せるように記述する。
grokフィルタが良く分からないときはここ(Grok Debugger)を参考にトライアンドエラーでがんばる。GREEDYDATA(*と同義)を使って少しずつ細分化していくのがおすすめ。
14行目:  source => “dst_ip”
geoipフィルタで対象となるIPアドレスを指定する。
今回はログから通信先がどこか地図にマッピングすることを考えているので, ログ内のdst_ip(通信先IPアドレス)を指定した。
16行~21行: mutateの行
ここは実際にパースしたらなぜかtypeがtextになっていたので入れた。気になったのでtypeをコンバートする設定を追加。テンプレートあたりをしっかり理解すればこんなことしなくてもよいのかもしれない。
27行目:  index => “myfilebeat-%{+YYYY.MM}”
elasitcsearchへ出力する際にインデックスを追加する。

3.2 インデックス作成
インデックスはKibanaにログインし, 「Management → Index Patterns」でインデックスを作成する。

インデックス作成画面

これでいけるか!と思ったけど実際にマップ作成をやってみると, “kibanaのGeo Coordinatesマップで参照されるgeo_pointとなるタイプが無い”となって作成できない。

デフォルトのfilebeatのテンプレートを元に, 新たに作成する。
<手順>
Kibana上のDevToolsに「GET _template/filebeat-*」と入れ, 出力結果を編集してPUTする。
1. 元となるテンプレートを元に新しいテンプレートを作成する。

{
"filebeat": {
"order": 1,
"index_patterns": [
"myfilebeat-*"
],

~中略~
}
}
},
"geoip": {
"properties": {
"continent_name": {
"type": "keyword",
"ignore_above": 1024
},
"country_iso_code": {
"type": "keyword",
"ignore_above": 1024
},
"location": {
"type": "geo_point"
},
"region_name": {
"type": "keyword",
"ignore_above": 1024
},
"city_name": {
"type": "keyword",
"ignore_above": 1024
}
}
}

}
}
},
"aliases": {}
}
}

2. テンプレートをPUTする。
1の内容をDevToolsでPUTする。

PUT _template/filebeat
※ ここに1の内容を入れる

4. 確認

ここまで来ればKibana上で次のように表示されるはず。

インデックスが作成されている
geoip.locationというフィールドがgeo_pointタイプで作成されている

Map作成は

  1. Visualize → 「+」新規作成 → MapsのCoordinate Map
  2. myfilebeat-* を選択
  3. Bucketsで「GeoCoodinate」を選択
  4. Aggregationで「Geohash」を選択
  5. Fieldで「geoip.location」を選択

で完了。

次のようなMapが表示される。

Map表示。

Splunkのほうが大分楽にMap作成はできるけどSPLを覚えるのと比較すると, まぁどっこいどっこいかな。

とりあえずの動作確認ができた。
これからは細かく分析・その他データの可視化を目標として検証すすめる。

【メモ】VyOSのBeta版(999-xxx) とCiscoのGREについて

CiscoのGRE Tunnel設定にはkeepalive設定がある。ステートレスなGREだけどこれのおかげでCiscoルータではGREの状態を管理できる。

VyOSとよくGRE over IPSecの設定をやるが, このKeepaliveパケットが1.1.7では機能していたのだが, 今出ているBeta版では「martian source ・・・」とメッセージが出て折り返しパケットが破棄される。

なお, VyOSはGREのKeepaliveは対応していないが, CiscoのKeepaliveの仕組みは対向の機器が対応していなくても機能する仕組みとなっている。
参考) CiscoのGRE Keepalive メカニズム
実際, VyOSの1.1.7ではCisco側で設定しても問題ない。

とはいえ, Beta版のVyOSとCiscoルータでGREトンネルをはるときは, Keep Aliveは設定できないので注意が必要です。

パケットフォーマットを見るとたしかに気持ち悪いっちゃー気持ち悪いんだけど, 今の1.1.7で正常に通信できるんだから, 早いとこ対応してほしいのが本音。

【メモ】OSPFにおけるdistribute-listの扱い

今更だけどOSPFでは経路制御は同一エリア内だと受信側で拒否するしかできないのね。
送信でフィルタは掛けられない, 途中のルータで受信拒否してもLSAでアドバタイズされるからその先には伝搬してしまう。このあたり理解できていなかった。

エリアを分けるかプロトコル分けるかなどして再配信じゃないと細かい制御ってできないのね。

簡単な構成で確認した。
R1とR3は普通にOSPFで配信。R2でdistribute-listで192.168系のルートを受信拒否。
R2で拒否すればその先へもルート情報は流れないだろうなーなんて安易に思っていました。OSPFとdistribute-listのこと理解できていませんでした。さーせん。

ルータ3台でOSPFでルーティングさせる

・R1のConfig

interface FastEthernet0/0
ip address 172.16.10.1 255.255.255.0
duplex auto
speed auto
!
interface FastEthernet0/1
ip address 192.168.10.1 255.255.255.0
duplex auto
speed auto
!
interface FastEthernet1/0
ip address 192.168.20.1 255.255.255.0
duplex auto
speed auto
!
router ospf 1
log-adjacency-changes
network 172.16.10.0 0.0.0.255 area 10
network 192.168.10.0 0.0.0.255 area 10
network 192.168.20.0 0.0.0.255 area 10
!

・R2のConfig

interface FastEthernet0/0
ip address 172.16.10.2 255.255.255.0
duplex auto
speed auto
!
interface FastEthernet0/1
ip address 172.16.20.1 255.255.255.0
duplex auto
speed auto
!
router ospf 1
log-adjacency-changes
network 172.16.0.0 0.0.255.255 area 10
distribute-list Deny_OSPF in
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
ip access-list standard Deny_OSPF
deny 192.168.0.0 0.0.255.255
permit any

・R3のConfig

interface FastEthernet0/0
ip address 172.16.20.2 255.255.255.0
duplex auto
speed auto
!
interface FastEthernet0/1
ip address 192.168.30.1 255.255.255.0
duplex auto
speed auto
!
interface FastEthernet1/0
ip address 192.168.40.1 255.255.255.0
duplex auto
speed auto
!
router ospf 1
log-adjacency-changes
network 172.16.20.0 0.0.0.255 area 10
network 192.168.30.0 0.0.0.255 area 10
network 192.168.40.0 0.0.0.255 area 10

それぞれのルーティングテーブルを見ると

R1#sh ip route 
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

O 192.168.30.0/24 [110/30] via 172.16.10.2, 00:10:34, FastEthernet0/0
C 192.168.10.0/24 is directly connected, FastEthernet0/1
O 192.168.40.0/24 [110/21] via 172.16.10.2, 00:10:34, FastEthernet0/0
172.16.0.0/24 is subnetted, 2 subnets
O 172.16.20.0 [110/20] via 172.16.10.2, 00:13:10, FastEthernet0/0
C 172.16.10.0 is directly connected, FastEthernet0/0
C 192.168.20.0/24 is directly connected, FastEthernet1/0
R2#sh ip route 
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

172.16.0.0/24 is subnetted, 2 subnets
C 172.16.20.0 is directly connected, FastEthernet0/1
C 172.16.10.0 is directly connected, FastEthernet0/0
R3#sh ip route 
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

C 192.168.30.0/24 is directly connected, FastEthernet0/1
O 192.168.10.0/24 [110/30] via 172.16.20.1, 00:11:22, FastEthernet0/0
C 192.168.40.0/24 is directly connected, FastEthernet1/0
172.16.0.0/24 is subnetted, 2 subnets
C 172.16.20.0 is directly connected, FastEthernet0/0
O 172.16.10.0 [110/20] via 172.16.20.1, 00:11:22, FastEthernet0/0
O 192.168.20.0/24 [110/21] via 172.16.20.1, 00:11:22, FastEthernet0/0

R2だけがルーティングテーブルに192.168系が載っていない。

設計時に経路制御とかしっかり盛り込んでおかないとあとから「やべっ!できねーじゃん」ってなるね。

OSPFのデフォルトルート配信設定

OSPFでデフォルトルートを配信するときにややハマったのでメモ。

Ciscoでは「default-information originate」コマンドで設定する。

OSPFではデフォルトルートは配信されないので, このコマンドで配信のON/OFFを制御する。また, オプションでallwaysをつけない限りはそのルータにデフォルトルート(0.0.0.0/0)のルートを持っていない限りは配信されない。

大体スタティックルートでデフォルトルートの設定を入れるのだけれど, スタティックの向け先がデフォルトルートを配信するOSPFのエリアの外か内かでメトリック値の扱いが異なる。これに気が付かなかったので, とある案件の検証でちょっとハマった。

以下の構成でR2からデフォルトルートを配信することを考える。

R2のデフォルトルートを192.168.50.254とOSPFのエリアに所属していないインタフェースに設定し, それをArea0と100に配信する。
R1とR3のshow ip routeの結果はこうなる。

R1#sh ip route 
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route

Gateway of last resort is 192.168.20.2 to network 0.0.0.0

C 192.168.10.0/24 is directly connected, FastEthernet1/0
C 192.168.20.0/24 is directly connected, FastEthernet0/0
10.0.0.0/32 is subnetted, 1 subnets
C 10.1.1.1 is directly connected, Loopback0
O*E2 0.0.0.0/0 [110/1] via 192.168.20.2, 00:00:11, FastEthernet0/0

R3#sh ip route 
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route

Gateway of last resort is 192.168.30.2 to network 0.0.0.0

C 192.168.30.0/24 is directly connected, FastEthernet0/1
C 192.168.40.0/24 is directly connected, FastEthernet0/0
10.0.0.0/32 is subnetted, 1 subnets
C 10.3.3.3 is directly connected, Loopback0
O*E2 0.0.0.0/0 [110/1] via 192.168.30.2, 00:20:37, FastEthernet0/1

この場合メトリックは「1」。
ここで, R2の192.168.50.0/24側のインタフェースをArea0に所属させてみる。
また, わかりやすいようにそのインタフェースのコスト値を100に変える。
図にするとこんな感じ。

R1#sh ip route 
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route

Gateway of last resort is 192.168.20.2 to network 0.0.0.0

C 192.168.10.0/24 is directly connected, FastEthernet1/0
C 192.168.20.0/24 is directly connected, FastEthernet0/0
10.0.0.0/32 is subnetted, 1 subnets
C 10.1.1.1 is directly connected, Loopback0
O 192.168.50.0/24 [110/110] via 192.168.20.2, 00:00:13, FastEthernet0/0
O*E2 0.0.0.0/0 [110/100] via 192.168.20.2, 00:00:13, FastEthernet0/0

R3#sh ip route 
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route

Gateway of last resort is 192.168.30.2 to network 0.0.0.0

C 192.168.30.0/24 is directly connected, FastEthernet0/1
C 192.168.40.0/24 is directly connected, FastEthernet0/0
10.0.0.0/32 is subnetted, 1 subnets
C 10.3.3.3 is directly connected, Loopback0
O*E2 0.0.0.0/0 [110/1] via 192.168.30.2, 00:31:07, FastEthernet0/1

R1はメトリックが100。R3はメトリックが1。

結果から見ると, 同じエリア内のルート情報だと該当するインタフェースのコスト値になり, エリア外だとメトリックは1になるということがわかった。

まぁ, 基本的に後者の構成が一般的だと思うけど, こんな挙動するってのは知らなかった。

検証って大事ね。

スパツリとVLANの話

Elasticsearchやるやる詐欺になりつつ今日このごろ。ネットワークの基本中の基本, L2の話でハマったというか今更ながらに理解したことがあったので記録しとく。

スイッチ3台でRSTP+PVSTで三角形の構成を組んだんだけど, うち上位の1台の機器が作業範囲じゃなかったので構成がさっぱりわからなかった。
ベンダーも違うので, 情報が全く出てこないという責任区分できっぱりと情報も切れてしまっている現場でのこと。

STPに関してはこちら側でコントロールするように, 色々値をいじったけど2つあるうち, 1つのVLANが想定外のポートがブロッキングになった。
show spanning-tree ~~~で探ってみると, どーも対向がTransparentになっているっぽい。VLAN分けてないのかよ!とか思ったけど, ログ持ち帰ってSTPやBPDUについて新手眼て調べるとアクセスポートにしているためVLAN認識しないってのがわかった。

そらそうか。って思うんだけどVLANタグはトランクポートでしか付与されないよねとか, ポートVLANは対向のVLAN設定なんて意識しないよねとか, あまり気にせずにいたところで躓いたのでやっぱ基礎はしっかりせないかんよねと思いましたとさ。

ちょっとわかりづらいけど, 図かいて残しとく。

transparentの機器をHUBで代用。
2つのVLANがある構成。

設計上, VLAN10はSW AがRootBridge, VLAN20はSW BがRoot Bridgeになってほしい

BPDUの動きをおっていく①

BPDUの動きをおっていく②

BPDUの動きをおっていく③

STP動かすときは接続機器の設定はしっかり手に入れておくべきよね。
(本来どのケースでもそうなんでしょうけどね・・・)

【Cisco】ファイル共有のスループットが上がらない

この前,ファイル共有のスループットが上がらないからインタフェースの設定を変えたのだが,どうにも100Mbps以上スループットが出ない。

ホストマシン上もインタフェースは1Gでアップしているし,他に何か調整余地あるかなと調べてみた。
以下2パターンでは状況は変わらず。
・ PC → ファイルサーバ(インスタンス上)
・ PC → ファイルサーバ(ホストマシン)
ということはサーバ側の問題ではないなと。

C841MでNATの制御が引っかかってスループット上がってないんじゃ?なんておもってログインしようとしたら,ファイルコピー中はSSHの応答が無い。CPU100%張り付いていた・・・。

オマエか。原因は。

PCをファイルサーバと同一セグメントにうつしてためしたところ,先の2パターンどちらも800Mbps以上出ていた。

状況証拠から結論が出た。

・C841Mではルーティング処理は約100Mbpsが限界値。
・L2処理は800Mbps以上は出る。というか,前の検証結果に準ずるのだろう。

NAT除外設定

Cisco IOSでNAT設定を入れている時に,特定のセグメントへの通信のみNATさせずに実アドレスで通信させる設定のメモ。

単純にaccess-listのPermitの前段に除外したいACLを入れてあげればよいかと思いきや,うまくいかない。
どうしたらいいかというと,Route-Mapを使う。

! ACL設定

ip access-list extended No_NAT
deny ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255
permit ip 192.168.1.0 0.0.0.255 any

! Route-Map設定
route-map RM_NAT permit 10

match ip address No_NAT

! NAT設定
ip nat inside source route-map RM_NAT pool VLAN1