<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Khalif AL Mahmud</title>
    <description>The latest articles on DEV Community by Khalif AL Mahmud (@almahmudkhalif).</description>
    <link>https://dev.to/almahmudkhalif</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2248836%2F3df06cb4-bca9-419a-a92f-40933dcd6ac6.png</url>
      <title>DEV Community: Khalif AL Mahmud</title>
      <link>https://dev.to/almahmudkhalif</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/almahmudkhalif"/>
    <language>en</language>
    <item>
      <title>Building a Personal Cybersecurity Lab: Kali Linux + Metasploitable2 on VirtualBox</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Thu, 18 Jun 2026 06:56:49 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/building-a-personal-cybersecurity-lab-kali-linux-metasploitable2-on-virtualbox-1gbe</link>
      <guid>https://dev.to/almahmudkhalif/building-a-personal-cybersecurity-lab-kali-linux-metasploitable2-on-virtualbox-1gbe</guid>
      <description>&lt;p&gt;I've been wanting a safe, isolated environment where I could actually practice security concepts instead of just reading about them. Reading about vulnerabilities and exploits only gets you so far — at some point you need a sandbox where you can break things, fix things, and see how attacks and defenses actually behave on a network.&lt;/p&gt;

&lt;p&gt;So I set out to build a small virtual lab on my own machine: a Kali Linux box as my "attacker" workstation, and Metasploitable2 as an intentionally vulnerable target to practice against. This post walks through exactly how I set it up, the mistakes I ran into, and how I verified everything was working before moving on to actual testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;Running security tools on a live network — or worse, on your host OS — is a bad idea for two reasons: it's risky (you could accidentally affect real systems), and it's messy (cleaning up after a misconfigured test is a pain). The fix is virtualization: spin up isolated VMs, connect them through a private virtual network, and keep everything contained on your own laptop or desktop.&lt;/p&gt;

&lt;p&gt;The goal here was simple: get Kali and Metasploitable2 running side by side, talking to each other on an isolated virtual network, without touching my host system or any real network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Install VirtualBox
&lt;/h3&gt;

&lt;p&gt;Grab VirtualBox from the official site: &lt;a href="https://www.virtualbox.org/wiki/Downloads" rel="noopener noreferrer"&gt;https://www.virtualbox.org/wiki/Downloads&lt;/a&gt;. Pick the build that matches your host OS and install it normally.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create and Install the Kali Linux VM
&lt;/h3&gt;

&lt;p&gt;Download the Kali installer image — "Installer Images → 64-bit → Everything" is the right choice (skip the Weekly and NetInstaller builds).&lt;/p&gt;

