SDN開発エンジニアを目指した活動ブログ

〜SDNなオープンソース製品を実際に使って試してみる〜

vSRXを活用した、JUNOSのお勉強まとめ【OSPF + MPLS編】

今回も、引き続き、JUNOSのお勉強メモです。
ttsubo.hatenablog.com

◼︎ vSRXトポロジ構成

今回は、vSRX3台構成としました。

                    [ AS: 65000 ]                                       [ AS: 65000 ]

                       10.0.0.1                  10.0.0.2                  10.0.0.3
+-----+               +--------+                +--------+                +--------+               +-----+               
|     | 172.16.0.0/30 |        | 192.168.0.0/30 |        | 192.168.1.0/30 |        | 172.16.1.0/30 |     | 10.0.0.1/24
| pc1 | +-----------+ | vSRX-1 | +------------+ | vSRX-2 | +------------+ | vSRX-3 | +-----------+ | pc2 | 10.0.1.1/24
|     | .1         .2 |        | .1          .2 |        | .1          .2 |        | .1         .2 |     | 10.0.2.1/24
+-----+               +--------+                +--------+                +--------+               +-----+

      :               :        :                :        :                :        :               :
      : < --------- > :        : < ---------- > :        : < ---------- > :        : < --------- > :
           static              :      ospf                      ospf      :              static
                               :                                          :
                               :                                          :
                               : < ------------------------------------ > :
                                                  i-BGP

◼︎ JUNOSルーティング設定

複数台のvSRX間でIP通信が可能なように、各種ルーティング設定を行います。

(1) OSPF基本設定

今回は、すべてのvSRXルータをエリア0に収容する形態としました。

1. protocolsを設定する
まずは、vSRX-1の場合、ge-0/0/1.0 のインタフェースをOSPFエリア0に収容するには、次のようにコンフィグ設定します。
なお、ループバックでOSPFを有効にする場合には、パッシブインタフェースとして設定するのが一般的だそうです。

root@vSRX-1# set protocols ospf area 0.0.0.0 interface ge-0/0/1.0 
root@vSRX-1# set protocols ospf area 0.0.0.0 interface lo0.0 passive 

root@vSRX-1# show | compare    
[edit]
+  protocols {
+      ospf {
+          area 0.0.0.0 {
+              interface ge-0/0/1.0;
+              interface lo0.0 {
+                  passive;
+              }
+          }
+      }
+  }

root@vSRX-1# commit

2. OSPF隣接関係の状態を確認しておく
すべてのvSRXルータでも同様に、OSPFエリア0に収容するインタフェースを有効にします。
vSRX-1で、OSPF隣接状態を確認してみます。
あと、ループバックインタフェースでもOSPFが有効になっていることを確認しておきます。

root@vSRX-1> show ospf neighbor     
Address          Interface              State     ID               Pri  Dead
192.168.0.2      ge-0/0/1.0             Full      10.0.0.2         128    33

root@vSRX-1> show ospf interface    
Interface           State   Area            DR ID           BDR ID          Nbrs
ge-0/0/1.0          BDR     0.0.0.0         10.0.0.2        10.0.0.1           1
lo0.0               DRother 0.0.0.0         0.0.0.0         0.0.0.0            0

そして、vSRX-2でも、OSPF隣接状態を確認してみます。

root@vSRX-2> show ospf neighbor     
Address          Interface              State     ID               Pri  Dead
192.168.0.1      ge-0/0/0.0             Full      10.0.0.1         128    35
192.168.1.2      ge-0/0/1.0             Full      10.0.0.3         128    39

root@vSRX-2> show ospf interface    
Interface           State   Area            DR ID           BDR ID          Nbrs
ge-0/0/0.0          DR      0.0.0.0         10.0.0.2        10.0.0.1           1
ge-0/0/1.0          BDR     0.0.0.0         10.0.0.3        10.0.0.2           1
lo0.0               DRother 0.0.0.0         0.0.0.0         0.0.0.0            0

さらに、vSRX-3でも、OSPF隣接状態を確認しておきます。

root@vSRX-3> show ospf neighbor     
Address          Interface              State     ID               Pri  Dead
192.168.1.1      ge-0/0/0.0             Full      10.0.0.2         128    32

root@vSRX-3> show ospf interface    
Interface           State   Area            DR ID           BDR ID          Nbrs
ge-0/0/0.0          DR      0.0.0.0         10.0.0.3        10.0.0.2           1
lo0.0               DRother 0.0.0.0         0.0.0.0         0.0.0.0            0

最後に、OSPFプロトコルによって学習したルーティング情報を確認しておきます。

root@vSRX-1> show route protocol ospf    

