From bb2cce2a92802e9d7e2e11074741b55063f0397a Mon Sep 17 00:00:00 2001 From: Korel Date: Wed, 8 May 2024 17:07:24 -0700 Subject: [PATCH 1/2] Doc: VRRP (Virtual Router Redundancy Protocol) Documentation This commit add documentaiton for how to use the keepalived utility to implement VRRP. A basic configuraiton example is also shown. Signed-off-by: Korel --- ...orVRRP_VirtualRouterRedundancyProtocol.png | Bin 0 -> 29157 bytes .../VRRP_VirtualRouterRedundancyProtocol.md | 364 ++++++++++++++++++ 2 files changed, 364 insertions(+) create mode 100644 Images/ImagesForNetworkConfiguration/ImageOneForVRRP_VirtualRouterRedundancyProtocol.png create mode 100644 NetworkConfigurations/NetworkDiscoveryAndManagementSubCategories/VRRP_VirtualRouterRedundancyProtocol.md diff --git a/Images/ImagesForNetworkConfiguration/ImageOneForVRRP_VirtualRouterRedundancyProtocol.png b/Images/ImagesForNetworkConfiguration/ImageOneForVRRP_VirtualRouterRedundancyProtocol.png new file mode 100644 index 0000000000000000000000000000000000000000..0202671c18c9395f8cfaf6fa3e79f055e143cc83 GIT binary patch literal 29157 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