&lt;p&gt;When creating the VM in VirtualBox, I used these specs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Disk space&lt;/td&gt;
&lt;td&gt;60 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU cores&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS Type&lt;/td&gt;
&lt;td&gt;Linux → Debian 10.x (64-bit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boot firmware&lt;/td&gt;
&lt;td&gt;UEFI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A note on disk size: the default 20GB is too small once you start running heavier tools like Nessus or OpenVAS later on, so I gave it more room upfront.&lt;/p&gt;

&lt;p&gt;Boot the VM, choose "Graphical Install" from the menu, and walk through it like a normal Linux install. When it asks where to put the GRUB bootloader, point it at &lt;code&gt;/dev/sda&lt;/code&gt; (or &lt;code&gt;/dev/nvme0n1&lt;/code&gt; if that's what shows up). Let it reboot when it's done, then log in.&lt;/p&gt;

&lt;p&gt;Once you're in, update everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nt"&gt;-y&lt;/span&gt; upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check your version to confirm everything's current:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsb_release &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Install VirtualBox Guest Additions
&lt;/h3&gt;

&lt;p&gt;This step makes the VM way more pleasant to use — proper window resizing, better mouse integration, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; virtualbox-guest-x11
&lt;span class="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the reboot, also go into your VM's Settings → General → Advanced and set both &lt;strong&gt;Shared Clipboard&lt;/strong&gt; and &lt;strong&gt;Drag'n'Drop&lt;/strong&gt; to "Bidirectional" instead of the default "Disabled." Small thing, but it makes copy-pasting commands between host and VM much easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Set Up Metasploitable2 as the Target
&lt;/h3&gt;

&lt;p&gt;Metasploitable2 is distributed as a ready-made VMware disk (&lt;code&gt;.vmdk&lt;/code&gt;), not an ISO, so the install process looks a little different. Download it from Sourceforge and unzip it somewhere convenient.&lt;/p&gt;

&lt;p&gt;In VirtualBox, create a new VM with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type: &lt;strong&gt;Linux&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Version: &lt;strong&gt;Ubuntu (64-bit)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;RAM: &lt;strong&gt;512 MB&lt;/strong&gt; is plenty&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key difference from the Kali setup: when it asks about the virtual disk, don't create a new one — point it at the existing &lt;code&gt;.vmdk&lt;/code&gt; file you extracted. No install step needed; it boots straight up.&lt;/p&gt;

&lt;p&gt;Default credentials are &lt;code&gt;msfadmin&lt;/code&gt; / &lt;code&gt;msfadmin&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Important:&lt;/strong&gt; This VM is intentionally riddled with vulnerabilities. Never connect it to anything beyond your isolated lab network — NAT or host-only mode only.&lt;/p&gt;

&lt;p&gt;Once you've confirmed you can log in, shut it down and take a snapshot (something like "Clean Metasploitable2 state" works fine as a name). That way, no matter how badly you break it later, you can roll back instantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Configure the Virtual Network
&lt;/h3&gt;

&lt;p&gt;By default, VirtualBox's plain "NAT" mode doesn't let VMs talk to each other — you need "NAT Network" mode instead.&lt;/p&gt;

&lt;p&gt;Go to &lt;strong&gt;File → Preferences → Network&lt;/strong&gt;, click the "+" icon, and add a new NAT Network. The default name (&lt;code&gt;NatNetwork&lt;/code&gt;) and default subnet (&lt;code&gt;10.0.2.0/24&lt;/code&gt; with DHCP enabled) are fine as-is.&lt;/p&gt;

&lt;p&gt;Then, for &lt;strong&gt;each VM&lt;/strong&gt; (Kali and Metasploitable2), go to Settings → Network → Adapter 1, and change "Attached to" from "NAT" to &lt;strong&gt;NAT Network&lt;/strong&gt;, making sure the Name field points to your new network.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Verify
&lt;/h2&gt;

&lt;p&gt;Once both VMs were up, I checked a few things to confirm the lab was actually working:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kali boots to a usable desktop&lt;/strong&gt; — no install errors, guest additions working, window resizes properly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Metasploitable2 boots and accepts login&lt;/strong&gt; — confirms the &lt;code&gt;.vmdk&lt;/code&gt; was mounted correctly and the NAT Network adapter is active.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resource usage looks sane with both VMs running&lt;/strong&gt; — I kept an eye on RAM and CPU through the host's system monitor to make sure I wasn't overcommitting resources.&lt;br&gt;
(Memory usage sitting around 80% with two VMs plus the host running gave me a good sense of how much headroom I actually have for heavier tools later.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Basic ping test between the two VMs&lt;/strong&gt; to confirm they can actually see each other on the NAT Network — this is the real proof the network config worked, since both VMs booting independently doesn't guarantee they can talk to each other.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftx6cvniuix5r4hyn9tfs.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftx6cvniuix5r4hyn9tfs.jpeg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;A few things stood out while doing this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VirtualBox's "NAT" and "NAT Network" modes are easy to confuse but behave very differently.&lt;/strong&gt; Plain NAT isolates each VM from the others; NAT Network lets them share a private subnet and actually communicate — which is exactly what you need for any kind of attacker/target setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snapshots aren't optional when working with intentionally vulnerable systems.&lt;/strong&gt; The first time I messed up a config on Metasploitable2, having a clean snapshot to revert to saved me from a full reinstall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resource planning matters more than I expected.&lt;/strong&gt; Running two VMs plus a host OS at once means watching RAM and CPU closely — giving Kali too much disk/RAM upfront just steals resources you'll want when running heavier tools later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolation is the whole point.&lt;/strong&gt; Keeping a deliberately vulnerable machine off any real network isn't just good practice — it's the difference between a safe learning environment and an actual security incident.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Mistakes Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Why It Happens&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VMs can't ping each other&lt;/td&gt;
&lt;td&gt;Using default "NAT" mode instead of "NAT Network"&lt;/td&gt;
&lt;td&gt;Switch both VMs' Adapter 1 to "NAT Network"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metasploitable2 won't boot&lt;/td&gt;
&lt;td&gt;Trying to create a new virtual disk instead of using the existing &lt;code&gt;.vmdk&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Point the VM at the existing disk file during creation, don't create a new one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kali window won't resize&lt;/td&gt;
&lt;td&gt;Guest Additions not installed&lt;/td&gt;
&lt;td&gt;Install &lt;code&gt;virtualbox-guest-x11&lt;/code&gt; and reboot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clipboard/drag-drop doesn't work between host and VM&lt;/td&gt;
&lt;td&gt;Shared Clipboard / Drag'n'Drop left on "Disabled"&lt;/td&gt;
&lt;td&gt;Set both to "Bidirectional" in VM Settings → General → Advanced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running out of disk space mid-lab&lt;/td&gt;
&lt;td&gt;Allocated the default 20GB to Kali&lt;/td&gt;
&lt;td&gt;Allocate at least 60GB upfront if you plan to run scanners like Nessus/OpenVAS later&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This was a pretty satisfying first step into building out a proper home lab. Nothing here is advanced yet — it's just plumbing — but plumbing matters. Having an isolated, repeatable environment means I can now move on to actually practicing scanning, enumeration, and exploitation techniques without worrying about breaking anything real.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>linux</category>
      <category>virtualbox</category>
      <category>metasploitable2</category>
    </item>
    <item>
      <title>Python Cryptography Basics: Building ASCII &amp; Alphabet Tables from Scratch</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Sat, 13 Jun 2026 18:00:25 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/python-cryptography-basics-building-ascii-alphabet-tables-from-scratch-16p3</link>
      <guid>https://dev.to/almahmudkhalif/python-cryptography-basics-building-ascii-alphabet-tables-from-scratch-16p3</guid>
      <description>&lt;p&gt;When I first started digging into cryptography, I realized something quickly — before you can understand ciphers, encryption, or any real crypto concept, you need a solid grip on how computers actually represent characters. Numbers, binary, hex — it all starts there.&lt;/p&gt;

&lt;p&gt;So I wrote two small Python programs that build these tables from scratch. Sounds simple, but honestly it clicked a lot of things into place for me. Let me walk you through both.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Program 1&lt;/strong&gt; — A table of uppercase letters (A–Z) with their decimal values (0–25), plus an arithmetic operation that adds 3 to each value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Program 2&lt;/strong&gt; — A full ASCII table (characters 0–127) showing each character in Binary, Octal, Decimal, and Hexadecimal.&lt;/p&gt;




&lt;h2&gt;
  
  
  Program 1: Uppercase Alphabet Table with Arithmetic
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Map every uppercase letter A–Z to a number (A=0, B=1, ... Z=25), display the original table, then add 3 to every value and display an updated table.&lt;/p&gt;

&lt;p&gt;This is actually the foundation of the Caesar cipher — shifting letters by a fixed number. That "add 3" operation? That's exactly what Caesar did.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Original Table:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Letter&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;Decimal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;letters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="c1"&gt;# A-Z Loop
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;letter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# ASCII of A = 65
&lt;/span&gt;    &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
    &lt;span class="n"&gt;letters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;letter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;letter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;After Adding 3:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Letter&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;New Value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;new_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;letters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;new_value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step-by-Step Breakdown
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;chr(65 + i)&lt;/code&gt; — How we get letters from numbers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Python, &lt;code&gt;chr()&lt;/code&gt; converts an integer to its ASCII character. Since &lt;code&gt;A&lt;/code&gt; has ASCII value 65, &lt;code&gt;chr(65)&lt;/code&gt; gives &lt;code&gt;'A'&lt;/code&gt;, &lt;code&gt;chr(66)&lt;/code&gt; gives &lt;code&gt;'B'&lt;/code&gt;, and so on up to &lt;code&gt;chr(90)&lt;/code&gt; which is &lt;code&gt;'Z'&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Output: A
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Output: Z
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Storing letters and values in lists&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We build two parallel lists — &lt;code&gt;letters&lt;/code&gt; and &lt;code&gt;values&lt;/code&gt; — so we can loop over them separately for the updated table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Adding 3 to each value&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;new_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This shifts every letter's number by 3. In cryptography terms, this is a Caesar cipher with shift=3. &lt;code&gt;A (0)&lt;/code&gt; becomes &lt;code&gt;3&lt;/code&gt;, &lt;code&gt;B (1)&lt;/code&gt; becomes &lt;code&gt;4&lt;/code&gt;, and so on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Tab-separated output with &lt;code&gt;\t&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using &lt;code&gt;\t&lt;/code&gt; gives clean columnar output in the terminal without needing any external libraries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F75o0fvm8tynnkjl89gob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F75o0fvm8tynnkjl89gob.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Run
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python alphabet_table.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Expected Output (partial)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Original Table:
Letter  Decimal
A       0
B       1
C       2
...
Z       25

After Adding 3:
Letter  New Value
A       3
B       4
C       5
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Program 2: Full ASCII Table — Binary, Octal, Decimal, Hex
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Print all 128 standard ASCII characters with their representations in four number systems: Binary, Octal, Decimal, and Hexadecimal — all in a clean tabular format.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Char&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;Decimal&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;Binary&lt;/span&gt;&lt;span class="se"&gt;\t\t&lt;/span&gt;&lt;span class="s"&gt;Octal&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;Hex&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;   &lt;span class="c1"&gt;# standard ASCII
&lt;/span&gt;    &lt;span class="n"&gt;char&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;decimal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;binary&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;octal&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;oct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;hexa&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;decimal&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;binary&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;octal&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;hexa&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step-by-Step Breakdown
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;range(128)&lt;/code&gt; — Standard ASCII range&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ASCII defines 128 characters (0–127). The first 32 are control characters (non-printable), the rest are printable symbols, digits, and letters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;chr(i)&lt;/code&gt; — Integer to character&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Converts each number to its corresponding ASCII character.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. &lt;code&gt;ord(char)&lt;/code&gt; — Character back to integer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ord()&lt;/code&gt; is the reverse of &lt;code&gt;chr()&lt;/code&gt;. It takes a character and returns its ASCII decimal value. Useful to verify the round-trip conversion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 65
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;    &lt;span class="c1"&gt;# A
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. &lt;code&gt;bin()&lt;/code&gt;, &lt;code&gt;oct()&lt;/code&gt;, &lt;code&gt;hex()&lt;/code&gt; — Python's built-in converters&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Example output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bin(i)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Converts to binary string&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0b1000001&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;oct(i)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Converts to octal string&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0o101&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hex(i)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Converts to hexadecimal string&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x41&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Python automatically adds prefixes (&lt;code&gt;0b&lt;/code&gt;, &lt;code&gt;0o&lt;/code&gt;, &lt;code&gt;0x&lt;/code&gt;) so you always know which base you're looking at.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. f-string formatting with &lt;code&gt;\t&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;\t&lt;/code&gt; tabs keep all columns aligned in the terminal without needing &lt;code&gt;format()&lt;/code&gt; or any padding library.&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftuvewq7q9ioic615vyjp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftuvewq7q9ioic615vyjp.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Run
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python ascii_table.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Expected Output (partial)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Char    Decimal Binary          Octal   Hex
A       65      0b1000001       0o101   0x41
B       66      0b1000010       0o102   0x42
C       67      0b1000011       0o103   0x43
...
a       97      0b1100001       0o141   0x61
b       98      0b1100010       0o142   0x62
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How to Verify Your Output
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;For Program 1:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check that &lt;code&gt;A&lt;/code&gt; maps to &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;Z&lt;/code&gt; maps to &lt;code&gt;25&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;After adding 3: &lt;code&gt;A&lt;/code&gt; should show &lt;code&gt;3&lt;/code&gt;, &lt;code&gt;Z&lt;/code&gt; should show &lt;code&gt;28&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Total rows: exactly 26 in each table&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For Program 2:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;A&lt;/code&gt; → decimal &lt;code&gt;65&lt;/code&gt;, binary &lt;code&gt;0b1000001&lt;/code&gt;, octal &lt;code&gt;0o101&lt;/code&gt;, hex &lt;code&gt;0x41&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;a&lt;/code&gt; → decimal &lt;code&gt;97&lt;/code&gt; (lowercase is always 32 more than uppercase)&lt;/li&gt;
&lt;li&gt;Total rows: 128 (0–127)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quick sanity check in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Verify a few values manually
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 0b1000001
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;oct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 0o101
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 0x41
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# 65
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Going through this exercise, a few things clicked that I hadn't fully internalized before:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Every character is just a number.&lt;/strong&gt; The letter &lt;code&gt;A&lt;/code&gt; and the number &lt;code&gt;65&lt;/code&gt; are the same thing from the machine's perspective. Encryption at its core is just math on these numbers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Caesar cipher is literally just addition.&lt;/strong&gt; Adding 3 to each letter's value and the cipher is done. Subtracting 3 decrypts it. That's it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Number bases aren't scary.&lt;/strong&gt; Binary, octal, hex — they're just different ways to write the same value. Python's &lt;code&gt;bin()&lt;/code&gt;, &lt;code&gt;oct()&lt;/code&gt;, and &lt;code&gt;hex()&lt;/code&gt; make conversion trivial, but understanding &lt;em&gt;why&lt;/em&gt; they exist (hardware efficiency, readability) matters more than memorizing conversions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;chr()&lt;/code&gt; and &lt;code&gt;ord()&lt;/code&gt; are the gateway to text-based cryptography.&lt;/strong&gt; Every classical cipher — Caesar, Vigenere, ROT13 — uses this same idea of converting text to numbers, operating on them, and converting back.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Why it happens&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;chr(i)&lt;/code&gt; starting from 0 gives weird symbols&lt;/td&gt;
&lt;td&gt;ASCII 0–31 are control characters&lt;/td&gt;
&lt;td&gt;Start from &lt;code&gt;range(32, 128)&lt;/code&gt; if you only want printable chars&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting &lt;code&gt;chr(65 + i)&lt;/code&gt; and using &lt;code&gt;chr(i)&lt;/code&gt; directly&lt;/td&gt;
&lt;td&gt;Off-by-one thinking&lt;/td&gt;
&lt;td&gt;A = 65 in ASCII, not 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Values after adding 3 going past Z (25→28)&lt;/td&gt;
&lt;td&gt;Letters only go 0–25&lt;/td&gt;
&lt;td&gt;Use modulo: &lt;code&gt;(value + 3) % 26&lt;/code&gt; for wrapping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Binary output looking messy in columns&lt;/td&gt;
&lt;td&gt;Binary strings have variable length&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;format(i, '08b')&lt;/code&gt; for fixed 8-bit width&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ord()&lt;/code&gt; and &lt;code&gt;chr()&lt;/code&gt; confused&lt;/td&gt;
&lt;td&gt;Their names aren't obvious&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ord&lt;/code&gt; = ordinal (number), &lt;code&gt;chr&lt;/code&gt; = character&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;These two programs are small, but they sit right at the foundation of everything in cryptography. Before you can implement any cipher — even the simplest one — you need to understand how characters map to numbers and how those numbers can be represented in different bases.&lt;/p&gt;

&lt;p&gt;If you're starting your cryptography journey, I'd recommend running both of these, playing with the shift value in Program 1 (try 13 for ROT13), and spending a few minutes reading the ASCII table output carefully. It makes a lot of later concepts much easier to grasp.&lt;/p&gt;

</description>
      <category>python</category>
      <category>cryptography</category>
    </item>
    <item>
      <title>Lab Task 14 - How I Built a Real-Time Admin Login Attack Detector Using Snort3 and Apache on Ubuntu</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Sat, 13 Jun 2026 12:48:36 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/lab-task-14-how-i-built-a-real-time-admin-login-attack-detector-using-snort3-and-apache-on-ubuntu-45l9</link>
      <guid>https://dev.to/almahmudkhalif/lab-task-14-how-i-built-a-real-time-admin-login-attack-detector-using-snort3-and-apache-on-ubuntu-45l9</guid>
      <description>&lt;p&gt;Brute-force login attacks on web admin panels happen constantly in the wild. What if you could catch them in real time — watching the exact moment someone hammers your login page? That's exactly what I set up here.&lt;/p&gt;

&lt;p&gt;In this walkthrough, I'll show you how to deploy a password-protected Apache web server on Ubuntu, simulate failed login attempts from a Kali Linux machine, and write custom Snort3 rules that fire alerts the moment those attempts hit your network. You'll see both the fast log and full log format outputs — side by side.&lt;/p&gt;

&lt;p&gt;This is a hands-on, practical setup. Every command here was actually run and verified.&lt;/p&gt;




&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;Default web servers expose their admin pages with zero intrusion visibility. An attacker can keep hammering &lt;code&gt;/admin&lt;/code&gt; with wrong credentials for hours, and without a detection layer, you'd never know. The goal here is to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up a realistic web server with a password-protected &lt;code&gt;/admin&lt;/code&gt; endpoint&lt;/li&gt;
&lt;li&gt;Simulate unauthorized access from a separate attacker machine&lt;/li&gt;
&lt;li&gt;Write Snort3 detection rules that catch those attempts in real time&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Lab Environment
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Machine&lt;/th&gt;
&lt;th&gt;OS&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu (Server)&lt;/td&gt;
&lt;td&gt;Ubuntu 24.x&lt;/td&gt;
&lt;td&gt;Web server + Snort3 IDS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kali Linux (Attacker)&lt;/td&gt;
&lt;td&gt;Kali 2025/2026&lt;/td&gt;
&lt;td&gt;Attack simulation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;Host-only / NAT&lt;/td&gt;
&lt;td&gt;VirtualBox&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1 — Install and Verify Apache2
&lt;/h2&gt;

&lt;p&gt;On the Ubuntu machine, start by installing the Apache web server and the utilities package needed for password protection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;apache2 &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;apache2-utils &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify Apache is running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see &lt;code&gt;Active: active (running)&lt;/code&gt; in the output.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F535k2lw1axrnnb0lu256.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F535k2lw1axrnnb0lu256.png" alt=" " width="800" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4m18uhe0pumc7u92y9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4m18uhe0pumc7u92y9k.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Create the Admin Web Page
&lt;/h2&gt;

&lt;p&gt;Apache serves files from &lt;code&gt;/var/www/html/&lt;/code&gt;. Create a new directory for the admin area and set up a basic HTML page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; /var/www/html/admin
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /var/www/html/admin/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste this minimal HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    Welcome to Admin Page
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save and exit. Then remove the default Apache index page to keep things clean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo rm&lt;/span&gt; /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0dbktqoaolz9y62t1zfm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0dbktqoaolz9y62t1zfm.png" alt=" " width="800" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxyk4r1zo1q6d5lvn1evv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxyk4r1zo1q6d5lvn1evv.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosjxsa5t4ao0kcrw0ojn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosjxsa5t4ao0kcrw0ojn.png" alt=" " width="800" height="133"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Password-Protect the Admin Directory
&lt;/h2&gt;

&lt;p&gt;Create an admin user with a password. The &lt;code&gt;-c&lt;/code&gt; flag creates a new password file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;htpasswd &lt;span class="nt"&gt;-c&lt;/span&gt; /etc/apache2/.htpasswd adminuser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll be prompted to enter and confirm a password (e.g., &lt;code&gt;1234&lt;/code&gt;). Then set the correct permissions on the admin folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /var/www/html/admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe7ffvqvpw9n1xdhe83q5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe7ffvqvpw9n1xdhe83q5.png" alt=" " width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Configure Apache to Protect the Admin Route
&lt;/h2&gt;

&lt;p&gt;Edit the default Apache virtual host config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/apache2/sites-available/000-default.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following block inside the &lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;/code&gt; section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Directory "/var/www/html/admin"&amp;gt;
    AuthType Basic
    AuthName "Restricted Admin Area"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
&amp;lt;/Directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fglelnv4pfcrlm1y4x940.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fglelnv4pfcrlm1y4x940.png" alt=" " width="800" height="751"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enable the headers module and restart Apache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;a2enmod headers
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart apache2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frc87h74ctaqdi2zf62cq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frc87h74ctaqdi2zf62cq.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Confirm the Admin Page is Live
&lt;/h2&gt;

&lt;p&gt;Check Ubuntu's IP address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note the IP (e.g., &lt;code&gt;192.168.1.104&lt;/code&gt;). Then from the Kali machine, open a browser and navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://&amp;lt;UBUNTU_IP&amp;gt;/admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a browser login prompt asking for username and password.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynr0i0g7ba8oxdua2wj8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynr0i0g7ba8oxdua2wj8.png" alt=" " width="799" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftzbibiqs2mn3gorlzng3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftzbibiqs2mn3gorlzng3.png" alt=" " width="800" height="223"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6 — Write the Custom Snort3 Detection Rule
&lt;/h2&gt;

&lt;p&gt;Back on Ubuntu, open the local Snort rules file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /usr/local/etc/rules/local-rules/local.rules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add this rule to detect HTTP traffic to port 80 that contains an &lt;code&gt;Authorization&lt;/code&gt; header — which is what HTTP Basic Auth sends on every login attempt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alert tcp any any -&amp;gt; any 80 (
    msg:"Unauthorized Access to admin page";
    content:"Authorization";
    sid:1000011;
    rev:2;
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this rule does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;alert tcp any any -&amp;gt; any 80&lt;/code&gt; — watches all TCP traffic heading to port 80&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;content:"Authorization"&lt;/code&gt; — matches the HTTP header browsers send during Basic Auth login attempts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;msg&lt;/code&gt; — the label you'll see in the alert log&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sid&lt;/code&gt; — unique Snort rule ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feojmxcdl0m0cbnp5605h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feojmxcdl0m0cbnp5605h.png" alt=" " width="800" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbb9quy7czlhd8v6irqlo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbb9quy7czlhd8v6irqlo.png" alt=" " width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7 — Validate the Snort3 Configuration
&lt;/h2&gt;

&lt;p&gt;Before running Snort live, always test the config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;snort &lt;span class="nt"&gt;-c&lt;/span&gt; /usr/local/etc/snort/snort.lua &lt;span class="nt"&gt;-T&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for this at the end of the output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Snort successfully validated the configuration (with 0 warnings).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdzlla6gkfgzviudcjv3v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdzlla6gkfgzviudcjv3v.png" alt=" " width="799" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fibtc73j2246j5i8ur2w8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fibtc73j2246j5i8ur2w8.png" alt=" " width="800" height="260"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8 — Start Snort3 in Alert Fast Mode
&lt;/h2&gt;

&lt;p&gt;Run Snort on the active network interface (check yours with &lt;code&gt;ip a&lt;/code&gt; — commonly &lt;code&gt;enp0s3&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;snort &lt;span class="nt"&gt;-A&lt;/span&gt; alert_fast &lt;span class="nt"&gt;-i&lt;/span&gt; enp0s3 &lt;span class="nt"&gt;-c&lt;/span&gt; /usr/local/etc/snort/snort.lua
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Leave this running in one terminal window.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0y18p78kvfxs8i9x0sx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff0y18p78kvfxs8i9x0sx.png" alt=" " width="800" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8pc13n1r46veuv8md0u6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8pc13n1r46veuv8md0u6.png" alt=" " width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9 — Simulate the Attack (More Than 3 Failed Logins)
&lt;/h2&gt;

&lt;p&gt;On the Kali machine, open the browser and go to &lt;code&gt;http://&amp;lt;UBUNTU_IP&amp;gt;/admin&lt;/code&gt;. Click &lt;strong&gt;Sign in&lt;/strong&gt; with wrong credentials at least 4–5 times (all attempts should fail).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lpzuo66oa09c80shblv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lpzuo66oa09c80shblv.png" alt=" " width="799" height="422"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 10 — Generate Alerts in Full Log Format
&lt;/h2&gt;

&lt;p&gt;Stop the previous Snort instance (&lt;code&gt;Ctrl+C&lt;/code&gt;) and restart with the full log format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;snort &lt;span class="nt"&gt;-A&lt;/span&gt; full &lt;span class="nt"&gt;-i&lt;/span&gt; enp0s3 &lt;span class="nt"&gt;-c&lt;/span&gt; /usr/local/etc/snort/snort.lua
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repeat the failed login attempts from Kali. The full format gives you detailed packet-level information including TCP flags, sequence numbers, TTL, and more — useful for deeper analysis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fombdnu1e8t0g2czi4m8t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fombdnu1e8t0g2czi4m8t.png" alt=" " width="799" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzjmig1z0zjya6cr7pwfl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzjmig1z0zjya6cr7pwfl.png" alt=" " width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Verify Everything is Working
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apache is up:&lt;/strong&gt; &lt;code&gt;sudo systemctl status apache2&lt;/code&gt; shows &lt;code&gt;active (running)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Admin page is protected:&lt;/strong&gt; Visiting &lt;code&gt;http://&amp;lt;UBUNTU_IP&amp;gt;/admin&lt;/code&gt; shows a login popup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snort is detecting:&lt;/strong&gt; After login attempts, alerts appear in the terminal with the message &lt;code&gt;"Unauthorized Access to admin page"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snort config is valid:&lt;/strong&gt; &lt;code&gt;snort -c /usr/local/etc/snort/snort.lua -T&lt;/code&gt; returns 0 warnings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full log works:&lt;/strong&gt; Switching to &lt;code&gt;-A full&lt;/code&gt; shows packet-level detail per alert&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Working through this setup gave me a much clearer picture of how network-level detection actually works in practice. A few things stood out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP Basic Auth is surprisingly transparent to Snort.&lt;/strong&gt; Every login attempt sends an &lt;code&gt;Authorization&lt;/code&gt; header in cleartext (over HTTP), which makes it trivially detectable with a content-match rule. This reinforces why HTTPS is non-negotiable for anything sensitive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Snort rules are very literal.&lt;/strong&gt; The rule fires on &lt;em&gt;every&lt;/em&gt; connection that contains the &lt;code&gt;Authorization&lt;/code&gt; header — not just failed ones. To detect only failures, you'd need to correlate the server's &lt;code&gt;401&lt;/code&gt; response, which requires stateful detection or threshold rules. This is a good next step to explore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fast vs. Full log formats serve different purposes.&lt;/strong&gt; The fast format is great for real-time monitoring — clean, one-line-per-alert. The full format is better for post-incident forensics where you need packet details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration validation saves time.&lt;/strong&gt; Running &lt;code&gt;snort -T&lt;/code&gt; before going live catches rule syntax errors before they silently fail in production.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Not running &lt;code&gt;sudo a2enmod headers&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Apache fails to restart after config edit&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;sudo a2enmod headers&lt;/code&gt; then restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong network interface in &lt;code&gt;-i&lt;/code&gt; flag&lt;/td&gt;
&lt;td&gt;Snort captures nothing&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;ip a&lt;/code&gt; to confirm interface name (e.g., &lt;code&gt;enp0s3&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule content keyword mismatch&lt;/td&gt;
&lt;td&gt;No alerts fire&lt;/td&gt;
&lt;td&gt;Check the exact string sent in HTTP headers using Wireshark&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Using &lt;code&gt;sid&lt;/code&gt; that already exists&lt;/td&gt;
&lt;td&gt;Snort config validation fails&lt;/td&gt;
&lt;td&gt;Use a unique SID (10000000+ range is safe for custom rules)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting to clear browser cache&lt;/td&gt;
&lt;td&gt;Old auth cookies auto-login without triggering alerts&lt;/td&gt;
&lt;td&gt;Clear cache or use incognito/private mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Not testing with &lt;code&gt;snort -T&lt;/code&gt; first&lt;/td&gt;
&lt;td&gt;Errors only appear after launching live capture&lt;/td&gt;
&lt;td&gt;Always validate config before live run&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This setup takes under 30 minutes and gives you a fully functional intrusion detection demo for web admin brute-force attempts. The combination of Apache's Basic Auth, a targeted Snort3 content rule, and live packet capture on the interface creates a pipeline you can actually watch in action.&lt;/p&gt;

&lt;p&gt;From here, there's a lot to build on — threshold rules to alert only after N attempts, suppression rules to reduce noise, or integrating with a SIEM to store and query alerts. But this foundation shows exactly how the detection layer works at the network level.&lt;/p&gt;

&lt;p&gt;If you set this up or tweak the rules, let me know how it went in the comments.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>snort</category>
      <category>linux</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Lab Task 13 - How I Built a Network Intrusion Detection System with Snort 3 on Ubuntu — and Caught Every Scan</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Sat, 13 Jun 2026 12:23:41 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/lab-task-13-how-i-built-a-network-intrusion-detection-system-with-snort-3-on-ubuntu-and-caught-3mep</link>
      <guid>https://dev.to/almahmudkhalif/lab-task-13-how-i-built-a-network-intrusion-detection-system-with-snort-3-on-ubuntu-and-caught-3mep</guid>
      <description>&lt;p&gt;Network security monitoring always looked intimidating to me — until I actually sat down, set up Snort 3 from scratch on Ubuntu, wrote my own detection rules, and watched it flag every single nmap scan in real time. This post walks through everything: installation, configuration, custom rules, and simulating real attacks to prove it works.&lt;/p&gt;

&lt;p&gt;If you have ever wondered how intrusion detection systems actually work under the hood, this is a solid hands-on way to find out.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We Are Building
&lt;/h2&gt;

&lt;p&gt;A working &lt;strong&gt;Snort 3 IDS&lt;/strong&gt; running on Ubuntu inside a virtual machine, monitored by a Kali Linux attacker VM. Snort will sit on the network interface, watch all traffic, and alert when it detects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ICMP Ping Sweep&lt;/li&gt;
&lt;li&gt;XMAS Scan&lt;/li&gt;
&lt;li&gt;FIN Scan&lt;/li&gt;
&lt;li&gt;NULL Scan&lt;/li&gt;
&lt;li&gt;SYN Scan&lt;/li&gt;
&lt;li&gt;TCP Connect Scan&lt;/li&gt;
&lt;li&gt;UDP Scan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both VMs are connected via Bridged Adapter in VirtualBox, so they share the same subnet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Environment Setup
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Machine&lt;/th&gt;
&lt;th&gt;OS&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;IP (example)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Defender&lt;/td&gt;
&lt;td&gt;Ubuntu 22.04&lt;/td&gt;
&lt;td&gt;Snort 3 IDS&lt;/td&gt;
&lt;td&gt;192.168.1.104&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attacker&lt;/td&gt;
&lt;td&gt;Kali Linux 2026.1&lt;/td&gt;
&lt;td&gt;nmap scan source&lt;/td&gt;
&lt;td&gt;192.168.1.106&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both adapters set to &lt;strong&gt;Bridged Adapter&lt;/strong&gt; in VirtualBox settings so they can reach each other.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Update Ubuntu and Install Dependencies
&lt;/h2&gt;

&lt;p&gt;Open a terminal on the Ubuntu VM and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install all required build tools and libraries in one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; build-essential &lt;span class="se"&gt;\&lt;/span&gt;
  libpcap-dev &lt;span class="se"&gt;\&lt;/span&gt;
  libpcre2-dev &lt;span class="se"&gt;\&lt;/span&gt;
  libnet1-dev &lt;span class="se"&gt;\&lt;/span&gt;
  zlib1g-dev &lt;span class="se"&gt;\&lt;/span&gt;
  luajit &lt;span class="se"&gt;\&lt;/span&gt;
  hwloc &lt;span class="se"&gt;\&lt;/span&gt;
  libdumbnet-dev &lt;span class="se"&gt;\&lt;/span&gt;
  bison &lt;span class="se"&gt;\&lt;/span&gt;
  flex &lt;span class="se"&gt;\&lt;/span&gt;
  liblzma-dev &lt;span class="se"&gt;\&lt;/span&gt;
  openssl &lt;span class="se"&gt;\&lt;/span&gt;
  libssl-dev &lt;span class="se"&gt;\&lt;/span&gt;
  pkg-config &lt;span class="se"&gt;\&lt;/span&gt;
  libhwloc-dev &lt;span class="se"&gt;\&lt;/span&gt;
  cmake &lt;span class="se"&gt;\&lt;/span&gt;
  cpputest &lt;span class="se"&gt;\&lt;/span&gt;
  libsqlite3-dev &lt;span class="se"&gt;\&lt;/span&gt;
  uuid-dev &lt;span class="se"&gt;\&lt;/span&gt;
  libcmocka-dev &lt;span class="se"&gt;\&lt;/span&gt;
  libnetfilter-queue-dev &lt;span class="se"&gt;\&lt;/span&gt;
  libmnl-dev &lt;span class="se"&gt;\&lt;/span&gt;
  autotools-dev &lt;span class="se"&gt;\&lt;/span&gt;
  libluajit-5.1-dev &lt;span class="se"&gt;\&lt;/span&gt;
  libunwind-dev &lt;span class="se"&gt;\&lt;/span&gt;
  git &lt;span class="se"&gt;\&lt;/span&gt;
  wget &lt;span class="se"&gt;\&lt;/span&gt;
  ethtool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp84es0aeaefdsbpre23y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp84es0aeaefdsbpre23y.png" alt=" " width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Create a Working Directory
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;snort-source-files
&lt;span class="nb"&gt;cd &lt;/span&gt;snort-source-files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3 — Install LibDAQ (Snort's Data Acquisition Library)
&lt;/h2&gt;

&lt;p&gt;LibDAQ is what allows Snort to capture packets from the network interface.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/snort3/libdaq.git
&lt;span class="nb"&gt;cd &lt;/span&gt;libdaq
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./bootstrap
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./configure
&lt;span class="nb"&gt;sudo &lt;/span&gt;make
&lt;span class="nb"&gt;sudo &lt;/span&gt;make &lt;span class="nb"&gt;install
cd&lt;/span&gt; ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh69abnxvvus4ykr64ryl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh69abnxvvus4ykr64ryl.png" alt=" " width="800" height="651"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F52i39vd1dy58hyvrehv1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F52i39vd1dy58hyvrehv1.png" alt=" " width="800" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpjkug8y9s095kbvjktt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpjkug8y9s095kbvjktt.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ipqrxvw78giudbuinty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ipqrxvw78giudbuinty.png" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5u9af4hfcv0zfmnxt80s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5u9af4hfcv0zfmnxt80s.png" alt=" " width="800" height="567"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4 — Install Tcmalloc (Memory Optimization)
&lt;/h2&gt;

&lt;p&gt;Tcmalloc is a memory allocator from Google that reduces fragmentation and speeds up Snort under load.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.10/gperftools-2.10.tar.gz
&lt;span class="nb"&gt;tar &lt;/span&gt;xzf gperftools-2.10.tar.gz
&lt;span class="nb"&gt;cd &lt;/span&gt;gperftools-2.10
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./configure
&lt;span class="nb"&gt;sudo &lt;/span&gt;make
&lt;span class="nb"&gt;sudo &lt;/span&gt;make &lt;span class="nb"&gt;install
cd&lt;/span&gt; ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjq2cjmp3w788jkpgix4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjq2cjmp3w788jkpgix4.png" alt=" " width="800" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tf0dtvak7e452tjn5p2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tf0dtvak7e452tjn5p2.png" alt=" " width="799" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forfjqqx2icbhlz6go11f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forfjqqx2icbhlz6go11f.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F15qw2c9kuj3xgzerai8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F15qw2c9kuj3xgzerai8e.png" alt=" " width="799" height="339"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Install Snort 3
&lt;/h2&gt;

&lt;p&gt;Now the main event — clone and build Snort 3 from source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/snort3/snort3.git
&lt;span class="nb"&gt;cd &lt;/span&gt;snort3
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./configure_cmake.sh &lt;span class="nt"&gt;--prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local &lt;span class="nt"&gt;--enable-tcmalloc&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;build
&lt;span class="nb"&gt;sudo &lt;/span&gt;make
&lt;span class="nb"&gt;sudo &lt;/span&gt;make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;sudo make&lt;/code&gt; step takes several minutes — this is normal. You will see progress climb from 0% to 100%.&lt;/p&gt;

&lt;p&gt;After install, create a symlink and verify the version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ldconfig
&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /usr/local/bin/snort /usr/sbin/snort
snort &lt;span class="nt"&gt;-V&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-*&amp;gt; Snort++ &amp;lt;*-
   Version 3.12.2.0
   By Martin Roesch &amp;amp; The Snort Team
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftvq16ohu2phegjg7wap8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftvq16ohu2phegjg7wap8.png" alt=" " width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ztv45084rpwcu99w7j4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ztv45084rpwcu99w7j4.png" alt=" " width="800" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fys2pbv770waseozvu62g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fys2pbv770waseozvu62g.png" alt=" " width="799" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgl8qi7zx0i8uun0ctu3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgl8qi7zx0i8uun0ctu3.png" alt=" " width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59sryuyxngqfvwa55nfq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59sryuyxngqfvwa55nfq.png" alt=" " width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6 — Configure the Network Interface
&lt;/h2&gt;

&lt;p&gt;Find your interface name (mine was &lt;code&gt;enp0s3&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set it to promiscuous mode so Snort can capture all traffic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ip &lt;span class="nb"&gt;link set &lt;/span&gt;dev enp0s3 promisc on
&lt;span class="nb"&gt;sudo &lt;/span&gt;ethtool &lt;span class="nt"&gt;-K&lt;/span&gt; enp0s3 gro off lro off
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a systemd service to persist this across reboots:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/systemd/system/snort3-nic.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste this content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Set Snort3 NIC in promiscuous mode&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;oneshot&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/sbin/ip link set dev enp0s3 promisc on&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/sbin/ethtool -K enp0s3 gro off lro off&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable and start it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; snort3-nic.service
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status snort3-nic.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjyu3m5t9wpyympvgaogi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjyu3m5t9wpyympvgaogi.png" alt=" " width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9jv1c0qbwof5exgnzfh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9jv1c0qbwof5exgnzfh.png" alt=" " width="800" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovvnp1xld352nulm8paa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovvnp1xld352nulm8paa.png" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkd76deyrfdp2wgnmw1jm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkd76deyrfdp2wgnmw1jm.png" alt=" " width="799" height="326"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7 — Create the Rules Directory and Configure snort.lua
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /usr/local/etc/rules/local-rules
&lt;span class="nb"&gt;cd&lt;/span&gt; /usr/local/etc/snort
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano snort.lua
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make the following changes in &lt;code&gt;snort.lua&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Set your network&lt;/span&gt;
&lt;span class="n"&gt;HOME_NET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'192.168.0.0/24'&lt;/span&gt;
&lt;span class="n"&gt;EXTERNAL_NET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'!$HOME_NET'&lt;/span&gt;

&lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s1"&gt;'snort_defaults.lua'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scroll to the detection section and add the IPS block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;ips&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/usr/local/etc/rules/local-rules/local.rules'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="n"&gt;variables&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;nets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;HOME_NET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HOME_NET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;EXTERNAL_NET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;EXTERNAL_NET&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save and exit with &lt;code&gt;Ctrl+X → Y → Enter&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwgw5xt8pyqoipzj2svh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwgw5xt8pyqoipzj2svh.png" alt=" " width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8e8zpb72348kusnnrkw5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8e8zpb72348kusnnrkw5.png" alt=" " width="799" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhciank53801dg1wj7j6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhciank53801dg1wj7j6.png" alt=" " width="659" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4e8qxeazvfoui2xsz41z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4e8qxeazvfoui2xsz41z.png" alt=" " width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7txj1wilob0op373p2hu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7txj1wilob0op373p2hu.png" alt=" " width="656" height="70"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnsncj6lmeg3ufn5sece.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnsncj6lmeg3ufn5sece.png" alt=" " width="643" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft8lxbs2wmz9nrceuney7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft8lxbs2wmz9nrceuney7.png" alt=" " width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8 — Write the Detection Rules
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /usr/local/etc/rules/local-rules/local.rules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add these seven rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alert icmp any any -&amp;gt; $HOME_NET any (msg:"NMAP Ping Sweep Scan"; dsize:0; sid:1000001; rev:1;)

alert tcp any any -&amp;gt; $HOME_NET 22 (msg:"NMAP XMAS Scan"; flags:FPU; sid:1000002; rev:1;)

alert tcp any any -&amp;gt; $HOME_NET 22 (msg:"NMAP FIN Scan"; flags:F; sid:1000003; rev:1;)

alert tcp any any -&amp;gt; $HOME_NET 22 (msg:"NMAP NULL Scan"; flags:0; sid:1000004; rev:1;)

alert tcp any any -&amp;gt; $HOME_NET 22 (msg:"NMAP SYN Scan"; flags:S; sid:1000005; rev:1;)

alert tcp any any -&amp;gt; $HOME_NET 22 (msg:"NMAP TCP Connect Scan"; sid:1000006; rev:1;)

alert udp any any -&amp;gt; $HOME_NET any (msg:"NMAP UDP Scan"; sid:1000007; rev:1;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faggso5pkoi4wroefoifd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faggso5pkoi4wroefoifd.png" alt=" " width="796" height="47"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gcwxjocbzc1c948mhpb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1gcwxjocbzc1c948mhpb.png" alt=" " width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9 — Validate the Configuration
&lt;/h2&gt;

&lt;p&gt;Before running Snort live, test that the config file loads without errors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;snort &lt;span class="nt"&gt;-c&lt;/span&gt; /usr/local/etc/snort/snort.lua &lt;span class="nt"&gt;-T&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see at the end:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Snort successfully validated the configuration (with 0 warnings).
o")~   Snort exiting
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfegvrjocuaza8j7b7q8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfegvrjocuaza8j7b7q8.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9os2ytaixxx0grhynox2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9os2ytaixxx0grhynox2.png" alt=" " width="799" height="405"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 10 — Start Snort in Alert Mode
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;snort &lt;span class="nt"&gt;-c&lt;/span&gt; /usr/local/etc/snort/snort.lua &lt;span class="nt"&gt;-i&lt;/span&gt; enp0s3 &lt;span class="nt"&gt;-A&lt;/span&gt; alert_fast
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Snort is now running and watching &lt;code&gt;enp0s3&lt;/code&gt; for any traffic that matches the rules.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jrb91gqgo6fo2mp07vc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jrb91gqgo6fo2mp07vc.png" alt=" " width="799" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu07ik8str9kkynvxp9m0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu07ik8str9kkynvxp9m0.png" alt=" " width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 11 — Simulate Attacks from Kali Linux
&lt;/h2&gt;

&lt;p&gt;On the Kali VM, run each scan against the Ubuntu IP:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Ping Sweep
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-sn&lt;/span&gt; 192.168.1.104
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. XMAS Scan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sX&lt;/span&gt; 192.168.1.104
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. FIN Scan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sF&lt;/span&gt; 192.168.1.104
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. NULL Scan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sN&lt;/span&gt; 192.168.1.104
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. SYN Scan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; 192.168.1.104
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. TCP Connect Scan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-sT&lt;/span&gt; 192.168.1.104
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. UDP Scan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nmap &lt;span class="nt"&gt;-sU&lt;/span&gt; 192.168.1.104
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprrov7gnk9blvkty9l2z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprrov7gnk9blvkty9l2z.png" alt=" " width="800" height="739"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxogrposmxqg7v2xee21.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxogrposmxqg7v2xee21.png" alt=" " width="800" height="736"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4jizyjp0oq2qubo6izi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4jizyjp0oq2qubo6izi.png" alt=" " width="800" height="710"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0xmrazt8erp55qxtcml.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0xmrazt8erp55qxtcml.png" alt=" " width="800" height="738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9zxerwj0o8j4ydg9ewh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9zxerwj0o8j4ydg9ewh.png" alt=" " width="800" height="716"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhk5lk6ne3p2bzmibwito.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhk5lk6ne3p2bzmibwito.png" alt=" " width="800" height="709"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0vsz21hhlihsk7efp18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0vsz21hhlihsk7efp18.png" alt=" " width="800" height="739"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Verify
&lt;/h2&gt;

&lt;p&gt;Watch the Snort terminal on Ubuntu while each nmap command runs on Kali. You will see live alert lines like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;05/14-18:13:07.004392 [**] [1:1000001:1] "NMAP Ping Sweep" [**] [Priority: 0] {ICMP} 192.168.1.106 -&amp;gt; 192.168.1.104
05/14-18:15:21.301976 [**] [1:1000002:1] "NMAP XMAS Scan" [**] [Priority: 0] {TCP} 192.168.1.106:34107 -&amp;gt; 192.168.1.104:22
05/14-18:16:03.900911 [**] [1:1000003:1] "NMAP FIN Scan" [**] [Priority: 0] {TCP} 192.168.1.106:41928 -&amp;gt; 192.168.1.104:22
05/14-18:16:53.770290 [**] [1:1000004:1] "NMAP NULL Scan" [**] [Priority: 0] {TCP} 192.168.1.106:52411 -&amp;gt; 192.168.1.104:22
05/14-18:17:26.976133 [**] [1:1000005:1] "NMAP SYN Scan" [**] [Priority: 0] {TCP} 192.168.1.106:40209 -&amp;gt; 192.168.1.104:22
05/14-18:15:21.301976 [**] [1:1000006:1] "NMAP TCP Connect Scan" [**] [Priority: 0] {TCP} 192.168.1.106:34107 -&amp;gt; 192.168.1.104:22
05/14-18:12:48.402112 [**] [1:1000007:1] "NMAP UDP Scan" [**] [Priority: 0] {UDP} 192.168.1.1:1900 -&amp;gt; 239.255.255.250:1900
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each attack type triggers its corresponding rule — that means the IDS is working exactly as expected.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Working through this end to end taught me several things that documentation alone does not convey:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Snort rules are just pattern matchers.&lt;/strong&gt; At their core, each rule is a protocol + direction + match condition. Once you understand that structure, writing new rules feels natural.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promiscuous mode matters.&lt;/strong&gt; Without &lt;code&gt;promisc on&lt;/code&gt;, Snort only sees traffic addressed directly to the host. Flipping that one flag is what makes it a proper network monitor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building from source builds understanding.&lt;/strong&gt; Watching each dependency compile, seeing LibDAQ slot into place, and then seeing Snort start up — it makes the whole stack tangible rather than abstract.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nmap flag combinations map to Snort flags directly.&lt;/strong&gt; The &lt;code&gt;-sX&lt;/code&gt; XMAS scan sets FIN, PSH, and URG flags — which maps to &lt;code&gt;flags:FPU&lt;/code&gt; in the rule. That connection between the attacker's tooling and the defender's signature clicked during this lab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alert mode is just the beginning.&lt;/strong&gt; Snort can also run in inline IPS mode and actively drop packets. This setup is the foundation for that.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;What Goes Wrong&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Using Snort 2 instead of Snort 3&lt;/td&gt;
&lt;td&gt;Config file format is completely different&lt;/td&gt;
&lt;td&gt;Always clone from &lt;code&gt;github.com/snort3/snort3&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong &lt;code&gt;HOME_NET&lt;/code&gt; subnet&lt;/td&gt;
&lt;td&gt;Rules never fire because traffic is not matched&lt;/td&gt;
&lt;td&gt;Check your actual subnet with &lt;code&gt;ip a&lt;/code&gt; and set it exactly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Not setting promiscuous mode&lt;/td&gt;
&lt;td&gt;Snort misses traffic not destined for the host&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo ip link set dev enp0s3 promisc on&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interface name mismatch in command&lt;/td&gt;
&lt;td&gt;Snort starts but captures nothing&lt;/td&gt;
&lt;td&gt;Confirm with &lt;code&gt;ip a&lt;/code&gt; — may be &lt;code&gt;ens33&lt;/code&gt;, &lt;code&gt;eth0&lt;/code&gt;, or &lt;code&gt;enp0s3&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rules path typo in snort.lua&lt;/td&gt;
&lt;td&gt;Snort validates but fires no alerts&lt;/td&gt;
&lt;td&gt;Double-check the exact path including subdirectories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skipping &lt;code&gt;sudo ldconfig&lt;/code&gt; after install&lt;/td&gt;
&lt;td&gt;Snort binary cannot find shared libraries&lt;/td&gt;
&lt;td&gt;Always run &lt;code&gt;sudo ldconfig&lt;/code&gt; before testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;flags:0&lt;/code&gt; for NULL scan&lt;/td&gt;
&lt;td&gt;May vary between Snort versions&lt;/td&gt;
&lt;td&gt;Test with &lt;code&gt;snort -c snort.lua -T&lt;/code&gt; and verify rule loads&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Snort 3 is not the simplest tool to set up from scratch, but going through the full build process is worth it. You end up with a real understanding of how each piece fits together — LibDAQ capturing packets, the rules engine pattern matching, and the alert output confirming what the attacker is doing.&lt;/p&gt;

&lt;p&gt;The combination of Snort writing alerts in one window while nmap runs in another makes the whole thing feel live and real. Each scan lights up the terminal on the defender side, which is a genuinely satisfying moment.&lt;/p&gt;

&lt;p&gt;If you set this up yourself and run into issues, drop a comment below — happy to help debug.&lt;/p&gt;

</description>
      <category>snort</category>
      <category>ids</category>
      <category>nmap</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Lab 12 - Telnet and SSH ( I Captured My Own Password in Wireshark — Here's What Telnet Taught Me About Network Security )</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Sat, 13 Jun 2026 12:22:06 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/lab-12-telnet-and-ssh-i-captured-my-own-password-in-wireshark-heres-what-telnet-taught-me-hh3</link>
      <guid>https://dev.to/almahmudkhalif/lab-12-telnet-and-ssh-i-captured-my-own-password-in-wireshark-heres-what-telnet-taught-me-hh3</guid>
      <description>&lt;p&gt;There's a moment in networking that changes how you think about protocols forever.&lt;/p&gt;

&lt;p&gt;You type a password into a terminal. Then you open Wireshark, follow a TCP stream, and there it is — your password, sitting in plain text, completely readable by anyone on the network.&lt;/p&gt;

&lt;p&gt;That's Telnet. And that's exactly why this experiment is worth doing.&lt;/p&gt;

&lt;p&gt;In this post, I'll walk you through how I set up a 4-router network in GNS3, configured Telnet and SSH on Cisco routers, and used Wireshark to visually prove why one protocol is dangerous and the other is essential.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: Why Does This Matter?
&lt;/h2&gt;

&lt;p&gt;Most people learn that "SSH is better than Telnet" from documentation. But seeing it live is different.&lt;/p&gt;

&lt;p&gt;Telnet operates on &lt;strong&gt;Port 23&lt;/strong&gt; and sends everything — usernames, passwords, commands — as unencrypted plain text over the network. SSH operates on &lt;strong&gt;Port 22&lt;/strong&gt; and encrypts every single byte using RSA key pairs.&lt;/p&gt;

&lt;p&gt;In a real-world scenario, any attacker with access to your network traffic (via ARP spoofing, a rogue device, or misconfigured infrastructure) can intercept Telnet credentials instantly. SSH prevents this entirely.&lt;/p&gt;




&lt;h2&gt;
  
  
  Network Topology
&lt;/h2&gt;

&lt;p&gt;Here's the topology I built in GNS3:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8764xkfomy07gkdt3o2z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8764xkfomy07gkdt3o2z.png" alt=" " width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;IP Address Summary:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Device&lt;/th&gt;
&lt;th&gt;Interface&lt;/th&gt;
&lt;th&gt;IP Address&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;R1&lt;/td&gt;
&lt;td&gt;f0/0&lt;/td&gt;
&lt;td&gt;172.16.2.16/16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2&lt;/td&gt;
&lt;td&gt;f0/0&lt;/td&gt;
&lt;td&gt;172.16.2.33/16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2&lt;/td&gt;
&lt;td&gt;f2/0&lt;/td&gt;
&lt;td&gt;172.25.177.254/16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2&lt;/td&gt;
&lt;td&gt;f3/0&lt;/td&gt;
&lt;td&gt;172.6.16.6/16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R3&lt;/td&gt;
&lt;td&gt;f0/0&lt;/td&gt;
&lt;td&gt;172.6.16.17/16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R3&lt;/td&gt;
&lt;td&gt;f1/0&lt;/td&gt;
&lt;td&gt;172.34.5.10/16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R4&lt;/td&gt;
&lt;td&gt;f0/0&lt;/td&gt;
&lt;td&gt;172.25.4.192/16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R4&lt;/td&gt;
&lt;td&gt;f1/0&lt;/td&gt;
&lt;td&gt;172.2.2.2/16&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Start Wireshark Before Anything Else
&lt;/h2&gt;

&lt;p&gt;This is the most important step that beginners miss.&lt;/p&gt;

&lt;p&gt;Before touching any configuration, start packet capture on every router link in GNS3. Right-click on each link → &lt;strong&gt;Start Capture&lt;/strong&gt;. This ensures Wireshark records all configuration traffic from the very beginning.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvuymj32j0giy5f01qfo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvuymj32j0giy5f01qfo.png" alt=" " width="799" height="300"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgmeopwbylt9qtjgrj8zn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgmeopwbylt9qtjgrj8zn.png" alt=" " width="799" height="434"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  PHASE 1 — Configure IP + RIP on All Routers (Direct Console)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  R1 Console:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;Router&amp;gt;&lt;/span&gt; enable
&lt;span class="k"&gt;Router#&lt;/span&gt; configure terminal

&lt;span class="k"&gt;Router(config)#&lt;/span&gt; hostname R1
&lt;span class="k"&gt;R1(config)#&lt;/span&gt; interface fastethernet 0/0
&lt;span class="k"&gt;R1(config-if)#&lt;/span&gt; ip address &lt;span class="m"&gt;172.16.2.16&lt;/span&gt; &lt;span class="m"&gt;255.255.0.0&lt;/span&gt;
&lt;span class="k"&gt;R1(config-if)#&lt;/span&gt; no shutdown
&lt;span class="k"&gt;R1(config-if)#&lt;/span&gt; exit

&lt;span class="k"&gt;R1(config)#&lt;/span&gt; router rip
&lt;span class="k"&gt;R1(config-router)#&lt;/span&gt; version 2
&lt;span class="k"&gt;R1(config-router)#&lt;/span&gt; network &lt;span class="m"&gt;172.16.0.0&lt;/span&gt;
&lt;span class="k"&gt;R1(config-router)#&lt;/span&gt; no auto-summary
&lt;span class="k"&gt;R1(config-router)#&lt;/span&gt; exit
&lt;span class="k"&gt;R1(config)#&lt;/span&gt; exit

&lt;span class="k"&gt;R1#&lt;/span&gt; write memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;R1 is our "management router" — everything else gets configured from here via Telnet.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdluhzor3xcgoydfuut2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdluhzor3xcgoydfuut2.png" alt=" " width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;code&gt;no shutdown&lt;/code&gt; command is essential — Cisco router interfaces are &lt;strong&gt;administratively down&lt;/strong&gt; by default. Without this, nothing works.&lt;/p&gt;

&lt;p&gt;Configure RIP on R1 : &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpz9ksiaz34bq89m0rfps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpz9ksiaz34bq89m0rfps.png" alt=" " width="799" height="315"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What Actually Happen in wireshark After Configure R1&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzh567pkrm2gstb20h0aq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzh567pkrm2gstb20h0aq.png" alt=" " width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  R2 Console:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;Router&amp;gt;&lt;/span&gt; enable
&lt;span class="k"&gt;Router#&lt;/span&gt; configure terminal

&lt;span class="k"&gt;Router(config)#&lt;/span&gt; hostname R2
&lt;span class="k"&gt;R2(config)#&lt;/span&gt; interface fastethernet 0/0
&lt;span class="k"&gt;R2(config-if)#&lt;/span&gt; ip address &lt;span class="m"&gt;172.16.2.33&lt;/span&gt; &lt;span class="m"&gt;255.255.0.0&lt;/span&gt;
&lt;span class="k"&gt;R2(config-if)#&lt;/span&gt; no shutdown
&lt;span class="k"&gt;R2(config-if)#&lt;/span&gt; exit

&lt;span class="k"&gt;R2(config)#&lt;/span&gt; router rip
&lt;span class="k"&gt;R2(config-router)#&lt;/span&gt; version 2
&lt;span class="k"&gt;R2(config-router)#&lt;/span&gt; network &lt;span class="m"&gt;172.16.0.0&lt;/span&gt;
&lt;span class="k"&gt;R2(config-router)#&lt;/span&gt; no auto-summary
&lt;span class="k"&gt;R2(config-router)#&lt;/span&gt; exit

&lt;span class="k"&gt;R2(config)#&lt;/span&gt; enable password cisco
&lt;span class="k"&gt;R2(config)#&lt;/span&gt; line vty 0 4
&lt;span class="k"&gt;R2(config-line)#&lt;/span&gt; password cisco
&lt;span class="k"&gt;R2(config-line)#&lt;/span&gt; login
&lt;span class="k"&gt;R2(config-line)#&lt;/span&gt; transport input telnet
&lt;span class="k"&gt;R2(config-line)#&lt;/span&gt; exit
&lt;span class="k"&gt;R2(config)#&lt;/span&gt; exit

&lt;span class="k"&gt;R2#&lt;/span&gt; write memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F056gt65l0c05zx67k9q2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F056gt65l0c05zx67k9q2.png" alt=" " width="800" height="204"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwd8383qcz2shvx5nvv0z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwd8383qcz2shvx5nvv0z.png" alt=" " width="800" height="136"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fipw7ar2tcfqnmyglnm1j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fipw7ar2tcfqnmyglnm1j.png" alt=" " width="799" height="220"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What are VTY lines?&lt;/strong&gt; They're virtual terminal lines — the "doors" through which remote users connect to a router. &lt;code&gt;line vty 0 4&lt;/code&gt; means we're configuring 5 simultaneous connections (0 through 4).&lt;/p&gt;

&lt;h2&gt;
  
  
  R3 Console:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;Router&amp;gt;&lt;/span&gt; enable
&lt;span class="k"&gt;Router#&lt;/span&gt; configure terminal

&lt;span class="k"&gt;Router(config)#&lt;/span&gt; hostname R3
&lt;span class="k"&gt;R3(config)#&lt;/span&gt; interface fastethernet 0/0
&lt;span class="k"&gt;R3(config-if)#&lt;/span&gt; ip address &lt;span class="m"&gt;172.6.16.17&lt;/span&gt; &lt;span class="m"&gt;255.255.0.0&lt;/span&gt;
&lt;span class="k"&gt;R3(config-if)#&lt;/span&gt; no shutdown
&lt;span class="k"&gt;R3(config-if)#&lt;/span&gt; exit

&lt;span class="k"&gt;R3(config)#&lt;/span&gt; router rip
&lt;span class="k"&gt;R3(config-router)#&lt;/span&gt; version 2
&lt;span class="k"&gt;R3(config-router)#&lt;/span&gt; network &lt;span class="m"&gt;172.6.0.0&lt;/span&gt;
&lt;span class="k"&gt;R3(config-router)#&lt;/span&gt; no auto-summary
&lt;span class="k"&gt;R3(config-router)#&lt;/span&gt; exit

&lt;span class="k"&gt;R3(config)#&lt;/span&gt; enable password cisco
&lt;span class="k"&gt;R3(config)#&lt;/span&gt; line vty 0 4
&lt;span class="k"&gt;R3(config-line)#&lt;/span&gt; password cisco
&lt;span class="k"&gt;R3(config-line)#&lt;/span&gt; login
&lt;span class="k"&gt;R3(config-line)#&lt;/span&gt; transport input telnet
&lt;span class="k"&gt;R3(config-line)#&lt;/span&gt; exit
&lt;span class="k"&gt;R3(config)#&lt;/span&gt; exit

&lt;span class="k"&gt;R3#&lt;/span&gt; write memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3mbcpv9xjdp3lg34kmq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3mbcpv9xjdp3lg34kmq.png" alt=" " width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  R4 Console:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;Router&amp;gt;&lt;/span&gt; enable
&lt;span class="k"&gt;Router#&lt;/span&gt; configure terminal
&lt;span class="k"&gt;Router(config)#&lt;/span&gt; hostname R4
&lt;span class="k"&gt;R4(config)#&lt;/span&gt; interface fastethernet 0/0
&lt;span class="k"&gt;R4(config-if)#&lt;/span&gt; ip address &lt;span class="m"&gt;172.25.4.192&lt;/span&gt; &lt;span class="m"&gt;255.255.0.0&lt;/span&gt;
&lt;span class="k"&gt;R4(config-if)#&lt;/span&gt; no shutdown
&lt;span class="k"&gt;R4(config-if)#&lt;/span&gt; exit
&lt;span class="k"&gt;R4(config)#&lt;/span&gt; router rip
&lt;span class="k"&gt;R4(config-router)#&lt;/span&gt; version 2
&lt;span class="k"&gt;R4(config-router)#&lt;/span&gt; network &lt;span class="m"&gt;172.25.0.0&lt;/span&gt;
&lt;span class="k"&gt;R4(config-router)#&lt;/span&gt; no auto-summary
&lt;span class="k"&gt;R4(config-router)#&lt;/span&gt; exit
&lt;span class="k"&gt;R4(config)#&lt;/span&gt; enable password cisco
&lt;span class="k"&gt;R4(config)#&lt;/span&gt; line vty 0 4
&lt;span class="k"&gt;R4(config-line)#&lt;/span&gt; password cisco
&lt;span class="k"&gt;R4(config-line)#&lt;/span&gt; login
&lt;span class="k"&gt;R4(config-line)#&lt;/span&gt; transport input telnet
&lt;span class="k"&gt;R4(config-line)#&lt;/span&gt; exit
&lt;span class="k"&gt;R4(config)#&lt;/span&gt; exit
&lt;span class="k"&gt;R4#&lt;/span&gt; write memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetdwdo1ly1n8wx5cgbsi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetdwdo1ly1n8wx5cgbsi.png" alt=" " width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  PHASE 2 — Configure PCs (VPCS)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  PC1:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;ip&lt;/span&gt; &lt;span class="m"&gt;172.2.3.3&lt;/span&gt; &lt;span class="m"&gt;255.255.0.0&lt;/span&gt; &lt;span class="m"&gt;172.2.2.2&lt;/span&gt;
&lt;span class="k"&gt;save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4dbodqobtq42wrcxjkz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4dbodqobtq42wrcxjkz.png" alt=" " width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  PC2:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;ip&lt;/span&gt; &lt;span class="m"&gt;172.34.10.67&lt;/span&gt; &lt;span class="m"&gt;255.255.0.0&lt;/span&gt; &lt;span class="m"&gt;172.34.5.10&lt;/span&gt;
&lt;span class="k"&gt;save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihsfdf308nnm3xpvk8w4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihsfdf308nnm3xpvk8w4.png" alt=" " width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  PHASE 3 — From R1, Telnet into R2, R3, R4 and Configure Remaining Interfaces + RIP
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ✅ First Verify — Ping from R1:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R1#&lt;/span&gt; ping &lt;span class="m"&gt;172.16.2.33&lt;/span&gt;
&lt;span class="k"&gt;R1#&lt;/span&gt; ping &lt;span class="m"&gt;172.6.16.17&lt;/span&gt;
&lt;span class="k"&gt;R1#&lt;/span&gt; ping &lt;span class="m"&gt;172.25.4.192&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkb575pmf4v25dfafrzpu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkb575pmf4v25dfafrzpu.png" alt=" " width="799" height="275"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All three must succeed before proceeding.&lt;/p&gt;

&lt;h2&gt;
  
  
  R1 → Telnet → R2:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R1#&lt;/span&gt; telnet &lt;span class="m"&gt;172.16.2.33&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;Password:&lt;/span&gt; cisco
&lt;span class="k"&gt;R2&amp;gt;&lt;/span&gt; enable
&lt;span class="k"&gt;Password:&lt;/span&gt; cisco
&lt;span class="k"&gt;R2#&lt;/span&gt; configure terminal

&lt;span class="k"&gt;R2(config)#&lt;/span&gt; interface fastethernet 2/0
&lt;span class="k"&gt;R2(config-if)#&lt;/span&gt; ip address &lt;span class="m"&gt;172.25.177.254&lt;/span&gt; &lt;span class="m"&gt;255.255.0.0&lt;/span&gt;
&lt;span class="k"&gt;R2(config-if)#&lt;/span&gt; no shutdown
&lt;span class="k"&gt;R2(config-if)#&lt;/span&gt; exit

&lt;span class="k"&gt;R2(config)#&lt;/span&gt; interface fastethernet 3/0
&lt;span class="k"&gt;R2(config-if)#&lt;/span&gt; ip address &lt;span class="m"&gt;172.6.16.6&lt;/span&gt; &lt;span class="m"&gt;255.255.0.0&lt;/span&gt;
&lt;span class="k"&gt;R2(config-if)#&lt;/span&gt; no shutdown
&lt;span class="k"&gt;R2(config-if)#&lt;/span&gt; exit

&lt;span class="k"&gt;R2(config)#&lt;/span&gt; router rip
&lt;span class="k"&gt;R2(config-router)#&lt;/span&gt; network &lt;span class="m"&gt;172.25.0.0&lt;/span&gt;
&lt;span class="k"&gt;R2(config-router)#&lt;/span&gt; network &lt;span class="m"&gt;172.6.0.0&lt;/span&gt;
&lt;span class="k"&gt;R2(config-router)#&lt;/span&gt; exit

&lt;span class="k"&gt;R2(config)#&lt;/span&gt; exit
&lt;span class="k"&gt;R2#&lt;/span&gt; write memory
&lt;span class="k"&gt;R2#&lt;/span&gt; exit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvrg5f64qdkqrv8381w6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvrg5f64qdkqrv8381w6.png" alt=" " width="800" height="158"&gt;&lt;/a&gt;&lt;br&gt;
Wireshark will show the packets exchanged between the two routers. Right click on the 2nd last telnet packet and got to Follow -&amp;gt; TCP stream. You can see the console commands entered on router 1 to access router 2. It will also show the password as plaintext.  If we had configured SSH instead of Telnet then the password wouldn’t be captured as plaintex&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgss3aoggw9977wqicsx1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgss3aoggw9977wqicsx1.png" alt=" " width="800" height="348"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkz1bkt66cd1z1lj8har.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkz1bkt66cd1z1lj8har.png" alt=" " width="800" height="374"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvezxy9ju6bxyl0qhcre3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvezxy9ju6bxyl0qhcre3.png" alt=" " width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5na6bxylyonpguta2pgw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5na6bxylyonpguta2pgw.png" alt=" " width="800" height="54"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47u21rjobgczvrs168fv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47u21rjobgczvrs168fv.png" alt=" " width="800" height="393"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmiv411pgoytr5d44oz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmiv411pgoytr5d44oz2.png" alt=" " width="799" height="431"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Full Command &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3hf87ljzw11xef80cny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp3hf87ljzw11xef80cny.png" alt=" " width="799" height="555"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  R1 → Telnet → R3:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R1#&lt;/span&gt; telnet &lt;span class="m"&gt;172.6.16.17&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;Password:&lt;/span&gt; cisco
&lt;span class="k"&gt;R3&amp;gt;&lt;/span&gt; enable
&lt;span class="k"&gt;Password:&lt;/span&gt; cisco
&lt;span class="k"&gt;R3#&lt;/span&gt; configure terminal

&lt;span class="k"&gt;R3(config)#&lt;/span&gt; interface fastethernet 1/0
&lt;span class="k"&gt;R3(config-if)#&lt;/span&gt; ip address &lt;span class="m"&gt;172.34.5.10&lt;/span&gt; &lt;span class="m"&gt;255.255.0.0&lt;/span&gt;
&lt;span class="k"&gt;R3(config-if)#&lt;/span&gt; no shutdown
&lt;span class="k"&gt;R3(config-if)#&lt;/span&gt; exit

&lt;span class="k"&gt;R3(config)#&lt;/span&gt; router rip
&lt;span class="k"&gt;R3(config-router)#&lt;/span&gt; network &lt;span class="m"&gt;172.34.0.0&lt;/span&gt;
&lt;span class="k"&gt;R3(config-router)#&lt;/span&gt; exit

&lt;span class="k"&gt;R3(config)#&lt;/span&gt; exit
&lt;span class="k"&gt;R3#&lt;/span&gt; write memory
&lt;span class="k"&gt;R3#&lt;/span&gt; exit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0eh8mfo4oousi2v4yulj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0eh8mfo4oousi2v4yulj.png" alt=" " width="800" height="165"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1uiw87encfovwq27502r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1uiw87encfovwq27502r.png" alt=" " width="800" height="374"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzja270fexeugpcpdqmp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzja270fexeugpcpdqmp.png" alt=" " width="800" height="357"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyjvqo01g4nraxypj893q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyjvqo01g4nraxypj893q.png" alt=" " width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3enx8tc2pid5aj2k7l3n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3enx8tc2pid5aj2k7l3n.png" alt=" " width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  R1 → Telnet → R4:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R1#&lt;/span&gt; telnet &lt;span class="m"&gt;172.25.4.192&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;Password:&lt;/span&gt; cisco
&lt;span class="k"&gt;R4&amp;gt;&lt;/span&gt; enable
&lt;span class="k"&gt;Password:&lt;/span&gt; cisco
&lt;span class="k"&gt;R4#&lt;/span&gt; configure terminal

&lt;span class="k"&gt;R4(config)#&lt;/span&gt; interface fastethernet 1/0
&lt;span class="k"&gt;R4(config-if)#&lt;/span&gt; ip address &lt;span class="m"&gt;172.2.2.2&lt;/span&gt; &lt;span class="m"&gt;255.255.0.0&lt;/span&gt;
&lt;span class="k"&gt;R4(config-if)#&lt;/span&gt; no shutdown
&lt;span class="k"&gt;R4(config-if)#&lt;/span&gt; exit

&lt;span class="k"&gt;R4(config)#&lt;/span&gt; router rip
&lt;span class="k"&gt;R4(config-router)#&lt;/span&gt; network &lt;span class="m"&gt;172.2.0.0&lt;/span&gt;
&lt;span class="k"&gt;R4(config-router)#&lt;/span&gt; exit

&lt;span class="k"&gt;R4(config)#&lt;/span&gt; exit
&lt;span class="k"&gt;R4#&lt;/span&gt; write memory
&lt;span class="k"&gt;R4#&lt;/span&gt; exit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1a8geuva9p9m1d2525ek.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1a8geuva9p9m1d2525ek.png" alt=" " width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8or9ulfmuvmui2wh9w0r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8or9ulfmuvmui2wh9w0r.png" alt=" " width="800" height="404"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpeab5228o1wfdcl4tfe9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpeab5228o1wfdcl4tfe9.png" alt=" " width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  PHASE 4 — Configure SSH on R4 (R4 Direct Console)
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R4#&lt;/span&gt; configure terminal
&lt;span class="k"&gt;R4(config)#&lt;/span&gt; ip domain-name lab.com
&lt;span class="k"&gt;R4(config)#&lt;/span&gt; crypto key generate rsa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When prompted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;How many bits in the modulus [512]: 1024
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R4(config)#&lt;/span&gt; ip ssh version 2
&lt;span class="k"&gt;R4(config)#&lt;/span&gt; username admin password cisco123
&lt;span class="k"&gt;R4(config)#&lt;/span&gt; line vty 0 3
&lt;span class="k"&gt;R4(config-line)#&lt;/span&gt; transport input ssh telnet
&lt;span class="k"&gt;R4(config-line)#&lt;/span&gt; login local
&lt;span class="k"&gt;R4(config-line)#&lt;/span&gt; exit
&lt;span class="k"&gt;R4(config)#&lt;/span&gt; exit
&lt;span class="k"&gt;R4#&lt;/span&gt; write memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why 1024 bits?&lt;/strong&gt; SSH version 2 requires a minimum key size. Less than 768 bits won't work. 1024 is the standard starting point, though 2048+ is recommended for production environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;login local&lt;/code&gt; vs &lt;code&gt;login&lt;/code&gt;:&lt;/strong&gt; Using &lt;code&gt;login local&lt;/code&gt; tells the router to check the local username database we just created. Plain &lt;code&gt;login&lt;/code&gt; only checks the VTY password — less secure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1yn8ceq6bsgcevqk56yd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1yn8ceq6bsgcevqk56yd.png" alt=" " width="800" height="174"&gt;&lt;/a&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo5ev6pig5zkd8poq3zfk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo5ev6pig5zkd8poq3zfk.png" alt=" " width="800" height="273"&gt;&lt;/a&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmcpglqzc7l0yya3cph3x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmcpglqzc7l0yya3cph3x.png" alt=" " width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After running configuration commands through Telnet, go to Wireshark:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find any Telnet packet&lt;/li&gt;
&lt;li&gt;Right-click → &lt;strong&gt;Follow&lt;/strong&gt; → &lt;strong&gt;TCP Stream&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You'll see the password typed at the prompt — completely readable. Every command. Every keystroke. All plain text.&lt;/p&gt;

&lt;p&gt;This is the moment that makes the SSH comparison real.&lt;/p&gt;




&lt;h1&gt;
  
  
  PHASE 5 — SSH from R2 into R4
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R2#&lt;/span&gt; ssh -l admin &lt;span class="m"&gt;172.25.4.192&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;Password:&lt;/span&gt; cisco123
&lt;span class="k"&gt;R4&amp;gt;&lt;/span&gt; enable
&lt;span class="k"&gt;Password:&lt;/span&gt; cisco
&lt;span class="k"&gt;R4#&lt;/span&gt; show running-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjeotjdxfufx8h0unww3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjeotjdxfufx8h0unww3w.png" alt=" " width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Follow the same steps as before — find an SSH packet, right-click → &lt;strong&gt;Follow&lt;/strong&gt; → &lt;strong&gt;TCP Stream&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Compare this with the Telnet stream. The SSH stream shows only encrypted bytes — no readable text, no visible commands, no password.&lt;/p&gt;

&lt;p&gt;Same network. Same routers. Completely different security story.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faxl06p8xhvc3cthxafd7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faxl06p8xhvc3cthxafd7.png" alt=" " width="800" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfksicr0y1wi5z046v1w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfksicr0y1wi5z046v1w.png" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All Encrypted Data : &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fio7ohcke8879l631nakb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fio7ohcke8879l631nakb.png" alt=" " width="800" height="651"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Final Verification
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Run on every router (R1, R2, R3, R4):
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;show&lt;/span&gt; ip interface brief
&lt;span class="k"&gt;show&lt;/span&gt; ip route
&lt;span class="k"&gt;show&lt;/span&gt; running-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With RIP v2 configured on all routers, they share routing information automatically. After about 30–60 seconds for convergence:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ql92dil4w132njodqba.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ql92dil4w132njodqba.png" alt=" " width="800" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fua222160vrijpb7rb84k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fua222160vrijpb7rb84k.png" alt=" " width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa87xra2rjav0ho3uu8bq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa87xra2rjav0ho3uu8bq.png" alt=" " width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzvo74pu3gdgn8qmodrd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzvo74pu3gdgn8qmodrd.png" alt=" " width="800" height="290"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Ping PC2 from PC1:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;ping&lt;/span&gt; &lt;span class="m"&gt;172.34.10.67&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp4ojb2ok4s5n54jwbl2s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp4ojb2ok4s5n54jwbl2s.png" alt=" " width="800" height="183"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  📝 Important Notes — Lessons Learned
&lt;/h1&gt;

&lt;h3&gt;
  
  
  ⚠️ Note 1: RIP First, Telnet Later
&lt;/h3&gt;

&lt;p&gt;Every router that you want to &lt;strong&gt;telnet into&lt;/strong&gt; must have RIP configured on it beforehand — from its own console.&lt;/p&gt;

&lt;p&gt;Reason: Telnet works over a TCP connection. For TCP to establish, packets must travel both ways. For packets to travel, routes must exist. Routes come from RIP. No RIP means no route, no route means no ping, no ping means no Telnet — connection will always time out.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ Correct order per router: Console → Assign IP → Configure RIP → Configure Telnet → Then telnet in from another router&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ⚠️ Note 2: The Chicken and Egg Trap
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Want to Telnet in    → Need Ping to work
Need Ping to work    → Need a Route
Need a Route         → Need RIP
Want to configure RIP → Need Telnet  ← 🔴 INFINITE LOOP!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The only way out of this loop is to configure RIP from the console first, before attempting any telnet connection.&lt;/p&gt;




&lt;h2&gt;
  
  
  Telnet vs SSH: Side by Side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Telnet&lt;/th&gt;
&lt;th&gt;SSH&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Port&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encryption&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;RSA + AES&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password in Wireshark&lt;/td&gt;
&lt;td&gt;Fully visible&lt;/td&gt;
&lt;td&gt;Encrypted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Integrity&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;Password only&lt;/td&gt;
&lt;td&gt;Password + Public Key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compliance&lt;/td&gt;
&lt;td&gt;Fails PCI DSS&lt;/td&gt;
&lt;td&gt;Meets PCI DSS, HIPAA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Industry Status&lt;/td&gt;
&lt;td&gt;Deprecated&lt;/td&gt;
&lt;td&gt;Standard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What We Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The technical takeaways:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cisco router interfaces are administratively down by default — always use &lt;code&gt;no shutdown&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;SSH requires a domain name and RSA key pair before it will function&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transport input ssh&lt;/code&gt; blocks Telnet entirely; &lt;code&gt;transport input ssh telnet&lt;/code&gt; allows both&lt;/li&gt;
&lt;li&gt;RIP v2 needs 30–60 seconds to converge before routing works across the full network&lt;/li&gt;
&lt;li&gt;Wireshark's "Follow TCP Stream" feature is one of the most powerful tools for understanding protocol behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The bigger picture:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seeing credentials in plain text in a packet capture is more convincing than any documentation&lt;/li&gt;
&lt;li&gt;Most legacy network devices still run Telnet by default — knowing how to replace it with SSH is a practical skill&lt;/li&gt;
&lt;li&gt;Tools like Wireshark aren't just for attackers — they're essential for anyone building or defending networks&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes for Beginners
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Starting Wireshark after configuration&lt;/strong&gt;&lt;br&gt;
Always start captures before any configuration. You can't capture traffic retroactively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Skipping &lt;code&gt;no shutdown&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
If interfaces stay down, nothing will connect. Make this a habit on every interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Using less than 1024-bit RSA keys&lt;/strong&gt;&lt;br&gt;
SSH v2 won't work. Always use 1024 minimum, 2048 for anything serious.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Expecting instant ping success&lt;/strong&gt;&lt;br&gt;
RIP needs time to advertise routes to all routers. Wait 30–60 seconds after configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Mixing up &lt;code&gt;login&lt;/code&gt; and &lt;code&gt;login local&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;login local&lt;/code&gt; uses the username database. &lt;code&gt;login&lt;/code&gt; uses only the VTY password. For SSH, always use &lt;code&gt;login local&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The gap between Telnet and SSH isn't theoretical — it's something you can see with your own eyes in a Wireshark capture. One protocol hands your credentials to anyone watching the wire. The other makes them invisible.&lt;/p&gt;

&lt;p&gt;If you're working with Cisco devices or any network infrastructure, replacing Telnet with SSH isn't optional — it's the baseline. Every compliance framework from PCI DSS to HIPAA requires it, and now you know exactly why.&lt;/p&gt;

&lt;p&gt;Try building this topology yourself. Capture the packets. See your password appear in plain text. It's the kind of hands-on lesson that sticks.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;All configurations were done in GNS3 with Cisco IOS routers. Wireshark was used for packet analysis.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>cybersecurity</category>
      <category>ssh</category>
      <category>telnet</category>
    </item>
    <item>
      <title>Lab Task 11 – Monitoring HTTP Traffic with Httpry on Kali Linux — Passive Capture, Live Monitoring &amp; CLF Conversion</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Sat, 13 Jun 2026 07:53:14 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/lab-task-11-monitoring-http-traffic-with-httpry-on-kali-linux-passive-capture-live-monitoring-3f83</link>
      <guid>https://dev.to/almahmudkhalif/lab-task-11-monitoring-http-traffic-with-httpry-on-kali-linux-passive-capture-live-monitoring-3f83</guid>
      <description>&lt;p&gt;When you start digging into network traffic analysis, you quickly realize that Full Packet Capture tools like Wireshark or tcpdump give you &lt;em&gt;everything&lt;/em&gt; — which is often too much. Sometimes you just need the HTTP layer: what requests are being made, to which hosts, using which methods, and when.&lt;/p&gt;

&lt;p&gt;That is exactly where &lt;strong&gt;Httpry&lt;/strong&gt; fits in. It is a lightweight, specialized HTTP sniffer that sits quietly on a network interface or reads from a captured pcap file and extracts only what matters — HTTP request and response metadata. No noise, no massive binary dumps, just clean HTTP session data.&lt;/p&gt;

&lt;p&gt;In this post I will walk through the full Httpry workflow: building it from source, running passive analysis on a captured pcap file, creating log files, converting those logs to Common Log Format, running live monitoring while generating real HTTP traffic, and then repeating the same CLF conversion on the live capture output.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Httpry Instead of Just Wireshark?
&lt;/h2&gt;

&lt;p&gt;Full packet capture has its place, but for HTTP-focused monitoring it comes with overhead — storage costs, parsing time, and complexity. Httpry gives you Packet String Data (PSTR): a selected, human-readable subset of network traffic focused on application-layer protocol strings like hostnames, URLs, HTTP methods, and status codes.&lt;/p&gt;

&lt;p&gt;Think of it as the difference between recording an entire phone conversation and keeping only a structured call log. The log is smaller, faster to query, and still tells you &lt;em&gt;who called whom, when, and for how long&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Will Need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Kali Linux (or any Debian/Ubuntu-based system)&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;.pcap&lt;/code&gt; file from a previous traffic capture session (I used one from Lab 10 generated with daemonlogger)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git&lt;/code&gt;, &lt;code&gt;gcc&lt;/code&gt;, &lt;code&gt;make&lt;/code&gt;, &lt;code&gt;libpcap-dev&lt;/code&gt; installed&lt;/li&gt;
&lt;li&gt;Root/sudo access&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1 — Update the System
&lt;/h2&gt;

&lt;p&gt;Before anything else, make sure your package lists are current.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz03stqqy2xfl3wortu35.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz03stqqy2xfl3wortu35.png" alt=" " width="800" height="186"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Install Build Dependencies
&lt;/h2&gt;

&lt;p&gt;Httpry is not in the default Kali repositories as a pre-built package, so you will compile it from source. It needs &lt;code&gt;libpcap-dev&lt;/code&gt;, &lt;code&gt;make&lt;/code&gt;, and &lt;code&gt;gcc&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;libpcap-dev make gcc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3 — Clone and Build Httpry
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/jbittel/httpry.git
&lt;span class="nb"&gt;cd &lt;/span&gt;httpry
make
&lt;span class="nb"&gt;sudo &lt;/span&gt;make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;make&lt;/code&gt; step compiles the source and places the binary in &lt;code&gt;/usr/sbin/httpry&lt;/code&gt;. You might see a deprecation warning about &lt;code&gt;pcap_lookupdev&lt;/code&gt; — that is harmless on modern libpcap versions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnzl7nzn3jriq5jn2nnun.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnzl7nzn3jriq5jn2nnun.png" alt=" " width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verify the install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;httpry &lt;span class="nt"&gt;--version&lt;/span&gt;
which httpry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F669u0urkcd5ea25ingq4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F669u0urkcd5ea25ingq4.png" alt=" " width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Locate the Captured pcap File (Part i)
&lt;/h2&gt;

&lt;p&gt;For passive analysis I used a &lt;code&gt;.pcap&lt;/code&gt; file captured during a previous lab session with daemonlogger. It was stored at &lt;code&gt;/var/log/daemonlogger/&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /var/log/daemonlogger
&lt;span class="nb"&gt;ls
ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; capture.1777551302.pcap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhmdomml2kp4iaaqo4r8t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhmdomml2kp4iaaqo4r8t.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Passive Monitoring on the pcap File (Part ii)
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;-r&lt;/code&gt; flag tells Httpry to read from a pcap file instead of a live interface. This is called &lt;strong&gt;passive monitoring&lt;/strong&gt; — no active capture, just replaying already-captured traffic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;httpy &lt;span class="nt"&gt;-r&lt;/span&gt; capture.1777551302.pcap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(Replace &lt;code&gt;capture.1777551302.pcap&lt;/code&gt; with your actual filename.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Httpry parses the file and prints every HTTP transaction it finds. Each line shows:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Timestamp&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2026-04-30 05:21:20.856&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source IP&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.0.2.15&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination IP&lt;/td&gt;
&lt;td&gt;&lt;code&gt;54.39.128.230&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direction&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;gt;&lt;/code&gt; (request) or &lt;code&gt;&amp;lt;&lt;/code&gt; (response)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Method&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http.kali.org&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/kali/pool/main/l/...&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP Version&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HTTP/1.1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status Code&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200 OK&lt;/code&gt; / &lt;code&gt;302 Found&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At the end of the output you will see a line like &lt;code&gt;25 http packets parsed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9t3ctqhfkhhlhqoff2dw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9t3ctqhfkhhlhqoff2dw.png" alt=" " width="800" height="567"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6 — Create a Log File and Inspect It (Part iii)
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;-o&lt;/code&gt; flag writes Httpry output to a file instead of (or in addition to) stdout.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;httpry &lt;span class="nt"&gt;-r&lt;/span&gt; capture.1777551302.pcap &lt;span class="nt"&gt;-o&lt;/span&gt; httpry_log.txt
&lt;span class="nb"&gt;cat &lt;/span&gt;httpry_log.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The saved file includes a header block showing the Httpry version, copyright, and the field names:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# httpry version 0.1.8
# Fields: timestamp,source-ip,dest-ip,direction,method,host,request-uri,http-version,status-code,reason-phrase
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Followed by tab-separated data rows for every HTTP event.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hqwf4iqb2s7hifbexhr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hqwf4iqb2s7hifbexhr.png" alt=" " width="800" height="683"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7 — Convert to Common Log Format (Part iv)
&lt;/h2&gt;

&lt;p&gt;Httpry's native log format is useful but not the same as &lt;strong&gt;Common Log Format (CLF)&lt;/strong&gt; — the standard format used by Apache, Nginx, and most web server logs. CLF looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;192.168.1.100 - john [16/Oct/2024:12:15:45 -0700] "GET /index.html HTTP/1.1" 200 1024
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To convert, I wrote a small Perl script (&lt;code&gt;log2clf.pl&lt;/code&gt;) that reads Httpry's tab-separated output and reformats it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/log2clf.pl &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
#!/usr/bin/perl
use strict;
use warnings;

while (&amp;lt;STDIN&amp;gt;) {
    chomp;
    next if /^#/;
    next if /^&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sh"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;$/&lt;/span&gt;&lt;span class="sh"&gt;;

    my @fields = split(/&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="sh"&gt;/, &lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="sh"&gt;);
    next unless @fields &amp;gt;= 7;

    my (&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$direction&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$src_ip&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$dst_ip&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$method&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$proto&lt;/span&gt;&lt;span class="sh"&gt;) = @fields;

    next unless defined &lt;/span&gt;&lt;span class="nv"&gt;$method&lt;/span&gt;&lt;span class="sh"&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span class="nv"&gt;$method&lt;/span&gt;&lt;span class="sh"&gt; =~ /GET|POST|HEAD/;

    my &lt;/span&gt;&lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="sh"&gt; = "http://" . (&lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="sh"&gt; // "-") . (&lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="sh"&gt; // "/");
    my &lt;/span&gt;&lt;span class="nv"&gt;$time_fmt&lt;/span&gt;&lt;span class="sh"&gt; = &lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="sh"&gt;;

    print "&lt;/span&gt;&lt;span class="nv"&gt;$src_ip&lt;/span&gt;&lt;span class="sh"&gt; - - [&lt;/span&gt;&lt;span class="nv"&gt;$time_fmt&lt;/span&gt;&lt;span class="sh"&gt;] &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$method&lt;/span&gt;&lt;span class="sh"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="sh"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$proto&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="sh"&gt; - -&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;";
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then pipe the Httpry log through it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/httpry_log.txt | perl ~/log2clf.pl &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/httpry_clf.txt
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/httpry_clf.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output now matches CLF structure — IP address, timestamp in brackets, quoted request line, and placeholder dashes for status/bytes (since Httpry does not always capture full response metadata for every entry).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpu2jbp483n0vdtlp29a7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpu2jbp483n0vdtlp29a7.png" alt=" " width="800" height="712"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8 — Live Monitoring While Generating HTTP Traffic (Part v)
&lt;/h2&gt;

&lt;p&gt;Now for real-time capture. Run Httpry on your active network interface (&lt;code&gt;eth0&lt;/code&gt; or &lt;code&gt;eth1&lt;/code&gt; depending on your setup) and simultaneously generate HTTP traffic from another terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Terminal 1 — start Httpry:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;httpry &lt;span class="nt"&gt;-i&lt;/span&gt; eth0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Terminal 2 — generate HTTP traffic:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://example.com
curl http://google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Httpry starts printing HTTP events in real time as the curl requests go out and responses come back. When you are done, press &lt;code&gt;Ctrl+C&lt;/code&gt; to stop. It will print a summary like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;^CCaught SIGINT, shutting down ...
48 packets received, 0 packets dropped, 4 http packets parsed
8.4 packets/min, 0.7 http packets/min
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9dwsye30o50qydnxyyp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9dwsye30o50qydnxyyp.png" alt=" " width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdud00o37ff8cvug60pm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdud00o37ff8cvug60pm.png" alt=" " width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo119mg0j5qhuqgmwfon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo119mg0j5qhuqgmwfon.png" alt=" " width="800" height="213"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9 — Save Live Capture to a File (Part vi)
&lt;/h2&gt;

&lt;p&gt;Repeat the live monitoring but this time save the output to a file using &lt;code&gt;-o&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;httpry &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-o&lt;/span&gt; live_capture.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate some HTTP traffic again with curl, then &lt;code&gt;Ctrl+C&lt;/code&gt; to stop. Verify the file was written:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;live_capture.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will see the same header format as before (&lt;code&gt;# Fields: timestamp,...&lt;/code&gt;) followed by the live session data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzo7blh5bav66x0kw8piy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzo7blh5bav66x0kw8piy.png" alt=" " width="799" height="330"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 10 — Convert the Live Capture to CLF (Part vii)
&lt;/h2&gt;

&lt;p&gt;Apply the same CLF conversion to the live capture file. You can reuse or slightly tweak the Perl script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/log2clf.pl &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
#!/usr/bin/perl
while (&amp;lt;STDIN&amp;gt;) {
    chomp;
    next if /^#/;
    next if /^&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sh"&gt;*&lt;/span&gt;&lt;span class="nv"&gt;$/&lt;/span&gt;&lt;span class="sh"&gt;;
    my @f = split(/&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="sh"&gt;/, &lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="sh"&gt;);
    next unless @f &amp;gt;= 7;
    my (&lt;/span&gt;&lt;span class="nv"&gt;$ts&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$src&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$dst&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$method&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="sh"&gt;, &lt;/span&gt;&lt;span class="nv"&gt;$proto&lt;/span&gt;&lt;span class="sh"&gt;) = @f;
    next unless defined &lt;/span&gt;&lt;span class="nv"&gt;$method&lt;/span&gt;&lt;span class="sh"&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span class="nv"&gt;$method&lt;/span&gt;&lt;span class="sh"&gt; =~ /GET|POST|HEAD/;
    &lt;/span&gt;&lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="sh"&gt; //= "/";
    &lt;/span&gt;&lt;span class="nv"&gt;$proto&lt;/span&gt;&lt;span class="sh"&gt; //= "HTTP/1.1";
    print "&lt;/span&gt;&lt;span class="nv"&gt;$src&lt;/span&gt;&lt;span class="sh"&gt; - - [&lt;/span&gt;&lt;span class="nv"&gt;$ts&lt;/span&gt;&lt;span class="sh"&gt;] &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$method&lt;/span&gt;&lt;span class="sh"&gt; http://&lt;/span&gt;&lt;span class="nv"&gt;$host$path&lt;/span&gt;&lt;span class="sh"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$proto&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="sh"&gt; - -&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;";
}
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/live_capture.txt | perl ~/log2clf.pl &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/live_clf.txt
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/live_clf.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output confirms the live traffic converted correctly to CLF:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;172.66.147.243 - - [2026-05-04 12:44:34.618] "GET http://example.com/ HTTP/1.1" - -
142.250.187.78 - - [2026-05-04 12:44:38.835] "GET http://google.com/ HTTP/1.1" - -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85plt2loeq4ybwirvhlk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85plt2loeq4ybwirvhlk.png" alt=" " width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Verify Everything Worked
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Expected Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Httpry is installed&lt;/td&gt;
&lt;td&gt;&lt;code&gt;which httpry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/usr/sbin/httpry&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Passive read works&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo httpry -r file.pcap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTTP lines printed, packets parsed count shown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Log file created&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cat httpry_log.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Header + tab-separated HTTP data rows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLF conversion&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cat httpry_clf.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lines formatted as &lt;code&gt;IP - - [timestamp] "METHOD url proto" - -&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live capture works&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sudo httpry -i eth0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Real-time HTTP events printed to terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live log saved&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cat live_capture.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same format as passive log with live timestamps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live CLF done&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cat live_clf.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CLF lines from live session&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Working through this taught me several things I did not fully appreciate before:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Httpry occupies a specific niche.&lt;/strong&gt; It is not trying to replace Wireshark or tcpdump. It is purpose-built for extracting HTTP metadata quickly — PSTR (Packet String Data). For network defenders who need to know &lt;em&gt;what HTTP activity happened&lt;/em&gt; without storing full packet payloads, this is a practical tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log format matters for toolchain compatibility.&lt;/strong&gt; Httpry's native format is clean and readable, but most SIEM tools, log parsers, and web analytics tools expect Common Log Format. Writing the Perl conversion script made it clear why standardization exists — a few field reorderings and you can feed Httpry output into tools designed for Apache logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passive vs live monitoring are different operational modes.&lt;/strong&gt; Reading a pcap file is deterministic and repeatable — useful for forensics and post-incident analysis. Live capture on an interface is real-time but ephemeral. Both have their place, and knowing when to use each is part of being a practical network analyst.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Httpry's &lt;code&gt;-r&lt;/code&gt; flag is the key for forensic work.&lt;/strong&gt; Most forensic workflows start with a pcap you already have. Being able to extract HTTP-layer data from it without re-opening Wireshark is genuinely useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Why It Happens&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Running Httpry without &lt;code&gt;sudo&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Packet capture needs root privileges&lt;/td&gt;
&lt;td&gt;Always use &lt;code&gt;sudo httpry ...&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong interface name&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;eth0&lt;/code&gt; vs &lt;code&gt;eth1&lt;/code&gt; vs &lt;code&gt;ens33&lt;/code&gt; varies by system&lt;/td&gt;
&lt;td&gt;Check with &lt;code&gt;ip a&lt;/code&gt; or &lt;code&gt;ifconfig&lt;/code&gt; before running&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perl script not filtering &lt;code&gt;#&lt;/code&gt; comment lines&lt;/td&gt;
&lt;td&gt;The Httpry log file starts with comment headers&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;next if /^#/;&lt;/code&gt; at the start of the while loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLF output shows wrong field order&lt;/td&gt;
&lt;td&gt;Tab-split index off by one&lt;/td&gt;
&lt;td&gt;Print and count the raw fields to verify &lt;code&gt;@fields&lt;/code&gt; alignment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;make install&lt;/code&gt; fails with "no such file" for man page&lt;/td&gt;
&lt;td&gt;Kali may not have &lt;code&gt;/usr/man/man1/&lt;/code&gt; pre-created&lt;/td&gt;
&lt;td&gt;This is a cosmetic error — the binary installs correctly to &lt;code&gt;/usr/sbin/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pcap file has no HTTP traffic&lt;/td&gt;
&lt;td&gt;Traffic was captured on HTTPS only&lt;/td&gt;
&lt;td&gt;HTTP (port 80) traffic is needed; HTTPS (443) is encrypted and not visible to Httpry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;httpry_log.txt&lt;/code&gt; is empty&lt;/td&gt;
&lt;td&gt;Ran without &lt;code&gt;-q&lt;/code&gt; and output went to stdout only&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;-o filename.txt&lt;/code&gt; to save to file&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Httpry is one of those tools that earns its place precisely because it does one thing and does it well. When you need a fast answer to "what HTTP traffic happened between these IPs during this window?" — whether from a historical pcap or a live interface — Httpry gets you there without the overhead of full packet capture.&lt;/p&gt;

&lt;p&gt;The CLF conversion step is a practical bridge between Httpry's output and the broader ecosystem of log analysis tools. Once your data is in CLF, you can pipe it into any number of parsers, dashboards, or SIEM inputs.&lt;/p&gt;

&lt;p&gt;If you are building a network monitoring toolkit, Httpry deserves a spot alongside your pcap tools — not instead of them, but as a faster, lighter option for HTTP-specific questions.&lt;/p&gt;

</description>
      <category>httpry</category>
      <category>kalilinux</category>
      <category>livemonitoring</category>
      <category>passivecapture</category>
    </item>
    <item>
      <title>Lab Task 10 -Packet Capture on Kali Linux: Daemonlogger Setup, Traffic Generation &amp; Wireshark Analysis</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Sat, 13 Jun 2026 05:18:06 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/lab-task-10-packet-capture-on-kali-linux-daemonlogger-setup-traffic-generation-wireshark-o7n</link>
      <guid>https://dev.to/almahmudkhalif/lab-task-10-packet-capture-on-kali-linux-daemonlogger-setup-traffic-generation-wireshark-o7n</guid>
      <description>&lt;p&gt;There's a big difference between knowing a network tool exists and actually sitting down, running it, watching the packets pile up, and then making sense of what you captured. This post walks through exactly that — installing &lt;strong&gt;Daemonlogger&lt;/strong&gt; on Kali Linux, generating real mixed traffic using &lt;code&gt;ping&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;iperf3&lt;/code&gt;, and a browser, then loading the &lt;code&gt;.pcap&lt;/code&gt; file into &lt;strong&gt;Wireshark&lt;/strong&gt; and pulling out meaningful numbers.&lt;/p&gt;

&lt;p&gt;Everything here is from my own hands-on session. The screenshots are real, the packet counts are real, and the mistakes I made along the way were very real too.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Daemonlogger?
&lt;/h2&gt;

&lt;p&gt;Most people reach for Wireshark when they want to capture traffic. That's fine for short sessions, but Wireshark's live capture is heavy — GUI, real-time rendering, constant screen updates. Daemonlogger is the opposite: a lightweight, command-line tool that runs quietly in the background and writes everything to a &lt;code&gt;.pcap&lt;/code&gt; file. No GUI, no overhead. You generate traffic, stop it when you're done, and &lt;em&gt;then&lt;/em&gt; open the file in Wireshark to analyze at your own pace.&lt;/p&gt;

&lt;p&gt;For anything resembling real-world passive monitoring, that's a much cleaner workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OS:&lt;/strong&gt; Kali Linux 2026.1 (Oracle VirtualBox)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Interface:&lt;/strong&gt; &lt;code&gt;eth0&lt;/code&gt; — IP &lt;code&gt;10.0.2.15&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools used:&lt;/strong&gt; &lt;code&gt;daemonlogger&lt;/code&gt;, &lt;code&gt;iperf3&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;ping&lt;/code&gt;, Firefox browser, &lt;code&gt;wireshark&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1 — Install Daemonlogger
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;daemonlogger &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, run it with &lt;code&gt;--help&lt;/code&gt; to confirm it's working and to review the available flags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;daemonlogger &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5atnyfadb4bmey30myi7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5atnyfadb4bmey30myi7.png" alt=" " width="800" height="911"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The key flags you'll use most:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i &amp;lt;intf&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Capture from this network interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-l &amp;lt;path&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Write log files to this directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-n &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set the output filename prefix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Daemonize (run in background)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 2 — Identify Your Network Interface
&lt;/h2&gt;

&lt;p&gt;Before starting any capture, confirm which interface is active and note its IP address.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip &lt;span class="nb"&gt;link &lt;/span&gt;show
ifconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjgacc746czvofmo53i7y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjgacc746czvofmo53i7y.png" alt=" " width="799" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my setup, &lt;code&gt;eth0&lt;/code&gt; was the active interface at &lt;code&gt;10.0.2.15&lt;/code&gt;. The loopback &lt;code&gt;lo&lt;/code&gt; was also present but not useful for capturing external traffic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Create Log Directory and Start Capture
&lt;/h2&gt;

&lt;p&gt;Create the directory where Daemonlogger will save the &lt;code&gt;.pcap&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; /var/log/daemonlogger
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then start the capture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;daemonlogger &lt;span class="nt"&gt;-i&lt;/span&gt; eth0 &lt;span class="nt"&gt;-l&lt;/span&gt; /var/log/daemonlogger/ &lt;span class="nt"&gt;-n&lt;/span&gt; capture
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kgspvog9trsamyt2q12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kgspvog9trsamyt2q12.png" alt=" " width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you see "sniffing on interface eth0" and the &lt;code&gt;.pcap&lt;/code&gt; filename appear, Daemonlogger is running and capturing everything. Leave this terminal open and move on to generating traffic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Generate Traffic
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ICMP — Ping
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping google.com &lt;span class="nt"&gt;-c&lt;/span&gt; 50
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1ebdtoi0im9m1pz73lx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1ebdtoi0im9m1pz73lx.png" alt=" " width="800" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The ping resolved &lt;code&gt;google.com&lt;/code&gt; to &lt;code&gt;142.250.187.78&lt;/code&gt; and sent 22 packets before I stopped it. Zero packet loss. The &lt;code&gt;curl&lt;/code&gt; to &lt;code&gt;testph.vulnweb.com&lt;/code&gt; on port 80 timed out with a connection error — that attempt still generated DNS + TCP SYN traffic worth capturing.&lt;/p&gt;

&lt;h3&gt;
  
  
  HTTP — curl
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://testph.vulnweb.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even a failed connection creates traffic. DNS resolution, TCP handshake attempts, and RST/timeout packets all end up in the capture file.&lt;/p&gt;

&lt;h3&gt;
  
  
  TCP Throughput — iperf3
&lt;/h3&gt;

&lt;p&gt;Open two terminals. In the first, start the iperf3 server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;iperf3 &lt;span class="nt"&gt;-s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the second, connect as a client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;iperf3 &lt;span class="nt"&gt;-c&lt;/span&gt; 127.0.0.1 &lt;span class="nt"&gt;-t&lt;/span&gt; 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fofrk3ipwtz2m9ywcx33o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fofrk3ipwtz2m9ywcx33o.png" alt=" " width="800" height="906"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The iperf3 test pushed ~43–46 Gbits/sec over loopback for 30 seconds. This floods the capture with a burst of TCP segments that show up clearly later in the IO Graph.&lt;/p&gt;

&lt;h3&gt;
  
  
  Website Visits — Browser
&lt;/h3&gt;

&lt;p&gt;With Daemonlogger still running, I opened Firefox inside the Kali VM and visited several sites — including an intentionally unencrypted HTTP site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://neverssl.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fntnr7j6a9slwuh36k9g6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fntnr7j6a9slwuh36k9g6.png" alt=" " width="800" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NeverSSL is designed specifically for this — it never redirects to HTTPS, so the full HTTP request and response are visible in the capture as plain text.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Stop Capture and Check the File
&lt;/h2&gt;

&lt;p&gt;Stop Daemonlogger with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pkill daemonlogger
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then check what was saved:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; /var/log/daemonlogger/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4q9xutcee5o3mo9qqd2e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4q9xutcee5o3mo9qqd2e.png" alt=" " width="799" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuot51859eyi6cax47lyx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuot51859eyi6cax47lyx.png" alt=" " width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result: 13,439 packets captured in a 9.6 MB file.&lt;/strong&gt; Zero drops — the system kept up with every single packet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6 — Install Wireshark and Open the File
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;wireshark &lt;span class="nt"&gt;-y&lt;/span&gt;
wireshark /var/log/daemonlogger/capture&lt;span class="k"&gt;*&lt;/span&gt;.pcap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm08ef7ub6wndlzvj76vc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm08ef7ub6wndlzvj76vc.png" alt=" " width="800" height="902"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wireshark loaded the full 13,439-packet capture without any issues.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7 — Wireshark Analysis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  HTTP Traffic
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Display filter:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;http
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6844zutx3tk6wrtn4jz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6844zutx3tk6wrtn4jz.png" alt=" " width="800" height="910"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP packet count: 25&lt;/strong&gt; (0.2% of total capture)&lt;/p&gt;




&lt;h3&gt;
  
  
  HTTPS Traffic
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Display filter:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssl || tls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foseyp33rxjt45bh1ihw4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foseyp33rxjt45bh1ihw4.png" alt=" " width="800" height="907"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTPS packet count: 1,833&lt;/strong&gt; (13.6% of total capture)&lt;/p&gt;




&lt;h3&gt;
  
  
  TCP Traffic
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Display filter:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fde22g2u3zr7eav5sircj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fde22g2u3zr7eav5sircj.png" alt=" " width="800" height="912"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TCP packet count: 11,739&lt;/strong&gt; (87.4% of total capture)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This makes sense — HTTP, HTTPS, and iperf3 all run over TCP. Filtering &lt;code&gt;tcp&lt;/code&gt; captures all of them plus the raw handshakes and teardowns.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Top Conversations
&lt;/h3&gt;

&lt;p&gt;Navigate to: &lt;strong&gt;Statistics → Conversations → TCP tab&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz79bihol0cu032ubsr5d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz79bihol0cu032ubsr5d.png" alt=" " width="800" height="906"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The machine at &lt;code&gt;10.0.2.15&lt;/code&gt; was the top talker — all outbound traffic originated here. Top destinations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source IP&lt;/th&gt;
&lt;th&gt;Destination IP&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10.0.2.15&lt;/td&gt;
&lt;td&gt;34.107.243.93&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.0.2.15&lt;/td&gt;
&lt;td&gt;34.223.124.45&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.0.2.15&lt;/td&gt;
&lt;td&gt;34.223.124.45&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.0.2.15&lt;/td&gt;
&lt;td&gt;44.228.249.3&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Top Protocols by Usage
&lt;/h3&gt;

&lt;p&gt;Navigate to: &lt;strong&gt;Statistics → Protocol Hierarchy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8b8ic6thrufou7r0li1u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8b8ic6thrufou7r0li1u.png" alt=" " width="800" height="910"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;% of Packets&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP&lt;/td&gt;
&lt;td&gt;8.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OCSP&lt;/td&gt;
&lt;td&gt;8.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ICMP&lt;/td&gt;
&lt;td&gt;present in unfiltered view&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  IO Graph
&lt;/h3&gt;

&lt;p&gt;Navigate to: &lt;strong&gt;Statistics → I/O Graph&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wwv5ggvmbou4fhuabff.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wwv5ggvmbou4fhuabff.png" alt=" " width="800" height="909"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The IO graph tells the timing story of the entire session:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spike at ~250s&lt;/strong&gt; — the 30-second &lt;code&gt;iperf3&lt;/code&gt; burst pushing thousands of TCP segments per second&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quiet baseline&lt;/strong&gt; — background HTTPS traffic from browser activity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Late spike near ~1000s&lt;/strong&gt; — the NeverSSL and other website browsing sessions generating another burst&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Capturing Login Credentials over HTTP
&lt;/h3&gt;

&lt;p&gt;For any site using plain HTTP (no TLS), Wireshark can show form submissions in full. Apply this filter to find POST requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;method&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;"POST"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then right-click any matching packet → &lt;strong&gt;Follow → HTTP Stream&lt;/strong&gt; to read the complete request body, including any username and password fields submitted through an HTML form.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is exactly why HTTPS matters. The same capture on an HTTPS connection shows only encrypted TLS Application Data — credentials are completely invisible.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Results Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total packets captured&lt;/td&gt;
&lt;td&gt;13,439&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Capture file size&lt;/td&gt;
&lt;td&gt;9.6 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP packets&lt;/td&gt;
&lt;td&gt;25 (0.2%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS / TLS packets&lt;/td&gt;
&lt;td&gt;1,833 (13.6%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TCP packets&lt;/td&gt;
&lt;td&gt;11,739 (87.4%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Packets dropped by kernel&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Top source IP&lt;/td&gt;
&lt;td&gt;10.0.2.15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Top destination ports&lt;/td&gt;
&lt;td&gt;443, 80&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How to Verify
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What to check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Daemonlogger started&lt;/td&gt;
&lt;td&gt;Output shows "sniffing on interface eth0"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Packets being captured&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.pcap&lt;/code&gt; file grows in size while traffic runs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clean stop&lt;/td&gt;
&lt;td&gt;Output shows exact packet count and zero drops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wireshark loads file&lt;/td&gt;
&lt;td&gt;Packet list populates, no parse errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;http&lt;/code&gt; filter&lt;/td&gt;
&lt;td&gt;Returns GET/POST/response packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`ssl \&lt;/td&gt;
&lt;td&gt;tls` filter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;tcp&lt;/code&gt; filter&lt;/td&gt;
&lt;td&gt;Returns ~87%+ of all packets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversations tab&lt;/td&gt;
&lt;td&gt;Shows source/dest IP pairs with port numbers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IO Graph&lt;/td&gt;
&lt;td&gt;Shows visible spikes at iperf3 burst timing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Going through this hands-on made a few things click that reading never quite did:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TCP is everywhere.&lt;/strong&gt; Filtering &lt;code&gt;tcp&lt;/code&gt; returns 87% of the capture because HTTP, HTTPS, iperf3, and most real-world traffic all run over TCP. The protocol isn't just one thing — it's the transport layer underneath almost everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Daemonlogger is better than live Wireshark for background capture.&lt;/strong&gt; No GUI overhead, no rendering lag, just packets written to disk. For any kind of monitoring scenario, that matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plain HTTP credentials are genuinely, immediately visible.&lt;/strong&gt; Not "theoretically exposed" — actually readable, in plain text, in a filter result. Seeing it in Wireshark removes any remaining abstract quality from the risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IO graphs are often the first place to look.&lt;/strong&gt; When something unusual happens on a network, the IO graph shows &lt;em&gt;when&lt;/em&gt; it happened before you've read a single packet. The iperf3 spike is unmistakable — it's the tallest feature on the graph.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero packet drops is worth celebrating.&lt;/strong&gt; At 43–46 Gbits/sec of iperf3 traffic, the Kali VM kept up with every single packet. That's worth noting because packet drop is a real issue in high-throughput capture environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Running daemonlogger without &lt;code&gt;sudo&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Permission denied — raw socket access requires root&lt;/td&gt;
&lt;td&gt;Always prefix with &lt;code&gt;sudo&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skipping &lt;code&gt;mkdir&lt;/code&gt; for the log directory&lt;/td&gt;
&lt;td&gt;Daemonlogger exits immediately with path error&lt;/td&gt;
&lt;td&gt;Create the directory first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong interface name&lt;/td&gt;
&lt;td&gt;No packets captured — capture starts but file stays empty&lt;/td&gt;
&lt;td&gt;Verify with &lt;code&gt;ip link show&lt;/code&gt; before starting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opening &lt;code&gt;.pcap&lt;/code&gt; before killing daemonlogger&lt;/td&gt;
&lt;td&gt;Wireshark shows truncated/incomplete data&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sudo pkill daemonlogger&lt;/code&gt; first, then open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Using only &lt;code&gt;ssl&lt;/code&gt; filter&lt;/td&gt;
&lt;td&gt;Misses QUIC and TLSv1.3 in newer captures&lt;/td&gt;
&lt;td&gt;Use `ssl \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expecting to see HTTPS credentials&lt;/td&gt;
&lt;td&gt;Empty results from POST filter&lt;/td&gt;
&lt;td&gt;Credential visibility only works on plain HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The full workflow — Daemonlogger for silent capture, mixed traffic from {% raw %}&lt;code&gt;ping&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;iperf3&lt;/code&gt;, and real browser sessions, then Wireshark for structured analysis — gives you a complete picture of what's happening on a network interface. The numbers from this session (13,439 packets, 87.4% TCP, 1,833 TLS packets, 25 HTTP packets, zero drops) aren't just statistics. They show exactly how a modern endpoint behaves: mostly encrypted HTTPS, with TCP as the invisible backbone underneath all of it, and a small but meaningful slice of plain-text HTTP that should never carry sensitive data.&lt;/p&gt;

&lt;p&gt;If you want to actually understand network traffic rather than just read about it, start here. Capture it, count it, follow the streams, and look at the IO graph. The packets tell the whole story.&lt;/p&gt;

</description>
      <category>wireshark</category>
      <category>kalilinux</category>
      <category>networking</category>
      <category>packetcapture</category>
    </item>
    <item>
      <title>Lab 9 - Building a Cisco ASA Firewall Lab in GNS3: Inside, DMZ, and Outside Zones with Extended ACLs</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Fri, 12 Jun 2026 18:43:17 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/lab-9-building-a-cisco-asa-firewall-lab-in-gns3-inside-dmz-and-outside-zones-with-extended-acls-1ib</link>
      <guid>https://dev.to/almahmudkhalif/lab-9-building-a-cisco-asa-firewall-lab-in-gns3-inside-dmz-and-outside-zones-with-extended-acls-1ib</guid>
      <description>&lt;p&gt;Firewalls sit at the heart of every real enterprise network. But reading about them and actually building one are two very different things. I wanted to go beyond theory and get hands-on experience — so I set up a full multi-zone network in GNS3 using a Cisco ASAv firewall, three routers, four PCs, and proper ACL rules.&lt;/p&gt;

&lt;p&gt;This article walks through everything: importing the firewall into GNS3, building the topology, configuring security zones, setting up RIP routing, writing extended ACL rules, and verifying it all with pings and ICMP debug traces.&lt;/p&gt;

&lt;p&gt;If you've been curious about how enterprise firewalls actually work — this is a good place to start.&lt;/p&gt;




&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;Most networking labs stop at basic routing. But in real environments, you need to separate trusted internal networks from public-facing servers and the outside world — and you need the firewall to enforce those boundaries.&lt;/p&gt;

&lt;p&gt;The challenge here was to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Import and configure a Cisco ASAv firewall inside GNS3&lt;/li&gt;
&lt;li&gt;Build a topology with three distinct security zones: &lt;strong&gt;Inside (trusted LAN)&lt;/strong&gt;, &lt;strong&gt;DMZ (semi-trusted)&lt;/strong&gt;, and &lt;strong&gt;Outside (untrusted)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Assign the correct security levels to each firewall interface&lt;/li&gt;
&lt;li&gt;Run RIP across all routers and the firewall so the whole topology can communicate&lt;/li&gt;
&lt;li&gt;Write extended ACL rules that explicitly allow ICMP (ping) traffic in and out of each zone&lt;/li&gt;
&lt;li&gt;Verify everything with ping tests and live ICMP debug traces on the firewall&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Topology
&lt;/h2&gt;

&lt;p&gt;Before touching any commands, it helps to understand what we're building.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4ajbkp4d8k5oj54etca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4ajbkp4d8k5oj54etca.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network layout:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Zone&lt;/th&gt;
&lt;th&gt;Network&lt;/th&gt;
&lt;th&gt;Security Level&lt;/th&gt;
&lt;th&gt;Devices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inside (trusted LAN)&lt;/td&gt;
&lt;td&gt;192.168.1.0/24&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;PC4, LAN-Switch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMZ (semi-trusted)&lt;/td&gt;
&lt;td&gt;192.168.20.0/24&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;PC3, DMZ-Switch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outside (untrusted)&lt;/td&gt;
&lt;td&gt;192.168.10.0/24, 192.168.30.0/24&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;PC1, PC2, Routers R1–R3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Firewall interfaces:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Interface&lt;/th&gt;
&lt;th&gt;Zone&lt;/th&gt;
&lt;th&gt;IP Address&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GigabitEthernet0/0&lt;/td&gt;
&lt;td&gt;inside&lt;/td&gt;
&lt;td&gt;192.168.1.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GigabitEthernet0/1&lt;/td&gt;
&lt;td&gt;dmz&lt;/td&gt;
&lt;td&gt;192.168.20.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GigabitEthernet0/2&lt;/td&gt;
&lt;td&gt;outside&lt;/td&gt;
&lt;td&gt;192.168.40.2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Router-to-router links:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;th&gt;IPs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;R1 f0/0 ↔ R2 f0/0&lt;/td&gt;
&lt;td&gt;1.1.1.1 / 1.1.1.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2 f1/0 ↔ R3 f0/0&lt;/td&gt;
&lt;td&gt;2.2.2.1 / 2.2.2.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R1 f1/0 ↔ R3 f1/0&lt;/td&gt;
&lt;td&gt;3.3.3.1 / 3.3.3.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2 f2/0 ↔ ASA Gi0/2&lt;/td&gt;
&lt;td&gt;192.168.40.1 / 192.168.40.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R3 f2/0&lt;/td&gt;
&lt;td&gt;192.168.30.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R1 f2/0&lt;/td&gt;
&lt;td&gt;192.168.10.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1 — Importing the Cisco ASAv Firewall into GNS3
&lt;/h2&gt;

&lt;p&gt;The ASAv isn't built into GNS3 by default — you need to import it manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open GNS3 and click the device list panel on the left&lt;/li&gt;
&lt;li&gt;At the bottom, click &lt;strong&gt;+ New template&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Install an appliance from the GNS3 server (recommended)&lt;/strong&gt; → click Next&lt;/li&gt;
&lt;li&gt;From the Firewalls category, select &lt;strong&gt;Cisco ASAv&lt;/strong&gt; → click Install&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Install the appliance on the GNS3 VM (recommended)&lt;/strong&gt; → click Next&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;/bin/qemu-system-x86_64&lt;/code&gt; as the Qemu binary → Next&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;ASAv version 9.9.2&lt;/strong&gt;, click &lt;strong&gt;Import&lt;/strong&gt;, and point it to your &lt;code&gt;asav992.qcow2&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;If GNS3 warns about MD5 mismatch, click &lt;strong&gt;Yes&lt;/strong&gt; to accept anyway&lt;/li&gt;
&lt;li&gt;Once the status shows &lt;strong&gt;Ready to install&lt;/strong&gt;, click Next → confirm with &lt;strong&gt;Yes&lt;/strong&gt; → Finish&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After installing, right-click the ASAv in your device list → &lt;strong&gt;Configure template&lt;/strong&gt; → change the symbol to the classic &lt;strong&gt;asa&lt;/strong&gt; icon so it's easy to identify on the canvas.&lt;/p&gt;

&lt;p&gt;Drag the firewall onto the canvas and start it. Open its console — it will do a double boot (this is normal). Wait until you see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;ciscoasa&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2 — Configuring PC IP Addresses
&lt;/h2&gt;

&lt;p&gt;Each PC is a VPCS node. Open each console and assign IPs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PC1 (Outside zone — 192.168.30.x):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip 192.168.30.15 255.255.255.0 192.168.30.1
save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PC2 (Outside zone — 192.168.10.x):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip 192.168.10.5 255.255.255.0 192.168.10.1
save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PC3 (DMZ zone):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip 192.168.20.15 255.255.255.0 192.168.20.1
save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PC4 (Inside/LAN zone):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip 192.168.1.15 255.255.255.0 192.168.1.1
save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgmq6yj3cgcd7i3cc6gvw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgmq6yj3cgcd7i3cc6gvw.png" alt=" " width="684" height="734"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fguacsqjvdbw4mfcq6yws.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fguacsqjvdbw4mfcq6yws.png" alt=" " width="800" height="929"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F40lc3ztjen5ld5ovwdqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F40lc3ztjen5ld5ovwdqo.png" alt=" " width="800" height="689"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft5rqvloy0jquduum914a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft5rqvloy0jquduum914a.png" alt=" " width="800" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verify with &lt;code&gt;show ip&lt;/code&gt; on each PC.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Configuring the Routers
&lt;/h2&gt;

&lt;p&gt;All three routers use Cisco IOS. The configuration pattern is the same for each — assign IPs to interfaces, bring them up, then enable RIP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;R1 configuration:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;enable
&lt;/span&gt;configure terminal

interface f0/0
 ip address 1.1.1.1 255.255.255.0
 no shutdown
 &lt;span class="nb"&gt;exit

&lt;/span&gt;interface f1/0
 ip address 3.3.3.1 255.255.255.0
 no shutdown
 &lt;span class="nb"&gt;exit

&lt;/span&gt;interface f2/0
 ip address 192.168.10.1 255.255.255.0
 no shutdown
 &lt;span class="nb"&gt;exit

&lt;/span&gt;router rip
 version 2
 no auto-summary
 network 1.1.1.0
 network 3.3.3.0
 network 192.168.10.0
 &lt;span class="nb"&gt;exit

&lt;/span&gt;&lt;span class="k"&gt;do &lt;/span&gt;wr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuxbjlob71p96zbooijun.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuxbjlob71p96zbooijun.png" alt=" " width="800" height="656"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ou0w96dj28p4n1v4sx9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ou0w96dj28p4n1v4sx9.png" alt=" " width="800" height="657"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;R2 configuration:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;enable
&lt;/span&gt;configure terminal

interface f0/0
 ip address 1.1.1.2 255.255.255.0
 no shutdown
 &lt;span class="nb"&gt;exit

&lt;/span&gt;interface f1/0
 ip address 2.2.2.1 255.255.255.0
 no shutdown
 &lt;span class="nb"&gt;exit

&lt;/span&gt;interface f2/0
 ip address 192.168.40.1 255.255.255.0
 no shutdown
 &lt;span class="nb"&gt;exit

&lt;/span&gt;router rip
 version 2
 no auto-summary
 network 1.1.1.0
 network 2.2.2.0
 network 192.168.40.0
 &lt;span class="nb"&gt;exit

&lt;/span&gt;&lt;span class="k"&gt;do &lt;/span&gt;wr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc01yr5l2pglyrtd7kg3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc01yr5l2pglyrtd7kg3w.png" alt=" " width="799" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmz8ht0vizwgfr6gic221.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmz8ht0vizwgfr6gic221.png" alt=" " width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;R3 configuration:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;enable
&lt;/span&gt;configure terminal

interface f0/0
 ip address 2.2.2.2 255.255.255.0
 no shutdown
 &lt;span class="nb"&gt;exit

&lt;/span&gt;interface f1/0
 ip address 3.3.3.2 255.255.255.0
 no shutdown
 &lt;span class="nb"&gt;exit

&lt;/span&gt;interface f2/0
 ip address 192.168.30.1 255.255.255.0
 no shutdown
 &lt;span class="nb"&gt;exit

&lt;/span&gt;router rip
 version 2
 no auto-summary
 network 2.2.2.0
 network 3.3.3.0
 network 192.168.30.0
 &lt;span class="nb"&gt;exit

&lt;/span&gt;&lt;span class="k"&gt;do &lt;/span&gt;wr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frf7o88nna0kjiafppxab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frf7o88nna0kjiafppxab.png" alt=" " width="799" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihgocw0nqyhgwuqm0p3b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihgocw0nqyhgwuqm0p3b.png" alt=" " width="799" height="434"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Configuring the Cisco ASA Firewall
&lt;/h2&gt;

&lt;p&gt;This is where things get interesting. The ASA uses a concept called &lt;strong&gt;security levels&lt;/strong&gt; — every interface gets a name (zone) and a trust number from 0 to 100. Higher is more trusted.&lt;/p&gt;

&lt;p&gt;Open the ASA console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ciscoasa&amp;gt; en
Password: &lt;span class="o"&gt;(&lt;/span&gt;just press Enter — no default password&lt;span class="o"&gt;)&lt;/span&gt;
ciscoasa# configure terminal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Configure the Inside interface (security level 100 — most trusted):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;interface gigabitEthernet 0/0
 nameif inside
 security-level 100
 ip address 192.168.1.1 255.255.255.0
 no shutdown
 &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you type &lt;code&gt;nameif inside&lt;/code&gt;, the ASA automatically sets security-level 100.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure the DMZ interface (security level 50):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;interface gigabitEthernet 0/1
 nameif dmz
 security-level 50
 ip address 192.168.20.1 255.255.255.0
 no shutdown
 &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Configure the Outside interface (security level 0 — least trusted):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;interface gigabitEthernet 0/2
 nameif outside
 security-level 0
 ip address 192.168.40.2 255.255.255.0
 no shutdown
 &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verify your zones and IPs:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;show nameif
show ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx21itjittpbsj41qtevt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx21itjittpbsj41qtevt.png" alt=" " width="750" height="1043"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx9z7vhbo9meug3k1adsq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx9z7vhbo9meug3k1adsq.png" alt=" " width="800" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable RIP on the firewall:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;configure terminal
router rip
 version 2
 no auto-summary
 network 192.168.1.0
 network 192.168.20.0
 network 192.168.40.0
 &lt;span class="nb"&gt;exit

&lt;/span&gt;write memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0otyyslv2v1t7wdbnxqw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0otyyslv2v1t7wdbnxqw.png" alt=" " width="761" height="508"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — How ASA Security Levels Work
&lt;/h2&gt;

&lt;p&gt;Before writing ACL rules, it's worth understanding why we need them.&lt;/p&gt;

&lt;p&gt;The ASA's default behavior based on security levels:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traffic Direction&lt;/th&gt;
&lt;th&gt;Allowed by Default?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;High → Low (e.g., inside → outside)&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low → High (e.g., outside → inside)&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same level → Same level&lt;/td&gt;
&lt;td&gt;❌ No (unless configured)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So by default, &lt;strong&gt;inside can reach outside&lt;/strong&gt;, but &lt;strong&gt;outside cannot reach inside&lt;/strong&gt;. Even inside → DMZ pings will fail — because even though the request leaves the inside interface, the ICMP &lt;strong&gt;reply&lt;/strong&gt; coming back from DMZ (lower security) to inside (higher security) is blocked.&lt;/p&gt;

&lt;p&gt;This is why we write explicit ACL rules.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6 — Creating Extended ACL Rules for ICMP
&lt;/h2&gt;

&lt;p&gt;We need to allow ICMP traffic (ping) in and out of all three zones. The approach: create a named ACL for each interface in each direction, then bind it to the interface with &lt;code&gt;access-group&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;configure terminal

&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;---&lt;/span&gt; Inside interface rules &lt;span class="nt"&gt;---&lt;/span&gt;
access-list INSIDE_ACCESS_IN extended permit icmp any any
access-list INSIDE_ACCESS_OUT extended permit icmp any any
access-group INSIDE_ACCESS_IN &lt;span class="k"&gt;in &lt;/span&gt;interface inside
access-group INSIDE_ACCESS_OUT out interface inside

&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;---&lt;/span&gt; DMZ interface rules &lt;span class="nt"&gt;---&lt;/span&gt;
access-list DMZ_ACCESS_IN extended permit icmp any any
access-list DMZ_ACCESS_OUT extended permit icmp any any
access-group DMZ_ACCESS_IN &lt;span class="k"&gt;in &lt;/span&gt;interface dmz
access-group DMZ_ACCESS_OUT out interface dmz

&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;---&lt;/span&gt; Outside interface rules &lt;span class="nt"&gt;---&lt;/span&gt;
access-list OUTSIDE_ACCESS_IN extended permit icmp any any
access-list OUTSIDE_ACCESS_OUT extended permit icmp any any
access-group OUTSIDE_ACCESS_IN &lt;span class="k"&gt;in &lt;/span&gt;interface outside
access-group OUTSIDE_ACCESS_OUT out interface outside

write memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verify all ACLs were created:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;show access-list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi05gxwcmdj2gdnir5tj4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi05gxwcmdj2gdnir5tj4.png" alt=" " width="800" height="865"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7 — Verifying with Ping Tests
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Test 1: PC1 → PC2 (Outside to Outside)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both are in the outside zone and communicate through the router infrastructure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PC1&amp;gt; ping 192.168.10.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected: 5/5 successful pings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6aev1my5ovkkzenuncuw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6aev1my5ovkkzenuncuw.png" alt=" " width="758" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test 2: PC4 → PC3 (Inside → DMZ)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PC4 is in the trusted LAN, PC3 is in the DMZ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PC4&amp;gt; ping 192.168.20.15
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected: 5/5 successful pings after ACLs are applied.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw6qjoa2z1mid5bo3whlo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw6qjoa2z1mid5bo3whlo.png" alt=" " width="761" height="508"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8 — ICMP Debug Trace on the Firewall
&lt;/h2&gt;

&lt;p&gt;The real power of the ASA is visibility. Enable debug mode on the firewall while running pings to see exactly what traffic is passing through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ciscoasa# debug icmp trace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see live output like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ICMP echo request from inside:192.168.1.15 to dmz:192.168.20.15 ID=4758 seq=1 len=56
ICMP echo reply from dmz:192.168.20.15 to inside:192.168.1.15 ID=4758 seq=1 len=56
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both request and reply lines appearing means the ACL rules are working correctly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mc60ypbudkg82adwui7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mc60ypbudkg82adwui7.png" alt=" " width="710" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vutcb7r72q91g7z90dj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vutcb7r72q91g7z90dj.png" alt=" " width="800" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjlxndalvfam01688lhdj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjlxndalvfam01688lhdj.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1hr6vzjdswg3yrlv40gy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1hr6vzjdswg3yrlv40gy.png" alt=" " width="800" height="719"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To stop debug output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ciscoasa# undebug all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How to Verify Everything Is Working
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Expected Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Firewall zones&lt;/td&gt;
&lt;td&gt;&lt;code&gt;show nameif&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;inside/100, dmz/50, outside/0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firewall IPs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;show ip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All three interfaces showing correct IPs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Router routes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;show ip route&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RIP routes (R) to all networks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Router interfaces&lt;/td&gt;
&lt;td&gt;&lt;code&gt;show ip int br&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All configured interfaces showing "up/up"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC addresses&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;show ip&lt;/code&gt; (in VPCS)&lt;/td&gt;
&lt;td&gt;Correct IP/MASK/GATEWAY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ACL rules&lt;/td&gt;
&lt;td&gt;&lt;code&gt;show access-list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All 6 ACLs with permit icmp entries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ping inside→dmz&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ping 192.168.20.15&lt;/code&gt; from PC4&lt;/td&gt;
&lt;td&gt;5/5 success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ping outside→outside&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ping 192.168.10.5&lt;/code&gt; from PC1&lt;/td&gt;
&lt;td&gt;5/5 success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debug trace&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;debug icmp trace&lt;/code&gt; on ASA&lt;/td&gt;
&lt;td&gt;Paired request/reply lines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Cisco ASA security level model&lt;/strong&gt; is elegant — higher levels trust lower ones by default, but you still need explicit ACLs for stateful ICMP control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;nameif&lt;/code&gt;&lt;/strong&gt; is the ASA's way of naming and assigning a role to an interface — without it, the interface won't participate in any security policies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RIP on ASA&lt;/strong&gt; works the same way as on IOS routers — but you have to remember to include all directly connected networks&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;&lt;code&gt;debug icmp trace&lt;/code&gt;&lt;/strong&gt; command on the ASA is incredibly useful for real-time traffic verification — you can see exactly which interface traffic arrives on and leaves from&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACE order matters&lt;/strong&gt; — the ASA processes access-list entries top to bottom and stops at the first match; a broad permit placed above a narrow deny will always win&lt;/li&gt;
&lt;li&gt;The ASA &lt;strong&gt;blocks inbound ICMP replies by default&lt;/strong&gt; even when the original request was allowed — which is why you need both &lt;code&gt;in&lt;/code&gt; and &lt;code&gt;out&lt;/code&gt; ACLs on each interface for full bidirectional ICMP&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting &lt;code&gt;no shutdown&lt;/code&gt; on ASA interfaces&lt;/td&gt;
&lt;td&gt;Interface stays down, no traffic passes&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;no shutdown&lt;/code&gt; in interface config mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Not adding &lt;code&gt;no auto-summary&lt;/code&gt; in RIP&lt;/td&gt;
&lt;td&gt;Classful summarization breaks routing&lt;/td&gt;
&lt;td&gt;Always add &lt;code&gt;no auto-summary&lt;/code&gt; with RIPv2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Applying ACL only in one direction&lt;/td&gt;
&lt;td&gt;Ping requests go through but replies are dropped&lt;/td&gt;
&lt;td&gt;Create both &lt;code&gt;_IN&lt;/code&gt; and &lt;code&gt;_OUT&lt;/code&gt; ACLs per interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting &lt;code&gt;nameif&lt;/code&gt; on ASA interfaces&lt;/td&gt;
&lt;td&gt;Interface gets no security level or zone name&lt;/td&gt;
&lt;td&gt;Always set &lt;code&gt;nameif&lt;/code&gt; before assigning an IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setting wrong security level on outside&lt;/td&gt;
&lt;td&gt;Traffic behavior becomes unpredictable&lt;/td&gt;
&lt;td&gt;Outside should always be security-level 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Not running &lt;code&gt;write memory&lt;/code&gt; after config&lt;/td&gt;
&lt;td&gt;All settings lost after reboot&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;write memory&lt;/code&gt; after every change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assigning PC gateway to wrong IP&lt;/td&gt;
&lt;td&gt;Pings fail even if firewall is correct&lt;/td&gt;
&lt;td&gt;Gateway must match the firewall interface IP for that subnet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Deploying a Cisco ASA firewall in GNS3 goes well beyond just typing commands — it forces you to think about traffic flow, trust boundaries, and why explicit rules matter even when high-to-low traffic is theoretically allowed by default.&lt;/p&gt;

&lt;p&gt;The topology we built here mirrors what you'd actually see in a small enterprise: an untrusted outside zone, a DMZ for semi-public services, and a protected internal LAN. Adding RIP made the routing dynamic, and the debug traces made the firewall's decisions fully transparent.&lt;/p&gt;

&lt;p&gt;If you want to take this further, try replacing the ICMP-only ACLs with TCP rules for HTTP or SSH, or experiment with blocking specific hosts while allowing the rest of the subnet. The ASA's ACL engine gives you surgical-level control once you understand the order and direction model.&lt;/p&gt;

</description>
      <category>firewall</category>
      <category>gns3</category>
      <category>networking</category>
      <category>ciscoasa</category>
    </item>
    <item>
      <title>Lab Task 8 - How I Built a Multi-VLAN Network with Inter-VLAN Routing in GNS3 Using a Layer 3 Switch</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Fri, 12 Jun 2026 15:08:46 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/lab-task-8-how-i-built-a-multi-vlan-network-with-inter-vlan-routing-in-gns3-using-a-layer-3-switch-2i47</link>
      <guid>https://dev.to/almahmudkhalif/lab-task-8-how-i-built-a-multi-vlan-network-with-inter-vlan-routing-in-gns3-using-a-layer-3-switch-2i47</guid>
      <description>&lt;p&gt;Network segmentation is one of those concepts that sounds straightforward until you actually sit down and try to wire it up. I wanted to go beyond just reading about VLANs — I wanted to actually configure them, watch the traffic flow, and prove inter-VLAN communication works end-to-end. So I set up a GNS3 lab using a QEMU-based Cisco Layer 3 switch, built a three-PC topology across three VLANs, and got a successful ping from PC1 all the way to PC3.&lt;/p&gt;

&lt;p&gt;This post walks through everything: setting up GNS3 with VMware, importing the Layer 3 switch as a QEMU VM, building the topology, configuring VLANs, setting up SVIs as gateways, and verifying inter-VLAN routing works.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;By default, devices in different VLANs cannot communicate with each other. That's the whole point of VLANs — isolation. But in a real network, you still need controlled communication between segments (e.g., the Sales team reaching the IT team's servers). That's where a Layer 3 switch with SVI (Switched Virtual Interface) routing comes in.&lt;/p&gt;

&lt;p&gt;The goal of this lab:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create three VLANs (VLAN 6 — SALES, VLAN 7 — HR, VLAN 8 — IT)&lt;/li&gt;
&lt;li&gt;Connect one VPCS (virtual PC) to each VLAN&lt;/li&gt;
&lt;li&gt;Configure a trunk port on the switch&lt;/li&gt;
&lt;li&gt;Set up SVI gateways for each VLAN&lt;/li&gt;
&lt;li&gt;Enable IP routing so PCs on different VLANs can ping each other&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Topology
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fni90dxmiv74q47o1e6ts.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fni90dxmiv74q47o1e6ts.png" alt=" " width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IP Plan:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Device&lt;/th&gt;
&lt;th&gt;Interface&lt;/th&gt;
&lt;th&gt;IP Address&lt;/th&gt;
&lt;th&gt;Subnet Mask&lt;/th&gt;
&lt;th&gt;Gateway&lt;/th&gt;
&lt;th&gt;VLAN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PC1&lt;/td&gt;
&lt;td&gt;e0&lt;/td&gt;
&lt;td&gt;10.0.1.1&lt;/td&gt;
&lt;td&gt;255.255.255.0&lt;/td&gt;
&lt;td&gt;10.0.1.254&lt;/td&gt;
&lt;td&gt;VLAN 6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC2&lt;/td&gt;
&lt;td&gt;e0&lt;/td&gt;
&lt;td&gt;10.0.2.1&lt;/td&gt;
&lt;td&gt;255.255.255.0&lt;/td&gt;
&lt;td&gt;10.0.2.254&lt;/td&gt;
&lt;td&gt;VLAN 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC3&lt;/td&gt;
&lt;td&gt;e0&lt;/td&gt;
&lt;td&gt;10.0.3.1&lt;/td&gt;
&lt;td&gt;255.255.255.0&lt;/td&gt;
&lt;td&gt;10.0.3.254&lt;/td&gt;
&lt;td&gt;VLAN 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SVI VLAN 6&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;10.0.1.254&lt;/td&gt;
&lt;td&gt;255.255.255.0&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SVI VLAN 7&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;10.0.2.254&lt;/td&gt;
&lt;td&gt;255.255.255.0&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SVI VLAN 8&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;10.0.3.254&lt;/td&gt;
&lt;td&gt;255.255.255.0&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 1 — Set Up GNS3 VM in VMware
&lt;/h2&gt;

&lt;p&gt;Before anything else, GNS3 needs a backend VM to run QEMU-based appliances. The standard setup uses VMware Workstation with the GNS3 VM image.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download VMware Workstation Pro and install it (accept the EULA, add it to system PATH).&lt;/li&gt;
&lt;li&gt;Download the GNS3 VM &lt;code&gt;.ova&lt;/code&gt; file from &lt;a href="https://www.gns3.com/software/download-vm" rel="noopener noreferrer"&gt;gns3.com/software/download-vm&lt;/a&gt; — choose the VMware Workstation version.&lt;/li&gt;
&lt;li&gt;In VMware, go to &lt;strong&gt;File &amp;gt; Open&lt;/strong&gt;, select the &lt;code&gt;.ova&lt;/code&gt;, give it a name, and click &lt;strong&gt;Import&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Power on the GNS3 VM. You'll see the GNS3 server IP and port in the console.&lt;/li&gt;
&lt;li&gt;Open GNS3 on your host, run the Setup Wizard, and choose &lt;strong&gt;Run appliances in a virtual machine&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;VMware&lt;/strong&gt; as the virtualization engine, pick your imported VM from the dropdown, and finish the wizard.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Edit &amp;gt; Preferences &amp;gt; GNS3 VM&lt;/strong&gt;, tick &lt;strong&gt;Enable the GNS3 VM&lt;/strong&gt;, and click Apply.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 2 — Import the Layer 3 Switch as a QEMU VM
&lt;/h2&gt;

&lt;p&gt;The Cisco IOSvL2 switch runs as a QEMU VM inside GNS3. Here's how to get it in.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the &lt;code&gt;cisco-iosvl2.gns3a&lt;/code&gt; appliance file from the &lt;a href="https://www.gns3.com/marketplace/appliances/cisco-iosvl2" rel="noopener noreferrer"&gt;GNS3 Marketplace&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;In GNS3, click the &lt;strong&gt;Switches&lt;/strong&gt; icon in the left panel, then click &lt;strong&gt;+ New template&lt;/strong&gt; at the bottom.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Import an appliance (.gns3a extension)&lt;/strong&gt; and browse to the downloaded file.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Install the appliance on the GNS3 VM (recommended)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;On the required files screen, select the IOSvL2 version that shows &lt;strong&gt;Ready to install&lt;/strong&gt; and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The switch will now appear as &lt;strong&gt;Cisco IOSvL2&lt;/strong&gt; under the Switches panel.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 3 — Build the Topology
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Drag one &lt;strong&gt;Cisco IOSvL2&lt;/strong&gt; switch onto the canvas.&lt;/li&gt;
&lt;li&gt;Drag three &lt;strong&gt;VPCS&lt;/strong&gt; nodes (PC1, PC2, PC3) onto the canvas.&lt;/li&gt;
&lt;li&gt;Connect them:

&lt;ul&gt;
&lt;li&gt;PC1 &lt;code&gt;e0&lt;/code&gt; → Switch &lt;code&gt;e0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;PC2 &lt;code&gt;e0&lt;/code&gt; → Switch &lt;code&gt;e1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;PC3 &lt;code&gt;e0&lt;/code&gt; → Switch &lt;code&gt;e2&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add text labels for IP addresses, VLAN names, and gateway values.&lt;/li&gt;
&lt;li&gt;Start all devices (green play button).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 4 — Configure VLANs on the Switch
&lt;/h2&gt;

&lt;p&gt;Double-click the switch to open its console. Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Switch&amp;gt; &lt;span class="nb"&gt;enable
&lt;/span&gt;Switch# configure terminal

Switch&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# vlan 6&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-vlan&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# name SALES&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-vlan&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# exit&lt;/span&gt;

Switch&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# vlan 7&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-vlan&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# name HR&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-vlan&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# exit&lt;/span&gt;

Switch&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# vlan 8&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-vlan&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# name IT&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-vlan&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# exit&lt;/span&gt;

Switch# show vlan brief
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;VLAN&lt;/span&gt; Name                             Status    Ports
&lt;span class="k"&gt;----&lt;/span&gt; -------------------------------- --------- --------------------------------
&lt;span class="k"&gt;1    default&lt;/span&gt;                          active    Gi0/0, Gi0/1, Gi0/2, Gi0/3
&lt;span class="k"&gt;6    SALES&lt;/span&gt;                            active
&lt;span class="k"&gt;7    HR&lt;/span&gt;                               active
&lt;span class="k"&gt;8    IT&lt;/span&gt;                               active
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxud4hvg0qoioid7bpf4x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxud4hvg0qoioid7bpf4x.png" alt=" " width="800" height="435"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexcfr6pzfeorydngpquj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexcfr6pzfeorydngpquj.png" alt=" " width="798" height="248"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 5 — Configure Access Ports
&lt;/h2&gt;

&lt;p&gt;Assign each switch port to the correct VLAN:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Switch# configure terminal

&lt;span class="o"&gt;!&lt;/span&gt; PC1 connects on Gi0/0 → VLAN 6
Switch&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface gi0/0&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# switchport mode access&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# switchport access vlan 6&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# exit&lt;/span&gt;

&lt;span class="o"&gt;!&lt;/span&gt; PC2 connects on Gi0/1 → VLAN 7
Switch&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface gi0/1&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# switchport mode access&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# switchport access vlan 7&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# exit&lt;/span&gt;

&lt;span class="o"&gt;!&lt;/span&gt; PC3 connects on Gi0/2 → VLAN 8
Switch&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface gi0/2&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# switchport mode access&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# switchport access vlan 8&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frul8eapdk4pemln7myrv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frul8eapdk4pemln7myrv.png" alt=" " width="799" height="501"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6 — Configure the Trunk Port
&lt;/h2&gt;

&lt;p&gt;On a Layer 3 switch doing inter-VLAN routing, the uplink ports carrying multiple VLANs need to be trunk ports. If you have an uplink or a router-on-a-stick setup, configure it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Switch&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface gi0/3&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# switchport trunk encapsulation dot1q&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# switchport mode trunk&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# exit&lt;/span&gt;

Switch# show interfaces trunk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 7 — Configure SVI Gateways and Enable IP Routing
&lt;/h2&gt;

&lt;p&gt;This is the heart of inter-VLAN routing. Each VLAN gets a virtual interface (SVI) with an IP that acts as the default gateway for devices in that VLAN.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Switch# configure terminal

&lt;span class="o"&gt;!&lt;/span&gt; Enable IP routing — only needed once
Switch&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip routing&lt;/span&gt;

&lt;span class="o"&gt;!&lt;/span&gt; SVI &lt;span class="k"&gt;for &lt;/span&gt;VLAN 6
Switch&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface vlan 6&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 10.0.1.254 255.255.255.0&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# exit&lt;/span&gt;

&lt;span class="o"&gt;!&lt;/span&gt; SVI &lt;span class="k"&gt;for &lt;/span&gt;VLAN 7
Switch&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface vlan 7&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 10.0.2.254 255.255.255.0&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# exit&lt;/span&gt;

&lt;span class="o"&gt;!&lt;/span&gt; SVI &lt;span class="k"&gt;for &lt;/span&gt;VLAN 8
Switch&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface vlan 8&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 10.0.3.254 255.255.255.0&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;
Switch&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# exit&lt;/span&gt;

Switch&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# do write&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8x1igbvsaz82c194e7zq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8x1igbvsaz82c194e7zq.png" alt=" " width="800" height="723"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8 — Assign IPs to the PCs
&lt;/h2&gt;

&lt;p&gt;Open each VPCS console and assign its IP and gateway:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PC1:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PC1&amp;gt; ip 10.0.1.1/24 10.0.1.254
PC1&amp;gt; save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PC2:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PC2&amp;gt; ip 10.0.2.1/24 10.0.2.254
PC2&amp;gt; save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PC3:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PC3&amp;gt; ip 10.0.3.1/24 10.0.3.254
PC3&amp;gt; save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F318wep1fd5twc8yavzao.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F318wep1fd5twc8yavzao.png" alt=" " width="688" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4yvx0nobcjl2gslkseu8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4yvx0nobcjl2gslkseu8.png" alt=" " width="799" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0qldpo3ad8dqz3urilm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0qldpo3ad8dqz3urilm.png" alt=" " width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Verify
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Check VLANs exist on the switch
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Switch# show vlan brief
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All three VLANs (6, 7, 8) should be listed as &lt;strong&gt;active&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Check trunk interface
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Switch# show interfaces trunk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the trunk port is up and the expected VLANs are listed.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Ping from PC1 to PC3 (cross-VLAN)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PC1&amp;gt; ping 10.0.3.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;84 bytes from 10.0.3.1 icmp_seq=2 ttl=63 time=1.784 ms
84 bytes from 10.0.3.1 icmp_seq=3 ttl=63 time=1.735 ms
84 bytes from 10.0.3.1 icmp_seq=4 ttl=63 time=1.547 ms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fri452td7ycofmbjmsm3b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fri452td7ycofmbjmsm3b.png" alt=" " width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Working through this lab made a few things click that had always felt a bit abstract:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VLANs are logical, not physical.&lt;/strong&gt; Three PCs connected to the same physical switch are completely isolated from each other just by VLAN assignment. It's powerful and the configuration is surprisingly minimal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SVIs are elegant.&lt;/strong&gt; Instead of needing a separate router, you assign virtual IPs directly to VLAN interfaces on the L3 switch. The switch handles routing internally. &lt;code&gt;ip routing&lt;/code&gt; is the one command that unlocks this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access vs. trunk is everything.&lt;/strong&gt; Getting confused between access ports (one VLAN, for end devices) and trunk ports (multiple VLANs, for switch-to-switch or switch-to-router links) is probably the most common source of VLAN misconfigurations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GNS3 VM setup matters.&lt;/strong&gt; Running QEMU-based appliances like the Cisco IOSvL2 requires the GNS3 VM to be properly configured and reachable. If the VM isn't green in GNS3, the switch won't start — so fixing the VM setup first saves a lot of frustration later.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting &lt;code&gt;ip routing&lt;/code&gt; on the switch&lt;/td&gt;
&lt;td&gt;Pings between VLANs fail silently&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;ip routing&lt;/code&gt; in global config mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong VLAN ID on access port&lt;/td&gt;
&lt;td&gt;PC is in the wrong VLAN; can't reach its gateway&lt;/td&gt;
&lt;td&gt;Double-check with &lt;code&gt;show vlan brief&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SVI IP on wrong subnet&lt;/td&gt;
&lt;td&gt;Gateway unreachable from the PC&lt;/td&gt;
&lt;td&gt;Match the SVI IP to the PC's subnet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing &lt;code&gt;no shutdown&lt;/code&gt; on SVI&lt;/td&gt;
&lt;td&gt;SVI stays down; routing doesn't work&lt;/td&gt;
&lt;td&gt;Always add &lt;code&gt;no shutdown&lt;/code&gt; after assigning IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GNS3 VM not running&lt;/td&gt;
&lt;td&gt;QEMU switch won't start&lt;/td&gt;
&lt;td&gt;Ensure VM is powered on and green in GNS3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dot1q encapsulation skipped&lt;/td&gt;
&lt;td&gt;Trunk port won't pass VLAN traffic&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;switchport trunk encapsulation dot1q&lt;/code&gt; before &lt;code&gt;switchport mode trunk&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This lab is a great way to understand how VLANs actually work in practice — not just the theory. Setting up the environment from scratch (VMware, GNS3 VM, importing the QEMU switch) teaches you to troubleshoot the virtualization layer before you even get to networking. And once the topology is up, watching a ping travel from PC1 in VLAN 6 across the L3 switch into VLAN 8 and land on PC3 makes the whole concept of inter-VLAN routing concrete.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>gns3</category>
      <category>vlan</category>
      <category>layer3switch</category>
    </item>
    <item>
      <title>Lab Task 7 - How I Used Wireshark to Capture ICMP and DHCP Traffic in a GNS3 Network</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Thu, 11 Jun 2026 19:57:13 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/lab-task-7-how-i-used-wireshark-to-capture-icmp-and-dhcp-traffic-in-a-gns3-network-ojp</link>
      <guid>https://dev.to/almahmudkhalif/lab-task-7-how-i-used-wireshark-to-capture-icmp-and-dhcp-traffic-in-a-gns3-network-ojp</guid>
      <description>&lt;p&gt;If you've ever wondered what actually happens on the wire when you run a &lt;code&gt;ping&lt;/code&gt; command — or how a PC automatically gets its IP address — this post is for you. I set up a small network in GNS3, ran some pings, configured a DHCP server on a Cisco router, and captured everything with Wireshark. Here's exactly what I did and what I found.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem I Was Solving
&lt;/h2&gt;

&lt;p&gt;Networking theory is one thing. Seeing the packets is another.&lt;/p&gt;

&lt;p&gt;I wanted to answer three practical questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When a ping travels across a link, what IP and MAC addresses does Wireshark actually show — and do they change hop by hop?&lt;/li&gt;
&lt;li&gt;How do you configure a Cisco router as a DHCP server so that every PC on the segment gets an address automatically?&lt;/li&gt;
&lt;li&gt;What do the four DHCP messages (Discover → Offer → Request → Acknowledge) look like at Layer 2 and Layer 3?&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Part A — ICMP (Ping) Analysis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Network Topology
&lt;/h3&gt;

&lt;p&gt;The Part A topology has two routers (R1, R2), two switches, and four PCs spread across three subnets:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Subnet&lt;/th&gt;
&lt;th&gt;Network&lt;/th&gt;
&lt;th&gt;Device Interfaces&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Left LAN&lt;/td&gt;
&lt;td&gt;192.168.0.0/24&lt;/td&gt;
&lt;td&gt;R1 f0/0 = .0.1 · PC1 = .0.10 · PC2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Link 1 (WAN)&lt;/td&gt;
&lt;td&gt;192.168.2.0/24&lt;/td&gt;
&lt;td&gt;R1 f2/0 = .2.1 · R2 f0/0 = .2.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Right LAN&lt;/td&gt;
&lt;td&gt;192.168.1.0/24&lt;/td&gt;
&lt;td&gt;R2 f2/0 = .1.1 · PC3 · PC4 = .1.10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ky4qoyby6gekx1uqxfb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ky4qoyby6gekx1uqxfb.png" alt=" " width="799" height="353"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Configuring R1
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R1&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface f0/0&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 192.168.0.1 255.255.255.0&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# exit&lt;/span&gt;

R1&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface f2/0&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 192.168.2.1 255.255.255.0&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# exit&lt;/span&gt;

R1&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# router rip&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# version 2&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# network 192.168.0.0&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# network 192.168.2.0&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no auto-summary&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27radxs9jj4l6u6t6jv5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F27radxs9jj4l6u6t6jv5.png" alt=" " width="800" height="854"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Configuring R2
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R2&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface f2/0&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 192.168.1.1 255.255.255.0&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;

R2&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface f0/0&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 192.168.2.2 255.255.255.0&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;

R2&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# router rip&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# version 2&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# network 192.168.1.0&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# network 192.168.2.0&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no auto-summary&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxx1f8w700ggcbk2fv1be.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxx1f8w700ggcbk2fv1be.png" alt=" " width="800" height="854"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Configuring PC1 and PC4 (Static IPs)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# PC1&lt;/span&gt;
PC1&amp;gt; ip 192.168.0.10 192.168.0.1 24

&lt;span class="c"&gt;# PC4&lt;/span&gt;
PC4&amp;gt; ip 192.168.1.10 192.168.1.1 24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffxst8u0hu1q5m85qv264.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffxst8u0hu1q5m85qv264.png" alt=" " width="800" height="854"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqk6phorlodbcce9ke01x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqk6phorlodbcce9ke01x.png" alt=" " width="800" height="854"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Task 1 — Ping R1 from PC1, Capture on Link 2
&lt;/h3&gt;

&lt;p&gt;Link 2 sits between Switch1 and R1 (the f0/0 segment, 192.168.0.0/24). Wireshark was started on that link before the ping.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PC1&amp;gt; ping 192.168.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because source and destination are on the &lt;strong&gt;same subnet&lt;/strong&gt;, the packet never leaves the LAN. At Layer 3 both addresses stay the same for every packet. At Layer 2 the source MAC is PC1's NIC and the destination MAC is R1's f0/0 interface — resolved via ARP before the first echo request goes out.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Src IP&lt;/td&gt;
&lt;td&gt;192.168.0.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst IP&lt;/td&gt;
&lt;td&gt;192.168.0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Src MAC&lt;/td&gt;
&lt;td&gt;PC1 NIC MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst MAC&lt;/td&gt;
&lt;td&gt;R1 f0/0 MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxcxjb2zyi1jwlvhpn0m3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxcxjb2zyi1jwlvhpn0m3.png" alt=" " width="800" height="121"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8imlxrrunwd4w7rnxmdw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8imlxrrunwd4w7rnxmdw.png" alt=" " width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Task 2 — Ping R2 from R1, Capture on Link 1
&lt;/h3&gt;

&lt;p&gt;Link 1 is the 192.168.2.0/24 WAN link between the two routers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R1# ping 192.168.2.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both ends of this link are directly connected, so IP addresses stay as-is. MACs are the router interface MACs on either side of Link 1.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Src IP&lt;/td&gt;
&lt;td&gt;192.168.2.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst IP&lt;/td&gt;
&lt;td&gt;192.168.2.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Src MAC&lt;/td&gt;
&lt;td&gt;R1 f2/0 MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst MAC&lt;/td&gt;
&lt;td&gt;R2 f0/0 MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjyb396xzajlyo545c56o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjyb396xzajlyo545c56o.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Task 3 — Ping R2 from PC4, Capture on Link 3
&lt;/h3&gt;

&lt;p&gt;Link 3 is the 192.168.1.0/24 right-side LAN between Switch2 and R2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PC4&amp;gt; ping 192.168.1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The destination (R2 f2/0) is on the same subnet as PC4, so the packet is delivered directly. Wireshark on Link 3 sees PC4's MAC as source and R2's f2/0 MAC as destination.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Src IP&lt;/td&gt;
&lt;td&gt;192.168.1.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst IP&lt;/td&gt;
&lt;td&gt;192.168.1.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Src MAC&lt;/td&gt;
&lt;td&gt;PC4 NIC MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst MAC&lt;/td&gt;
&lt;td&gt;R2 f2/0 MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1w7vkjlioa4l4rhwkmmm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1w7vkjlioa4l4rhwkmmm.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Key Insight — Why MACs Change But IPs Don't
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;IP addresses identify end-to-end communication and stay the same across the entire path. MAC addresses are only meaningful on the local segment — they change at every router hop because the router strips the old frame and builds a brand-new one for the next hop.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Part B — DHCP Configuration and DORA Capture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Network Topology
&lt;/h3&gt;

&lt;p&gt;Part B is simpler: one router (R1) connected through a single switch to four PCs, all on the 192.160.0.0/24 subnet. R1 acts as the DHCP server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp80v0cf0e10zwahv1k3b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp80v0cf0e10zwahv1k3b.png" alt=" " width="746" height="515"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Configuring the Interface on R1
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R1&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface f0/0&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 192.160.0.1 255.255.255.0&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Configuring the DHCP Pool on R1
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R1&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip dhcp excluded-address 192.160.0.1&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip dhcp pool LAN_POOL_B&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;dhcp-config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# network 192.160.0.0 255.255.255.0&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;dhcp-config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# default-router 192.160.0.1&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;dhcp-config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# dns-server 8.8.8.8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;excluded-address&lt;/code&gt; line protects the router's own IP from being handed out to a client. Everything from &lt;code&gt;.2&lt;/code&gt; upward is fair game.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovux4morm8uw0rvkalrf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovux4morm8uw0rvkalrf.png" alt=" " width="800" height="854"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Verifying the Interface
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R1# show ip interface brief
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirm that FastEthernet0/0 shows &lt;code&gt;192.160.0.1&lt;/code&gt; with status &lt;code&gt;up/up&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frl7546qb0y3coc1p19t3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frl7546qb0y3coc1p19t3.png" alt=" " width="799" height="643"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Requesting IPs on the PCs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PC1&amp;gt; ip dhcp
PC2&amp;gt; ip dhcp
PC3&amp;gt; ip dhcp
PC4&amp;gt; ip dhcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each PC runs the full DORA exchange and receives an address:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PC&lt;/th&gt;
&lt;th&gt;Assigned IP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PC1&lt;/td&gt;
&lt;td&gt;192.160.0.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC2&lt;/td&gt;
&lt;td&gt;192.160.0.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC3&lt;/td&gt;
&lt;td&gt;192.160.0.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC4&lt;/td&gt;
&lt;td&gt;192.160.0.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftfck4cldczjd5xzwy34o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftfck4cldczjd5xzwy34o.png" alt=" " width="800" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwstvrj8dhd4xi2ln6a9q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwstvrj8dhd4xi2ln6a9q.png" alt=" " width="799" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvt1ti2yskfhlie52j5ip.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvt1ti2yskfhlie52j5ip.png" alt=" " width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2eu116bn5r97p1c2tvb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2eu116bn5r97p1c2tvb.png" alt=" " width="799" height="331"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Verifying DHCP Bindings on R1
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R1# show ip dhcp binding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lists every IP that has been leased, along with the client MAC and lease expiry time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrykqw5a309k5c2dbn7n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkrykqw5a309k5c2dbn7n.png" alt=" " width="799" height="363"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The DORA Process — What Wireshark Shows
&lt;/h3&gt;

&lt;p&gt;Wireshark was running on Link 1 (between R1 and Switch1) while PC1 ran &lt;code&gt;ip dhcp&lt;/code&gt;. Applying the &lt;code&gt;dhcp&lt;/code&gt; display filter reveals four packets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;Filter&lt;/span&gt;: &lt;span class="n"&gt;dhcp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Discover
&lt;/h4&gt;

&lt;p&gt;The PC has no IP yet. It broadcasts from &lt;code&gt;0.0.0.0&lt;/code&gt; to &lt;code&gt;255.255.255.255&lt;/code&gt;, asking if any DHCP server is available.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Src IP&lt;/td&gt;
&lt;td&gt;0.0.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst IP&lt;/td&gt;
&lt;td&gt;255.255.255.255&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Src MAC&lt;/td&gt;
&lt;td&gt;PC1 NIC MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst MAC&lt;/td&gt;
&lt;td&gt;ff:ff:ff:ff:ff:ff&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Offer
&lt;/h4&gt;

&lt;p&gt;R1 responds with a proposed IP address, unicast back toward PC1.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Src IP&lt;/td&gt;
&lt;td&gt;192.160.0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst IP&lt;/td&gt;
&lt;td&gt;192.160.0.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Src MAC&lt;/td&gt;
&lt;td&gt;R1 f0/0 MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst MAC&lt;/td&gt;
&lt;td&gt;PC1 NIC MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Request
&lt;/h4&gt;

&lt;p&gt;PC1 broadcasts again, formally requesting the offered address.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Src IP&lt;/td&gt;
&lt;td&gt;0.0.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst IP&lt;/td&gt;
&lt;td&gt;255.255.255.255&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Src MAC&lt;/td&gt;
&lt;td&gt;PC1 NIC MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst MAC&lt;/td&gt;
&lt;td&gt;ff:ff:ff:ff:ff:ff&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Acknowledge
&lt;/h4&gt;

&lt;p&gt;R1 confirms the lease.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Src IP&lt;/td&gt;
&lt;td&gt;192.160.0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst IP&lt;/td&gt;
&lt;td&gt;192.160.0.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Src MAC&lt;/td&gt;
&lt;td&gt;R1 f0/0 MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dst MAC&lt;/td&gt;
&lt;td&gt;PC1 NIC MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsq9m5364ma3swdcpu37s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsq9m5364ma3swdcpu37s.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Verify Everything Worked
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On R1 — confirm interface is up&lt;/span&gt;
R1# show ip interface brief

&lt;span class="c"&gt;# On R1 — confirm leases are active&lt;/span&gt;
R1# show ip dhcp binding

&lt;span class="c"&gt;# On any PC — confirm assigned address&lt;/span&gt;
PC1&amp;gt; show

&lt;span class="c"&gt;# From PC — test connectivity to gateway&lt;/span&gt;
PC1&amp;gt; ping 192.160.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MACs are local, IPs are global.&lt;/strong&gt; Every time a frame crosses a router, the Layer 2 header is completely rebuilt. The Layer 3 header is untouched.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wireshark placement matters.&lt;/strong&gt; Capturing on Link 2 vs Link 1 gives completely different MAC addresses for the same ping, because the frame is re-encapsulated at R1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DHCP Discover and Request use broadcast at both layers&lt;/strong&gt; — the PC literally has no address to use yet, so it shouts to everyone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RIPv2 with &lt;code&gt;no auto-summary&lt;/code&gt;&lt;/strong&gt; is essential when your subnets could be summarized incorrectly by classful routing behaviour.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ip dhcp excluded-address&lt;/code&gt;&lt;/strong&gt; must be configured before the pool, or the router's own IP could be handed to a client and cause an address conflict.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;What Goes Wrong&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting &lt;code&gt;no shutdown&lt;/code&gt; on an interface&lt;/td&gt;
&lt;td&gt;Interface stays down, no traffic flows&lt;/td&gt;
&lt;td&gt;Always run &lt;code&gt;no shutdown&lt;/code&gt; after assigning an IP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong subnet in &lt;code&gt;network&lt;/code&gt; command under RIP&lt;/td&gt;
&lt;td&gt;Routes not advertised to the other router&lt;/td&gt;
&lt;td&gt;Match the exact network address of each interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing &lt;code&gt;no auto-summary&lt;/code&gt; in RIPv2&lt;/td&gt;
&lt;td&gt;Classful summarization silently drops subnets&lt;/td&gt;
&lt;td&gt;Always add &lt;code&gt;no auto-summary&lt;/code&gt; with RIPv2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Not excluding the router IP from DHCP pool&lt;/td&gt;
&lt;td&gt;Router's own IP could be leased to a PC&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;ip dhcp excluded-address&lt;/code&gt; before creating the pool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Applying the wrong Wireshark filter&lt;/td&gt;
&lt;td&gt;All protocols shown, hard to find what you need&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;icmp&lt;/code&gt; or &lt;code&gt;dhcp&lt;/code&gt; as the display filter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Capturing on the wrong link&lt;/td&gt;
&lt;td&gt;MAC addresses won't match what you expect&lt;/td&gt;
&lt;td&gt;Understand which segment you're on before starting a capture&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Setting up this lab made abstract networking concepts click in a way that textbooks alone never could. Watching the MAC address change at the router boundary while the IP stays constant is one of those genuine "aha" moments. And seeing the DORA exchange live in Wireshark makes DHCP feel concrete rather than magical.&lt;/p&gt;

&lt;p&gt;If you're learning networking and haven't tried packet capture in GNS3 yet — start here. The tools are free, the setup is repeatable, and what you see in Wireshark will stick with you far longer than any diagram.&lt;/p&gt;

</description>
      <category>wireshark</category>
      <category>dhcp</category>
      <category>gns3</category>
      <category>networking</category>
    </item>
    <item>
      <title>Lab Task 6 - How I Built a Multi-Router DHCP Network in GNS3 with RIP Routing</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Thu, 11 Jun 2026 19:09:31 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/lab-task-6-how-i-built-a-multi-router-dhcp-network-in-gns3-with-rip-routing-23c5</link>
      <guid>https://dev.to/almahmudkhalif/lab-task-6-how-i-built-a-multi-router-dhcp-network-in-gns3-with-rip-routing-23c5</guid>
      <description>&lt;p&gt;There's something satisfying about watching a PC automatically grab an IP address from a DHCP server you configured yourself. No typing. No guessing. The router just hands it over.&lt;/p&gt;

&lt;p&gt;In this post, I'll walk through how I set up a two-router GNS3 topology where four virtual PCs get their IP addresses via DHCP — across two different subnets, connected through RIP routing. Everything was done inside GNS3 using Cisco IOS routers and VPCS nodes.&lt;/p&gt;

&lt;p&gt;By the end, PC1 (on the 192.168.0.0/24 network) was successfully pinging PC4 (on the 192.168.1.0/24 network). That cross-subnet ping only works when routing, DHCP, and IP addressing are all wired together correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Running DHCP across a single subnet is straightforward. But what happens when you have two separate LANs connected by routers — and you want DHCP to work on both sides?&lt;/p&gt;

&lt;p&gt;You need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each router to serve as a DHCP server for its own local subnet&lt;/li&gt;
&lt;li&gt;Routing configured between routers so packets can actually travel between subnets&lt;/li&gt;
&lt;li&gt;Router interfaces manually assigned static IPs (DHCP is for end devices only)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's exactly what this topology covers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Topology Overview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9wwk4o8gopp8ti50zv2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9wwk4o8gopp8ti50zv2.png" alt=" " width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;R1&lt;/strong&gt; serves DHCP for the 192.168.0.0/24 subnet (PC1 and PC2)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R2&lt;/strong&gt; serves DHCP for the 192.168.1.0/24 subnet (PC3 and PC4)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RIP&lt;/strong&gt; is used to share routing information between R1 and R2&lt;/li&gt;
&lt;li&gt;All router interfaces are manually configured (No DHCP on router ports)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1 — Configure R1 Interfaces
&lt;/h2&gt;

&lt;p&gt;Open R1's console and assign static IPs to both interfaces.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R1&amp;gt;&lt;/span&gt; enable
&lt;span class="k"&gt;R1#&lt;/span&gt; configure terminal

&lt;span class="k"&gt;R1(config)#&lt;/span&gt; interface fa0/0
&lt;span class="k"&gt;R1(config-if)#&lt;/span&gt; ip address &lt;span class="m"&gt;192.168.0.1&lt;/span&gt; &lt;span class="m"&gt;255.255.255.0&lt;/span&gt;
&lt;span class="k"&gt;R1(config-if)#&lt;/span&gt; no shutdown

&lt;span class="k"&gt;R1(config)#&lt;/span&gt; interface fa2/0
&lt;span class="k"&gt;R1(config-if)#&lt;/span&gt; ip address &lt;span class="m"&gt;192.168.2.1&lt;/span&gt; &lt;span class="m"&gt;255.255.255.0&lt;/span&gt;
&lt;span class="k"&gt;R1(config-if)#&lt;/span&gt; no shutdown

&lt;span class="k"&gt;R1(config)#&lt;/span&gt; end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jyvlobkvne6ocmjnb4v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jyvlobkvne6ocmjnb4v.png" alt=" " width="738" height="428"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Configure R2 Interfaces
&lt;/h2&gt;

&lt;p&gt;Same process on R2, but with its own IP addresses.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R2&amp;gt;&lt;/span&gt; enable
&lt;span class="k"&gt;R2#&lt;/span&gt; configure terminal

&lt;span class="k"&gt;R2(config)#&lt;/span&gt; interface fa0/0
&lt;span class="k"&gt;R2(config-if)#&lt;/span&gt; ip address &lt;span class="m"&gt;192.168.2.2&lt;/span&gt; &lt;span class="m"&gt;255.255.255.0&lt;/span&gt;
&lt;span class="k"&gt;R2(config-if)#&lt;/span&gt; no shutdown

&lt;span class="k"&gt;R2(config)#&lt;/span&gt; interface fa2/0
&lt;span class="k"&gt;R2(config-if)#&lt;/span&gt; ip address &lt;span class="m"&gt;192.168.1.1&lt;/span&gt; &lt;span class="m"&gt;255.255.255.0&lt;/span&gt;
&lt;span class="k"&gt;R2(config-if)#&lt;/span&gt; no shutdown

&lt;span class="k"&gt;R2(config)#&lt;/span&gt; end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyg7zwo72r5ij3fujw43k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyg7zwo72r5ij3fujw43k.png" alt=" " width="799" height="244"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Configure RIP on R1
&lt;/h2&gt;

&lt;p&gt;RIP version 2 tells R1 to advertise its connected networks so R2 knows how to reach 192.168.0.0/24.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R1(config)#&lt;/span&gt; router rip
&lt;span class="k"&gt;R1(config-router)#&lt;/span&gt; version 2
&lt;span class="k"&gt;R1(config-router)#&lt;/span&gt; network &lt;span class="m"&gt;192.168.0.0&lt;/span&gt;
&lt;span class="k"&gt;R1(config-router)#&lt;/span&gt; network &lt;span class="m"&gt;192.168.2.0&lt;/span&gt;
&lt;span class="k"&gt;R1(config-router)#&lt;/span&gt; no auto-summary
&lt;span class="k"&gt;R1(config-router)#&lt;/span&gt; exit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11zrygce7knea7zs673u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11zrygce7knea7zs673u.png" alt=" " width="656" height="150"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Configure RIP on R2
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R2(config)#&lt;/span&gt; router rip
&lt;span class="k"&gt;R2(config-router)#&lt;/span&gt; version 2
&lt;span class="k"&gt;R2(config-router)#&lt;/span&gt; network &lt;span class="m"&gt;192.168.1.0&lt;/span&gt;
&lt;span class="k"&gt;R2(config-router)#&lt;/span&gt; network &lt;span class="m"&gt;192.168.2.0&lt;/span&gt;
&lt;span class="k"&gt;R2(config-router)#&lt;/span&gt; no auto-summary
&lt;span class="k"&gt;R2(config-router)#&lt;/span&gt; exit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4n4nb00vlpz5k1fhmlh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4n4nb00vlpz5k1fhmlh.png" alt=" " width="660" height="130"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Verify Routing Tables
&lt;/h2&gt;

&lt;p&gt;After RIP converges (usually within 30–60 seconds), check the routing tables. You should see RIP-learned routes marked with &lt;code&gt;R&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On R1:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R1#&lt;/span&gt; show ip route
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R    192.168.1.0/24&lt;/span&gt; [120/1] via &lt;span class="m"&gt;192.168.2.2&lt;/span&gt;, FastEthernet2/0
&lt;span class="k"&gt;C    192.168.0.0/24&lt;/span&gt; is directly connected, FastEthernet0/0
&lt;span class="k"&gt;C    192.168.2.0/24&lt;/span&gt; is directly connected, FastEthernet2/0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;On R2:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R2#&lt;/span&gt; show ip route
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R    192.168.0.0/24&lt;/span&gt; [120/1] via &lt;span class="m"&gt;192.168.2.1&lt;/span&gt;, FastEthernet0/0
&lt;span class="k"&gt;C    192.168.1.0/24&lt;/span&gt; is directly connected, FastEthernet2/0
&lt;span class="k"&gt;C    192.168.2.0/24&lt;/span&gt; is directly connected, FastEthernet0/0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhv4zzdcj93yriainkonw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhv4zzdcj93yriainkonw.png" alt=" " width="642" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgr9qfwar9uiiowuhud1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgr9qfwar9uiiowuhud1v.png" alt=" " width="639" height="384"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6 — Configure DHCP on R1
&lt;/h2&gt;

&lt;p&gt;R1 will hand out IPs in the 192.168.0.0/24 range to PC1 and PC2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R1(config)#&lt;/span&gt; ip dhcp pool SUBNET1
&lt;span class="k"&gt;R1(dhcp-config)#&lt;/span&gt; network &lt;span class="m"&gt;192.168.0.0&lt;/span&gt; &lt;span class="m"&gt;255.255.255.0&lt;/span&gt;
&lt;span class="k"&gt;R1(dhcp-config)#&lt;/span&gt; default-router &lt;span class="m"&gt;192.168.0.1&lt;/span&gt;
&lt;span class="k"&gt;R1(dhcp-config)#&lt;/span&gt; dns-server &lt;span class="m"&gt;8.8.8.8&lt;/span&gt;
&lt;span class="k"&gt;R1(dhcp-config)#&lt;/span&gt; exit

&lt;span class="k"&gt;R1(config)#&lt;/span&gt; ip dhcp excluded-address &lt;span class="m"&gt;192.168.0.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4w6lhm241lobbe34amhz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4w6lhm241lobbe34amhz.png" alt=" " width="506" height="126"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7 — Configure DHCP on R2
&lt;/h2&gt;

&lt;p&gt;R2 handles DHCP for PC3 and PC4 on the 192.168.1.0/24 subnet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R2(config)#&lt;/span&gt; ip dhcp pool SUBNET2
&lt;span class="k"&gt;R2(dhcp-config)#&lt;/span&gt; network &lt;span class="m"&gt;192.168.1.0&lt;/span&gt; &lt;span class="m"&gt;255.255.255.0&lt;/span&gt;
&lt;span class="k"&gt;R2(dhcp-config)#&lt;/span&gt; default-router &lt;span class="m"&gt;192.168.1.1&lt;/span&gt;
&lt;span class="k"&gt;R2(dhcp-config)#&lt;/span&gt; dns-server &lt;span class="m"&gt;8.8.8.8&lt;/span&gt;
&lt;span class="k"&gt;R2(dhcp-config)#&lt;/span&gt; exit

&lt;span class="k"&gt;R2(config)#&lt;/span&gt; ip dhcp excluded-address &lt;span class="m"&gt;192.168.1.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbvw319g3wau4kch4p4iw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbvw319g3wau4kch4p4iw.png" alt=" " width="492" height="118"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8 — Configure PCs to Use DHCP
&lt;/h2&gt;

&lt;p&gt;In GNS3, each VPCS node just needs a single command to request an IP via DHCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PC1:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;PC1&amp;gt;&lt;/span&gt; ip dhcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PC2:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;PC2&amp;gt;&lt;/span&gt; ip dhcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PC3:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;PC3&amp;gt;&lt;/span&gt; ip dhcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PC4:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;PC4&amp;gt;&lt;/span&gt; ip dhcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each PC should respond with something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DDORA IP 192.168.0.2/24 GW 192.168.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;DDORA&lt;/code&gt; output means the full DHCP handshake completed: &lt;strong&gt;D&lt;/strong&gt;iscover → &lt;strong&gt;D&lt;/strong&gt;iscover (server) → &lt;strong&gt;O&lt;/strong&gt;ffer → &lt;strong&gt;R&lt;/strong&gt;equest → &lt;strong&gt;A&lt;/strong&gt;cknowledge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxff7up5pjhr47800p2r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxff7up5pjhr47800p2r.png" alt=" " width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhzeref5x1gvmcbkt68v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhzeref5x1gvmcbkt68v.png" alt=" " width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fheyd0pcdv9umz2pm9y3j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fheyd0pcdv9umz2pm9y3j.png" alt=" " width="799" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F92946h3fye04q3dpnl70.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F92946h3fye04q3dpnl70.png" alt=" " width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9 — Verify DHCP Bindings
&lt;/h2&gt;

&lt;p&gt;Run this on both routers to confirm which MAC addresses received which IPs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R1#&lt;/span&gt; show ip dhcp binding
&lt;span class="k"&gt;R2#&lt;/span&gt; show ip dhcp binding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see entries for the PCs that requested IPs, with their assigned addresses and lease times.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 10 — Check Interface Summary
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;R1#&lt;/span&gt; show ip int br
&lt;span class="k"&gt;R2#&lt;/span&gt; show ip int br
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All interfaces used in the topology should show &lt;code&gt;up/up&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 11 — Ping Tests
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ping PC4 from PC1&lt;/strong&gt; (cross-subnet ping — this is the real test):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;PC1&amp;gt;&lt;/span&gt; ping &lt;span class="m"&gt;192.168.1.3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;84 bytes from 192.168.1.3 icmp_seq=3 ttl=62 time=60.528 ms
84 bytes from 192.168.1.3 icmp_seq=4 ttl=62 time=61.646 ms
84 bytes from 192.168.1.3 icmp_seq=5 ttl=62 time=61.215 ms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnkt3bgjkx3ya6frpozh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnkt3bgjkx3ya6frpozh.png" alt=" " width="800" height="234"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ping PC2 from PC3&lt;/strong&gt; (reverse direction):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cisco_ios"&gt;&lt;code&gt;&lt;span class="k"&gt;PC3&amp;gt;&lt;/span&gt; ping &lt;span class="m"&gt;192.168.0.3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;84 bytes from 192.168.0.3 icmp_seq=3 ttl=62 time=61.733 ms
84 bytes from 192.168.0.3 icmp_seq=4 ttl=62 time=47.556 ms
84 bytes from 192.168.0.3 icmp_seq=5 ttl=62 time=62.207 ms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2yampzjzasupn7w00e52.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2yampzjzasupn7w00e52.png" alt=" " width="799" height="186"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Verify Everything is Working
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;What to Look For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Interface IPs assigned&lt;/td&gt;
&lt;td&gt;&lt;code&gt;show ip int br&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All interfaces &lt;code&gt;up/up&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RIP routes learned&lt;/td&gt;
&lt;td&gt;&lt;code&gt;show ip route&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;R&lt;/code&gt; entries for remote subnets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DHCP leases issued&lt;/td&gt;
&lt;td&gt;&lt;code&gt;show ip dhcp binding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MAC-to-IP entries for all PCs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCs got IPs&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ip dhcp&lt;/code&gt; on each VPCS&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;DDORA IP x.x.x.x/24&lt;/code&gt; response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-subnet ping works&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ping &amp;lt;remote PC IP&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Replies with TTL=62&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Working through this lab made a few things click that I hadn't fully internalized before:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DHCP scope matters&lt;/strong&gt; — The &lt;code&gt;excluded-address&lt;/code&gt; command is easy to forget but important. Without it, the router could assign its own interface IP to a PC, causing an IP conflict.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RIP convergence takes time&lt;/strong&gt; — If you configure DHCP and run &lt;code&gt;ip dhcp&lt;/code&gt; on a PC before RIP finishes converging, pings will fail even though DHCP worked. Waiting 30–60 seconds after configuring RIP saves a lot of confusion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TTL=62 tells a story&lt;/strong&gt; — When pinging across two routers, the TTL drops by 1 per hop. Seeing TTL=62 (from a starting TTL of 64) confirms the packet traveled through exactly two routers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DDORA is your confirmation&lt;/strong&gt; — That output from VPCS after &lt;code&gt;ip dhcp&lt;/code&gt; is the clearest sign that the entire DHCP process completed. If you only see &lt;code&gt;D&lt;/code&gt; and it stops, your router's DHCP pool isn't reachable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;no auto-summary&lt;/code&gt; matters in RIP v2&lt;/strong&gt; — Without it, RIP summarizes subnets at classful boundaries. In a topology like this where all subnets share the 192.168.x.x space, it can cause routing issues.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting &lt;code&gt;no shutdown&lt;/code&gt; on interfaces&lt;/td&gt;
&lt;td&gt;Interface stays down, no traffic passes&lt;/td&gt;
&lt;td&gt;Always follow IP assignment with &lt;code&gt;no shutdown&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing &lt;code&gt;no auto-summary&lt;/code&gt; in RIP&lt;/td&gt;
&lt;td&gt;Remote subnets may not be reachable&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;no auto-summary&lt;/code&gt; under &lt;code&gt;router rip&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Not excluding the gateway IP from DHCP pool&lt;/td&gt;
&lt;td&gt;Router's own IP could be assigned to a PC&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;ip dhcp excluded-address&lt;/code&gt; for gateway IPs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running &lt;code&gt;ip dhcp&lt;/code&gt; on PCs before RIP converges&lt;/td&gt;
&lt;td&gt;Ping fails even though DHCP works&lt;/td&gt;
&lt;td&gt;Wait 30–60 seconds after RIP config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong interface selected for DHCP pool&lt;/td&gt;
&lt;td&gt;PCs get wrong gateway or no IP&lt;/td&gt;
&lt;td&gt;Match &lt;code&gt;default-router&lt;/code&gt; to the interface facing the PCs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pinging by IP instead of using the actual assigned address&lt;/td&gt;
&lt;td&gt;Misleading results&lt;/td&gt;
&lt;td&gt;Always verify the assigned IP via &lt;code&gt;ip dhcp&lt;/code&gt; response first&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This topology covers a lot of ground for what looks like a simple setup. You're dealing with static interface addressing, DHCP pools on two separate subnets, dynamic routing with RIP, and cross-subnet connectivity — all in one lab.&lt;/p&gt;

&lt;p&gt;The ping from PC1 to PC4 working end-to-end is a real confidence check. It means your routing table has the right entries, DHCP handed out the correct gateway, and packets are actually traveling the full path through both routers.&lt;/p&gt;

&lt;p&gt;If you're building out GNS3 labs and want to go further, try replacing RIP with OSPF, or add a third router and see how the routing table changes.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>gns3</category>
      <category>dhcp</category>
      <category>rip</category>
    </item>
    <item>
      <title>Lab Task 5 - Subnetting in GNS3: Building a Multi-Subnet Network with OSPF Routing from Scratch</title>
      <dc:creator>Khalif AL Mahmud</dc:creator>
      <pubDate>Thu, 11 Jun 2026 15:09:52 +0000</pubDate>
      <link>https://dev.to/almahmudkhalif/lab-task-5-subnetting-in-gns3-building-a-multi-subnet-network-with-ospf-routing-from-scratch-fh4</link>
      <guid>https://dev.to/almahmudkhalif/lab-task-5-subnetting-in-gns3-building-a-multi-subnet-network-with-ospf-routing-from-scratch-fh4</guid>
      <description>&lt;p&gt;There is a point in every networking journey when reading about subnets stops being enough. You know the formulas, you can do the math on paper — but until you wire up a real (or virtual) topology and watch packets actually cross subnet boundaries, it doesn't fully click.&lt;/p&gt;

&lt;p&gt;This post walks through exactly that. I took a single Class C address block (&lt;code&gt;192.168.43.0/24&lt;/code&gt;), carved it into &lt;code&gt;/30&lt;/code&gt; and &lt;code&gt;/28&lt;/code&gt; subnets, built a three-router topology in GNS3 with six PCs across four switches, configured OSPF on every router, and verified end-to-end connectivity with ping tests. Everything is documented here — the subnet math, the router commands, the PC configs, and the verification steps.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: One Address Space, Multiple Isolated Networks
&lt;/h2&gt;

&lt;p&gt;The starting point is a single IP block: &lt;strong&gt;&lt;code&gt;192.168.43.0/24&lt;/code&gt;&lt;/strong&gt;. The goal is to divide it into smaller subnets that serve different parts of the topology.&lt;/p&gt;

&lt;p&gt;From the topology diagram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two router-to-router links need &lt;code&gt;/30&lt;/code&gt; subnets (point-to-point, only 2 usable hosts needed)&lt;/li&gt;
&lt;li&gt;Four LAN segments — each hosting a switch and PCs — need &lt;code&gt;/28&lt;/code&gt; subnets (up to 14 usable hosts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Borrowing bits from the &lt;code&gt;/24&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/30&lt;/code&gt; = borrow &lt;strong&gt;6 bits&lt;/strong&gt; from the host portion (30 − 24 = 6)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/28&lt;/code&gt; = borrow &lt;strong&gt;4 bits&lt;/strong&gt; from the host portion (28 − 24 = 4)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Subnet Calculation
&lt;/h2&gt;

&lt;p&gt;Before touching GNS3, the math needs to be right. Here is the full breakdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  /30 Subnets — Router-to-Router Links
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Subnet #&lt;/th&gt;
&lt;th&gt;Network Address&lt;/th&gt;
&lt;th&gt;Subnet Mask&lt;/th&gt;
&lt;th&gt;Usable Hosts&lt;/th&gt;
&lt;th&gt;Host Range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/30 Subnet 1&lt;/td&gt;
&lt;td&gt;192.168.43.0&lt;/td&gt;
&lt;td&gt;255.255.255.252&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;.1 – .2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/30 Subnet 2&lt;/td&gt;
&lt;td&gt;192.168.43.4&lt;/td&gt;
&lt;td&gt;255.255.255.252&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;.5 – .6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A &lt;code&gt;/30&lt;/code&gt; gives you 4 addresses total: network address, 2 usable hosts, broadcast. Perfect for a point-to-point router link.&lt;/p&gt;

&lt;h3&gt;
  
  
  /28 Subnets — LAN Segments
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Subnet #&lt;/th&gt;
&lt;th&gt;Network Address&lt;/th&gt;
&lt;th&gt;Subnet Mask&lt;/th&gt;
&lt;th&gt;Usable Hosts&lt;/th&gt;
&lt;th&gt;Host Range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/28 Subnet 1&lt;/td&gt;
&lt;td&gt;192.168.43.16&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;.17 – .30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/28 Subnet 2&lt;/td&gt;
&lt;td&gt;192.168.43.32&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;.33 – .46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/28 Subnet 3&lt;/td&gt;
&lt;td&gt;192.168.43.48&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;.49 – .62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/28 Subnet 4&lt;/td&gt;
&lt;td&gt;192.168.43.64&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;.65 – .78&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A &lt;code&gt;/28&lt;/code&gt; gives you 16 addresses total: 14 usable. Each LAN segment (Switch + 2 PCs) connects to one of these.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: IP Address Assignment Plan
&lt;/h2&gt;

&lt;p&gt;With the subnets defined, addresses get assigned to every interface and PC before building anything in GNS3.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Device&lt;/th&gt;
&lt;th&gt;Interface&lt;/th&gt;
&lt;th&gt;IP Address&lt;/th&gt;
&lt;th&gt;Subnet Mask&lt;/th&gt;
&lt;th&gt;CIDR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;R1&lt;/td&gt;
&lt;td&gt;f0/0 (to R2)&lt;/td&gt;
&lt;td&gt;192.168.43.1&lt;/td&gt;
&lt;td&gt;255.255.255.252&lt;/td&gt;
&lt;td&gt;/30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R1&lt;/td&gt;
&lt;td&gt;f2/0 (to R3)&lt;/td&gt;
&lt;td&gt;192.168.43.5&lt;/td&gt;
&lt;td&gt;255.255.255.252&lt;/td&gt;
&lt;td&gt;/30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2&lt;/td&gt;
&lt;td&gt;f0/0 (to R1)&lt;/td&gt;
&lt;td&gt;192.168.43.2&lt;/td&gt;
&lt;td&gt;255.255.255.252&lt;/td&gt;
&lt;td&gt;/30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2&lt;/td&gt;
&lt;td&gt;f2/0 (LAN 1)&lt;/td&gt;
&lt;td&gt;192.168.43.17&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;/28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2&lt;/td&gt;
&lt;td&gt;f3/0 (LAN 2)&lt;/td&gt;
&lt;td&gt;192.168.43.33&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;/28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R3&lt;/td&gt;
&lt;td&gt;f0/0 (to R1)&lt;/td&gt;
&lt;td&gt;192.168.43.6&lt;/td&gt;
&lt;td&gt;255.255.255.252&lt;/td&gt;
&lt;td&gt;/30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R3&lt;/td&gt;
&lt;td&gt;f2/0 (LAN 3)&lt;/td&gt;
&lt;td&gt;192.168.43.49&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;/28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R3&lt;/td&gt;
&lt;td&gt;f3/0 (LAN 4)&lt;/td&gt;
&lt;td&gt;192.168.43.65&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;/28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC1&lt;/td&gt;
&lt;td&gt;e0&lt;/td&gt;
&lt;td&gt;192.168.43.18&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;/28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC2&lt;/td&gt;
&lt;td&gt;e0&lt;/td&gt;
&lt;td&gt;192.168.43.19&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;/28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC3&lt;/td&gt;
&lt;td&gt;e0&lt;/td&gt;
&lt;td&gt;192.168.43.34&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;/28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC4&lt;/td&gt;
&lt;td&gt;e0&lt;/td&gt;
&lt;td&gt;192.168.43.35&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;/28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC5&lt;/td&gt;
&lt;td&gt;e0&lt;/td&gt;
&lt;td&gt;192.168.43.50&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;/28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC6&lt;/td&gt;
&lt;td&gt;e0&lt;/td&gt;
&lt;td&gt;192.168.43.66&lt;/td&gt;
&lt;td&gt;255.255.255.240&lt;/td&gt;
&lt;td&gt;/28&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Step 3: Build the Topology in GNS3
&lt;/h2&gt;

&lt;p&gt;The topology looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu02gii4z7p5rctiw6rl1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu02gii4z7p5rctiw6rl1.png" alt=" " width="799" height="386"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Configure the Routers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Router R1
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R1# configure terminal

&lt;span class="o"&gt;!&lt;/span&gt; Interface toward R2 &lt;span class="o"&gt;(&lt;/span&gt;/30&lt;span class="o"&gt;)&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface fastEthernet 0/0&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 192.168.43.1 255.255.255.252&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;

&lt;span class="o"&gt;!&lt;/span&gt; Interface toward R3 &lt;span class="o"&gt;(&lt;/span&gt;/30&lt;span class="o"&gt;)&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface fastEthernet 2/0&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 192.168.43.5 255.255.255.252&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;

R1&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# end&lt;/span&gt;
R1# write memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Static routing is skipped entirely here. OSPF is used so routers discover all subnets dynamically — no manual route entries needed, and the network adapts if something changes.&lt;/p&gt;

&lt;p&gt;All routers use OSPF process ID 1 and area 0 (the backbone area).&lt;/p&gt;

&lt;h3&gt;
  
  
  OSPF on R1
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R1# configure terminal
R1&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# router ospf 1&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# network 192.168.43.0 0.0.0.3 area 0&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# network 192.168.43.4 0.0.0.3 area 0&lt;/span&gt;
R1&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# end&lt;/span&gt;
R1# write memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymwqnkc9hxx1idsupogk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymwqnkc9hxx1idsupogk.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Router R2
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R2# configure terminal

&lt;span class="o"&gt;!&lt;/span&gt; Interface toward R1 &lt;span class="o"&gt;(&lt;/span&gt;/30&lt;span class="o"&gt;)&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface fastEthernet 0/0&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 192.168.43.2 255.255.255.252&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;

&lt;span class="o"&gt;!&lt;/span&gt; Interface toward Switch1 / LAN1 &lt;span class="o"&gt;(&lt;/span&gt;/28&lt;span class="o"&gt;)&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface fastEthernet 2/0&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 192.168.43.17 255.255.255.240&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;

&lt;span class="o"&gt;!&lt;/span&gt; Interface toward Switch2 / LAN2 &lt;span class="o"&gt;(&lt;/span&gt;/28&lt;span class="o"&gt;)&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface fastEthernet 3/0&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 192.168.43.33 255.255.255.240&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;

R2&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# end&lt;/span&gt;
R2# write memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  OSPF on R2
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R2# configure terminal
R2&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# router ospf 1&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# network 192.168.43.0 0.0.0.3 area 0&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# network 192.168.43.16 0.0.0.15 area 0&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# network 192.168.43.32 0.0.0.15 area 0&lt;/span&gt;
R2&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# end&lt;/span&gt;
R2# write memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3rr6ujffg9ra3pupefm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3rr6ujffg9ra3pupefm.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Router R3
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R3# configure terminal

&lt;span class="o"&gt;!&lt;/span&gt; Interface toward R1 &lt;span class="o"&gt;(&lt;/span&gt;/30&lt;span class="o"&gt;)&lt;/span&gt;
R3&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface fastEthernet 0/0&lt;/span&gt;
R3&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 192.168.43.6 255.255.255.252&lt;/span&gt;
R3&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;

&lt;span class="o"&gt;!&lt;/span&gt; Interface toward Switch3 / LAN3 &lt;span class="o"&gt;(&lt;/span&gt;/28&lt;span class="o"&gt;)&lt;/span&gt;
R3&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface fastEthernet 2/0&lt;/span&gt;
R3&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 192.168.43.49 255.255.255.240&lt;/span&gt;
R3&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;

&lt;span class="o"&gt;!&lt;/span&gt; Interface toward Switch4 / LAN4 &lt;span class="o"&gt;(&lt;/span&gt;/28&lt;span class="o"&gt;)&lt;/span&gt;
R3&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# interface fastEthernet 3/0&lt;/span&gt;
R3&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# ip address 192.168.43.65 255.255.255.240&lt;/span&gt;
R3&lt;span class="o"&gt;(&lt;/span&gt;config-if&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# no shutdown&lt;/span&gt;

R3&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# end&lt;/span&gt;
R3# write memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  OSPF on R3
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R3# configure terminal
R3&lt;span class="o"&gt;(&lt;/span&gt;config&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# router ospf 1&lt;/span&gt;
R3&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# network 192.168.43.4 0.0.0.3 area 0&lt;/span&gt;
R3&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# network 192.168.43.48 0.0.0.15 area 0&lt;/span&gt;
R3&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# network 192.168.43.64 0.0.0.15 area 0&lt;/span&gt;
R3&lt;span class="o"&gt;(&lt;/span&gt;config-router&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="c"&gt;# end&lt;/span&gt;
R3# write memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why wildcard masks?&lt;/strong&gt; The wildcard mask is the inverse of the subnet mask. For a &lt;code&gt;/30&lt;/code&gt; (mask &lt;code&gt;255.255.255.252&lt;/code&gt;), the wildcard is &lt;code&gt;0.0.0.3&lt;/code&gt;. For a &lt;code&gt;/28&lt;/code&gt; (mask &lt;code&gt;255.255.255.240&lt;/code&gt;), the wildcard is &lt;code&gt;0.0.0.15&lt;/code&gt;. OSPF uses these to match which interfaces to include in the routing process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fho534zawojzsf79gvs09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fho534zawojzsf79gvs09.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Configure the PCs (VPCS)
&lt;/h2&gt;

&lt;p&gt;VPCS uses a simple one-liner per PC. The gateway in each case is the router interface on the same &lt;code&gt;/28&lt;/code&gt; subnet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# PC1 — LAN1, Switch1&lt;/span&gt;
PC1&amp;gt; ip 192.168.43.18 255.255.255.240 192.168.43.17

&lt;span class="c"&gt;# PC2 — LAN1, Switch1&lt;/span&gt;
PC2&amp;gt; ip 192.168.43.19 255.255.255.240 192.168.43.17

&lt;span class="c"&gt;# PC3 — LAN2, Switch2&lt;/span&gt;
PC3&amp;gt; ip 192.168.43.34 255.255.255.240 192.168.43.33

&lt;span class="c"&gt;# PC4 — LAN2, Switch2&lt;/span&gt;
PC4&amp;gt; ip 192.168.43.35 255.255.255.240 192.168.43.33

&lt;span class="c"&gt;# PC5 — LAN3, Switch3&lt;/span&gt;
PC5&amp;gt; ip 192.168.43.50 255.255.255.240 192.168.43.49

&lt;span class="c"&gt;# PC6 — LAN4, Switch4&lt;/span&gt;
PC6&amp;gt; ip 192.168.43.66 255.255.255.240 192.168.43.65
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56vzvmsmqh0hykj29ikx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56vzvmsmqh0hykj29ikx.png" alt=" " width="625" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb48abbnyf4f3guu97qg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb48abbnyf4f3guu97qg.png" alt=" " width="622" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumcoty09d5rw9zf0g68n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumcoty09d5rw9zf0g68n.png" alt=" " width="623" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fka1zkt6cnlitcszuqli1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fka1zkt6cnlitcszuqli1.png" alt=" " width="621" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95ftho1hu31oim4snyvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95ftho1hu31oim4snyvl.png" alt=" " width="621" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfzezygil1pch56tnst0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfzezygil1pch56tnst0.png" alt=" " width="623" height="155"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Verify Routing Tables
&lt;/h2&gt;

&lt;p&gt;After OSPF converges (usually within 30–60 seconds), check that each router has learned all subnets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R1# show ip route
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output will include &lt;code&gt;O&lt;/code&gt; (OSPF-learned) entries for all &lt;code&gt;/28&lt;/code&gt; subnets that R1 doesn't directly own, alongside &lt;code&gt;C&lt;/code&gt; (Connected) entries for its own &lt;code&gt;/30&lt;/code&gt; links.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;R2# show ip route
R3# show ip route
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How to Verify: Ping Tests
&lt;/h2&gt;

&lt;p&gt;The real confirmation is cross-subnet pings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ping PC6 from PC1
&lt;/h3&gt;

&lt;p&gt;PC1 is on &lt;code&gt;192.168.43.16/28&lt;/code&gt; (LAN1, connected to R2).&lt;br&gt;&lt;br&gt;
PC6 is on &lt;code&gt;192.168.43.64/28&lt;/code&gt; (LAN4, connected to R3).&lt;br&gt;&lt;br&gt;
Traffic must travel: PC1 → R2 → R1 → R3 → PC6.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PC1&amp;gt; ping 192.168.43.66
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected: 5 successful replies from &lt;code&gt;192.168.43.66&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgb012qxdmxr89c6gwu4q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgb012qxdmxr89c6gwu4q.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ping PC5 from PC3
&lt;/h3&gt;

&lt;p&gt;PC3 is on &lt;code&gt;192.168.43.32/28&lt;/code&gt; (LAN2, connected to R2).&lt;br&gt;&lt;br&gt;
PC5 is on &lt;code&gt;192.168.43.48/28&lt;/code&gt; (LAN3, connected to R3).&lt;br&gt;&lt;br&gt;
Traffic must travel: PC3 → R2 → R1 → R3 → PC5.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PC3&amp;gt; ping 192.168.43.50
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected: 5 successful replies from &lt;code&gt;192.168.43.50&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnz5ra7k6ec62cvroub48.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnz5ra7k6ec62cvroub48.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Working through this end-to-end, a few things stood out that are easy to get wrong or gloss over in theory:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wildcard masks trip people up.&lt;/strong&gt; When you first encounter OSPF's &lt;code&gt;network&lt;/code&gt; command, the wildcard syntax feels backwards. The key insight is: it's not a subnet mask. It's a "don't care" mask. Bits set to 1 mean "I don't care about this bit." So &lt;code&gt;0.0.0.15&lt;/code&gt; means the last 4 bits are flexible — matching any address in that /28 block.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OSPF needs all networks advertised.&lt;/strong&gt; Forgetting to include even one &lt;code&gt;network&lt;/code&gt; statement under &lt;code&gt;router ospf&lt;/code&gt; means that subnet won't be shared with neighbors. The ping will fail and it's not immediately obvious why — &lt;code&gt;show ip route&lt;/code&gt; on the remote router will simply be missing that subnet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subnet size selection is deliberate.&lt;/strong&gt; Using a &lt;code&gt;/30&lt;/code&gt; for a router-to-router link instead of a &lt;code&gt;/28&lt;/code&gt; isn't just aesthetics — it conserves address space. A &lt;code&gt;/28&lt;/code&gt; wastes 12 addresses on a link that only ever needs 2. When you're working with limited address space, that discipline matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Label everything before you configure.&lt;/strong&gt; Trying to assign IPs while building the topology in GNS3 leads to mistakes. Doing the full address plan first on paper (or in a table) and then just applying it makes configuration mechanical and fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Why It Happens&lt;/th&gt;
&lt;th&gt;How to Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wrong wildcard mask in OSPF&lt;/td&gt;
&lt;td&gt;Confusing it with subnet mask&lt;/td&gt;
&lt;td&gt;Wildcard = bitwise inverse of subnet mask&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PC default gateway not set&lt;/td&gt;
&lt;td&gt;Assuming it's automatic in VPCS&lt;/td&gt;
&lt;td&gt;Always include the gateway in the &lt;code&gt;ip&lt;/code&gt; command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interface left in &lt;code&gt;shutdown&lt;/code&gt; state&lt;/td&gt;
&lt;td&gt;Cisco routers default to shutdown&lt;/td&gt;
&lt;td&gt;Always add &lt;code&gt;no shutdown&lt;/code&gt; after configuring an interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet overlap&lt;/td&gt;
&lt;td&gt;Miscalculating block boundaries&lt;/td&gt;
&lt;td&gt;Use a subnet calculator to verify ranges before assigning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSPF not converging&lt;/td&gt;
&lt;td&gt;Not enough time after configuration&lt;/td&gt;
&lt;td&gt;Wait 30–60 seconds; use &lt;code&gt;show ip ospf neighbor&lt;/code&gt; to check adjacency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing &lt;code&gt;network&lt;/code&gt; statement&lt;/td&gt;
&lt;td&gt;Only configuring some interfaces in OSPF&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;show ip ospf interface brief&lt;/code&gt; to see which interfaces are in OSPF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong subnet mask on PC&lt;/td&gt;
&lt;td&gt;Copying the router's mask without checking&lt;/td&gt;
&lt;td&gt;Each PC mask must match the &lt;code&gt;/28&lt;/code&gt; subnet it sits in (&lt;code&gt;255.255.255.240&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Subnetting is one of those topics where the gap between understanding it and actually doing it is wider than expected. Building this topology — calculating the blocks, assigning addresses, configuring interfaces, running OSPF, and watching the pings succeed — closes that gap in a way that no amount of reading does.&lt;/p&gt;

&lt;p&gt;The key workflow that made it clean: &lt;strong&gt;plan first, configure second, verify last.&lt;/strong&gt; Get the entire address table done before opening GNS3. Then configuration becomes mechanical, and any failures point clearly to a mistake in either math or typing.&lt;/p&gt;

&lt;p&gt;If you're working through something similar, the routing table output from &lt;code&gt;show ip route&lt;/code&gt; is your best debugging tool. If a subnet is missing there, OSPF hasn't learned it — and the ping will fail before it even tries.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>subnetting</category>
      <category>gns3</category>
      <category>ospf</category>
    </item>
  </channel>
</rss>
