naoki86star

インターネットの片隅でなにかしら書いてみる

BIRDでremotely triggered blackhole(+ flowspec)

このときのノード構成で、ルータをvMXに変えて、ついでにIPv6でも試してみる*1。コミュニティ投げるほうはBIRDのまま。

動機というかきっかけというか

 前にVXLAN試したあとにもいろいろ読んでいて特に
tech.fjct.fujitsu.com
読んでいたらもうすこしVXLANがっつり試してみたくなった。それでまずこの中でも利用したとあったvMXを入手してみる。vMX Trialは、そのダウンロードの難易度が高いらしくダウンロード武勇伝記事を散見。確かにダウンロードできるまでに数日かかった、なんとかアクセス権get。

 で、とりあえず、vMXに慣れるつもりで、先日のbgp つかったblack holeデモを設定してみる。ついでにIPv6でもやってみる。bhするルータノードをvMXにする。*2

結果メモ

 triggerのBIRD側は2.0を使う*3。bhとかflowを発動させてみるのがvmx。

  • rtbh

 bh時にnext hopをbh先としての別ポートに振るとき、コミュニティとともに渡すnext-hopアドレスが、コミュニティを受けたポートで送出できるアドレスでないと有効ルートとみなしてもらえないようにみえた。show route hidden detailでみるとこんな理由が出力されていた。

Hidden reason: protocol nexthop is not on the interface

 単純構成から始めよう、という以外には意図のない構成でやっていたことに起因したみたい。今回の場合、protocol bgp で、これをつけないといけないらしい。(single-hopのEBGPで同じサブネットネットワークアドレス以外に振りたい場合に必要、らしい)

accept-remote-nexthop;

間にひとつvMXと同じASNのルータを挟んでやったらいらなくなった。*4

  • flowspec

受ける側・制御する側:vMX
受けたflowの検査をまったくしないで受け入れる(この例はIPv4だけ)

protocols {
    bgp {
        local-as 65000;
        group PEER-T {
            type external;
            family inet {
                unicast;
                flow {
                    no-validate NO-VALIDATION;
                }
            }
         }
    }
}
policy-options {
    policy-statement NO-VALIDATION {
        term 1 {
            then accept;
        }
    }
}

投げる側・リクエストする側:BIRD
BIRDのdocumentで探していて、Actionにあたる設定キーワードがない、と思っていたら、flowspec上は拡張コミュニティ(RFC4360)の形式なので以下のようになるらしい。この例はtraffic-rate 0なので全断。

protocol static flowstat4 {
  flow4;
  route flow4 {
    dst 10.100.1.123/32;
    proto = 1;
  }{
     bgp_ext_community.add( (generic, 0x80060000, 0x0 ) );
  };
}

参考になったもの(Part2以降にも期待、、、)

今回自分ルールで、flowspecにも(bhと別の)コミュニティーつけてみる

  • flowspec(IPv6)

 IPv4と同じだと思ったのですが、試した範囲内で微妙な予想外の挙動がありました。
プロトコルを指定したときのパラメータ自体がprotoでなくnext headerになっているらしいが58も1も効かなかった。icmp typeの指定でpingを落とすことができた。

protocol static flowstat6 {
  flow6;
  route flow6 { dst fc00:10:100:1::123/128;icmp type 128;
  }{ bgp_ext_community.add( (generic, 0x80060000, 0x0 ) ); };
}

icmp type 128;でなくnext header = 58;だと

staticでvMXに直接いれてみたときも似た感じ。

set routing-options rib inet6.0 flow route DROPICMP6 match destination fc00:10:100:1::123/128
set routing-options rib inet6.0 flow route DROPICMP6 match icmp6-type echo-request
set routing-options rib inet6.0 flow route DROPICMP6 then discard

match protocol icmp6だと効かなかった、謎*5

その他
  • 少しはvMX慣れたつもりで,VXLANを通すのを次の機会に挑戦するつもり
その他2

vmx 設定の最終形
accept-remote-nexthopは外した
multiprotocol-bgpでpolicy-statementにv4v6押し込めてる

root> show configuration | display set
set version 17.1R1.8
set system syslog user * any emergency
set system syslog file messages any notice
set system syslog file messages authorization info
set system syslog file interactive-commands interactive-commands any
set interfaces ge-0/0/0 unit 0 family inet address 172.31.2.1/24
set interfaces ge-0/0/0 unit 0 family inet6 address fc00:2::1/64
set interfaces ge-0/0/1 unit 0 family inet address 172.31.3.1/24
set interfaces ge-0/0/1 unit 0 family inet6 address fc00:3::1/64
set interfaces ge-0/0/2 unit 0 family inet address 172.31.1.1/24
set interfaces ge-0/0/2 unit 0 family inet6 address fc00:1::1/64
set interfaces ge-0/0/3 unit 0 family inet address 172.16.0.1/24
set interfaces ge-0/0/3 unit 0 family inet6 address fc00:172:16::254/64
set interfaces fxp0 disable
set routing-options rib inet.0 static route 0.0.0.0/0 discard
set routing-options rib inet.0 static route 192.168.100.1/32 next-hop 172.16.0.254
set routing-options rib inet6.0 static route ::/0 discard
set routing-options rib inet6.0 static route fc00:192:168:100::1/128 next-hop fc00:172:16::254
set routing-options router-id 172.31.1.1
set routing-options autonomous-system 65000
set protocols bgp group PEER4U type external
set protocols bgp group PEER4U peer-as 65002
set protocols bgp group PEER4U local-as 65000
set protocols bgp group PEER4U neighbor 172.31.3.2 description UsersArea
set protocols bgp group PEER6U type external
set protocols bgp group PEER6U peer-as 65002
set protocols bgp group PEER6U local-as 65000
set protocols bgp group PEER6U neighbor fc00:3::2 description UsersArea
set protocols bgp group PEER-TRIGGER type internal
set protocols bgp group PEER-TRIGGER import RECV-COMMUNITY
set protocols bgp group PEER-TRIGGER family inet unicast
set protocols bgp group PEER-TRIGGER family inet flow prefix-limit maximum 5
set protocols bgp group PEER-TRIGGER family inet flow no-validate NO-VALIDATION
set protocols bgp group PEER-TRIGGER family inet6 unicast
set protocols bgp group PEER-TRIGGER family inet6 flow no-validate NO-VALIDATION
set protocols bgp group PEER-TRIGGER export REJECT
set protocols bgp group PEER-TRIGGER peer-as 65000
set protocols bgp group PEER-TRIGGER local-as 65000
set protocols bgp group PEER-TRIGGER neighbor 172.31.2.2 description multiprotocol-bgp
set policy-options policy-statement ACCEPT then accept
set policy-options policy-statement NO-VALIDATION then accept
set policy-options policy-statement RECV-COMMUNITY term v4 from protocol bgp
set policy-options policy-statement RECV-COMMUNITY term v4 from community CM-BLACKHOLE
set policy-options policy-statement RECV-COMMUNITY term v4 from community CM-FLOWSPEC
set policy-options policy-statement RECV-COMMUNITY term v4 from route-filter 0.0.0.0/0 prefix-length-range /32-/32
set policy-options policy-statement RECV-COMMUNITY term v4 then accept
set policy-options policy-statement RECV-COMMUNITY term v6 from protocol bgp
set policy-options policy-statement RECV-COMMUNITY term v6 from community CM-BLACKHOLE
set policy-options policy-statement RECV-COMMUNITY term v6 from community CM-FLOWSPEC
set policy-options policy-statement RECV-COMMUNITY term v6 from route-filter ::/0 prefix-length-range /128-/128
set policy-options policy-statement RECV-COMMUNITY term v6 then accept
set policy-options policy-statement RECV-COMMUNITY then reject
set policy-options policy-statement REJECT then reject
set policy-options community CM-BLACKHOLE members 65000:666
set policy-options community CM-FLOWSPEC members 65000:667

*1:multiprotocol-bgp

*2:今回は17.1で動かした、18.2はimagesのファイル構成に違いがあって17とは同じように動かせていない

*3:directとかkernelとかは一切設定しない、bgp送信専用

*4:ibgpになったということかな

*5:どこかに説明ありそうだけども、ダメなものは設定不可だといいなぁ