Присутствие Route Target в BGP-анонсах между PE и CE



    Статья предполагает, что у читателя уже есть понимание основ MPLS L3VPN.

    Привет. Допустим, вы — ISP. И как у любого достаточно крупного ISP, ядро вашей сети построено на базе IP/MPLS. Если совсем уж упрощать, то вашу сеть можно представить схемой, изображенной выше. Давайте также допустим, что вы, как ISP, продаете своим клиентам услугу L3VPN, которая на вашей сети реализуется в соответствии с RFC 4364 (BGP/MPLS IP VPNs). И в том случае, если клиенту L3VPN на некотором сайте недостаточно directly connected сети, и он хочет анонсировать другим сайтам дополнительные маршруты, то вы поднимаете между вашим оборудованием (PE) и оборудованием клиента (CE) BGP-сессию, посредством которой клиент может анонсировать желаемые маршруты. При всем этом какие-либо фильтры/политики вы к данной сессии не применяете, руководствуясь тем, что это, дескать, VPN клиента, и он волен в нем «гонять» все, что захочет (в пределах лимита по числу префиксов, например). А теперь внимание, вопрос: что произойдет, если в рамках этой BGP-сессии клиент будет анонсировать вам (провайдеру) маршруты, добавляя к ним Route Target Community? Это может быть, к примеру, результатом ошибки, либо желанием поэкспериментировать.

    На всякий случай вспомним, что Route Target — это одно из специальных расширенных BGP-комьюнити, используемое в MPLS L3VPN для выбора VRF, в таблицу маршрутизации которого необходимо установить пришедший по MP-BGP маршрут. А раз RT это комьюнити, то в теории нам ничего не мешает добавлять его к обычным IPv4-маршрутам.

    Вернемся к вопросу о том, что может произойти, если CE будет анонсировать на PE маршруты, помеченные RT (BGP-политики на PE отсутствуют). Немного подумав можно предположить, что существуют 3 различных исхода:

    1. PE отбросит такой анонс.
    2. PE удалит RT из анонса, добавит к нему RT соответствующего VRF и отправит анонс другим PE.
    3. PE примет анонс без изменений, добавит к нему RT соответствующего VRF (т.е. в анонсе будет содержаться уже два RT) и отправит анонс другим PE.

    Наиболее интересным и в то же время опасным для сервис-провайдера, конечно же, является последний вариант. В этом случае клиент бы потенциально смог нарушить маршрутизацию в других VRF, как клиентских, так и внутренних, технологических.

    Но довольно предполагать, давайте проверять. Для большего интереса проверять будем сразу на нескольких Network OS. В Eve-NG была собрана вот такая схема:



    Список участников тестирования:

    • CHRMikrotik CHR, RouterOS 6.40.8
    • VSR — Nokia VSR, TiMOS 15.0.R6
    • vMX — Juniper vMX, JUNOS 14.1R1.10
    • XRv — Cisco XRv, IOS-XR 6.1.1
    • 3725 — Cisco 3725 (Dynamips), IOS 12.4

    Вспомогательные роутеры:

    • Remote-PE — Cisco 3725 (Dynamips), IOS 12.4
    • CE — Mikrotik CHR, RouterOS 6.40.8

    Описание схемы:

    1. «Участники тестирования» — PE-маршрутизаторы. На каждом из них создан VRF-100 (RT 65001:100), в рамках этого VRF-100 организована BGP-сессия с CE без каких-либо фильтров/политик.
    2. Каждый из тестируемых PE имеет MP-BGP сессию с маршрутизатором Remote_PE, по которой передает маршруты VRF.
    3. Маршрутизатор CE имеет 5 сабинтерфейсов (по 1 до каждого PE), в каждом сабинтерфейсе поднята BGP-сессия до соответствующего CE. Каждому PE анонсируется свой префикс вида 1.1.1.N/32, где N — порядковый номер PE слева направо. При помощи политики на экспорт со стороны CE к каждому из этих префиксов добавляется комьюнити RT:65001:200.
    4. На Remote_PE созданы два VRF: VRF-100 (RT 65001:100) и VRF-200 (RT 65001:200)
    5. MPLS-транспорт, P-роутеры, RR и прочие радости, обычно присутствующие в реальной сети, здесь опущены, т.к. нам здесь это не важно.

    Для тех, кто не удовлетворен описанием «только на словах», приведу конфиги всех участвующих устройств.

    CE
    /interface vlan
    add interface=ether1 name=ether1.10 vlan-id=10
    add interface=ether1 name=ether1.20 vlan-id=20
    add interface=ether1 name=ether1.30 vlan-id=30
    add interface=ether1 name=ether1.40 vlan-id=40
    add interface=ether1 name=ether1.50 vlan-id=50
    /interface wireless security-profiles
    set [ find default=yes ] supplicant-identity=MikroTik
    /routing bgp instance
    set default as=65002
    /ip address
    add address=192.168.30.2/24 interface=ether1.30 network=192.168.30.0
    add address=192.168.10.2/24 interface=ether1.10 network=192.168.10.0
    add address=192.168.20.2/24 interface=ether1.20 network=192.168.20.0
    add address=192.168.40.2/24 interface=ether1.40 network=192.168.40.0
    add address=192.168.50.2/24 interface=ether1.50 network=192.168.50.0
    /ip dhcp-client
    add disabled=no interface=ether3
    add disabled=no interface=ether1.30
    /ip route
    add distance=1 dst-address=1.1.1.1/32 type=blackhole
    add distance=1 dst-address=1.1.1.2/32 type=blackhole
    add distance=1 dst-address=1.1.1.3/32 type=blackhole
    add distance=1 dst-address=1.1.1.4/32 type=blackhole
    add distance=1 dst-address=1.1.1.5/32 type=blackhole
    /routing bgp network
    add network=1.1.1.3/32
    add network=1.1.1.1/32
    add network=1.1.1.2/32
    add network=1.1.1.4/32
    add network=1.1.1.5/32
    /routing bgp peer
    add comment=VMX name=VMX out-filter=TO-VMX remote-address=192.168.30.1 \
        remote-as=65001
    add comment=CHR name=CHR out-filter=TO-CHR remote-address=192.168.10.1 \
        remote-as=65001
    add comment=VSR name=VSR out-filter=TO-VSR remote-address=192.168.20.1 \
        remote-as=65001
    add comment=XRV name=XRV out-filter=TO-XRV remote-address=192.168.40.1 \
        remote-as=65001
    add comment=3725 name=3725 out-filter=TO-3725 remote-address=192.168.50.1 \
        remote-as=65001
    /routing filter
    add action=accept chain=TO-VMX prefix=1.1.1.3 set-route-targets=65001:200
    add action=accept chain=TO-CHR prefix=1.1.1.1 set-route-targets=65001:200
    add action=accept chain=TO-VSR prefix=1.1.1.2 set-route-targets=65001:200
    add action=accept chain=TO-XRV prefix=1.1.1.4 set-route-targets=65001:200
    add action=accept chain=TO-3725 prefix=1.1.1.5 set-route-targets=65001:200
    add action=discard chain=TO-VMX
    add action=discard chain=TO-CHR
    add action=discard chain=TO-VSR
    add action=discard chain=TO-XRV
    add action=discard chain=TO-3725
    /system identity
    set name=CE
    


    CHR
    /interface bridge
    add name=lo0 protocol-mode=none
    /interface vlan
    add interface=ether1 name=ether1.10 vlan-id=10
    add interface=ether2 name=ether2.10 vlan-id=10
    /interface wireless security-profiles
    set [ find default=yes ] supplicant-identity=MikroTik
    /routing bgp instance
    set default as=65001
    add as=65001 name=vrf-100 redistribute-other-bgp=yes router-id=192.168.10.1 \ 
            routing-table=VRF-100
    /ip address
    add address=192.168.10.1/24 interface=ether1.10 network=192.168.10.0
    add address=10.0.1.1/24 interface=ether2.10 network=10.0.1.0
    add address=10.1.1.1 interface=lo0 network=10.1.1.1
    /ip dhcp-client
    add disabled=no interface=ether1
    /ip route vrf
    add export-route-targets=65001:100 import-route-targets=65001:100 interfaces=\
        ether1.10 route-distinguisher=65001:100 routing-mark=VRF-100
    /routing bgp instance vrf
    add redistribute-other-bgp=yes routing-mark=VRF-100
    /routing bgp peer
    add address-families=vpnv4 comment=remote_PE name=remote_PE remote-address=\
        10.10.10.10 remote-as=65001 update-source=lo0
    add comment=CE instance=vrf-100 name=CE remote-address=192.168.10.2 \
        remote-as=65002
    /routing ospf network
    add area=backbone network=10.0.0.0/8
    /system identity
    set name=CHR
    


    VSR
    # TiMOS-B-15.0.R6 both/x86_64 Nokia 7750 SR Copyright (c) 2000-2017 Nokia.
    # All rights reserved. All use subject to applicable license agreements.
    # Built on Mon Nov 20 12:58:19 PST 2017 by builder in /builds/150B/R6/panos/main
    
    # Generated MON JAN 01 00:32:55 2018 UTC
    
    exit all
    configure
    #--------------------------------------------------
    echo "System Configuration"
    #--------------------------------------------------
        system
            snmp
                shutdown
            exit
            time
                sntp
                    shutdown
                exit
                zone UTC 
            exit
        exit
    #--------------------------------------------------
    echo "System Security Configuration"
    #--------------------------------------------------
        system
            security
                dist-cpu-protection
                    policy "_default-access-policy" create
                    exit
                    policy "_default-network-policy" create
                    exit
                exit
            exit
        exit
    #--------------------------------------------------
    echo "Log Configuration"
    #--------------------------------------------------
        log 
        exit 
    #--------------------------------------------------
    echo "Card Configuration"
    #--------------------------------------------------
        card 1
            card-type iom-v
            mda 1
                mda-type m20-v
                no shutdown
            exit
            no shutdown
        exit
    #--------------------------------------------------
    echo "Port Configuration"
    #--------------------------------------------------
        port 1/1/1
            description "CE"
            ethernet
                mode hybrid
                encap-type qinq
            exit
            no shutdown
        exit
        port 1/1/2
            description "remote_PE"
            ethernet
                mode hybrid
                encap-type qinq
            exit
            no shutdown
        exit
        port 1/1/3
            shutdown
            ethernet
            exit
        exit
        port 1/1/4
            shutdown
            ethernet
            exit
        exit
    
    #--------------------------------------------------
    echo "Management Router Configuration"
    #--------------------------------------------------
        router management
        exit
    
    #--------------------------------------------------
    echo "Router (Network Side) Configuration"
    #--------------------------------------------------
        router Base
            interface "remote_PE"
                address 10.0.2.1/24
                port 1/1/2:20.*
                no shutdown
            exit
            interface "system"
                address 10.2.2.2/32
                no shutdown
            exit
            autonomous-system 65001
    #--------------------------------------------------
    echo "OSPFv2 Configuration"
    #--------------------------------------------------
            ospf 0
                area 0.0.0.0
                    interface "system"
                        no shutdown
                    exit
                    interface "remote_PE"
                        mtu 1500
                        no shutdown
                    exit
                exit
                no shutdown
            exit
        exit
    
    #--------------------------------------------------
    echo "Service Configuration"
    #--------------------------------------------------
        service
            customer 1 create
                description "Default customer"
            exit
            vprn 100 customer 1 create
                autonomous-system 65001
                route-distinguisher 65001:100
                vrf-target target:65001:100
                interface "CE" create
                    address 192.168.20.1/24
                    sap 1/1/1:20.0 create
                    exit
                exit
                bgp
                    group "CE"
                        type external
                        export "TO-CE"
                        peer-as 65002
                        neighbor 192.168.20.2
                        exit
                    exit
                    no shutdown
                exit
                service-name "VRF-100"
                no shutdown
            exit
        exit
    #--------------------------------------------------
    echo "Router (Service Side) Configuration"
    #--------------------------------------------------
        router Base
    #--------------------------------------------------
    echo "OSPFv2 Configuration"
    #--------------------------------------------------
            ospf 0
                no shutdown
            exit
    #--------------------------------------------------
    echo "Policy Configuration"
    #--------------------------------------------------
            policy-options
                begin
                policy-statement "TO-CE"
                    entry 10
                        action accept
                        exit
                    exit
                exit
                commit
            exit
    #--------------------------------------------------
    echo "BGP Configuration"
    #--------------------------------------------------
            bgp
                group "remote_PE"
                    family vpn-ipv4
                    type internal
                    local-address system
                    neighbor 10.0.2.2
                    exit
                exit
                no shutdown
            exit
        exit
    
    
    exit all
    


    vMX
    ## Last commit: 2018-05-25 12:37:27 UTC by root
    version 14.1R1.10;
    system {
        host-name vmx01;
        root-authentication {
            encrypted-password "$1$zA/8snt5$g3mYVmz7MzTZZOhtjRX6g1"; ## SECRET-DATA
        }
    }
    interfaces {
        ge-0/0/0 {
            vlan-tagging;
            encapsulation flexible-ethernet-services;
            unit 30 {
                vlan-id 30;
                family inet {
                    address 192.168.30.1/24;
                }
            }
        }
        ge-0/0/1 {
            vlan-tagging;
            encapsulation flexible-ethernet-services;
            unit 30 {
                vlan-id 30;
                family inet {
                    address 10.0.3.1/24;
                }
            }
        }
        lo0 {
            unit 0 {
                family inet {
                    address 10.3.3.3/32;
                }
            }
        }
    }
    routing-options {
        autonomous-system 65001;
    }
    protocols {
        bgp {
            group remote_PE {
                type internal;
                local-address 10.3.3.3;
                family inet-vpn {
                    unicast;
                }
                neighbor 10.10.10.10;
            }
        }
        ospf {
            area 0.0.0.0 {
                interface lo0.0;
                interface ge-0/0/1.30;
            }
        }
    }
    routing-instances {
        VRF-100 {
            instance-type vrf;
            interface ge-0/0/0.30;
            route-distinguisher 65001:100;
            vrf-target target:65001:100;
            protocols {
                bgp {
                    group CE {
                        type external;
                        peer-as 65002;
                        neighbor 192.168.30.2;
                    }
                }
            }
        }
    }
    


    XRv
    !! IOS XR Configuration 6.1.1
    !! Last configuration change at Fri May 25 15:24:01 2018 by Cisco
    !
    hostname XRv
    vrf VRF-100
     address-family ipv4 unicast
      import route-target
       65001:100
      !
      export route-target
       65001:100
      !
     !
    !
    interface Loopback0
     no shutdown
     ipv4 address 10.4.4.4 255.255.255.255
    !
    interface MgmtEth0/0/CPU0/0
     no shutdown
     shutdown
    !
    interface GigabitEthernet0/0/0/0.40
     no shutdown
     vrf VRF-100
     ipv4 address 192.168.40.1 255.255.255.0
     encapsulation dot1q 40
    !
    interface GigabitEthernet0/0/0/1.40
     no shutdown
     ipv4 address 10.0.4.1 255.255.255.0
     encapsulation dot1q 40
    !
    interface GigabitEthernet0/0/0/2
     no shutdown
     shutdown
    !
    route-policy TO-CE
      pass
    end-policy
    !
    route-policy FROM-CE
      pass
    end-policy
    !
    router ospf main
     area 0
      interface Loopback0
      !
      interface GigabitEthernet0/0/0/1.40
      !
     !
    !
    router bgp 65001
     address-family ipv4 unicast
     !
     address-family vpnv4 unicast
     !
     neighbor 10.10.10.10
      remote-as 65001
      update-source Loopback0
      address-family vpnv4 unicast
      !
     !
     vrf VRF-100
      rd 65001:100
      bgp router-id 192.168.40.1
      address-family ipv4 unicast
      !
      neighbor 192.168.40.2
       remote-as 65002
       address-family ipv4 unicast
        route-policy FROM-CE in
        route-policy TO-CE out
       !
      !
     !
    !
    end
    


    3725
    !
    version 12.4
    service timestamps debug datetime msec
    service timestamps log datetime msec
    no service password-encryption
    !
    hostname 3725
    !
    boot-start-marker
    boot-end-marker
    !
    !
    no aaa new-model
    memory-size iomem 5
    ip cef
    !
    !
    !
    !
    ip vrf VRF-100
     rd 65001:100
     route-target export 65001:100
     route-target import 65001:100
    !
    no ip domain lookup
    !
    multilink bundle-name authenticated
    !
    !
    !
    archive
     log config
      hidekeys
    ! 
    !
    !
    interface Loopback0
     ip address 10.5.5.5 255.255.255.255
    !
    interface FastEthernet0/0
     no ip address
     duplex auto
     speed auto
    !
    interface FastEthernet0/0.50
     encapsulation dot1Q 50
     ip vrf forwarding VRF-100
     ip address 192.168.50.1 255.255.255.0
    !
    interface FastEthernet0/1
     no ip address
     duplex auto
     speed auto
    !
    interface FastEthernet0/1.50
     encapsulation dot1Q 50
     ip address 10.0.5.1 255.255.255.0
    !
    router ospf 123
     log-adjacency-changes
     network 10.0.0.0 0.255.255.255 area 0
    !
    router bgp 65001
     no bgp default ipv4-unicast
     no bgp default route-target filter
     bgp log-neighbor-changes
     neighbor 10.10.10.10 remote-as 65001
     neighbor 10.10.10.10 update-source Loopback0
     !
     address-family vpnv4
      neighbor 10.10.10.10 activate
      neighbor 10.10.10.10 send-community extended
     exit-address-family
     !
     address-family ipv4 vrf VRF-200
      no synchronization
     exit-address-family
     !
     address-family ipv4 vrf VRF-100
      neighbor 192.168.50.2 remote-as 65002
      neighbor 192.168.50.2 activate
      neighbor 192.168.50.2 soft-reconfiguration inbound
      no synchronization
     exit-address-family
    !
    ip forward-protocol nd
    !
    !
    ip http server
    no ip http secure-server
    !
    !
    !
    control-plane
    !
    !
    !
    line con 0
    line aux 0
    line vty 0 4
    !
    !
    end
    


    Remote_PE
    !
    version 12.4
    service timestamps debug datetime msec
    service timestamps log datetime msec
    no service password-encryption
    !
    hostname remote_PE
    !
    boot-start-marker
    boot-end-marker
    !
    !
    no aaa new-model
    memory-size iomem 5
    ip cef
    !
    !
    !
    !
    ip vrf VRF-100
     rd 65001:100
     route-target export 65001:100
     route-target import 65001:100
    !
    ip vrf VRF-200
     rd 65001:200
     route-target export 65001:200
     route-target import 65001:200
    !
    !
    multilink bundle-name authenticated
    !
    !
    !
    !
    archive
     log config
      hidekeys
    ! 
    !
    !
    !
    interface Loopback0
     ip address 10.10.10.10 255.255.255.255
    !
    interface FastEthernet0/0
     no ip address
     duplex auto
     speed auto
    !
    interface FastEthernet0/0.10
     description CHR
     encapsulation dot1Q 10
     ip address 10.0.1.2 255.255.255.0
    !
    interface FastEthernet0/0.20
     encapsulation dot1Q 20
     ip address 10.0.2.2 255.255.255.0
    !
    interface FastEthernet0/0.30
     encapsulation dot1Q 30
     ip address 10.0.3.2 255.255.255.0
    !
    interface FastEthernet0/0.40
     encapsulation dot1Q 40
     ip address 10.0.4.2 255.255.255.0
    !
    interface FastEthernet0/0.50
     encapsulation dot1Q 50
     ip address 10.0.5.2 255.255.255.0
    !
    interface FastEthernet0/1
     no ip address
     shutdown
     duplex auto
     speed auto
    !
    router ospf 123
     log-adjacency-changes
     network 10.0.0.0 0.255.255.255 area 0
    !
    router bgp 65001
     no bgp default ipv4-unicast
     no bgp default route-target filter
     bgp log-neighbor-changes
     neighbor 10.1.1.1 remote-as 65001
     neighbor 10.2.2.2 remote-as 65001
     neighbor 10.3.3.3 remote-as 65001
     neighbor 10.4.4.4 remote-as 65001
     neighbor 10.5.5.5 remote-as 65001
     !
     address-family vpnv4
      neighbor 10.1.1.1 activate
      neighbor 10.1.1.1 send-community extended
      neighbor 10.2.2.2 activate
      neighbor 10.2.2.2 send-community extended
      neighbor 10.3.3.3 activate
      neighbor 10.3.3.3 send-community extended
      neighbor 10.4.4.4 activate
      neighbor 10.4.4.4 send-community extended
      neighbor 10.5.5.5 activate
      neighbor 10.5.5.5 send-community extended
     exit-address-family
     !
     address-family ipv4 vrf VRF-200
      no synchronization
     exit-address-family
     !
     address-family ipv4 vrf VRF-100
      redistribute connected
      no synchronization
     exit-address-family
    !
    ip forward-protocol nd
    !
    !
    ip http server
    no ip http secure-server
    !
    !
    control-plane
    !
    !
    !
    line con 0
    line aux 0
    line vty 0 4
     login
    !
    !
    end
    


    Анонсы CE->PE


    Итак, эксперимент прост: с CE анонсируем маршруты, помеченные RT:65001:200, на Remote-PE смотрим, появятся ли эти маршруты в таблице маршрутизации VRF-200.

    Для начала проверим таблицу маршрутизации VRF-100:

    remote_PE#show ip route vrf VRF-100 1.1.1.0 255.255.255.0 longer-prefixes
    
    Routing Table: VRF-100
    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
    
         1.0.0.0/32 is subnetted, 5 subnets
    B       1.1.1.1 [200/0] via 10.1.1.1, 00:01:02
    B       1.1.1.3 [200/0] via 10.3.3.3, 05:19:08
    B       1.1.1.2 [200/0] via 10.2.2.2, 00:02:47
    B       1.1.1.5 [200/0] via 10.5.5.5, 01:36:05
    B       1.1.1.4 [200/0] via 10.4.4.4, 02:32:21
    remote_PE#
    

    Нам пришли маршруты от всех 5 PE. Теперь проверим, попали ли какие-то из этих маршрутов в VRF-200:

    remote_PE#show ip route vrf VRF-200
    
    Routing Table: VRF-200
    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
    
         1.0.0.0/32 is subnetted, 3 subnets
    B       1.1.1.1 [200/0] via 10.1.1.1, 00:01:24
    B       1.1.1.3 [200/0] via 10.3.3.3, 05:19:29
    B       1.1.1.2 [200/0] via 10.2.2.2, 00:03:08
    remote_PE#
    

    Маршруты от CHR, vMX и VSR попали в VRF-200. Это означает, что добавленное на CE комьюнити RT:65001:200 было сохранено этими PE.

    В это же время маршруты от XRv и 3725 есть только в VRF-100. Это означает, что циско-роутеры удалили комьюнити RT:65001:200 из анонса.

    Анонсы PE->CE


    Не будем останавливаться на достигнутом и проверим, как ведут себя анонсы в обратную сторону, т.е. от PE к CE. Немного изменим существующие конфигурации.

    На Remote_PE создадим loopback, адрес которого 100.100.100.100/32 проанонсируем другим PE:

    interface Loopback100
     ip vrf forwarding VRF-100
     ip address 100.100.100.100 255.255.255.255
    !
    router bgp 65001
     address-family ipv4 vrf VRF-100
      redistribute connected
     exit-address-family
    ! 
    

    На vMX вспомним, что MPLS-транспорт мы не настраивали, а значит таблица inet.3 пустая, и маршрут от Remote_PE попадет в hidden. Скопируем маршруты OSPF в inet.3.

    set routing-options rib-groups RG-INET3 import-rib [ inet.0 inet.3 ]
    set protocols ospf rib-group RG-INET3
    

    На остальных роутерах текущих настроек должно быть достаточно.

    Смотрим маршруты на CE:

    [admin@CE] > ip route print detail where dst-address=100.100.100.100/32
    Flags: X - disabled, A - active, D - dynamic,
    C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
    B - blackhole, U - unreachable, P - prohibit
     0 ADb  dst-address=100.100.100.100/32 gateway=192.168.20.1
            gateway-status=192.168.20.1 reachable via  ether1.20 distance=20
            scope=40 target-scope=10 bgp-as-path="65001" bgp-origin=incomplete
            bgp-ext-communities="RT:65001:100" received-from=VSR
    
     1  Db  dst-address=100.100.100.100/32 gateway=192.168.50.1
            gateway-status=192.168.50.1 reachable via  ether1.50 distance=20
            scope=40 target-scope=10 bgp-as-path="65001" bgp-origin=incomplete
            received-from=3725
    
     2  Db  dst-address=100.100.100.100/32 gateway=192.168.10.1
            gateway-status=192.168.10.1 reachable via  ether1.10 distance=20
            scope=40 target-scope=10 bgp-as-path="65001" bgp-origin=incomplete
            bgp-ext-communities="RT:65001:100" received-from=CHR
    
     3  Db  dst-address=100.100.100.100/32 gateway=192.168.30.1
            gateway-status=192.168.30.1 reachable via  ether1.30 distance=20
            scope=40 target-scope=10 bgp-as-path="65001" bgp-origin=incomplete
            bgp-ext-communities="RT:65001:100" received-from=VMX
    
     4  Db  dst-address=100.100.100.100/32 gateway=192.168.40.1
            gateway-status=192.168.40.1 reachable via  ether1.40 distance=20
            scope=40 target-scope=10 bgp-as-path="65001" bgp-origin=incomplete
            received-from=XRV
    

    Все роутеры, кроме Cisco, оставили Route Target в анонсе маршрута. Cisco этого не сделали только по причине того, что на них по умолчанию выключена отправка любых community. Исправим это.
    3725:*

    router bgp 65001
     address-family ipv4 vrf VRF-100
      neighbor 192.168.50.2 send-community extended
    

    XRv:*

    router bgp 65001 vrf VRF-100 neighbor 192.168.40.2
      address-family ipv4 unicast send-extended-community-ebgp
    

    *Применение данных команд никак не меняет результаты первого опыта с CE->PE анонсами.

    Теперь смотрим маршрут на CE еще раз:

    [admin@CE] > ip route print detail where dst-address=100.100.100.100/32
    Flags: X - disabled, A - active, D - dynamic,
    C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
    B - blackhole, U - unreachable, P - prohibit
     0 ADb  dst-address=100.100.100.100/32 gateway=192.168.20.1
            gateway-status=192.168.20.1 reachable via  ether1.20 distance=20
            scope=40 target-scope=10 bgp-as-path="65001" bgp-origin=incomplete
            bgp-ext-communities="RT:65001:100" received-from=VSR
    
     1  Db  dst-address=100.100.100.100/32 gateway=192.168.50.1
            gateway-status=192.168.50.1 reachable via  ether1.50 distance=20
            scope=40 target-scope=10 bgp-as-path="65001" bgp-origin=incomplete
            bgp-ext-communities="RT:65001:100" received-from=3725
    
     2  Db  dst-address=100.100.100.100/32 gateway=192.168.10.1
            gateway-status=192.168.10.1 reachable via  ether1.10 distance=20
            scope=40 target-scope=10 bgp-as-path="65001" bgp-origin=incomplete
            bgp-ext-communities="RT:65001:100" received-from=CHR
    
     3  Db  dst-address=100.100.100.100/32 gateway=192.168.30.1
            gateway-status=192.168.30.1 reachable via  ether1.30 distance=20
            scope=40 target-scope=10 bgp-as-path="65001" bgp-origin=incomplete
            bgp-ext-communities="RT:65001:100" received-from=VMX
    
     4  Db  dst-address=100.100.100.100/32 gateway=192.168.40.1
            gateway-status=192.168.40.1 reachable via  ether1.40 distance=20
            scope=40 target-scope=10 bgp-as-path="65001" bgp-origin=incomplete
            bgp-ext-communities="RT:65001:100" received-from=XRV
    

    Теперь абсолютно все PE посылают в сторону CE маршруты с указанием RT.

    Подобный результат лично мне показался несколько странным. Если сохранению RT в анонсе CE->PE теоретически можно придумать применение, то вот в анонсе PE->CE RT выглядит как явно лишняя информация.

    Кроме того, существование явлений сохранения RT как в сторону CE->PE, так и в сторону PE->CE, потенциально может оказать негативное влияние на сценарии Inter-AS Option A.

    Рубрика «Что нам говорит RFC»


    В RFC 4364, упоминавшемся в начале статьи, в частности сказано вот это:
    If the PE and the CE are themselves BGP peers, then
    the SP may allow the customer, within limits, to specify how its
    routes are to be distributed. The SP and the customer would need to
    agree in advance on the set of RTs that are allowed to be attached to
    the customer's VPN routes. The CE could then attach one or more of
    those RTs to each IP route that it distributes to the PE. This gives
    the customer the freedom to specify in real time, within agreed-upon
    limits, its route distribution policies. If the CE is allowed to
    attach RTs to its routes, the PE MUST filter out all routes that
    contain RTs that the customer is not allowed to use. If the CE is
    not allowed to attach RTs to its routes, but does so anyway, the PE
    MUST remove the RT before converting the customer's route to a VPN-
    IPv4 route.

    Таким образом, сохранение RT в анонсах CE->PE имеет под собой вполне легальную основу, хоть практическое применение подобного и кажется лично мне несколько сомнительным.
    Про RT в анонсах PE->CE в RFC ничего не сказано.

    Убираем RT из сессий с CE


    С Циско все понятно заранее. В анонсах CE->PE все RT удаляются безапелляционно (мне не удалось найти команды, которая бы изменила это поведение), в PE->CE анонсах RT отсутствует по умолчанию, достаточно не включать отправку расширенных комьюнити.

    Разберемся, как избавиться от RT на других участниках нашего тестирования.

    Juniper


    Все, что нужно сделать, чтобы удалить RT из анонсов (как PE->CE, так и CE->PE), так это составить политику и самым первым термом удалить все комьюнити, начинающиеся с «target:», отдав при этом префикс на обработку следующими термами.

    Например, если мы хотим принимать и анонсировать все маршруты, просто удаляя из них RT:

    edit policy-options
    set community RT-ALL members target:.+:.+
    set policy-statement TO-CE term 10 then community delete RT-ALL
    set policy-statement TO-CE term 10 then next term
    set policy-statement TO-CE then accept
    copy policy-statement TO-CE to policy-statement FROM-CE
    

    Nokia


    Для отключения отправки расширенных комьюнити BGP-пиру можно воспользоваться командой:

    configure service vprn "VRF-100" bgp group "CE" disable-communities extended

    Для того, чтобы убрать RT из анонсов от CE, нужно создать политику аналогичному тому, как это было сделано в Juniper, и применить ее к сессии с CE.

    configure router policy-options
    begin
    community "RT-ALL" members "target:.+&.+"
    policy-statement FROM-CE
            entry 10
                action next-entry
                    community remove "RT-ALL"
                exit
            exit
            default-action accept
            exit
    exit
    commit
    

    Mikrotik


    А вот с Микротиком нас ждет разочарование. Механизма, позволяющего удалить RT из анонса, просто нет. Казалось бы, в routing filter есть параметр set-route-targets, и сделать бы что-то типа

    /routing filter
    add chain=TO-CE set-route-targets="" action=passthrough
    add chain=TO-CE action=accept
    

    но, к сожалению, set-route-targets="" означает, что данный параметр (set-route-targets) нужно вовсе убрать из правила. Пример:

    [admin@CE] /routing filter> add chain=TO-CE action=passthrough set-route-targets=""
    [admin@CE /routing filter> print where chain=TO-CE 
    Flags: X - disabled 
     0   chain=TO-CE invert-match=no action=passthrough set-bgp-prepend-path="" 
    

    В данном случае все же стоит помнить, что Mikrotik — в первую очередь продвинутый SOHO-роутер, и требовать от него того же функционала, что есть в маршрутизаторе Carrier-класса, наверное, не совсем правильно. Остается уповать на RouterOS 7.

    Выводы


    Добавляя нужный RT к своим анонсам, ваш клиент все же не сможет получить доступ в ваш MGMT VRF, например, т.к. связность будет односторонней. Тем не менее, нарушить работу маршрутизации в MGMT VRF клиенту вполне под силу (конечно, для этого нужно угадать с RT и с анонсируемыми маршрутами).

    Кроме этого, при реализации Inter-AS Option A возможна ситуация, когда маршрут от провайдера A попадет в сеть провайдера B, сохранив свой RT. При этом если в сети провайдера B данный RT уже используется под какой-то другой VRF, маршрут утечет в этот VRF, что, конечно же, не является желаемым поведением.

    Таким образом, проблема не являются уж слишком значительной, т.к. для того, чтобы она «выстрелила», должно совпасть вместе несколько факторов. С другой стороны, исправить данное нежелательное поведение гораздо проще, чем потом разбираться, почему вдруг «не работает».

    Итак, еще раз, очень кратко:

    1. По возможности вырезайте RT из анонсов между PE и CE (если, конечно, у вас нет в них необходимости).
    2. Судя по результатам тестов, владельцы циско-PE могут спать спокойно, у них RT вырезается на автомате. Однако, я бы на всякий случай перепроверил. Возможно, в других версиях IOS поведение отличается.

    Похожие публикации

    Средняя зарплата в IT

    110 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 8 813 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

    Комментарии 2

      0
      Замечательное исследование, открывшее новую уязвимость. Зная, например, RT vrf Сбербанка в сети Ростелеком, можно проанонсировать more specific инфраструктурно-значимого сервиса, и, как минимум, сломать что-то серьезное. Для данного метода напрашивается определение Inter-AS BGP hijacking :)
        0

        Интересное исследование, спасибо!

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое