<?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>Forem: Olusanya Olajide Emmanuel</title>
    <description>The latest articles on Forem by Olusanya Olajide Emmanuel (@olusanya3838).</description>
    <link>https://forem.com/olusanya3838</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3607572%2F78db0b40-6629-41f9-8331-9865e0109869.png</url>
      <title>Forem: Olusanya Olajide Emmanuel</title>
      <link>https://forem.com/olusanya3838</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/olusanya3838"/>
    <language>en</language>
    <item>
      <title>Building a Virtual Private Cloud (VPC) from Scratch on Linux</title>
      <dc:creator>Olusanya Olajide Emmanuel</dc:creator>
      <pubDate>Wed, 12 Nov 2025 10:13:37 +0000</pubDate>
      <link>https://forem.com/olusanya3838/building-a-virtual-private-cloud-vpc-from-scratch-on-linux-157i</link>
      <guid>https://forem.com/olusanya3838/building-a-virtual-private-cloud-vpc-from-scratch-on-linux-157i</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Ever wondered how cloud providers like AWS, GCP, or Azure implement Virtual Private Clouds (VPCs) under the hood? In this comprehensive guide, we'll recreate VPC fundamentals entirely on Linux using native networking primitives like network namespaces, veth pairs, bridges, and iptables.&lt;/p&gt;

&lt;p&gt;By the end of this tutorial, you'll have built a fully functional mini-VPC environment supporting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple isolated subnets&lt;/li&gt;
&lt;li&gt;Inter-subnet routing&lt;/li&gt;
&lt;li&gt;NAT gateway for internet access&lt;/li&gt;
&lt;li&gt;VPC peering&lt;/li&gt;
&lt;li&gt;Firewall rules (Security Groups)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Linux machine (Ubuntu 20.04+ or similar)&lt;/li&gt;
&lt;li&gt;Root/sudo access&lt;/li&gt;
&lt;li&gt;Basic understanding of networking concepts (IP addresses, routing, NAT)&lt;/li&gt;
&lt;li&gt;Python 3.6+ or Bash&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│                         Host OS                         │
│                                                         │
│  ┌──────────────────────────────────────────────────┐  │
│  │                    VPC 1                         │  │
│  │                                                  │  │
│  │  ┌──────────────┐         ┌──────────────┐     │  │
│  │  │   Public     │         │   Private    │     │  │
│  │  │   Subnet     │◄───────►│   Subnet     │     │  │
│  │  │ (Namespace)  │         │ (Namespace)  │     │  │
│  │  │ 10.0.1.0/24  │         │ 10.0.2.0/24  │     │  │
│  │  └──────┬───────┘         └──────┬───────┘     │  │
│  │         │                        │             │  │
│  │         └────────┬───────────────┘             │  │
│  │                  │                             │  │
│  │           ┌──────▼──────┐                      │  │
│  │           │   Bridge    │                      │  │
│  │           │ (VPC Router)│                      │  │
│  │           └──────┬──────┘                      │  │
│  └──────────────────┼──────────────────────────────┘  │
│                     │                                 │
│                     │ NAT                             │
│                     ▼                                 │
│              ┌─────────────┐                          │
│              │ eth0 (WAN)  │                          │
│              └─────────────┘                          │
└─────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Components
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Linux Bridge&lt;/strong&gt;: Acts as a virtual switch/router for the VPC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Namespaces&lt;/strong&gt;: Isolated network environments representing subnets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;veth Pairs&lt;/strong&gt;: Virtual ethernet cables connecting namespaces to the bridge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iptables&lt;/strong&gt;: Implements NAT and firewall rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing Tables&lt;/strong&gt;: Controls packet flow between subnets&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Set Up the Project
&lt;/h3&gt;

&lt;p&gt;Create a project directory and the main CLI tool:&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;mkdir &lt;/span&gt;vpc-project
&lt;span class="nb"&gt;cd &lt;/span&gt;vpc-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create &lt;code&gt;vpcctl.py&lt;/code&gt; with the implementation (see the complete code in the GitHub repository).&lt;/p&gt;