inet.0: 9 destinations, 9 routes (9 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

10.0.0.2/32        *[OSPF/10] 00:21:26, metric 1
                    > to 192.168.0.2 via ge-0/0/1.0
10.0.0.3/32        *[OSPF/10] 00:21:26, metric 2
                    > to 192.168.0.2 via ge-0/0/1.0
192.168.1.0/30     *[OSPF/10] 00:21:26, metric 2
                    > to 192.168.0.2 via ge-0/0/1.0
224.0.0.5/32       *[OSPF/10] 00:21:41, metric 1
                      MultiRecv

(2) BGP基本設定

1. BGP Peer相手となる対向vSRXとの疎通性を確認しておく
まず、vSRX-1とvSRX-3の間で、ループバックインタフェース間での疎通性を確認しておきます。

root@vSRX-1> ping 10.0.0.3 source 10.0.0.1 count 5 
PING 10.0.0.3 (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: icmp_seq=0 ttl=63 time=3.796 ms
64 bytes from 10.0.0.3: icmp_seq=1 ttl=63 time=1.610 ms
64 bytes from 10.0.0.3: icmp_seq=2 ttl=63 time=1.324 ms
64 bytes from 10.0.0.3: icmp_seq=3 ttl=63 time=1.154 ms
64 bytes from 10.0.0.3: icmp_seq=4 ttl=63 time=1.340 ms

--- 10.0.0.3 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 1.154/1.845/3.796/0.986 ms

問題なく、ping動作しております。

2. routing-optionを設定する
ここからは、ほぼ前回の記事と同じ作業になります。
BGP Peerアドレスとして、ループバックインタフェースを指定する点が異なります。

root@vSRX-1# set routing-options router-id 10.0.0.1 autonomous-system 65000    
root@vSRX-1# show | compare 
[edit]
+  routing-options {
+      router-id 10.0.0.1;
+      autonomous-system 65000;
+  }

root@vSRX-1# commit 

3. protocolsを設定する

root@vSRX-1# set protocols bgp group INTERNAL type internal local-address 10.0.0.1 neighbor 10.0.0.3
root@vSRX-1# show | compare 
[edit protocols]
+   bgp {
+       group INTERNAL {
+           type internal;
+           local-address 10.0.0.1;
+           neighbor 10.0.0.3;
+       }
+   }

root@vSRX-1# commit

4. BGP Peerの状態を確認しておく

root@vSRX-1> show bgp neighbor 
Peer: 10.0.0.3+57167 AS 65000  Local: 10.0.0.1+179 AS 65000
  Type: Internal    State: Established    Flags: <Sync>
  Last State: OpenConfirm   Last Event: RecvKeepAlive
  Last Error: None
  Options: <Preference LocalAddress Refresh>
  Local Address: 10.0.0.1 Holdtime: 90 Preference: 170
  Number of flaps: 0
  Peer ID: 10.0.0.3        Local ID: 10.0.0.1          Active Holdtime: 90
  Keepalive Interval: 30         Group index: 0    Peer index: 0   
  BFD: disabled, down
  NLRI for restart configured on peer: inet-unicast
  NLRI advertised by peer: inet-unicast
  NLRI for this session: inet-unicast
  Peer supports Refresh capability (2)
  Stale routes from peer are kept for: 300
  Peer does not support Restarter functionality
  NLRI that restart is negotiated for: inet-unicast
  NLRI of received end-of-rib markers: inet-unicast
  NLRI of all end-of-rib markers sent: inet-unicast
  Peer supports 4 byte AS extension (peer-as 65000)
  Peer does not support Addpath
  Table inet.0 Bit: 10000
    RIB State: BGP restart is complete
    Send state: in sync
    Active prefixes:              0
    Received prefixes:            0
    Accepted prefixes:            0
    Suppressed due to damping:    0
    Advertised prefixes:          0
  Last traffic (seconds): Received 21   Sent 21   Checked 21  
  Input messages:  Total 3      Updates 1       Refreshes 0     Octets 101
  Output messages: Total 3      Updates 0       Refreshes 0     Octets 120
  Output Queue[0]: 0            (inet.0, init-unicast)

5. Export policy適用
こちらも、前回と同様に、Export policy作成して、適用します。
自分が保持している経路を、BGP Peerに対して、アドバタイズするには、Export policyを作成して、BGPピアのGroupに適用する必要があるようです。

root@vSRX-1# set policy-options policy-statement export-bgp term 1 from route-filter 172.16.0.0/30 exact
root@vSRX-1# set policy-options policy-statement export-bgp term 1 then accept 
root@vSRX-1# set protocols bgp group INTERNAL export export-bgp 
root@vSRX-1# show | compare 
[edit protocols bgp group INTERNAL]
+    export export-bgp;
[edit]
+  policy-options {
+      policy-statement export-bgp {
+          term 1 {
+              from {
+                  route-filter 172.16.0.0/30 exact;
+              }
+              then accept;
+          }
+      }
+  }

root@vSRX-1# commit

すると、想定どおりに、自分が保持している経路をアドバタイズするようになりました。

root@vSRX-1> show route advertising-protocol bgp 10.0.0.3      

inet.0: 9 destinations, 9 routes (9 active, 0 holddown, 0 hidden)
  Prefix                  Nexthop              MED     Lclpref    AS path
* 172.16.0.0/30           Self                         100        I

さらに、対向側(vSRX-3ルータ)でも、Export policy適用してみると、アドバタイズされた経路を受信できるようになりました。

root@vSRX-1> show route receive-protocol bgp 10.0.0.3    

inet.0: 10 destinations, 10 routes (10 active, 0 holddown, 0 hidden)
  Prefix                  Nexthop              MED     Lclpref    AS path
* 172.16.1.0/30           10.0.0.3                     100        I

今回は、さらに、vSRX-3側でスタティック経路も追加しておきます。

root@vSRX-3# set routing-options static route 10.0.0.0/24 next-hop 172.16.1.2
root@vSRX-3# set routing-options static route 10.0.1.0/24 next-hop 172.16.1.2 
root@vSRX-3# set routing-options static route 10.0.2.0/24 next-hop 172.16.1.2
root@vSRX-3# show | compare 
[edit routing-options]
+   static {
+       route 10.0.0.0/24 next-hop 172.16.1.2;
+       route 10.0.1.0/24 next-hop 172.16.1.2;
+       route 10.0.2.0/24 next-hop 172.16.1.2;
+   }

root@vSRX-3# commit 

ただし、このままでは、vSRX-1側では、スタティック経路を受信しておりません。
vSRX-3側で保持しているスタティック経路を、BGP再配布するには、Export policyを作成して、BGPピアのGroupに適用する必要があるようです。

root@vSRX-1> show route receive-protocol bgp 10.0.0.3    

inet.0: 10 destinations, 10 routes (10 active, 0 holddown, 0 hidden)
  Prefix                  Nexthop              MED     Lclpref    AS path
* 172.16.1.0/30           10.0.0.3                     100        I

6. Export policy再適用
スタティック経路のBGP再配布に関わるExport policy作成して、適用します。

root@vSRX-3# set policy-options prefix-list PREFIX 10.0.0.0/24
root@vSRX-3# set policy-options prefix-list PREFIX 10.0.1.0/24
root@vSRX-3# set policy-options prefix-list PREFIX 10.0.2.0/24
root@vSRX-3# set policy-options policy-statement export-bgp term 1 from prefix-list PREFIX 
root@vSRX-3# set policy-options policy-statement export-bgp term 1 then accept
root@vSRX-3# show | compare 
[edit policy-options]
+   prefix-list PREFIX {
+       10.0.0.0/24;
+       10.0.1.0/24;
+       10.0.2.0/24;
+   }
[edit policy-options policy-statement export-bgp term 1 from]
+      prefix-list PREFIX;

root@vSRX-3# commit

この状態でのpolicy-options設定内容は、こんな感じになっています。

policy-options {
    prefix-list PREFIX {
        10.0.0.0/24;
        10.0.1.0/24;
        10.0.2.0/24;
    }
    policy-statement export-bgp {
        term 1 {                        
            from {
                route-filter 172.16.1.0/30 exact;
                prefix-list PREFIX;
            }
            then accept;
        }
    }
}

すると、vSRX-1ルータ側では、アドバタイズされたスタティック経路も受信できるようになりました。

root@vSRX-1> show route receive-protocol bgp 10.0.0.3    

inet.0: 13 destinations, 13 routes (13 active, 0 holddown, 0 hidden)
  Prefix                  Nexthop              MED     Lclpref    AS path
* 10.0.0.0/24             172.16.1.2                   100        I
* 10.0.1.0/24             172.16.1.2                   100        I
* 10.0.2.0/24             172.16.1.2                   100        I
* 172.16.1.0/30           10.0.0.3                     100        I

ここまでは、順調ですね。

(3) エンド端末間での疎通確認

それでは、OSPF, BGPの基本設定も完了したので、最後に、エンドエンド端末間でpingをうってみましょう。

tsubo@pc1:~$ ping 172.16.1.2
PING 172.16.1.2 (172.16.1.2) 56(84) bytes of data.
^C
--- 172.16.1.2 ping statistics ---
15 packets transmitted, 0 received, 100% packet loss, time 13999ms

残念ながら、pingが成功しません!
ここでの課題は、vSRX-2では、"172.16.1.0/30"のルーティング情報を保持しておりません。
よって、ICMP Echo Requestのパケットを受信しても、vSRX-3に転送せずに、ドロップしてしまった!
こちらのSlideShareが参考になると思います。

www.slideshare.net

(4) MPLS / LDP基本設定

早速、先ほどの課題解決のために、MPLS / LDPを設定します。
1. interfacesを設定する

root@vSRX-1# set interfaces ge-0/0/1 unit 0 family mpls 
root@vSRX-1# show | compare 
[edit interfaces ge-0/0/1 unit 0]
+      family mpls;

root@vSRX-1# commit

2. protocolsを設定する
MPLSも有効にします。

root@vSRX-1# set protocols mpls interface ge-0/0/1.0    
root@vSRX-1# show | compare 
[edit protocols]
+   mpls {
+       interface ge-0/0/1.0;
+   }

root@vSRX-1# commit 

LDPも有効にします。

root@vSRX-1# set protocols ldp interface ge-0/0/1.0 

[edit]
root@vSRX-1# show | compare 
[edit protocols]
+   ldp {
+       interface ge-0/0/1.0;
+   }

[edit]
root@vSRX-1# commit 
commit complete


3. LDP隣接関係の状態を確認しておく
すべてのvSRXルータでも同様に、MPLS / LDPを設定します。
そして、vSRX-1で、LDP隣接状態を確認してみます。

root@vSRX-1> show ldp neighbor 
Address            Interface          Label space ID         Hold time
192.168.0.2        ge-0/0/1.0         10.0.0.2:0               12

root@vSRX-1> show ldp interface   
Interface            Label space ID        Nbr count   Next hello
ge-0/0/1.0           10.0.0.1:0               1           4

さらに、vSRX-2でも、LDP隣接状態を確認してみます。

root@vSRX-2> show ldp neighbor     
Address            Interface          Label space ID         Hold time
192.168.0.1        ge-0/0/0.0         10.0.0.1:0               12
192.168.1.2        ge-0/0/1.0         10.0.0.3:0               14

root@vSRX-2> show ldp interface    
Interface            Label space ID        Nbr count   Next hello
ge-0/0/0.0           10.0.0.2:0               1           1
ge-0/0/1.0           10.0.0.2:0               1           2

vSRX-3でも、OSPF隣接状態を確認しておきます。

root@vSRX-3> show ldp neighbor     
Address            Interface          Label space ID         Hold time
192.168.1.1        ge-0/0/0.0         10.0.0.2:0               10

root@vSRX-3> show ldp interface    
Interface            Label space ID        Nbr count   Next hello
ge-0/0/0.0           10.0.0.3:0               1           3

LDPプロトコルによって学習したルーティング情報を確認しておきます。

root@vSRX-1> show route protocol ldp             

inet.0: 13 destinations, 13 routes (13 active, 0 holddown, 0 hidden)

inet.3: 2 destinations, 2 routes (2 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

10.0.0.2/32        *[LDP/9] 00:14:15, metric 1
                    > to 192.168.0.2 via ge-0/0/1.0
10.0.0.3/32        *[LDP/9] 00:13:31, metric 1
                    > to 192.168.0.2 via ge-0/0/1.0, Push 299792

mpls.0: 7 destinations, 7 routes (7 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both

299776             *[LDP/9] 00:14:15, metric 1
                    > to 192.168.0.2 via ge-0/0/1.0, Pop      
299776(S=0)        *[LDP/9] 00:14:15, metric 1
                    > to 192.168.0.2 via ge-0/0/1.0, Pop      
299792             *[LDP/9] 00:13:31, metric 1
                    > to 192.168.0.2 via ge-0/0/1.0, Swap 299792

(5) エンド端末間での疎通確認

それでは、LDPの基本設定も完了したので、もう一度、エンドエンド端末間でpingをうってみましょう。

tsubo@pc1:~$ ping 172.16.1.2
PING 172.16.1.2 (172.16.1.2) 56(84) bytes of data.
64 bytes from 172.16.1.2: icmp_seq=1 ttl=61 time=0.758 ms
64 bytes from 172.16.1.2: icmp_seq=2 ttl=61 time=0.728 ms
64 bytes from 172.16.1.2: icmp_seq=3 ttl=61 time=0.758 ms
64 bytes from 172.16.1.2: icmp_seq=4 ttl=61 time=0.828 ms
64 bytes from 172.16.1.2: icmp_seq=5 ttl=61 time=55.9 ms
^C
--- 172.16.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.728/11.812/55.992/22.090 ms||<

今回は、pingが成功しましたね!

この時、pc2側でtcpdumpを動作させて、パケットモニタリングしておきます。

root@pc2:~# tcpdump -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
17:29:11.583949 IP 172.16.0.1 > 172.16.1.2: ICMP echo request, id 2198, seq 1, length 64
17:29:11.583983 IP 172.16.1.2 > 172.16.0.1: ICMP echo reply, id 2198, seq 1, length 64
17:29:12.586912 IP 172.16.0.1 > 172.16.1.2: ICMP echo request, id 2198, seq 2, length 64
17:29:12.586940 IP 172.16.1.2 > 172.16.0.1: ICMP echo reply, id 2198, seq 2, length 64
17:29:13.588175 IP 172.16.0.1 > 172.16.1.2: ICMP echo request, id 2198, seq 3, length 64
17:29:13.588204 IP 172.16.1.2 > 172.16.0.1: ICMP echo reply, id 2198, seq 3, length 64
17:29:14.588207 IP 172.16.0.1 > 172.16.1.2: ICMP echo request, id 2198, seq 4, length 64
17:29:14.588240 IP 172.16.1.2 > 172.16.0.1: ICMP echo reply, id 2198, seq 4, length 64
17:29:14.974839 IP 192.168.105.1.17500 > 192.168.105.255.17500: UDP, length 131
17:29:15.590265 IP 172.16.0.1 > 172.16.1.2: ICMP echo request, id 2198, seq 5, length 64
17:29:15.590293 IP 172.16.1.2 > 172.16.0.1: ICMP echo reply, id 2198, seq 5, length 64

こちらも期待通り、ICMP Echo Request / Replyが観測できました。

さらに、pc2側の"10.0.0.1"に対して、pingをうってみましょう。

tsubo@pc1:~$ ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.273 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.353 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=0.328 ms
64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=0.312 ms
64 bytes from 10.0.0.1: icmp_seq=5 ttl=64 time=0.264 ms
^C
--- 10.0.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.264/0.306/0.353/0.033 ms

こちらも、pingは、成功しました。

この時、pc2側でtcpdumpを動作させて、パケットモニタリングしておきます。

root@pc2:~# tcpdump -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel

あれっ?
こちらは、期待に反して、ICMP Echo Request / Replyが観測できません。

pc2には、ICMP Echo Requestパケットが届いていないのに、pc1では、ICMP Echo Replyを受信してしまっている。
という、奇妙に現象が発生してしまいました。

◼︎ 最終的なコンフィグ内容の確認

root@vSRX-1> show configuration | display set 
set version 15.1X49-D15.4
set system host-name vSRX-1
set system time-zone Asia/Tokyo
set system root-authentication encrypted-password "$1$XvI2vVPR$7lnJdb5gNeg4zql8lZ/1Q1"
set system login user tsubo uid 2000
set system login user tsubo class super-user
set system login user tsubo authentication encrypted-password "$1$THS.KlMg$SvjUk8SUxyDY3rDRGT3hK/"
set system services ssh root-login allow
set system services web-management http interface fxp0.0
set system syslog user * any emergency
set system syslog file messages any any
set system syslog file messages authorization info
set system syslog file interactive-commands interactive-commands any
set system license autoupdate url https://ae1.juniper.net/junos/key_retrieval
set security forwarding-options family inet6 mode packet-based
set security forwarding-options family mpls mode packet-based
set interfaces ge-0/0/0 unit 0 family inet address 172.16.0.2/30
set interfaces ge-0/0/1 unit 0 family inet address 192.168.0.1/30
set interfaces ge-0/0/1 unit 0 family mpls
set interfaces fxp0 unit 0
set interfaces lo0 unit 0 family inet address 10.0.0.1/32
set routing-options router-id 10.0.0.1
set routing-options autonomous-system 65000
set protocols mpls interface ge-0/0/1.0
set protocols bgp group INTERNAL type internal
set protocols bgp group INTERNAL local-address 10.0.0.1
set protocols bgp group INTERNAL export export-bgp
set protocols bgp group INTERNAL neighbor 10.0.0.3
set protocols ospf area 0.0.0.0 interface ge-0/0/1.0
set protocols ospf area 0.0.0.0 interface lo0.0 passive
set protocols ldp interface ge-0/0/1.0
set policy-options policy-statement export-bgp term 1 from route-filter 172.16.0.0/30 exact
set policy-options policy-statement export-bgp term 1 then accept

◼︎ 最後に

先ほどの課題は、次回、考察したいと思います。
以上です。