F*ci 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 US|FeI9ZVM@FQXz|EM*+{AEnKn761SM literal 0 HcmV?d00001 diff --git a/NetworkConfigurations/NetworkDiscoveryAndManagementSubCategories/VRRP_VirtualRouterRedundancyProtocol.md b/NetworkConfigurations/NetworkDiscoveryAndManagementSubCategories/VRRP_VirtualRouterRedundancyProtocol.md new file mode 100644 index 0000000..96219dd --- /dev/null +++ b/NetworkConfigurations/NetworkDiscoveryAndManagementSubCategories/VRRP_VirtualRouterRedundancyProtocol.md @@ -0,0 +1,364 @@ +--- +title: VRRP (Virtual Router Redundancy Protocol) +grand_parent: Network Configuration +parent: Network Discovery and Management +nav_order: 3 +layout: default +--- + +# VRRP (Virtual Router Redundancy Protocol) + +## Introduction + +In this guide, we will quickly explain what the +Virtual Router Redundancy Protocol is +and give an example implementing it. + +The Virtual Router Redundancy Protocol or VRRP +is a network protocol that provides the automatic assignment of +routers to participating hosts in order to improve availability and +reliability. + +The reliability of routing paths is improved +through the use of an automatic default gateway +selections. + +A virtual router is assigned to act as the default gateway +of participating hosts. Initially, a physical router called the MASTER will +forward packets. If the MASTER fails at any +point, a BACKUP router is selected to replace it based on priority. + +This example implementation of VRRP will use the keepalived utility. + +## Enabling Virtual Router Redundancy Protocol + +If the `keepalived` utility is not already installed: + +_Do not forget to use `$ apt-get update` to +fetch the latest version of your package lists. +Follow this with the command `$ apt-get upgrade` to first +review the changes in the latest versions +and then replace the old packages by installing the new ones._ + +To install the `keepalived` utility, run the following: `$ apt-get install keepalived` + +### Keepalived Configuration + +keepalived has many configurable options that are all handled through a +keepalived.conf file in `/etc/keepalived/keepalived.conf`. +This file may not exist after installation. To use VRRP, create the +keepalived.conf file and add the desired configuration. + +Example Configuration in keepalived.conf file + +``` +vrrp_instance VI_1 { + state BACKUP + interface enp0s4 + virtual_router_id 150 + priority 100 + advert_int 1 + unicast_src_ip 192.168.1.11 + unicast_peer { + 192.168.1.12 + } + authentication { + auth_type PASS + auth_pass 1212 + } + virtual_ipaddress { + 192.168.1.13/24 + } +} +``` + +Detailed Descriptions: + +| Configure | Description | +| ----------------- | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| vrrp_instance | Instance of VRRP. It is an identifier and should be consistent across nodes | +| state | Options include MASTER and BACKUP for defining the device's desired state | +| interface | The network interface to run VRRP on | +| virtual_router_id | Can be anything but must match among VRRP instances | +| priority | Determines ordering of devices to be MASTER. Routers have a configurable priority between 1 and 254. The router with the highest priority becomes the master router. The default priority is 100. | +| advert_int | The interval of how often devices will advertise themselves to other nodes | +| unicast_src_ip | Multicast will be by default. Source IP should match current nodes IP | +| unicast_peer | Should include the IP address of all other nodes | +| authentication | Password is not necessary but is useful for authentication, and all matching nodes must have the same values. | +| virtual_ipaddress | The virtual IP address the host will use as the gateway. It should be unique and not already existsing. | + +For a list of more information, visit [Keepalived User Guide](https://keepalived.org/doc/) + +### Starting Keepalived + +To enable keepalived, run the following command after installation: + +``` +$ sudo systemctl start keepalived +``` + +To check the status of the service run: + +``` +$ sudo systemctl status keepalived +``` + +## Example Configuration + +Consider the following topology: + +![VRRP_Topology](../../Images/ImagesForNetworkConfiguration/ImageOneForVRRP_VirtualRouterRedundancyProtocol.png) + +In this example, PC1 is connected to an L2 device (DENT1), which is connected to two L3 devices +(DENT2 and DENT3). DENT2 will act as the MASTER, and PC1 will communicate with the internet through DENT2. +We will simulate DENT2 going down, and using keepalived PC1, we will re-establish a connection +to the internet through DENT3. + +### Configure Devices + +First, create a bridge on the DENT1 device to connect all interfaces. Use the following to do so... + +DENT1: + +``` +$ ip link add name br0 type bridge + +$ ip link set dev enp0s4 master br0 + +$ ip link set dev enp0s5 master br0 + +$ ip link set dev enp0s6 master br0 +``` + +After the bridge is created, bring all interfaces up with the following: + +``` +$ ip link set dev enp0s4 up + +$ ip link set dev enp0s5 up + +$ ip link set dev enp0s6 up + +$ ip link set dev br0 up +``` + +You may also attach an IP address to the L3 devices DENT1 and DENT2 with... + +DENT2: + +``` +$ ip address add 192.168.1.11 dev enp0s4 +``` + +DENT3: + +``` +$ ip address add 192.168.1.12 dev enp0s4 +``` + +Bring these interfaces up with the following: + +DENT2: + +``` +$ ip link set enp0s4 up + +$ ip link set ma1 up +``` + +DENT3: + +``` +$ ip link set enp0s4 up + +$ ip link set ma1 up +``` + +### Configure keepalived + +Next, ensure the keepalived utility is installed on DENT2 and DENT3. + +If the keepalived utility is not already installed, run the following on both devices: + +_Do not forget to use `$ apt-get update` to +fetch the latest version of your package lists. +Follow this with the command `$ apt-get upgrade` to first +review the changes in the latest versions +and then replace the old packages by installing the new ones._ + +To install the keepalived utility, run the following: `$ apt-get install keepalived` + +Once installed on DENT2 and DENT3, create a keepalived.conf file in `/etc/keepalived/keepalived.conf`. + +In this example, DENT2 will act as the MASTER, and the following configuration will +be used in the `keepalived.conf` file on DENT2. + +This example will assign a Virtual Router with IP address 192.168.1.13 to DENT2: + +``` +vrrp_instance VI_1 { + state MASTER + interface enp0s4 + virtual_router_id 150 + priority 101 + advert_int 1 + unicast_src_ip 192.168.1.11 + unicast_peer { + 192.168.1.12 + } + authentication { + auth_type PASS + auth_pass 1212 + } + virtual_ipaddress { + 192.168.1.13/24 + } +} +``` + +On the DENT3 device, edit the `keepalived.conf` file +and use the following example configuration to set this device as the BACKUP: + +``` +vrrp_instance VI_1 { + state BACKUP + interface enp0s4 + virtual_router_id 150 + priority 100 + advert_int 1 + unicast_src_ip 192.168.1.12 + unicast_peer { + 192.168.1.11 + } + authentication { + auth_type PASS + auth_pass 1212 + } + virtual_ipaddress { + 192.168.1.13/24 + } +} +``` + +Once configured, begin the keepalived services with: + +``` +$ sudo systemctl start keepalived +``` + +On PC1, specify the gateway address as the IP address for the Virtual Router. + +``` +PC1> ip 192.168.1.2 192.168.1.13 +``` + +### Enable Packet Forwarding + +Additionally, ensure packet forwarding is enabled on DENT2 +and DENT3 by running the following command on both devices: + +``` +$ sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' +``` + +### Enable Network Address Translation + +Lastly, ensure NAT is enabled on DENT2 and DENT3 by using the following command: + +``` +$ iptables -t nat -A POSTROUTING -o ma1 -j MASQUERADE +``` + +This command appends a rule to the POSTROUTING +chain of the nat table that enables masquerading. +Masquerading is a form of network address translation +(NAT) that allows multiple devices on a private network +to share a single public IP address for Internet access. +When a packet exits the network interface ma1, this rule +masks the source IP address with the IP address of ma1. + +### Keepalived + +Once completed, PC1 should be able to access the internet successfully. +If DENT2 goes down, DENT3 will take over. + +The following ping is routing through DENT2: + +``` +PC1> ping 8.8.8.8 + +84 bytes from 8.8.8.8 icmp_seq=1 ttl=55 time=26.211 ms +84 bytes from 8.8.8.8 icmp_seq=2 ttl=55 time=18.960 ms +84 bytes from 8.8.8.8 icmp_seq=3 ttl=55 time=21.917 ms +84 bytes from 8.8.8.8 icmp_seq=4 ttl=55 time=26.588 ms +84 bytes from 8.8.8.8 icmp_seq=5 ttl=55 time=22.331 ms +``` + +We can see DENT3 pick up the virtual IP by watching the IP addresses +of DENT3 on enp0s4 and bringing DENT2 down. + +To watch the IP addresses of DENT3, use the following command: + +``` +$ watch -n 1 'ip addr | grep 192' +``` + +To take the virtual router on DENT2 down, use the following: + +``` +$ sudo systemctl stop keepalived +``` + +The shift from BACKUP to MASTER can be seen on DENT3. + +BEFORE: + +``` +root@localhost://etc/keepalived# watch -n 1 'ip addr | grep 192' +Every 1.0s: ip addr | grep 192 localhost: Wed May 8 22:56:26 2024 + + inet 192.168.1.12/32 scope global enp0s4 +``` + +AFTER: + +``` +root@localhost://etc/keepalived# watch -n 1 'ip addr | grep 192' +Every 1.0s: ip addr | grep 192 localhost: Wed May 8 22:57:16 2024 + + inet 192.168.1.12/32 scope global enp0s4 + inet 192.168.1.13/24 scope global enp0s4 +``` + +While PC1 may lose connection once DENT2 goes down +it will be able to reach the internet again +through DENT3: + +**NOTE: It may take time for DENT3 to pick up the routing from DENT2. After some time, resend the ping to verify that the connection was re-established** + +``` +PC1> ping 8.8.8.8 -c 100 + +84 bytes from 8.8.8.8 icmp_seq=1 ttl=55 time=21.525 ms +84 bytes from 8.8.8.8 icmp_seq=2 ttl=55 time=25.538 ms +84 bytes from 8.8.8.8 icmp_seq=3 ttl=55 time=68.537 ms +8.8.8.8 icmp_seq=4 timeout +... +8.8.8.8 icmp_seq=47 timeout +8.8.8.8 icmp_seq=48 timeout +8.8.8.8 icmp_seq=49 timeout +^C + +PC1> ping 8.8.8.8 -c 100 + +84 bytes from 8.8.8.8 icmp_seq=1 ttl=55 time=21.525 ms +84 bytes from 8.8.8.8 icmp_seq=2 ttl=55 time=25.538 ms +84 bytes from 8.8.8.8 icmp_seq=3 ttl=55 time=68.537 ms +84 bytes from 8.8.8.8 icmp_seq=4 ttl=55 time=25.428 ms +``` + +**NOTE: The above was tested on a virtual machine** + +Congratulations! PC1 is now routing through DENT3. Once keepalived is re-enabled +on DENT2, it will again become the MASTER, and PC1 will route through DENT2. +Note again it may take some time before connection is re-established through this route. From 5186f5e2cf6a3811de1affd469fb8bb2aacff817 Mon Sep 17 00:00:00 2001 From: Korel Date: Tue, 21 May 2024 11:49:42 -0700 Subject: [PATCH 2/2] Explanation for Including NAT in VRRP Example The example that had been included was attempting to show how a device could access the internet and maintain connection using VRRP. NAT was used to translate requests from a private ip address to a public ip address. An explanation was provided to clarify why this was needed. An explanaiton was also included to specify NAT is not required if you are only working within a LAN. Signed-off-by: Korel --- .../VRRP_VirtualRouterRedundancyProtocol.md | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/NetworkConfigurations/NetworkDiscoveryAndManagementSubCategories/VRRP_VirtualRouterRedundancyProtocol.md b/NetworkConfigurations/NetworkDiscoveryAndManagementSubCategories/VRRP_VirtualRouterRedundancyProtocol.md index 96219dd..5732ebe 100644 --- a/NetworkConfigurations/NetworkDiscoveryAndManagementSubCategories/VRRP_VirtualRouterRedundancyProtocol.md +++ b/NetworkConfigurations/NetworkDiscoveryAndManagementSubCategories/VRRP_VirtualRouterRedundancyProtocol.md @@ -111,7 +111,7 @@ Consider the following topology: In this example, PC1 is connected to an L2 device (DENT1), which is connected to two L3 devices (DENT2 and DENT3). DENT2 will act as the MASTER, and PC1 will communicate with the internet through DENT2. -We will simulate DENT2 going down, and using keepalived PC1, we will re-establish a connection +We will simulate DENT2 going down, and using keepalived, PC1 we will re-establish a connection to the internet through DENT3. ### Configure Devices @@ -263,7 +263,22 @@ $ sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' ### Enable Network Address Translation -Lastly, ensure NAT is enabled on DENT2 and DENT3 by using the following command: +Since we are attempting to access the internet +we must be aware that +the private IP addresses +with 192.168.1.x are only valid in our Local Area Network (LAN). To ping and get result back +from the internet we must use a public IP address. +This is why Network Address Translation (NAT) +is used here. + +**Note, if you are only working within a LAN and not connecting +to the internet, NAT is not required because the devices can +communicate using their private IP addresses.** + +In this example ma1 acts as the external +gateway for our LAN to connect to the internet. + +To enable NAT on DENT2 and DENT3 use the following command: ``` $ iptables -t nat -A POSTROUTING -o ma1 -j MASQUERADE @@ -272,7 +287,7 @@ $ iptables -t nat -A POSTROUTING -o ma1 -j MASQUERADE This command appends a rule to the POSTROUTING chain of the nat table that enables masquerading. Masquerading is a form of network address translation -(NAT) that allows multiple devices on a private network +that allows multiple devices on a private network to share a single public IP address for Internet access. When a packet exits the network interface ma1, this rule masks the source IP address with the IP address of ma1.