From c36dcec44c66d84e376fda0668f8564c26f8e59d Mon Sep 17 00:00:00 2001 From: fett0 Date: Tue, 28 Mar 2023 15:48:58 -0300 Subject: [PATCH] Segment-rounting : Add documentation about segment-routing mpls on VyOS --- docs/_static/images/vyos-sr-isis.png | Bin 0 -> 45339 bytes docs/configuration/protocols/index.rst | 1 + .../protocols/segment-routing.rst | 564 ++++++++++++++++++ 3 files changed, 565 insertions(+) create mode 100644 docs/_static/images/vyos-sr-isis.png create mode 100644 docs/configuration/protocols/segment-routing.rst diff --git a/docs/_static/images/vyos-sr-isis.png b/docs/_static/images/vyos-sr-isis.png new file mode 100644 index 0000000000000000000000000000000000000000..6243091971354462a2167d04e2b6b885d64142af GIT binary patch literal 45339 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 Y=lk{Wwp*kte}NxGIkkty4@?992f}Yk6aWAK literal 0 HcmV?d00001 diff --git a/docs/configuration/protocols/index.rst b/docs/configuration/protocols/index.rst index 682390d5..29dc230f 100644 --- a/docs/configuration/protocols/index.rst +++ b/docs/configuration/protocols/index.rst @@ -14,6 +14,7 @@ Protocols igmp isis mpls + segment-routing ospf rip rpki diff --git a/docs/configuration/protocols/segment-routing.rst b/docs/configuration/protocols/segment-routing.rst new file mode 100644 index 00000000..d8d0f116 --- /dev/null +++ b/docs/configuration/protocols/segment-routing.rst @@ -0,0 +1,564 @@ +.. _segment-routing: + +############### +Segment Routing +############### + +Segment Routing (SR) is a network architecture that is similar to +source-routing.In this architecture, the ingress router adds a list of segments, +known as SIDs, to the packet as it enters the network. These segments represent +different portions of the network path that the packet will take. + +The SR segments are portions of the network path taken by the packet, and are +called SIDs. At each node, the first SID of the list is read, executed as a +forwarding function, and may be popped to let the next node read the next SID of +the list. The SID list completely determines the path where the packet is +forwarded. + +Segment Routing can be applied to an existing MPLS-based data plane and defines +a control plane network architecture. In MPLS networks, segments are encoded as +MPLS labels and are added at the ingress router. These MPLS labels are then +exchanged and populated by Interior Gateway Protocols (IGPs) like IS-IS or OSPF +which are running on most ISPs. + + +.. note:: Segment routing defines a control plane network architecture and + can be applied to an existing MPLS based dataplane. In the MPLS networks, + segments are encoded as MPLS labels and are imposed at the ingress router. + MPLS labels are exchanged and populated by IGPs like IS-IS.Segment Routing + as per RFC8667 for MPLS dataplane. It supports IPv4, IPv6 and ECMP and has + been tested against Cisco & Juniper routers.however,this deployment is still + EXPERIMENTAL for FRR . + + +IS-IS SR Configuration +---------------------- + +Segment routing (SR) is used by the IGP protocols to interconnect network +devices, below configuration shows how to enable SR on IS-IS: + + +.. note:: ``Known limitations:`` + + No support for level redistribution (L1 to L2 or L2 to L1) + + No support for binding SID + + No support for SRLB + + Only one SRGB and default SPF Algorithm is supported + + + +.. cfgcmd:: set protocols isis segment-routing global-block + + Set the Segment Routing Global Block i.e. the label range used by MPLS to + store label in the MPLS FIB for Prefix SID. Note that the block size may + not exceed 65535. + +.. cfgcmd:: set protocols isis segment-routing local-block + + Set the Segment Routing Local Block i.e. the label range used by MPLS to + store label in the MPLS FIB for Prefix SID. Note that the block size may + not exceed 65535.Segment Routing Local Block, The negative command always + unsets both. + +.. cfgcmd:: set protocols isis segment-routing maximum-label-depth <1-16> + + Set the Maximum Stack Depth supported by the router. The value depend of + the MPLS dataplane. + +.. cfgcmd:: set protocols isis segment-routing prefix
index value + <0-65535> + + A segment ID that contains an IP address prefix calculated by an IGP in the + service provider core network. Prefix SIDs are globally unique, this value + indentify it + +.. cfgcmd:: set protocols isis segment-routing prefix
index + + + prefix. The ‘no-php-flag’ means NO Penultimate Hop Popping that allows SR + node to request to its neighbor to not pop the label. The ‘explicit-null’ + flag allows SR node to request to its neighbor to send IP packet with the + EXPLICIT-NULL label. The ‘n-flag-clear’ option can be used to explicitly + clear the Node flag that is set by default for Prefix-SIDs associated to + loopback addresses. This option is necessary to configure Anycast-SIDs. + + +.. opcmd:: show isis segment-routing node + + Show detailed information about all learned Segment Routing Nodes + +.. note:: more information related IGP - :ref:`routing-isis` + + + +OSPF SR Configuration +---------------------- + +Segment routing (SR) is used by the IGP protocols to interconnect network +devices, below configuration shows how to enable SR on OSPF: + +.. cfgcmd:: set protocols ospf parameters opaque-lsa + + Enable the Opaque-LSA capability (rfc2370),necessary to transport label + on IGP + + +.. cfgcmd:: set protocols ospf segment-routing global-block + + Set the Segment Routing Global Block i.e. the label range used by MPLS to + store label in the MPLS FIB for Prefix SID. Note that the block size may + not exceed 65535. + +.. cfgcmd:: set protocols ospf segment-routing local-block + + Set the Segment Routing Local Block i.e. the label range used by MPLS to + store label in the MPLS FIB for Prefix SID. Note that the block size may + not exceed 65535.Segment Routing Local Block, The negative command always + unsets both. + +.. cfgcmd:: set protocols ospf segment-routing maximum-label-depth <1-16> + + Set the Maximum Stack Depth supported by the router. The value depend of + the MPLS dataplane. + +.. cfgcmd:: set protocols ospf segment-routing prefix
index value + <0-65535> + + A segment ID that contains an IP address prefix calculated by an IGP in the + service provider core network. Prefix SIDs are globally unique, this value + indentify it + +.. cfgcmd:: set protocols ospf segment-routing prefix
index + + + prefix. The ‘no-php-flag’ means NO Penultimate Hop Popping that allows SR + node to request to its neighbor to not pop the label. The ‘explicit-null’ + flag allows SR node to request to its neighbor to send IP packet with the + EXPLICIT-NULL label. The ‘n-flag-clear’ option can be used to explicitly + clear the Node flag that is set by default for Prefix-SIDs associated to + loopback addresses. This option is necessary to configure Anycast-SIDs. + +.. note:: more information related IGP - :ref:`routing-ospf` + +Configuration Example +--------------------- + +we described the configuration SR ISIS / SR OSPF using 2 connected with them to +share label information. + +Enable IS-IS with Segment Routing (Experimental) +================================================ + +**Node 1:** + +.. code-block:: none + + set interfaces loopback lo address '192.168.255.255/32' + set interfaces ethernet eth1 address '192.0.2.1/24' + + set protocols isis interface eth1 + set protocols isis interface lo + set protocols isis net '49.0001.1921.6825.5255.00' + set protocols isis segment-routing global-block high-label-value '599' + set protocols isis segment-routing global-block low-label-value '550' + set protocols isis segment-routing prefix 192.168.255.255/32 index value '1' + set protocols isis segment-routing prefix 192.168.255.255/32 index explicit-null + set protocols mpls interface 'eth1' + +**Node 2:** + +.. code-block:: none + + set interfaces loopback lo address '192.168.255.254/32' + set interfaces ethernet eth1 address '192.0.2.2/24' + + set protocols isis interface eth1 + set protocols isis interface lo + set protocols isis net '49.0001.1921.6825.5254.00' + set protocols isis segment-routing global-block high-label-value '599' + set protocols isis segment-routing global-block low-label-value '550' + set protocols isis segment-routing prefix 192.168.255.254/32 index value '2' + set protocols isis segment-routing prefix 192.168.255.254/32 index explicit-null + set protocols mpls interface 'eth1' + + + +This gives us MPLS segment routing enabled and labels for far end loopbacks: + +.. code-block:: none + + Node-1@vyos:~$ show mpls table + Inbound Label Type Nexthop Outbound Label + ---------------------------------------------------------------------- + 552 SR (IS-IS) 192.0.2.2 IPv4 Explicit Null <-- Node-2 loopback learned on Node-1 + 15000 SR (IS-IS) 192.0.2.2 implicit-null + 15001 SR (IS-IS) fe80::e87:6cff:fe09:1 implicit-null + 15002 SR (IS-IS) 192.0.2.2 implicit-null + 15003 SR (IS-IS) fe80::e87:6cff:fe09:1 implicit-null + + Node-2@vyos:~$ show mpls table + Inbound Label Type Nexthop Outbound Label + --------------------------------------------------------------------- + 551 SR (IS-IS) 192.0.2.1 IPv4 Explicit Null <-- Node-1 loopback learned on Node-2 + 15000 SR (IS-IS) 192.0.2.1 implicit-null + 15001 SR (IS-IS) fe80::e33:2ff:fe80:1 implicit-null + 15002 SR (IS-IS) 192.0.2.1 implicit-null + 15003 SR (IS-IS) fe80::e33:2ff:fe80:1 implicit-null + +Here is the routing tables showing the MPLS segment routing label operations: + +.. code-block:: none + + Node-1@vyos:~$ show ip route isis + Codes: K - kernel route, C - connected, S - static, R - RIP, + O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, + T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, + f - OpenFabric, + > - selected route, * - FIB route, q - queued, r - rejected, b - backup + t - trapped, o - offload failure + + I 192.0.2.0/24 [115/20] via 192.0.2.2, eth1 inactive, weight 1, 00:07:48 + I>* 192.168.255.254/32 [115/20] via 192.0.2.2, eth1, label IPv4 Explicit Null, weight 1, 00:03:39 + + Node-2@vyos:~$ show ip route isis + Codes: K - kernel route, C - connected, S - static, R - RIP, + O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, + T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, + f - OpenFabric, + > - selected route, * - FIB route, q - queued, r - rejected, b - backup + t - trapped, o - offload failure + + I 192.0.2.0/24 [115/20] via 192.0.2.1, eth1 inactive, weight 1, 00:07:46 + I>* 192.168.255.255/32 [115/20] via 192.0.2.1, eth1, label IPv4 Explicit Null, weight 1, 00:03:43 + + +Enable OSPF with Segment Routing (Experimental): +================================================ + +**Node 1** + +.. code-block:: none + + set interfaces loopback lo address 10.1.1.1/32 + set interfaces ethernet eth0 address 192.168.0.1/24 + set protocols ospf area 0 network '192.168.0.0/24' + set protocols ospf area 0 network '10.1.1.1/32' + set protocols ospf parameters opaque-lsa + set protocols ospf parameters router-id '10.1.1.1' + set protocols ospf segment-routing global-block high-label-value '1100' + set protocols ospf segment-routing global-block low-label-value '1000' + set protocols ospf segment-routing prefix 10.1.1.1/32 index explicit-null + set protocols ospf segment-routing prefix 10.1.1.1/32 index value '1' + +**Node 2** + +.. code-block:: none + + set interfaces loopback lo address 10.1.1.2/32 + set interfaces ethernet eth0 address 192.168.0.2/24 + set protocols ospf area 0 network '192.168.0.0/24' + set protocols ospf area 0 network '10.1.1.2/32' + set protocols ospf parameters opaque-lsa + set protocols ospf parameters router-id '10.1.1.2' + set protocols ospf segment-routing global-block high-label-value '1100' + set protocols ospf segment-routing global-block low-label-value '1000' + set protocols ospf segment-routing prefix 10.1.1.2/32 index explicit-null + set protocols ospf segment-routing prefix 10.1.1.2/32 index value '2' + + +This gives us MPLS segment routing enabled and labels for far end loopbacks: + +.. code-block:: none + + Node-1@vyos:~$ show mpls table + Inbound Label Type Nexthop Outbound Label + ----------------------------------------------------------- + 1002 SR (OSPF) 192.168.0.2 IPv4 Explicit Null <-- Node-2 loopback learned on Node-1 + 15000 SR (OSPF) 192.168.0.2 implicit-null + 15001 SR (OSPF) 192.168.0.2 implicit-null + + Node-2@vyos:~$ show mpls table + Inbound Label Type Nexthop Outbound Label + ----------------------------------------------------------- + 1001 SR (OSPF) 192.168.0.1 IPv4 Explicit Null <-- Node-1 loopback learned on Node-2 + 15000 SR (OSPF) 192.168.0.1 implicit-null + 15001 SR (OSPF) 192.168.0.1 implicit-null + +Here is the routing tables showing the MPLS segment routing label operations: + +.. code-block:: none + + Node-1@vyos:~$ show ip route ospf + Codes: K - kernel route, C - connected, S - static, R - RIP, + O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, + T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, + f - OpenFabric, + > - selected route, * - FIB route, q - queued, r - rejected, b - backup + t - trapped, o - offload failure + + O 10.1.1.1/32 [110/0] is directly connected, lo, weight 1, 00:03:43 + O>* 10.1.1.2/32 [110/1] via 192.168.0.2, eth0, label IPv4 Explicit Null, weight 1, 00:03:32 + O 192.168.0.0/24 [110/1] is directly connected, eth0, weight 1, 00:03:43 + + Node-2@vyos:~$ show ip route ospf + Codes: K - kernel route, C - connected, S - static, R - RIP, + O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, + T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, + f - OpenFabric, + > - selected route, * - FIB route, q - queued, r - rejected, b - backup + t - trapped, o - offload failure + + O>* 10.1.1.1/32 [110/1] via 192.168.0.1, eth0, label IPv4 Explicit Null, weight 1, 00:03:36 + O 10.1.1.2/32 [110/0] is directly connected, lo, weight 1, 00:03:51 + O 192.168.0.0/24 [110/1] is directly connected, eth0, weight 1, 00:03:51 + +************************** +Example with Cisco IOS-XR +************************** + +When utilizing VyOS in an environment with Cisco IOS-XR gear you can use this +blue print as an initial setup to get MPLS ISIS-SR working between those two +devices.The lab was build using :abbr:`EVE-NG (Emulated Virtual +Environment NG)`. + +.. figure:: /_static/images/vyos-sr-isis.png + :alt: ISIS-SR network + + ISIS-SR example network + +The below configuration is used as example where we keep focus on +VyOS-P1/VyOS-P2/XRv-P3 which we share the settings. + + +Configuration +============= + +VyOS-P1: +======== +.. code-block:: none + + set interfaces dummy dum0 address '192.0.2.1/32' + set interfaces ethernet eth1 address '192.0.2.5/30' + set interfaces ethernet eth1 mtu '8000' + set interfaces ethernet eth3 address '192.0.2.21/30' + set interfaces ethernet eth3 mtu '8000' + set protocols isis interface dum0 passive + set protocols isis interface eth1 network point-to-point + set protocols isis interface eth3 network point-to-point + set protocols isis level 'level-2' + set protocols isis log-adjacency-changes + set protocols isis metric-style 'wide' + set protocols isis net '49.0000.0000.0000.0001.00' + set protocols isis segment-routing maximum-label-depth '8' + set protocols isis segment-routing prefix 192.0.2.1/32 index value '1' + set protocols mpls interface 'eth1' + set protocols mpls interface 'eth3' + set system host-name 'P1-VyOS' + +XRv-P3: +======= +.. code-block:: none + + hostname P3-VyOS + interface Loopback0 + ipv4 address 192.0.2.3 255.255.255.255 + ! + interface GigabitEthernet0/0/0/1 + mtu 8014 + ipv4 address 192.0.2.6 255.255.255.252 + ! + interface GigabitEthernet0/0/0/2 + mtu 8014 + ipv4 address 192.0.2.18 255.255.255.252 + ! + router isis VyOS + is-type level-2-only + net 49.0000.0000.0000.0003.00 + log adjacency changes + address-family ipv4 unicast + metric-style wide + segment-routing mpls + ! + interface Loopback0 + passive + address-family ipv4 unicast + prefix-sid index 3 + ! + ! + interface GigabitEthernet0/0/0/1 + point-to-point + address-family ipv4 unicast + ! + ! + interface GigabitEthernet0/0/0/2 + point-to-point + address-family ipv4 unicast + ! + ! + ! + +VyOS-P2: +======== +.. code-block:: none + + set interfaces dummy dum0 address '192.0.2.2/32' + set interfaces ethernet eth2 address '192.0.2.17/30' + set interfaces ethernet eth2 mtu '8000' + set interfaces ethernet eth3 address '192.0.2.26/30' + set interfaces ethernet eth3 mtu '8000' + set protocols isis interface dum0 passive + set protocols isis interface eth2 network point-to-point + set protocols isis interface eth3 network point-to-point + set protocols isis level 'level-2' + set protocols isis log-adjacency-changes + set protocols isis metric-style 'wide' + set protocols isis net '49.0000.0000.0000.0002.00' + set protocols isis segment-routing maximum-label-depth '8' + set protocols isis segment-routing prefix 192.0.2.2/32 index value '2' + set protocols mpls interface 'eth2' + set protocols mpls interface 'eth3' + set system host-name 'P2-VyOS' + +This gives us MPLS segment routing enabled and labels forwarding : + +.. code-block:: none + + vyos@P1-VyOS:~$ show mpls table + Inbound Label Type Nexthop Outbound Label + ----------------------------------------------------------------- + 15000 SR (IS-IS) 192.0.2.6 implicit-null + 15001 SR (IS-IS) 192.0.2.22 implicit-null + 15002 SR (IS-IS) fe80::5200:ff:fe04:3 implicit-null + 16002 SR (IS-IS) 192.0.2.6 16002 + 16003 SR (IS-IS) 192.0.2.6 implicit-null + 16011 SR (IS-IS) 192.0.2.22 implicit-null + + vyos@P2-VyOS:~$ show mpls table + Inbound Label Type Nexthop Outbound Label + ------------------------------------------------------- + 15000 SR (IS-IS) 192.0.2.18 implicit-null + 16001 SR (IS-IS) 192.0.2.18 16001 + 16003 SR (IS-IS) 192.0.2.18 implicit-null + 16011 SR (IS-IS) 192.0.2.18 16011 + + RP/0/0/CPU0:P3-VyOS#show mpls forwarding + Tue Mar 28 17:47:18.928 UTC + Local Outgoing Prefix Outgoing Next Hop Bytes + Label Label or ID Interface Switched + ------ ----------- ------------------ ------------ --------------- ------------ + 16001 Pop SR Pfx (idx 1) Gi0/0/0/1 192.0.2.5 0 + 16002 Pop SR Pfx (idx 2) Gi0/0/0/2 192.0.2.17 0 + 16011 16011 SR Pfx (idx 11) Gi0/0/0/1 192.0.2.5 0 + 24000 Pop SR Adj (idx 1) Gi0/0/0/1 192.0.2.5 0 + 24001 Pop SR Adj (idx 3) Gi0/0/0/1 192.0.2.5 0 + 24002 Pop SR Adj (idx 1) Gi0/0/0/2 192.0.2.17 0 + 24003 Pop SR Adj (idx 3) Gi0/0/0/2 192.0.2.17 0 + + +VyOS is able to check MSD per devices: + +.. code-block:: none + + vyos@P1-VyOS:~$ show isis segment-routing node + Area VyOS: + IS-IS L1 SR-Nodes: + + IS-IS L2 SR-Nodes: + + System ID SRGB SRLB Algorithm MSD + --------------------------------------------------------------- + 0000.0000.0001 16000 - 23999 15000 - 15999 SPF 8 + 0000.0000.0002 16000 - 23999 15000 - 15999 SPF 8 + 0000.0000.0003 16000 - 23999 0 - 4294967295 SPF 10 + 0000.0000.0011 16000 - 23999 15000 - 15999 SPF 8 + + vyos@P2-VyOS:~$ show isis segment-routing node + Area VyOS: + IS-IS L1 SR-Nodes: + + IS-IS L2 SR-Nodes: + + System ID SRGB SRLB Algorithm MSD + --------------------------------------------------------------- + 0000.0000.0001 16000 - 23999 15000 - 15999 SPF 8 + 0000.0000.0002 16000 - 23999 15000 - 15999 SPF 8 + 0000.0000.0003 16000 - 23999 0 - 4294967295 SPF 10 + 0000.0000.0011 16000 - 23999 15000 - 15999 SPF 8 + +Here is the routing tables showing the MPLS segment routing label operations: + +.. code-block:: none + + vyos@P1-VyOS:~$ show ip route isis + Codes: K - kernel route, C - connected, S - static, R - RIP, + O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, + T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, + f - OpenFabric, + > - selected route, * - FIB route, q - queued, r - rejected, b - backup + t - trapped, o - offload failure + + I>* 192.0.2.2/32 [115/30] via 192.0.2.6, eth1, label 16002, weight 1, 1d03h18m + I>* 192.0.2.3/32 [115/10] via 192.0.2.6, eth1, label implicit-null, weight 1, 1d03h18m + I 192.0.2.4/30 [115/20] via 192.0.2.6, eth1 inactive, weight 1, 1d03h18m + I>* 192.0.2.11/32 [115/20] via 192.0.2.22, eth3, label implicit-null, weight 1, 1d02h47m + I>* 192.0.2.16/30 [115/20] via 192.0.2.6, eth1, weight 1, 1d03h18m + I 192.0.2.20/30 [115/20] via 192.0.2.22, eth3 inactive, weight 1, 1d02h48m + I>* 192.0.2.24/30 [115/30] via 192.0.2.6, eth1, weight 1, 1d03h18m + + + vyos@P2-VyOS:~$ show ip route isis + Codes: K - kernel route, C - connected, S - static, R - RIP, + O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP, + T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, + f - OpenFabric, + > - selected route, * - FIB route, q - queued, r - rejected, b - backup + t - trapped, o - offload failure + + I>* 192.0.2.1/32 [115/30] via 192.0.2.18, eth2, label 16001, weight 1, 1d03h17m + I>* 192.0.2.3/32 [115/10] via 192.0.2.18, eth2, label implicit-null, weight 1, 1d03h17m + I>* 192.0.2.4/30 [115/20] via 192.0.2.18, eth2, weight 1, 1d03h17m + I>* 192.0.2.11/32 [115/40] via 192.0.2.18, eth2, label 16011, weight 1, 1d02h47m + I 192.0.2.16/30 [115/20] via 192.0.2.18, eth2 inactive, weight 1, 1d03h17m + I>* 192.0.2.20/30 [115/30] via 192.0.2.18, eth2, weight 1, 1d03h17m + + RP/0/0/CPU0:P3-VyOS#show route isis + Tue Mar 28 18:19:16.417 UTC + + i L2 192.0.2.1/32 [115/20] via 192.0.2.5, 1d03h, GigabitEthernet0/0/0/1 + i L2 192.0.2.2/32 [115/20] via 192.0.2.17, 1d03h, GigabitEthernet0/0/0/2 + i L2 192.0.2.11/32 [115/30] via 192.0.2.5, 1d02h, GigabitEthernet0/0/0/1 + i L2 192.0.2.20/30 [115/20] via 192.0.2.5, 1d03h, GigabitEthernet0/0/0/1 + i L2 192.0.2.24/30 [115/20] via 192.0.2.17, 1d03h, GigabitEthernet0/0/0/2 + +Ping between VyOS-P1 / VyOS-P2 to confirm reachability: + +.. code-block:: none + + vyos@P1-VyOS:~$ ping 192.0.2.2 source-address 192.0.2.1 + PING 192.0.2.2 (192.0.2.2) from 192.0.2.1 : 56(84) bytes of data. + 64 bytes from 192.0.2.2: icmp_seq=1 ttl=63 time=3.47 ms + 64 bytes from 192.0.2.2: icmp_seq=2 ttl=63 time=2.06 ms + 64 bytes from 192.0.2.2: icmp_seq=3 ttl=63 time=3.90 ms + 64 bytes from 192.0.2.2: icmp_seq=4 ttl=63 time=3.87 ms + ^C + --- 192.0.2.2 ping statistics --- + 4 packets transmitted, 4 received, 0% packet loss, time 3004ms + rtt min/avg/max/mdev = 2.064/3.326/3.903/0.748 ms + + vyos@P2-VyOS:~$ ping 192.0.2.1 source-address 192.0.2.2 + PING 192.0.2.1 (192.0.2.1) from 192.0.2.2 : 56(84) bytes of data. + 64 bytes from 192.0.2.1: icmp_seq=1 ttl=63 time=2.91 ms + 64 bytes from 192.0.2.1: icmp_seq=2 ttl=63 time=3.23 ms + 64 bytes from 192.0.2.1: icmp_seq=3 ttl=63 time=2.91 ms + 64 bytes from 192.0.2.1: icmp_seq=4 ttl=63 time=2.85 ms + ^C + --- 192.0.2.1 ping statistics --- + 4 packets transmitted, 4 received, 0% packet loss, time 3005ms + rtt min/avg/max/mdev = 2.846/2.972/3.231/0.151 ms \ No newline at end of file