&lt;p&gt;Make it executable:&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;chmod&lt;/span&gt; +x vpcctl.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Understanding the Core Commands
&lt;/h3&gt;

&lt;p&gt;Our CLI tool provides these commands:&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;# Create a VPC&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./vpcctl.py create-vpc &amp;lt;name&amp;gt; &amp;lt;cidr&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--interface&lt;/span&gt; eth0]

&lt;span class="c"&gt;# Add subnet to VPC&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./vpcctl.py add-subnet &amp;lt;vpc-name&amp;gt; &amp;lt;subnet-name&amp;gt; &amp;lt;cidr&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;--type&lt;/span&gt; public|private]

&lt;span class="c"&gt;# Peer two VPCs&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./vpcctl.py peer &amp;lt;vpc1&amp;gt; &amp;lt;vpc2&amp;gt;

&lt;span class="c"&gt;# Apply firewall rules&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./vpcctl.py apply-firewall &amp;lt;vpc&amp;gt; &amp;lt;subnet&amp;gt; &amp;lt;policy.json&amp;gt;

&lt;span class="c"&gt;# List all VPCs&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./vpcctl.py list

&lt;span class="c"&gt;# Delete VPC&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./vpcctl.py delete-vpc &amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Create Your First VPC
&lt;/h3&gt;

&lt;p&gt;Let's create a VPC with CIDR &lt;code&gt;10.0.0.0/16&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; ./vpcctl.py create-vpc vpc1 10.0.0.0/16 &lt;span class="nt"&gt;--interface&lt;/span&gt; eth0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens behind the scenes:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creates a Linux bridge named &lt;code&gt;br-vpc1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Assigns the first IP from the CIDR (10.0.0.1) to the bridge&lt;/li&gt;
&lt;li&gt;Enables IP forwarding on the system&lt;/li&gt;
&lt;li&gt;Saves VPC state to &lt;code&gt;~/.vpcctl/vpcs.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Verify the bridge was created:&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 br-vpc1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Add Subnets
&lt;/h3&gt;

&lt;p&gt;Add a public subnet (with internet access):&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; ./vpcctl.py add-subnet vpc1 public 10.0.1.0/24 &lt;span class="nt"&gt;--type&lt;/span&gt; public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add a private subnet (isolated from internet):&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; ./vpcctl.py add-subnet vpc1 private 10.0.2.0/24 &lt;span class="nt"&gt;--type&lt;/span&gt; private
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creates network namespace (e.g., &lt;code&gt;vpc1-public&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Creates veth pair connecting namespace to bridge&lt;/li&gt;
&lt;li&gt;Assigns IP address to namespace interface&lt;/li&gt;
&lt;li&gt;Configures default route through bridge&lt;/li&gt;
&lt;li&gt;For public subnets: sets up NAT rules using iptables&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;List the created namespaces:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Deploy Test Applications
&lt;/h3&gt;

&lt;p&gt;Let's deploy simple HTTP servers to test connectivity:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In public subnet:&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="c"&gt;# Start HTTP server in public subnet namespace&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;vpc1-public python3 &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8080 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;In private subnet:&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="c"&gt;# Start HTTP server in private subnet namespace&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;vpc1-private python3 &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8081 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Test Connectivity
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Test 1: Inter-subnet communication within VPC&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="c"&gt;# From private subnet, ping public subnet&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;vpc1-private ping &lt;span class="nt"&gt;-c&lt;/span&gt; 3 10.0.1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Expected:&lt;/strong&gt; Success - subnets in same VPC can communicate&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test 2: Internet access from public subnet&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="c"&gt;# Public subnet should reach internet via NAT&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;vpc1-public ping &lt;span class="nt"&gt;-c&lt;/span&gt; 3 8.8.8.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Expected:&lt;/strong&gt; Success - NAT gateway allows outbound traffic&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test 3: Internet access from private subnet&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="c"&gt;# Private subnet should NOT have internet access&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;vpc1-private ping &lt;span class="nt"&gt;-c&lt;/span&gt; 3 8.8.8.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ &lt;strong&gt;Expected:&lt;/strong&gt; Failure or timeout - private subnet is isolated&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test 4: HTTP access&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="c"&gt;# Access HTTP server in public subnet&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;vpc1-private curl http://10.0.1.1:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Expected:&lt;/strong&gt; Success - receives HTTP response&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Implement VPC Isolation
&lt;/h3&gt;

&lt;p&gt;Create a second VPC:&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; ./vpcctl.py create-vpc vpc2 172.16.0.0/16
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./vpcctl.py add-subnet vpc2 web 172.16.1.0/24 &lt;span class="nt"&gt;--type&lt;/span&gt; public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test isolation:&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;# Try to ping vpc2 from vpc1&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;vpc1-public ping &lt;span class="nt"&gt;-c&lt;/span&gt; 3 172.16.1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ &lt;strong&gt;Expected:&lt;/strong&gt; Failure - VPCs are isolated by default&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 8: Enable VPC Peering
&lt;/h3&gt;

&lt;p&gt;Allow controlled communication between VPCs:&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; ./vpcctl.py peer vpc1 vpc2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creates veth pair between the two bridges&lt;/li&gt;
&lt;li&gt;Adds static routes for cross-VPC traffic&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Test cross-VPC communication:&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;# Now vpc1 can reach vpc2&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;vpc1-public ping &lt;span class="nt"&gt;-c&lt;/span&gt; 3 172.16.1.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Expected:&lt;/strong&gt; Success - peering enables cross-VPC routing&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 9: Apply Firewall Rules
&lt;/h3&gt;

&lt;p&gt;Create a security policy file &lt;code&gt;firewall-policy.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"subnet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10.0.1.0/24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ingress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"protocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"protocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deny"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"protocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply the policy:&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; ./vpcctl.py apply-firewall vpc1 public firewall-policy.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test the rules:&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;# HTTP on port 8080 should work&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;vpc1-private curl http://10.0.1.1:8080

&lt;span class="c"&gt;# SSH on port 22 should be blocked&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;vpc1-private nc &lt;span class="nt"&gt;-zv&lt;/span&gt; 10.0.1.1 22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 10: Monitoring and Debugging
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;View routing table in namespace:&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;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;vpc1-public ip route
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;View iptables rules:&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;iptables &lt;span class="nt"&gt;-t&lt;/span&gt; nat &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;vpc1-public iptables &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Check bridge connections:&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;bridge &lt;span class="nb"&gt;link &lt;/span&gt;show br-vpc1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Monitor network 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;&lt;span class="c"&gt;# Capture traffic on bridge&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; br-vpc1 &lt;span class="nt"&gt;-n&lt;/span&gt;

&lt;span class="c"&gt;# Capture traffic in namespace&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip netns &lt;span class="nb"&gt;exec &lt;/span&gt;vpc1-public tcpdump &lt;span class="nt"&gt;-i&lt;/span&gt; veth-ns-public &lt;span class="nt"&gt;-n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 11: Cleanup
&lt;/h3&gt;

&lt;p&gt;Remove all resources:&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;# Delete individual VPC&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./vpcctl.py delete-vpc vpc1

&lt;span class="c"&gt;# Or delete all VPCs&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./vpcctl.py delete-vpc vpc1
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./vpcctl.py delete-vpc vpc2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The delete operation automatically removes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All network namespaces&lt;/li&gt;
&lt;li&gt;veth pairs&lt;/li&gt;
&lt;li&gt;Bridge interfaces&lt;/li&gt;
&lt;li&gt;iptables NAT rules&lt;/li&gt;
&lt;li&gt;Routing table entries&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Issue: Cannot ping between subnets
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Check that IP forwarding is enabled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sysctl net.ipv4.ip_forward
&lt;span class="c"&gt;# Should return: net.ipv4.ip_forward = 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue: No internet access from public subnet
&lt;/h3&gt;

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

&lt;ol&gt;
&lt;li&gt;Verify the interface name: &lt;code&gt;ip link show&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;--interface&lt;/code&gt; parameter to match your actual internet interface&lt;/li&gt;
&lt;li&gt;Check NAT rules: &lt;code&gt;sudo iptables -t nat -L -n -v&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Issue: "Operation not permitted" errors
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; All commands must run with &lt;code&gt;sudo&lt;/code&gt; or as root user&lt;/p&gt;

&lt;h3&gt;
  
  
  Issue: Namespace already exists
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Clean up existing namespaces:&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 netns del vpc1-public
&lt;span class="c"&gt;# Or delete the entire VPC&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./vpcctl.py delete-vpc vpc1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Advanced Topics
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Custom NAT Rules
&lt;/h3&gt;

&lt;p&gt;For more complex NAT scenarios:&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;# Port forwarding from host to namespace&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;iptables &lt;span class="nt"&gt;-t&lt;/span&gt; nat &lt;span class="nt"&gt;-A&lt;/span&gt; PREROUTING &lt;span class="nt"&gt;-p&lt;/span&gt; tcp &lt;span class="nt"&gt;--dport&lt;/span&gt; 8080 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-j&lt;/span&gt; DNAT &lt;span class="nt"&gt;--to-destination&lt;/span&gt; 10.0.1.1:80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  VPC Traffic Shaping
&lt;/h3&gt;

&lt;p&gt;Limit bandwidth on veth interface:&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;tc qdisc add dev veth-vpc1-public root tbf &lt;span class="se"&gt;\&lt;/span&gt;
  rate 1mbit burst 32kbit latency 400ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Multi-tenancy
&lt;/h3&gt;

&lt;p&gt;Create isolated VPCs for different users/projects using unique naming prefixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Development Environment&lt;/strong&gt;: Create isolated networks for testing microservices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD Pipelines&lt;/strong&gt;: Spin up temporary network environments for integration tests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning Platform&lt;/strong&gt;: Understand cloud networking without cloud costs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Security Testing&lt;/strong&gt;: Practice firewall configurations and network segmentation&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;VPCs are built on standard Linux networking primitives&lt;/li&gt;
&lt;li&gt;Network namespaces provide complete network isolation&lt;/li&gt;
&lt;li&gt;Bridges act as virtual switches/routers&lt;/li&gt;
&lt;li&gt;iptables implements NAT and security policies&lt;/li&gt;
&lt;li&gt;VPC peering requires explicit routing configuration&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;You've successfully built a fully functional VPC implementation on Linux! This project demonstrates the core concepts behind cloud networking and gives you hands-on experience with Linux networking tools.&lt;/p&gt;

&lt;p&gt;The same principles apply to production cloud environments, just at a much larger scale with additional features like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High availability and redundancy&lt;/li&gt;
&lt;li&gt;Load balancing&lt;/li&gt;
&lt;li&gt;VPN connectivity&lt;/li&gt;
&lt;li&gt;Flow logs and monitoring&lt;/li&gt;
&lt;li&gt;Service mesh integration&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://man7.org/linux/man-pages/man7/network_namespaces.7.html" rel="noopener noreferrer"&gt;Linux Network Namespaces Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO.html" rel="noopener noreferrer"&gt;iptables Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.linuxfoundation.org/networking/bridge" rel="noopener noreferrer"&gt;Linux Bridge Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html" rel="noopener noreferrer"&gt;AWS VPC Concepts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  GitHub Repository
&lt;/h2&gt;

&lt;p&gt;Full code available at: [Your GitHub Repo URL]&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions or suggestions? Feel free to open an issue on GitHub!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>linux</category>
      <category>tutorial</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
