<?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: Frank Zhang</title>
    <description>The latest articles on DEV Community by Frank Zhang (@frankzhang).</description>
    <link>https://dev.to/frankzhang</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%2F4084184%2Fbd788009-bcdc-42d7-8803-4af0a1421140.jpg</url>
      <title>DEV Community: Frank Zhang</title>
      <link>https://dev.to/frankzhang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frankzhang"/>
    <language>en</language>
    <item>
      <title>Do You Know What’s Connected to Your Wi-Fi?</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Sun, 25 Oct 2026 05:48:33 +0000</pubDate>
      <link>https://dev.to/frankzhang/do-you-know-whats-connected-to-your-wi-fi-1bc6</link>
      <guid>https://dev.to/frankzhang/do-you-know-whats-connected-to-your-wi-fi-1bc6</guid>
      <description>&lt;p&gt;You can probably name every phone and computer in your home without thinking twice.&lt;/p&gt;

&lt;p&gt;But what about the TV, printer, cameras, smart speakers, NAS, and that old tablet you occasionally pull out of a drawer?&lt;/p&gt;

&lt;p&gt;As more devices get connected, your home network becomes a small collection of systems quietly working in the background. Then one day, you want to identify an unfamiliar device or troubleshoot a connection—and realize you could use a clearer picture of what’s there.&lt;/p&gt;

&lt;p&gt;WiFi Health Check brings device discovery, network diagnostics, walk tests, and stability testing to iPhone and iPad, so you can explore your network directly from your mobile device.&lt;/p&gt;

&lt;h2&gt;
  
  
  01 | Start by Seeing Who’s on Your Network
&lt;/h2&gt;

&lt;p&gt;Running a LAN scan and watching devices appear in the list is one of the most direct ways to get to know your network.&lt;/p&gt;

&lt;p&gt;Phones, computers, printers, cameras, network equipment—devices scattered across different rooms and management interfaces can now be viewed in one place. Device category counts also make it easier to see how your network is made up.&lt;/p&gt;

&lt;p&gt;If you have a NAS, virtualization hosts, or smart home devices, this inventory is especially useful. After connecting a new device, you can check whether it has been discovered and view its IP address and identification details.&lt;/p&gt;

&lt;h2&gt;
  
  
  02 | What Exactly Is That Unfamiliar Device?
&lt;/h2&gt;

&lt;p&gt;The entries that make you pause are often the ones with names you don’t recognize: an unfamiliar hostname, an IP address, or a record that shows only a manufacturer.&lt;/p&gt;

&lt;p&gt;WiFi Health Check combines multiple clues to help identify devices, including their manufacturer, device category, model, and discoverable services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multicast Discovery&lt;/strong&gt; is particularly useful here. Devices can announce information through local discovery protocols, and the app combines those details with other probe results to build a more informative device list.&lt;/p&gt;

&lt;p&gt;For example, mDNS / Bonjour, SSDP, and WS-Discovery can provide useful clues for identifying Apple devices, printers, media devices, and cameras.&lt;/p&gt;

&lt;p&gt;Once you’ve identified a device, you can give it a memorable alias. The next time you see “Office Printer” or “Living Room TV,” you won’t have to work out what it is all over again.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5wwzpf9tx8j6cffdutir.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5wwzpf9tx8j6cffdutir.png" alt=" " width="800" height="1576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  03 | What Has Changed Since the Last Scan?
&lt;/h2&gt;

&lt;p&gt;You’ve installed a new camera, replaced a phone, or rearranged your network equipment. What’s different from your previous scan?&lt;/p&gt;

&lt;p&gt;Scan history and device change comparisons let you review results from different points in time, see newly discovered devices, and check which devices were not found in the current scan.&lt;/p&gt;

&lt;p&gt;For a home network with plenty of devices—or a small studio—this saves you from repeatedly scrolling through lists and manually comparing addresses. Giving important devices recognizable aliases makes the changes even easier to follow.&lt;/p&gt;

&lt;p&gt;Your network inventory now has a timeline: you can inspect the current results and look back at earlier records.&lt;/p&gt;

&lt;h2&gt;
  
  
  04 | Same Wi-Fi, Different Room—Why Does It Feel Different?
&lt;/h2&gt;

&lt;p&gt;Video streams smoothly in the living room but occasionally stutters in the office. Meetings work well at your desk, yet moving to another room makes the connection feel less dependable.&lt;/p&gt;

&lt;p&gt;Start with a network diagnostic to check the current connection. Then use a walk test to test the same target from different locations and compare the results.&lt;/p&gt;

&lt;p&gt;You can take measurements in the living room, office, and bedroom, then use those results alongside your everyday needs to decide which location works best for video calls, remote work, or accessing your NAS.&lt;/p&gt;

&lt;p&gt;Instead of relying only on “the connection feels unstable here,” you have test records you can revisit when making changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  05 | It Connects Now. Will It Stay Stable?
&lt;/h2&gt;

&lt;p&gt;A webpage loading successfully tells you that it’s reachable at that moment. For a long video call, a remote connection, or access to services at home, you may also want to know how the connection behaves over time.&lt;/p&gt;

&lt;p&gt;Stability testing repeatedly checks a chosen target and tracks metrics such as connection success rate, latency, and jitter.&lt;/p&gt;

&lt;p&gt;You can test a service you use regularly or specify an IP address and port to see whether connections keep succeeding and whether latency fluctuates noticeably.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5lpnqomrhoxf4mxccbe0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5lpnqomrhoxf4mxccbe0.png" alt=" " width="800" height="1576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run a test before and after a network adjustment, and the difference becomes easier to see.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Knowing Your Devices to Understanding Your Connection
&lt;/h2&gt;

&lt;p&gt;A device inventory helps you get to know your local network. A diagnostic check, a set of walk test results, and a stability test help you understand how it performs in everyday use.&lt;/p&gt;

&lt;p&gt;WiFi Health Check brings these tools together on iPhone and iPad, so you can discover devices, explore identification details, review network changes, and check connection performance.&lt;/p&gt;

&lt;p&gt;Curious about what’s connected to your own Wi-Fi? Open the app and start with a LAN scan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wifi.opshome.run" rel="noopener noreferrer"&gt;Explore WiFi Health Check&lt;/a&gt; · &lt;a href="https://apps.apple.com/app/id6791147190" rel="noopener noreferrer"&gt;View on the App Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You know your Wi-Fi password. How well do you know the devices behind it?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>wifi</category>
      <category>networking</category>
      <category>iphone</category>
    </item>
    <item>
      <title>How to Use Subnet CIDR Pro to Plan IPv4 Networks</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Mon, 19 Oct 2026 04:56:08 +0000</pubDate>
      <link>https://dev.to/frankzhang/how-to-use-subnet-cidr-pro-to-plan-ipv4-networks-1i23</link>
      <guid>https://dev.to/frankzhang/how-to-use-subnet-cidr-pro-to-plan-ipv4-networks-1i23</guid>
      <description>&lt;p&gt;Subnetting is one of those everyday networking tasks that looks simple until you need to plan multiple VLANs, check address boundaries, or fit several networks into a limited IP range.&lt;/p&gt;

&lt;p&gt;A subnet calculator helps with the arithmetic. A good workflow should also help you understand the results and turn them into a usable addressing plan.&lt;/p&gt;

&lt;p&gt;In this guide, we'll walk through practical IPv4 subnet calculations, CIDR notation, VLSM planning, and wildcard masks using &lt;strong&gt;Subnet CIDR Pro&lt;/strong&gt;, an offline subnetting tool for iPhone and iPad.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://subnet.opshome.run/" rel="noopener noreferrer"&gt;https://subnet.opshome.run/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;App Store: &lt;a href="https://apps.apple.com/us/app/subnet-cidr-pro/id6816397989" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/subnet-cidr-pro/id6816397989&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Calculate a subnet from an IP address
&lt;/h2&gt;

&lt;p&gt;Let's start with a common example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;192.168.1.100/26&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;/26&lt;/code&gt; prefix means that 26 bits identify the network, leaving 6 bits for host addresses.&lt;/p&gt;

&lt;p&gt;That gives us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total addresses: 64&lt;/li&gt;
&lt;li&gt;Conventionally usable host addresses: 62&lt;/li&gt;
&lt;li&gt;Subnet mask: &lt;code&gt;255.255.255.192&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Using Subnet CIDR Pro
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the subnet calculator.&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;192.168.1.100&lt;/code&gt; and select the &lt;code&gt;/26&lt;/code&gt; prefix.&lt;/li&gt;
&lt;li&gt;Review the calculated network information.&lt;/li&gt;
&lt;li&gt;Copy the individual values you need or copy the complete summary.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result should look like this:&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;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.64/26&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet mask&lt;/td&gt;
&lt;td&gt;&lt;code&gt;255.255.255.192&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First usable address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.65&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last usable address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.126&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broadcast address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.127&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wildcard mask&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.0.0.63&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usable hosts&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notice that the entered address, &lt;code&gt;192.168.1.100&lt;/code&gt;, is a host address inside the subnet. It is not the network address itself.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F71mbpl8y53q99ypx3zrv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F71mbpl8y53q99ypx3zrv.PNG" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This distinction matters when configuring VLAN interfaces, DHCP scopes, firewall rules, and static routes.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Understand what happens when the prefix changes
&lt;/h2&gt;

&lt;p&gt;The prefix determines how much address space belongs to a subnet.&lt;/p&gt;

&lt;p&gt;For example, compare &lt;code&gt;/24&lt;/code&gt;, &lt;code&gt;/26&lt;/code&gt;, and &lt;code&gt;/28&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;Total addresses&lt;/th&gt;
&lt;th&gt;Conventional usable hosts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/24&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;254&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/26&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/28&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A &lt;code&gt;/24&lt;/code&gt; provides a larger address pool, while a &lt;code&gt;/28&lt;/code&gt; is better suited to a smaller network segment.&lt;/p&gt;

&lt;p&gt;In Subnet CIDR Pro, adjust the prefix and review the updated network boundaries, mask, address range, and host capacity.&lt;/p&gt;

&lt;p&gt;This is useful when deciding whether a subnet has enough room for the devices you expect to connect.&lt;/p&gt;

&lt;p&gt;For example, a VLAN requiring 40 host addresses needs at least a &lt;code&gt;/26&lt;/code&gt; under conventional IPv4 subnetting rules. A &lt;code&gt;/27&lt;/code&gt; only provides 30 usable host addresses.&lt;/p&gt;

&lt;p&gt;Don't choose a prefix based only on how many devices are connected today. Leave reasonable room for growth.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Plan multiple VLANs with VLSM
&lt;/h2&gt;

&lt;p&gt;Calculating individual subnets is straightforward. Designing an entire addressing plan is more challenging.&lt;/p&gt;

&lt;p&gt;Imagine a homelab or small office using the parent network:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;10.20.0.0/24&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You need separate networks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Servers: 100 hosts&lt;/li&gt;
&lt;li&gt;Workstations: 50 hosts&lt;/li&gt;
&lt;li&gt;Management: 20 hosts&lt;/li&gt;
&lt;li&gt;Printers and other devices: 10 hosts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Allocating the same subnet size to every VLAN would waste address space.&lt;/p&gt;

&lt;p&gt;This is where Variable Length Subnet Masking (VLSM) becomes useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  A practical allocation
&lt;/h3&gt;

&lt;p&gt;Start with the largest host requirement and work downward.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Network&lt;/th&gt;
&lt;th&gt;Required hosts&lt;/th&gt;
&lt;th&gt;Allocation&lt;/th&gt;
&lt;th&gt;Usable range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Servers&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.20.0.0/25&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.1–.126&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workstations&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.20.0.128/26&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.129–.190&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Management&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.20.0.192/27&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.193–.222&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Printers&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.20.0.224/28&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.225–.238&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The remaining block is &lt;code&gt;10.20.0.240/28&lt;/code&gt;, which can be reserved for future use.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to use the VLSM planner
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the VLSM planning feature.&lt;/li&gt;
&lt;li&gt;Specify the parent network and the required host counts.&lt;/li&gt;
&lt;li&gt;Add meaningful labels for each network.&lt;/li&gt;
&lt;li&gt;Generate the allocation plan.&lt;/li&gt;
&lt;li&gt;Review the proposed prefixes and address boundaries before deploying them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The important principle is to allocate the largest requirements first, then fit smaller networks into the remaining address space.&lt;/p&gt;

&lt;p&gt;Always verify that every allocated subnet fits within the parent network and that no two allocations overlap.&lt;/p&gt;

&lt;p&gt;A structured plan is easier to maintain than a collection of manually calculated addresses.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Convert subnet masks and wildcard masks
&lt;/h2&gt;

&lt;p&gt;Subnet masks and wildcard masks are closely related, but they serve different purposes.&lt;/p&gt;

&lt;p&gt;For example, a &lt;code&gt;/26&lt;/code&gt; subnet uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subnet mask: &lt;code&gt;255.255.255.192&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Wildcard mask: &lt;code&gt;0.0.0.63&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A wildcard mask is the bitwise inverse of a subnet mask. It is commonly used in Cisco-style access control lists and routing configurations.&lt;/p&gt;

&lt;p&gt;Instead of calculating each octet manually, use the mask converter to move between subnet masks, wildcard masks, and CIDR prefixes.&lt;/p&gt;

&lt;p&gt;This is especially useful when translating an IP addressing plan into device configurations.&lt;/p&gt;

&lt;p&gt;Remember that a wildcard mask is not interchangeable with a subnet mask in every command. Always check the syntax required by the target network device.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Use the CIDR reference for quick checks
&lt;/h2&gt;

&lt;p&gt;Sometimes you don't need to calculate a complete subnet. You simply need to answer a question:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many addresses does &lt;code&gt;/27&lt;/code&gt; contain?&lt;/li&gt;
&lt;li&gt;Which subnet mask corresponds to &lt;code&gt;/29&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;What wildcard mask should I use for &lt;code&gt;/24&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;How many usable hosts are available in a particular prefix?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The built-in CIDR reference lets you look up prefixes from &lt;code&gt;/0&lt;/code&gt; through &lt;code&gt;/32&lt;/code&gt; without repeatedly opening a separate browser-based calculator.&lt;/p&gt;

&lt;p&gt;It's useful during troubleshooting, certification study, network planning, and configuration reviews.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Pay attention to special prefixes
&lt;/h2&gt;

&lt;p&gt;Not every IPv4 subnet follows the conventional usable-host calculation.&lt;/p&gt;

&lt;p&gt;Two important examples are &lt;code&gt;/31&lt;/code&gt; and &lt;code&gt;/32&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/31&lt;/code&gt; — Point-to-point links&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;RFC 3021 defines the use of &lt;code&gt;/31&lt;/code&gt; prefixes on IPv4 point-to-point links. Both addresses can be used as endpoint addresses in that context, without reserving a traditional network and broadcast address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;/32&lt;/code&gt; — Single-host routes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;/32&lt;/code&gt; identifies one IPv4 address. It is commonly used for host routes and other configurations that refer to a single address.&lt;/p&gt;

&lt;p&gt;Subnet CIDR Pro handles these prefix boundaries explicitly, helping avoid incorrect assumptions when working with point-to-point links or single-host routes.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Why use an offline subnet calculator?
&lt;/h2&gt;

&lt;p&gt;Network addressing information often appears in internal documentation, private infrastructure plans, and troubleshooting notes.&lt;/p&gt;

&lt;p&gt;Subnet CIDR Pro performs its subnet calculations locally on the device. The calculation workflow does not require an account or a backend service, and results are copied only when you choose to copy them.&lt;/p&gt;

&lt;p&gt;That makes it convenient when working in a lab, on-site, or in environments where connectivity is limited.&lt;/p&gt;

&lt;p&gt;It also means you can calculate subnets without depending on an external website being available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Subnetting is not just about finding a network address. It is about making reliable decisions about address capacity, network boundaries, and future growth.&lt;/p&gt;

&lt;p&gt;A practical workflow is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Calculate the subnet for an individual IP address.&lt;/li&gt;
&lt;li&gt;Adjust the prefix to evaluate address capacity.&lt;/li&gt;
&lt;li&gt;Use VLSM to plan multiple networks efficiently.&lt;/li&gt;
&lt;li&gt;Convert masks when working with routing or ACL configurations.&lt;/li&gt;
&lt;li&gt;Verify special prefixes before deploying the configuration.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Subnet CIDR Pro brings these IPv4 calculation and planning tasks into one focused iPhone and iPad workflow.&lt;/p&gt;

&lt;p&gt;If you regularly work with VLANs, homelabs, routing, or small-office networks, having these calculations available offline can make address planning quicker and less error-prone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; Subnet CIDR Pro is my app. This article focuses on practical subnetting workflows rather than a complete feature review.&lt;/p&gt;

&lt;p&gt;#devops #homelab  #cidr&lt;/p&gt;

</description>
      <category>networking</category>
      <category>ipv4</category>
    </item>
    <item>
      <title>Does `docker compose down` Delete Your Data?</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Fri, 16 Oct 2026 14:06:02 +0000</pubDate>
      <link>https://dev.to/frankzhang/does-docker-compose-down-delete-your-data-154d</link>
      <guid>https://dev.to/frankzhang/does-docker-compose-down-delete-your-data-154d</guid>
      <description>&lt;p&gt;Two commands can have very different consequences for your database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down
docker compose down &lt;span class="nt"&gt;--volumes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference comes down to how Docker Compose manages volumes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Containers are temporary. Named volumes persist.
&lt;/h2&gt;

&lt;p&gt;Consider this PostgreSQL configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:17&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${POSTGRES_PASSWORD:?Set a password}&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db_data:/var/lib/postgresql/data&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The database files live in &lt;code&gt;db_data&lt;/code&gt;, a named volume with a lifecycle separate from the container.&lt;/p&gt;

&lt;p&gt;Running &lt;code&gt;docker compose down&lt;/code&gt; removes the containers and project networks, but keeps the named volume. Starting the same project again with &lt;code&gt;docker compose up -d&lt;/code&gt; reuses the existing data.&lt;/p&gt;

&lt;p&gt;Adding &lt;code&gt;--volumes&lt;/code&gt; requests removal of the project’s managed volumes too.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Containers&lt;/th&gt;
&lt;th&gt;Managed named volumes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose stop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stopped&lt;/td&gt;
&lt;td&gt;Kept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;td&gt;Kept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose down --volumes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;td&gt;Removed if possible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Treat &lt;code&gt;--volumes&lt;/code&gt; as an intentional data reset.&lt;/p&gt;

&lt;h2&gt;
  
  
  External volumes are handled differently
&lt;/h2&gt;

&lt;p&gt;To manage storage independently of the Compose stack, create it first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume create postgres_data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then update the volume declaration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres_data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compose now expects &lt;code&gt;postgres_data&lt;/code&gt; to exist and will leave it untouched—even during &lt;code&gt;down --volumes&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;However, external volumes can still be deleted manually. Also, pointing an existing application at a new volume does not migrate its old data.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Empty database” does not always mean deleted data
&lt;/h2&gt;

&lt;p&gt;Compose normally prefixes managed volume names with the project name:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Changing the project name—or moving the Compose file when the directory determines that name—can cause the application to use a different volume.&lt;/p&gt;

&lt;p&gt;Before assuming data loss, check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume &lt;span class="nb"&gt;ls
&lt;/span&gt;docker volume inspect homelab_db_data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The original data may still exist in the previous volume.&lt;/p&gt;

&lt;p&gt;For routine shutdowns, use &lt;code&gt;stop&lt;/code&gt; or &lt;code&gt;down&lt;/code&gt;. Reserve &lt;code&gt;down --volumes&lt;/code&gt; for deliberate cleanup, and maintain backups for anything you cannot afford to lose.&lt;/p&gt;

</description>
      <category>docker</category>
    </item>
    <item>
      <title>Three SSIDs, Three VLANs, One AP: How Industrial Wi-Fi Really Works</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Mon, 12 Oct 2026 11:15:32 +0000</pubDate>
      <link>https://dev.to/frankzhang/three-ssids-three-vlans-one-ap-how-industrial-wi-fi-really-works-807</link>
      <guid>https://dev.to/frankzhang/three-ssids-three-vlans-one-ap-how-industrial-wi-fi-really-works-807</guid>
      <description>&lt;p&gt;&lt;em&gt;When multiple wireless networks share one access point, where does the traffic actually go?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Imagine a modern manufacturing plant.&lt;/p&gt;

&lt;p&gt;AGVs transport materials between production lines. Operators use industrial PDAs to manage daily tasks. Visiting engineers connect to a guest Wi-Fi network.&lt;/p&gt;

&lt;p&gt;All three services share the same industrial wireless access point.&lt;/p&gt;

&lt;p&gt;But should they also share the same network?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not necessarily.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  One AP, Multiple Networks
&lt;/h2&gt;

&lt;p&gt;Consider this wireless configuration:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SSID&lt;/th&gt;
&lt;th&gt;Purpose&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;Factory-AGV&lt;/td&gt;
&lt;td&gt;Automated vehicles&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Factory-PDA&lt;/td&gt;
&lt;td&gt;Industrial handhelds&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Factory-Guest&lt;/td&gt;
&lt;td&gt;Visitors&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The AP broadcasts three SSIDs, each mapped to a different VLAN.&lt;/p&gt;

&lt;p&gt;All three networks reach the wired infrastructure through a single Ethernet uplink.&lt;/p&gt;

&lt;p&gt;The key question is: &lt;strong&gt;Should the switch port connected to the AP be configured as Access or Trunk?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer depends on how wireless traffic is forwarded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local Forwarding Changes Everything
&lt;/h2&gt;

&lt;p&gt;In a &lt;strong&gt;Local Forwarding&lt;/strong&gt; architecture, wireless client traffic is bridged directly from the AP into the local wired network.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; AGV ───── SSID 1 ─── VLAN 10 ──┐
                                │
 PDA ───── SSID 2 ─── VLAN 20 ──┼── AP
                                │    │
 Guest ─── SSID 3 ─── VLAN 90 ──┘    │
                                     │
                               802.1Q Trunk
                                     │
                              Industrial Switch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AP uses IEEE 802.1Q tagging to distinguish traffic belonging to different VLANs.&lt;/p&gt;

&lt;p&gt;Therefore, the connected switch port must permit VLANs 10, 20, and 90, typically using a &lt;strong&gt;Trunk configuration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And don't forget the AP management VLAN, which may require its own tagged or untagged configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Centralized Forwarding?
&lt;/h2&gt;

&lt;p&gt;With &lt;strong&gt;Centralized Forwarding&lt;/strong&gt;, the data path is different.&lt;/p&gt;

&lt;p&gt;Instead of bridging wireless client traffic locally, the AP encapsulates it in a tunnel, commonly CAPWAP, toward a wireless controller.&lt;/p&gt;

&lt;p&gt;The wireless client VLANs are then handled at the controller or centralized gateway.&lt;/p&gt;

&lt;p&gt;As a result, the AP's switch port does not necessarily need all three service VLANs.&lt;/p&gt;

&lt;p&gt;This is an important distinction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Forwarding:&lt;/strong&gt; Client traffic enters the wired VLANs at the AP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Centralized Forwarding:&lt;/strong&gt; Client traffic is transported to the controller before entering the service networks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Local Forwarding can still use CAPWAP for AP management and control. It does not mean the wireless controller disappears.&lt;/p&gt;

&lt;h2&gt;
  
  
  VLAN Separation Is Not Security Isolation
&lt;/h2&gt;

&lt;p&gt;Here's another detail worth remembering.&lt;/p&gt;

&lt;p&gt;Three VLANs provide three separate Layer 2 broadcast domains.&lt;/p&gt;

&lt;p&gt;But if a Layer 3 gateway allows unrestricted inter-VLAN routing, the guest network might still reach production systems.&lt;/p&gt;

&lt;p&gt;In an industrial environment, this can create unnecessary exposure.&lt;/p&gt;

&lt;p&gt;Proper segmentation also requires firewall policies or ACLs to control traffic between AGVs, industrial terminals, and guest devices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VLANs separate networks. Security policies determine who can communicate.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;One AP can support multiple SSIDs and VLANs through a single physical connection.&lt;/p&gt;

&lt;p&gt;But the switch configuration must match the wireless forwarding architecture.&lt;/p&gt;

&lt;p&gt;For locally forwarded SSIDs, the AP uplink typically needs to carry the corresponding VLANs through 802.1Q tagging.&lt;/p&gt;

&lt;p&gt;For centrally forwarded SSIDs, those service VLANs may instead be handled at the wireless controller.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real design question isn't how many SSIDs an AP broadcasts. It's where their traffic enters the wired network.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In your industrial Wi-Fi deployments, do you prefer Local Forwarding or Centralized Forwarding?&lt;/p&gt;




</description>
      <category>network</category>
      <category>wifi</category>
      <category>industrialiot</category>
    </item>
    <item>
      <title>If Making OT Easier to Manage Also Makes It Easier to Reach, Is That Still a Good Design?</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Fri, 02 Oct 2026 07:33:22 +0000</pubDate>
      <link>https://dev.to/frankzhang/if-making-ot-easier-to-manage-also-makes-it-easier-to-reach-is-that-still-a-good-design-41j4</link>
      <guid>https://dev.to/frankzhang/if-making-ot-easier-to-manage-also-makes-it-easier-to-reach-is-that-still-a-good-design-41j4</guid>
      <description>&lt;p&gt;&lt;strong&gt;In an IT/OT environment, would you choose easier operations — or stronger security?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most engineers would probably answer: &lt;strong&gt;both&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But in real environments, the two often start pulling in different directions.&lt;/p&gt;

&lt;p&gt;A Windows workstation needs patches, so someone opens access to WSUS.&lt;/p&gt;

&lt;p&gt;Then DNS is added.&lt;/p&gt;

&lt;p&gt;Then NTP.&lt;/p&gt;

&lt;p&gt;Then Active Directory.&lt;/p&gt;

&lt;p&gt;Then remote support.&lt;/p&gt;

&lt;p&gt;Each change looks reasonable on its own.&lt;/p&gt;

&lt;p&gt;But after enough small exceptions, the OT network is still called “isolated” while depending on half of the enterprise network.&lt;/p&gt;

&lt;p&gt;That is where the real problem begins.&lt;/p&gt;

&lt;p&gt;And that is exactly why &lt;strong&gt;Purdue Level 3.5 — the Industrial DMZ — matters.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  OT Does Need IT Services
&lt;/h2&gt;

&lt;p&gt;A secure OT network cannot simply disconnect from everything.&lt;/p&gt;

&lt;p&gt;Production environments still need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows updates&lt;/li&gt;
&lt;li&gt;DNS and NTP&lt;/li&gt;
&lt;li&gt;identity services&lt;/li&gt;
&lt;li&gt;antivirus updates&lt;/li&gt;
&lt;li&gt;remote maintenance&lt;/li&gt;
&lt;li&gt;logging&lt;/li&gt;
&lt;li&gt;file exchange&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The question is not whether OT should use these services.&lt;/p&gt;

&lt;p&gt;The question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How do we provide them without turning IT into a direct path into OT?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A simplified architecture looks 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;Corporate IT
     |
  Firewall
     |
+----------------------+
|   Industrial DMZ     |
|      Level 3.5       |
+----------------------+
     |
  Firewall
     |
     OT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The DMZ becomes the controlled boundary between the two environments.&lt;/p&gt;

&lt;p&gt;Not just another VLAN.&lt;/p&gt;

&lt;p&gt;Not just another subnet.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;service boundary&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  WSUS Is a Simple Example
&lt;/h2&gt;

&lt;p&gt;Imagine several Windows systems inside OT:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;engineering workstations&lt;/li&gt;
&lt;li&gt;HMI servers&lt;/li&gt;
&lt;li&gt;SCADA servers&lt;/li&gt;
&lt;li&gt;historian systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They need updates.&lt;/p&gt;

&lt;p&gt;The easiest solution is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OT Host
   |
   v
Corporate WSUS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works.&lt;/p&gt;

&lt;p&gt;But now OT depends directly on a Level 4 service.&lt;/p&gt;

&lt;p&gt;A cleaner approach is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Microsoft Update
      |
      v
Corporate WSUS
      |
      v
DMZ WSUS
      |
      v
OT Windows Hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now OT systems only need access to the WSUS service in the DMZ.&lt;/p&gt;

&lt;p&gt;The DMZ server handles the upstream relationship.&lt;/p&gt;

&lt;p&gt;That is an important difference.&lt;/p&gt;

&lt;p&gt;Instead of giving OT access to the corporate network, we give OT access to &lt;strong&gt;one specific service&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Think in Services, Not Networks
&lt;/h2&gt;

&lt;p&gt;This is probably the simplest way to understand Level 3.5.&lt;/p&gt;

&lt;p&gt;Avoid this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OT ---&amp;gt; Corporate Network
OT ---&amp;gt; Internet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefer this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OT ---&amp;gt; DMZ WSUS
OT ---&amp;gt; DMZ NTP
OT ---&amp;gt; DMZ DNS
OT ---&amp;gt; DMZ Jump Host
OT ---&amp;gt; DMZ File Gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first model grants network reachability.&lt;/p&gt;

&lt;p&gt;The second grants controlled service access.&lt;/p&gt;

&lt;p&gt;That is a much healthier security model.&lt;/p&gt;




&lt;h2&gt;
  
  
  Active Directory Is Where Things Get Complicated
&lt;/h2&gt;

&lt;p&gt;Identity is harder.&lt;/p&gt;

&lt;p&gt;It is tempting to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We already have a corporate domain. Why build something separate?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The problem is that Active Directory is not just a login service.&lt;/p&gt;

&lt;p&gt;It may also involve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kerberos&lt;/li&gt;
&lt;li&gt;LDAP&lt;/li&gt;
&lt;li&gt;DNS&lt;/li&gt;
&lt;li&gt;Group Policy&lt;/li&gt;
&lt;li&gt;service accounts&lt;/li&gt;
&lt;li&gt;machine accounts&lt;/li&gt;
&lt;li&gt;privileged credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once OT becomes deeply dependent on enterprise identity, the boundary between the two environments becomes much weaker.&lt;/p&gt;

&lt;p&gt;Putting a corporate domain controller directly into a lower OT zone is not really solving the problem.&lt;/p&gt;

&lt;p&gt;It is moving enterprise trust deeper into OT.&lt;/p&gt;

&lt;p&gt;Depending on the environment, a better design may involve:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Corporate Identity
       |
       v
Industrial DMZ
       |
       v
OT Identity Services
       |
       v
OT Systems
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This could mean a separate OT domain, carefully restricted trust, or another controlled authentication design.&lt;/p&gt;

&lt;p&gt;There is no single Active Directory architecture that fits every plant.&lt;/p&gt;

&lt;p&gt;But the principle is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Enterprise identity should not quietly become a bridge into OT.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Even NTP Deserves Attention
&lt;/h2&gt;

&lt;p&gt;Allowing an HMI or PLC to reach a public NTP server may look harmless.&lt;/p&gt;

&lt;p&gt;After all, it only needs the time.&lt;/p&gt;

&lt;p&gt;But architecturally, this still means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OT Device ---&amp;gt; Internet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A cleaner design is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;External Time Source
        |
        v
Enterprise / DMZ NTP
        |
        v
OT Time Source
        |
        v
HMI / SCADA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same logic applies to DNS, software repositories, antivirus updates, logging, and other shared services.&lt;/p&gt;

&lt;p&gt;The closer a system is to the physical process, the fewer external dependencies it should normally have.&lt;/p&gt;




&lt;h2&gt;
  
  
  Remote Access Is Another Common Shortcut
&lt;/h2&gt;

&lt;p&gt;Maintenance teams need access.&lt;/p&gt;

&lt;p&gt;That is normal.&lt;/p&gt;

&lt;p&gt;But this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Engineer Laptop ---&amp;gt; OT Server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;creates direct trust between environments.&lt;/p&gt;

&lt;p&gt;A stronger design is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Engineer
   |
   v
DMZ Jump Host
   |
   v
OT Management Host
   |
   v
Target System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we have a place to enforce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MFA&lt;/li&gt;
&lt;li&gt;privileged access&lt;/li&gt;
&lt;li&gt;session logging&lt;/li&gt;
&lt;li&gt;approval workflows&lt;/li&gt;
&lt;li&gt;time-based access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The DMZ is not simply forwarding traffic.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;breaking direct trust&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  A DMZ Is Not the Same as a VLAN
&lt;/h2&gt;

&lt;p&gt;Another common assumption is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“IT and OT are already on different VLANs, so they are isolated.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;This:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IT VLAN
   |
 Router
   |
OT VLAN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is not automatically equivalent to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IT
 |
Firewall
 |
Industrial DMZ
 |
Firewall
 |
OT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important question is not whether the networks use different subnets.&lt;/p&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What communication paths are actually allowed between them?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A real DMZ normally gives you a place to enforce policy, inspection, logging, proxies, jump hosts, and other controls.&lt;/p&gt;

&lt;p&gt;A VLAN gives you segmentation.&lt;/p&gt;

&lt;p&gt;A DMZ gives you a security boundary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Keep the Firewall Rules Boring
&lt;/h2&gt;

&lt;p&gt;A good IT/OT firewall policy should be easy to explain.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OT Windows Hosts -&amp;gt; DMZ WSUS
DMZ WSUS         -&amp;gt; Upstream WSUS
OT Hosts         -&amp;gt; DMZ NTP
Admin Workstation -&amp;gt; DMZ Jump Host
DMZ Log Relay    -&amp;gt; SIEM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What you do not want is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OT-NETWORK -&amp;gt; CORPORATE-NETWORK -&amp;gt; ANY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the DMZ exists but broad rules allow everyone to bypass it, then it is mostly decoration.&lt;/p&gt;

&lt;p&gt;A good starting point is still:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DENY BY DEFAULT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then allow only the specific services that have a clear operational reason.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Question I Like to Ask
&lt;/h2&gt;

&lt;p&gt;When reviewing an IT/OT architecture, one question quickly reveals whether the segmentation is meaningful:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If the DMZ is compromised, how far can an attacker move?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the answer is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Anywhere in OT.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;then the DMZ is not doing enough.&lt;/p&gt;

&lt;p&gt;If the answer is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Only to a small number of explicitly permitted services.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;then the architecture is much healthier.&lt;/p&gt;

&lt;p&gt;The same question works in reverse.&lt;/p&gt;

&lt;p&gt;If an OT workstation is compromised, how much of corporate IT can it reach?&lt;/p&gt;

&lt;p&gt;Ideally:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;very little.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Security First — Without Making Operations Miserable
&lt;/h2&gt;

&lt;p&gt;In OT, I would still put security first.&lt;/p&gt;

&lt;p&gt;But “security first” should not mean making everyday operations painful.&lt;/p&gt;

&lt;p&gt;A good architecture should make the safe path the normal path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Engineer
   |
  MFA
   |
Jump Host
   |
OT Management Zone
   |
Target Device
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is better than forcing engineers to choose between:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;secure but unusable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;convenient but exposed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal should be both.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Purdue Level 3.5 is not really about memorizing another network layer.&lt;/p&gt;

&lt;p&gt;It is about deciding &lt;strong&gt;where trust stops&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IT &amp;lt;-------------&amp;gt; OT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we want:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IT
 |
DMZ
 |
OT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with every connection having a clear reason to exist.&lt;/p&gt;

&lt;p&gt;WSUS, identity, NTP, DNS, remote access, logging, and file transfer all follow the same principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Do not provide broad network access when a narrowly defined service is enough.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the real value of the Industrial DMZ.&lt;/p&gt;

&lt;p&gt;It lets IT support OT without quietly becoming part of the OT attack path.&lt;/p&gt;




</description>
      <category>cybersecurity</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>Hardening Enterprise Layer 2: How DHCP Snooping, DAI, and IP Source Guard Work in Tandem</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Thu, 24 Sep 2026 02:24:45 +0000</pubDate>
      <link>https://dev.to/frankzhang/hardening-enterprise-layer-2-how-dhcp-snooping-dai-and-ip-source-guard-work-in-tandem-4b50</link>
      <guid>https://dev.to/frankzhang/hardening-enterprise-layer-2-how-dhcp-snooping-dai-and-ip-source-guard-work-in-tandem-4b50</guid>
      <description>&lt;p&gt;When engineering network security, teams often fixate on perimeter firewalls, WAFs, and endpoint EDR agents. Yet, inside flat campus and branch networks, the Layer 2 broadcast domain remains one of the softest targets. Once a rogue actor plugs into an open Ethernet jack or lands on an internal SSID, the absence of Layer 2 verification turns the entire local subnet into a playground.&lt;/p&gt;

&lt;p&gt;Without proper safeguards, an unprivileged attacker can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stand up a rogue DHCP server to distribute malicious default gateways and DNS servers.&lt;/li&gt;
&lt;li&gt;Broadcast forged Gratuitous ARPs to execute Man-in-the-Middle (MitM) eavesdropping.&lt;/li&gt;
&lt;li&gt;Forge arbitrary source IPs to launch spoofed volumetric attacks or bypass IP-based ACLs and log audits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Access layer switches must do more than blindly forward frames—they must act as zero-trust gatekeepers for network identity. In enterprise designs, this resilience is built on three tightly coupled mechanisms: &lt;strong&gt;DHCP Snooping&lt;/strong&gt;, &lt;strong&gt;Dynamic ARP Inspection (DAI)&lt;/strong&gt;, and &lt;strong&gt;IP Source Guard (IPSG)&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Dependency Chain: One Source of Truth
&lt;/h2&gt;

&lt;p&gt;These three features do not operate as isolated silos. Instead, they form a strict, hierarchical enforcement chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;               +----------------------------------+
               |          DHCP Snooping           |
               | (Builds the Trusted State Table) |
               +-----------------+----------------+
                                 │
                 ┌───────────────┴───────────────┐
                 ▼                               ▼
  +-----------------------------+ +-----------------------------+
  | Dynamic ARP Inspection(DAI) | |   IP Source Guard (IPSG)    |
  |  Validates ARP frames via   | |  Injects dynamic TCAM PACLs |
  |       Control Plane         | |     to filter Source IPs    |
  +-----------------------------+ +-----------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If DHCP Snooping fails to build or maintain an accurate binding database, both DAI and IPSG lose their reference point and fail to operate correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architectural Scenario &amp;amp; Packet Enforcement Flow
&lt;/h2&gt;

&lt;p&gt;Below is a breakdown of how an access switch armed with this triad inspects both legitimate endpoints and hostile traffic across trusted and untrusted interfaces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+--------------------------------------------------------------------------------------------------+
|                                    ENTERPRISE L2 SWITCH FABRIC                                   |
|                                                                                                  |
|   [Port Gi1/0/24: TRUSTED] &amp;lt;=============================&amp;gt; Legitimate Core / DHCP Server         |
|   - Allows incoming DHCP Offer / ACK messages                                                    |
|   - Bypasses DAI &amp;amp; IPSG inspection filters                                                       |
+--------------------------------------------------------------------------------------------------+
          ▲                                                   ▲
          │                                                   │
[Port Gi1/0/1: UNTRUSTED]                           [Port Gi1/0/2: UNTRUSTED]
          │                                                   │
+---------┴-----------------------+                 +---------┴-----------------------+
|        LEGITIMATE CLIENT        |                 |            ATTACKER             |
| MAC:  00:aa:bb:cc:dd:01         |                 | MAC:  00:de:ad:be:ef:99         |
| IP:   10.10.10.101 (via DHCP)   |                 | IP:   Self-assigned / Rogue     |
+---------------------------------+                 +---------------------------------+
  │                                                   │
  ├─ 1. DHCP DORA Handshake                           ├─ [ATTACK A] Rogue DHCP Server
  │     └─► Switch builds Binding Entry:              │     └─► Sends DHCP Offer
  │         [00:aa:bb:... | 10.10.10.101 | Gi1/0/1]   │         └─► DROPPED by DHCP Snooping
  │                                                   │
  ├─ 2. ARP Request / Reply                           ├─ [ATTACK B] ARP Poisoning / Spoofing
  │     └─► DAI checks Binding Database:              │     └─► Sends: "10.10.10.1 is at 00:de:ad:..."
  │         Matches entry -&amp;gt; PASSED                   │         └─► DROPPED by DAI (Sender mismatch)
  │                                                   │
  └─ 3. Standard IP Data Frames                       └─ [ATTACK C] IP Impersonation
        └─► IPSG checks TCAM filter:                        └─► Forges Source IP: 10.10.10.100
            Src IP = 10.10.10.101 -&amp;gt; FORWARDED                  └─► DROPPED by IPSG (Hardware line-rate)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  1. DHCP Snooping: Establishing the Binding Database
&lt;/h2&gt;

&lt;p&gt;DHCP Snooping acts as a layer-2 stateful inspection engine for DHCP traffic. It performs two critical tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Rogue DHCP Mitigation&lt;/strong&gt;: Switch ports are designated as either &lt;code&gt;Trusted&lt;/code&gt; or &lt;code&gt;Untrusted&lt;/code&gt;. All end-user access ports are &lt;code&gt;Untrusted&lt;/code&gt; by default. If a DHCP server message (such as &lt;code&gt;DHCPOFFER&lt;/code&gt;, &lt;code&gt;DHCPACK&lt;/code&gt;, or &lt;code&gt;DHCPNAK&lt;/code&gt;) arrives on an untrusted port, the switch discards it immediately. Only ports connecting directly to legitimate upstream DHCP servers or DHCP relays are configured as &lt;code&gt;Trusted&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Database Construction&lt;/strong&gt;: As valid endpoints complete the standard DORA exchange (Discover, Offer, Request, ACK), the switch snoops on the &lt;code&gt;DHCPACK&lt;/code&gt; packet and records an entry in the &lt;strong&gt;DHCP Snooping Binding Table&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Client MAC Address&lt;/li&gt;
&lt;li&gt;Leased IP Address&lt;/li&gt;
&lt;li&gt;Lease Duration&lt;/li&gt;
&lt;li&gt;VLAN ID&lt;/li&gt;
&lt;li&gt;Ingress Physical Port
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MAC Address          IP Address       Lease(sec)  Type            VLAN  Interface
------------------   ---------------  ----------  --------------  ----  ------------------
00:aa:bb:cc:dd:01   10.10.10.101     86400       dhcp-snooping   10    GigabitEthernet1/0/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This binding database is the single source of truth for downstream filtering engines.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Dynamic ARP Inspection (DAI): Eliminating ARP Poisoning
&lt;/h2&gt;

&lt;p&gt;The Address Resolution Protocol (ARP) is stateless and insecure by design. Any host can transmit an unsolicited Gratuitous ARP declaring ownership of an IP address, and adjacent hosts will blindly update their local ARP caches.&lt;/p&gt;

&lt;p&gt;DAI remedies this by validating ARP traffic on all untrusted interfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When an ARP frame enters an untrusted port, the switch intercepts it and checks the payload's &lt;code&gt;Sender MAC&lt;/code&gt; and &lt;code&gt;Sender IP&lt;/code&gt; fields against the DHCP Snooping Binding Table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Match Found&lt;/strong&gt;: The frame is forwarded normally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mismatch or Missing Record&lt;/strong&gt;: The frame is dropped, and a violation is logged.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Operational Note on Control Plane Protection:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Unlike standard line-rate frame switching handled by ASICs, DAI requires the switch CPU to parse the ARP payload. A malicious host can easily flood thousands of forged ARP packets to overwhelm the switch processor. Always enforce ARP rate limiting on untrusted ports (typically &lt;code&gt;15–30 packets per second&lt;/code&gt;) to prevent control plane denial of service.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. IP Source Guard (IPSG): Stopping Spoofed Packets in Hardware
&lt;/h2&gt;

&lt;p&gt;DAI defends against ARP manipulation, but an attacker can still configure a static IP on their network interface and transmit raw IP packets directly (e.g., launching UDP floods or evading identity-based firewalls).&lt;/p&gt;

&lt;p&gt;IP Source Guard addresses this vulnerability in the data plane:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When IPSG is enabled on an access interface, the port initially blocks all IP traffic except essential DHCP exchanges.&lt;/li&gt;
&lt;li&gt;Once an endpoint receives an IP via DHCP, IPSG reads the snooping table and dynamically compiles a Port Access Control List (PACL) straight into the switch’s &lt;strong&gt;TCAM (Ternary Content-Addressable Memory)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Only frames whose source IP (and optionally, source MAC) match the active hardware entry are permitted. Mismatched packets are dropped at wire speed by the ASIC without consuming CPU cycles.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DAI  ──► Inspects ARP payloads in software/CPU plane
IPSG ──► Filters IP packet headers in hardware/TCAM plane
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. The Fallacy: Why Port Security Is Not Enough
&lt;/h2&gt;

&lt;p&gt;A frequent misconception among administrators is that enabling &lt;strong&gt;Port Security&lt;/strong&gt; eliminates the need for DHCP Snooping, DAI, and IPSG.&lt;/p&gt;

&lt;p&gt;Port Security operates strictly at Layer 2:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It tracks how many source MAC addresses appear on a physical port and limits unauthorized MAC learning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It is completely blind to Layer 3 and Layer 2.5 protocols.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If an employee brings an unauthorized device and clones their company-issued laptop’s MAC address, Port Security sees a legitimate MAC and permits the frame. That rogue device can then forge ARP packets or hijack another node's IP unimpeded. &lt;/p&gt;

&lt;p&gt;Port Security prevents physical port piggybacking (such as an unmanaged mini-hub under a desk); it does not protect the integrity of network identities.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Production Pitfalls and Failure Modes
&lt;/h2&gt;

&lt;p&gt;Deploying these protocols in enterprise environments without proper planning can easily cause network outages. Keep the following gotchas in mind:&lt;/p&gt;

&lt;h3&gt;
  
  
  Pitfall 1: Silent Drops on Static-IP Endpoints
&lt;/h3&gt;

&lt;p&gt;Not every enterprise asset uses DHCP. Printers, IP cameras, video endpoints, building management systems, and specialized industrial controllers are often assigned static addresses.&lt;/p&gt;

&lt;p&gt;Because these devices bypass the DHCP handshake, they never register in the DHCP Snooping database. Turning on DAI or IPSG indiscriminately will instantly blackhole them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Audit all non-DHCP assets prior to rollout. Define static bindings manually in the switch configuration or construct tailored ARP Access Lists (ARP ACLs) to explicitly authorize static hosts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ip source binding 00:11:22:33:44:55 vlan 10 10.10.10.50 interface Gi1/0/5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pitfall 2: The "All Trunks Are Trusted" Assumption
&lt;/h3&gt;

&lt;p&gt;A naive rule of thumb claims that &lt;em&gt;Access ports are Untrusted, and Trunk ports are Trusted&lt;/em&gt;. This is dangerous.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Trusted&lt;/code&gt; designation must be reserved exclusively for uplinks heading directly toward legitimate DHCP infrastructure. If an inter-switch trunk leading to a downstream access switch is marked as &lt;code&gt;Trusted&lt;/code&gt;, any untrusted client connected to that downstream switch can bypass snooping checks if the edge switch is misconfigured.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pitfall 3: Err-Disable Outages Caused by ARP Bursts
&lt;/h3&gt;

&lt;p&gt;Operating systems frequently send sudden bursts of ARP requests upon waking from sleep or renegotiating connections. Furthermore, dual-homed setups (such as a laptop tethered to an IP Phone’s passthrough port) can generate bursts that exceed conservative rate limits.&lt;/p&gt;

&lt;p&gt;If a port exceeds its configured ARP threshold, many switches automatically transition the interface to the &lt;code&gt;err-disable&lt;/code&gt; state, causing complete loss of connectivity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tune the burst rate thresholds based on port workload, and always enable automated recovery timers so ports recover without administrative intervention:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;errdisable recovery cause arp-inspection
errdisable recovery interval 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Phased Rollout Blueprint
&lt;/h2&gt;

&lt;p&gt;Do not enable all three features at once on an active production network. Adopt an &lt;strong&gt;Observe → Validate → Enforce&lt;/strong&gt; strategy across distinct phases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Phase 1: Foundation (DHCP Snooping)&lt;/strong&gt;
Enable DHCP Snooping globally and define upstream uplinks as &lt;code&gt;Trusted&lt;/code&gt;. Let the network run undisturbed for several days while reviewing the binding table to confirm leases are reliably captured.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 2: Static Inventory Reconciliation&lt;/strong&gt;
Cross-reference the binding table against network inventory. Create static binding entries or ARP ACLs for all non-DHCP infrastructure devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 3: DAI Canary Deployment&lt;/strong&gt;
Enable DAI on a single non-critical VLAN. Configure generous ARP rate limits and set DAI logging to notify on drops. Review the Syslog output to ensure legitimate nodes are not triggering violations before rolling it out across access VLANs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 4: Hardware-Level Lockdown (IPSG)&lt;/strong&gt;
Apply IP Source Guard to client-facing access ports to seal IP spoofing vectors in the TCAM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 5: Complementary Access Hardening&lt;/strong&gt;
Layer on supplemental port-level defenses:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;802.1X (NAC)&lt;/strong&gt; for client authentication.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BPDU Guard &amp;amp; Root Guard&lt;/strong&gt; to prevent spanning-tree manipulation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storm Control&lt;/strong&gt; to suppress broadcast storms.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Layer 2 security cannot rely on a single magic toggle. True defense-in-depth requires cohesive, layered enforcement:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threat Vector&lt;/th&gt;
&lt;th&gt;Mitigation Engine&lt;/th&gt;
&lt;th&gt;Inspection Layer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rogue DHCP / Man-in-the-Middle&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;DHCP Snooping&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Layer 7 (DHCP Payload)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARP Cache Poisoning / Spoofing&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Dynamic ARP Inspection (DAI)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Layer 2.5 (ARP Payload)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source IP Impersonation / Leakage&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IP Source Guard (IPSG)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Layer 3 (IP Header / TCAM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MAC Flooding / Unauthorized Hardware&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Port Security / 802.1X&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Layer 2 (MAC / EAPOL)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;By tying Layer 3 IP allocations to physical switch ports and Layer 2 MAC addresses, you transform your access switches from unauthenticated dumb pipes into an integrated zero-trust perimeter.&lt;/p&gt;

</description>
      <category>security</category>
      <category>networking</category>
      <category>sysadmin</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>Enterprise WLAN Architecture: 802.1X Dynamic VLAN Assignment and Zero-Trust Guest Isolation</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Mon, 21 Sep 2026 00:06:10 +0000</pubDate>
      <link>https://dev.to/frankzhang/enterprise-wlan-architecture-8021x-dynamic-vlan-assignment-and-zero-trust-guest-isolation-11d</link>
      <guid>https://dev.to/frankzhang/enterprise-wlan-architecture-8021x-dynamic-vlan-assignment-and-zero-trust-guest-isolation-11d</guid>
      <description>&lt;p&gt;Enterprise wireless networks frequently fall victim to one of two major architectural anti-patterns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SSID Proliferation:&lt;/strong&gt; Deploying dedicated SSIDs for individual departments (Engineering, Finance, HR) or distinct functional units.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Shared-PSK Flat Network:&lt;/strong&gt; Funneling all users and endpoints into a flat, shared-key network under a single pre-shared key (PSK).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The former triggers catastrophic beacon overhead that saturates limited RF airtime, degrading overall channel capacity. The latter completely forfeits identity-based network access control and leaves the internal perimeter exposed to lateral movement.&lt;/p&gt;

&lt;p&gt;A scalable, high-security enterprise WLAN architecture must enforce a strict &lt;strong&gt;separation of concerns across three layers&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Air Interface (Access Layer):&lt;/strong&gt; Managed by the SSID, responsible solely for physical RF attachment and baseline frame delivery.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity &amp;amp; Authentication (Control Layer):&lt;/strong&gt; Driven by 802.1X and centralized RADIUS services to validate directory credentials and device posture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy &amp;amp; Authorization (Data Plane Isolation):&lt;/strong&gt; Enforced via RADIUS-pushed dynamic VLAN assignment and upstream firewall access control lists (ACLs).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Architectural Core: The Minimalist Dual-SSID Model
&lt;/h2&gt;

&lt;p&gt;To eliminate SSID proliferation, the wireless footprint is consolidated into two distinct radio access profiles: &lt;strong&gt;Corporate (Internal)&lt;/strong&gt; and &lt;strong&gt;Guest (External)&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;                           Enterprise WLAN RF Access
                                      │
         ┌────────────────────────────┴────────────────────────────┐
         ▼                                                         ▼
 Corporate Access (Internal)                               Guest Access (External)
┌───────────────────────────┐                             ┌───────────────────────┐
│ WPA3/WPA2-Enterprise      │                             │ Open / OWE (Enhanced) │
│ 802.1X EAP Authentication │                             │ Captive Portal Auth   │
└─────────────┬─────────────┘                             └───────────┬───────────┘
              │                                                       │
              ▼                                                       ▼
      RADIUS Server / IdP                                     Guest Edge Gateway
   (AD / OpenLDAP / Cloud IdP)                             (L2 Isolation + L3 ACLs)
              │                                                       │
              ▼                                                       ▼
  Dynamic Attribute Injection                                Strict Outbound Only
     (RFC 2868 / RFC 3580)                                (Allow: DHCP/DNS/Internet)
              │
   ┌──────────┼──────────┐
   ▼          ▼          ▼
Eng VLAN   Fin VLAN   Mgmt VLAN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under this operational model, Access Points (APs) broadcast a maximum of two SSIDs across all radios. Airtime utilization is maintained at peak efficiency, while segmentation and access policies are offloaded entirely to identity-driven backend systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Corporate Network: 802.1X and Dynamic VLAN Assignment
&lt;/h2&gt;

&lt;p&gt;Corporate endpoints authenticate via 802.1X enterprise frameworks (EAP-TLS with mutual PKI certificates, or transitional EAP-PEAP-MSCHAPv2), enabling a &lt;strong&gt;single SSID to dynamically route diverse user roles into isolated segments&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Authentication &amp;amp; Dynamic Assignment Flow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Supplicant (Client)   Authenticator (AP/WLC)   Auth Server (RADIUS)    Directory (AD/LDAP)
        │                       │                       │                       │
        │── 802.1X EAPOL ──────&amp;gt;│                       │                       │
        │                       │── RADIUS Access- ────&amp;gt;│                       │
        │                       │   Request             │── Verify Identity ───&amp;gt;│
        │                       │                       │&amp;lt;── Identity &amp;amp; Groups ─│
        │                       │&amp;lt;── Access-Accept ─────│                       │
        │                       │    (RFC 3580 VLAN)    │                       │
        │&amp;lt;── EAP-Success ───────│                       │                       │
        │                       │                       │                       │
        │[Client mapped to target VLAN; initiates DHCP DORA on respective subnet]│
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Standard RADIUS Response Attributes
&lt;/h3&gt;

&lt;p&gt;Upon successful authentication, the RADIUS server (e.g., FreeRADIUS, Cisco ISE, Aruba ClearPass, or Windows NPS) injects standard IETF authorization attributes into the &lt;code&gt;Access-Accept&lt;/code&gt; payload as defined by RFC 2868 and RFC 3580:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;RADIUS Attribute&lt;/th&gt;
&lt;th&gt;Attribute ID&lt;/th&gt;
&lt;th&gt;Typical Value&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;strong&gt;Tunnel-Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;13&lt;/code&gt; (VLAN)&lt;/td&gt;
&lt;td&gt;Specifies the encapsulation tunneling protocol as 802.1Q VLAN.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tunnel-Medium-Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;6&lt;/code&gt; (802)&lt;/td&gt;
&lt;td&gt;Defines the transport medium as IEEE 802 Local Area Network.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tunnel-Private-Group-Id&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;100&lt;/code&gt; or &lt;code&gt;VLAN_Name&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The target VLAN ID or named VLAN string assigned to the session.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Dynamic Mapping Logic&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Software Engineer authenticates $\rightarrow$ RADIUS returns &lt;code&gt;Tunnel-Private-Group-Id = 100&lt;/code&gt; $\rightarrow$ AP binds traffic to R&amp;amp;D VLAN.&lt;/li&gt;
&lt;li&gt;Finance Officer authenticates $\rightarrow$ RADIUS returns &lt;code&gt;Tunnel-Private-Group-Id = 200&lt;/code&gt; $\rightarrow$ AP binds traffic to Finance VLAN.&lt;/li&gt;
&lt;li&gt;Untrusted entity or expired account $\rightarrow$ RADIUS returns &lt;code&gt;Access-Reject&lt;/code&gt; $\rightarrow$ Association terminated at L2.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Guest Network: Zero-Trust Defense-in-Depth
&lt;/h2&gt;

&lt;p&gt;All guest devices must be treated as hostile endpoints. The guest deployment model requires deterministic Layer 2 east-west blocking coupled with strict Layer 3 egress gating.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Layer 2 Client Isolation (Mitigating Lateral Threats)
&lt;/h3&gt;

&lt;p&gt;When multiple untrusted devices reside within the same broadcast domain, malicious actors can perform ARP spoofing/poisoning, passive packet sniffing, and subnet-wide reconnaissance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mandatory L2 Mitigations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AP-Level Client Isolation:&lt;/strong&gt; Enable &lt;code&gt;Client Isolation&lt;/code&gt; / &lt;code&gt;Station-to-Station Blocking&lt;/code&gt;. The AP drops direct intra-BSS and inter-BSS frame forwarding between wireless clients.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch-Level Port Isolation:&lt;/strong&gt; Configure Private VLANs (PVLANs) on edge switch ports terminating APs. Set AP access ports as &lt;strong&gt;Isolated Ports&lt;/strong&gt;, ensuring traffic can only traverse upstream toward the &lt;strong&gt;Promiscuous Port&lt;/strong&gt; (Default Gateway/Firewall).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broadcast/Multicast Suppression:&lt;/strong&gt; Enable ARP Proxy on APs/controllers to intercept and satisfy ARP requests locally, suppressing mDNS, LLMNR, and broadcast floods.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Layer 3 Perimeter Control (North-South Firewall Policies)
&lt;/h3&gt;

&lt;p&gt;The guest default gateway (Layer 3 switch SVI or firewall security zone interface) must enforce an uncompromising egress access control list (ACL):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Guest VLAN (Subnet: 192.168.100.0/24)
  │
  ├── [PERMIT] UDP 67/68  -&amp;gt; Local DHCP Relay / Server
  ├── [PERMIT] UDP/TCP 53 -&amp;gt; Approved Public DNS Resolvers
  ├── [PERMIT] TCP 80/443 -&amp;gt; Captive Portal Gateway Controller
  ├── [PERMIT] IP ANY     -&amp;gt; WAN Egress Interface (Internet Access)
  │
  └── [DENY]   IP ANY     -&amp;gt; RFC 1918 Private Address Space:
                             - 10.0.0.0/8
                             - 172.16.0.0/12
                             - 192.168.0.0/16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By explicitly dropping all RFC 1918 traffic by default, the guest subnet is cryptographically and logically isolated from internal production workloads, office LANs, and management subnets (OOB, switch/AP management planes).&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Comparison Matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evaluation Vector&lt;/th&gt;
&lt;th&gt;Shared PSK Flat Subnet&lt;/th&gt;
&lt;th&gt;Multi-SSID Per Group&lt;/th&gt;
&lt;th&gt;MAC Address Filtering&lt;/th&gt;
&lt;th&gt;802.1X Dynamic VLAN + Guest Isolation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Authentication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Static Pre-Shared Key&lt;/td&gt;
&lt;td&gt;Multiple Pre-Shared Keys&lt;/td&gt;
&lt;td&gt;None / PSK + MAC List&lt;/td&gt;
&lt;td&gt;802.1X (EAP-TLS / EAP-PEAP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Airtime Efficiency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High (Minimal beacons)&lt;/td&gt;
&lt;td&gt;Very Low (Beacon bloat)&lt;/td&gt;
&lt;td&gt;High (Minimal beacons)&lt;/td&gt;
&lt;td&gt;Optimal (Strict dual-SSID footprint)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None (Single flat domain)&lt;/td&gt;
&lt;td&gt;Coarse (Static SSID-to-VLAN)&lt;/td&gt;
&lt;td&gt;Weak (Access permit only)&lt;/td&gt;
&lt;td&gt;Granular (Identity-driven dynamic mapping)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User Offboarding&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requires global key rotation&lt;/td&gt;
&lt;td&gt;Requires group-wide rekeying&lt;/td&gt;
&lt;td&gt;Requires manual MAC removal&lt;/td&gt;
&lt;td&gt;Immediate on directory account deprovisioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spoofing Resistance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Negligible (Key leakages)&lt;/td&gt;
&lt;td&gt;Negligible (Easily shared)&lt;/td&gt;
&lt;td&gt;Zero (MAC headers unencrypted)&lt;/td&gt;
&lt;td&gt;High (Tied to user tokens or PKI certificates)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operational Overhead&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scales quadratically&lt;/td&gt;
&lt;td&gt;High configuration drift&lt;/td&gt;
&lt;td&gt;Unmanageable at scale&lt;/td&gt;
&lt;td&gt;Low (Automated policy-driven enforcement)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Implementation &amp;amp; Hardening Checklist
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Corporate Network Implementation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;RF Profile:&lt;/strong&gt; Disable legacy WEP, WPA-TKIP, and 802.11b rates. Default to WPA3-Enterprise (or WPA2/WPA3 Enterprise transition mode).&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;RADIUS Handshake:&lt;/strong&gt; Configure robust shared secrets between APs/WLC and RADIUS nodes, with health monitoring and failover clusters.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Attribute Delivery:&lt;/strong&gt; Verify directory group mappings to RFC 2868 (&lt;code&gt;Tunnel-Type&lt;/code&gt;, &lt;code&gt;Tunnel-Medium-Type&lt;/code&gt;) and RFC 3580 (&lt;code&gt;Tunnel-Private-Group-Id&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Trunk Infrastructure:&lt;/strong&gt; Ensure edge switch ports terminating APs are provisioned as 802.1Q trunks permitting all dynamically allocated VLAN IDs.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Certificate Authority (PKI):&lt;/strong&gt; For EAP-TLS deployments, distribute machine/user certificates and RADIUS trusted roots via MDM or Active Directory Group Policy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Guest Network Implementation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Radio Security:&lt;/strong&gt; Deploy Captive Portal over Open, or prioritize Wi-Fi Enhanced Open (OWE / Opportunistic Wireless Encryption) for authenticated encryption over public airwaves.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;L2 Isolation:&lt;/strong&gt; Enforce Station-to-Station isolation on the APs and configure Private VLANs (Isolated Ports) on intermediate Layer 2 switches.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Egress Firewall Rules:&lt;/strong&gt; Apply stateful outbound filtering. Place the explicit deny rule for RFC 1918 directly above the WAN default permit.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Bandwidth &amp;amp; Resource Protections:&lt;/strong&gt; Implement client-level upstream/downstream rate limiting (QoS) and enforce DNS snooping/anti-spoofing to prevent airtime denial-of-service.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Summary: Decoupling Physical Access from Logical Policy
&lt;/h2&gt;

&lt;p&gt;Building a high-performance, defensible enterprise wireless infrastructure requires an architectural paradigm shift: &lt;strong&gt;completely decoupling physical radio access from logical network permissions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is achieved through three core engineering principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Airtime First (Channel Conservation)&lt;/strong&gt;
Retire multi-SSID configurations. Consolidating the RF footprint into a dual-SSID model reclaims essential channel airtime otherwise lost to repetitive beacon broadcasts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity-Driven Authorization (Policy Automation)&lt;/strong&gt;
Rely on 802.1X and RADIUS attribute injection for dynamic network assignment. An endpoint's network placement must not depend on the SSID it selects, but on who the user is and what device posture they demonstrate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Trust Boundary Enforcement (Containment by Default)&lt;/strong&gt;
Treat all guest devices as compromised by design. Implement L2 station isolation at the edge to block lateral movement and strictly drop RFC 1918 routing paths at the gateway to restrict traffic exclusively to public WAN destinations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Modern enterprise WLAN engineering is not about expanding SSIDs to solve organizational boundaries; it is about deploying &lt;strong&gt;a minimalist RF entry point governed by dynamic, identity-aware backend policy.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>wifi</category>
      <category>security</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Wi-Fi 6 in High-Density Networks: Diagnosing CCI and Improving Airtime Efficiency</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Sun, 20 Sep 2026 01:34:48 +0000</pubDate>
      <link>https://dev.to/frankzhang/wi-fi-6-in-high-density-networks-diagnosing-cci-and-improving-airtime-efficiency-3e4d</link>
      <guid>https://dev.to/frankzhang/wi-fi-6-in-high-density-networks-diagnosing-cci-and-improving-airtime-efficiency-3e4d</guid>
      <description>&lt;p&gt;Modern Wi-Fi deployments face a common challenge:&lt;/p&gt;

&lt;p&gt;Adding more access points does not always improve wireless performance.&lt;/p&gt;

&lt;p&gt;In high-density environments, the limiting factor is often not signal&lt;br&gt;
coverage, but airtime contention caused by &lt;strong&gt;Co-Channel Interference&lt;br&gt;
(CCI)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This article explains how Wi-Fi 6 technologies such as &lt;strong&gt;BSS Coloring,&lt;br&gt;
Spatial Reuse, and RX-SOP tuning&lt;/strong&gt; can help improve wireless efficiency,&lt;br&gt;
and how to avoid common RF optimization mistakes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding Co-Channel Interference (CCI)
&lt;/h2&gt;

&lt;p&gt;Co-Channel Interference occurs when multiple access points operate on&lt;br&gt;
the same channel.&lt;/p&gt;

&lt;p&gt;Unlike traditional interference caused by noise, CCI happens because&lt;br&gt;
multiple Wi-Fi devices share the same spectrum and must coordinate&lt;br&gt;
channel access.&lt;/p&gt;

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

&lt;p&gt;Typical symptoms include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  High channel utilization&lt;/li&gt;
&lt;li&gt;  Increased latency&lt;/li&gt;
&lt;li&gt;  Slow application response&lt;/li&gt;
&lt;li&gt;  Reduced throughput during busy periods&lt;/li&gt;
&lt;li&gt;  Frequent roaming events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem is often not weak signal strength, but too many devices&lt;br&gt;
competing for the same airtime.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Increasing Transmit Power Can Make Things Worse
&lt;/h2&gt;

&lt;p&gt;A common troubleshooting action is increasing AP transmit power.&lt;/p&gt;

&lt;p&gt;However, higher power also increases the coverage area of each AP,&lt;br&gt;
creating larger overlap zones.&lt;/p&gt;

&lt;p&gt;This can result in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  More CCI&lt;/li&gt;
&lt;li&gt;  More channel contention&lt;/li&gt;
&lt;li&gt;  More waiting time&lt;/li&gt;
&lt;li&gt;  Lower airtime efficiency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A well-designed wireless network focuses on controlled coverage overlap&lt;br&gt;
rather than maximum signal strength.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wi-Fi 6 Improvement: BSS Coloring and Spatial Reuse
&lt;/h2&gt;

&lt;p&gt;Wi-Fi 6 introduces BSS Coloring to help devices distinguish between&lt;br&gt;
their own network traffic and neighboring BSS traffic.&lt;/p&gt;

&lt;p&gt;Instead of treating every detected transmission as a reason to wait,&lt;br&gt;
devices can identify whether the transmission belongs to another BSS.&lt;/p&gt;

&lt;p&gt;Benefits include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Better spectrum utilization&lt;/li&gt;
&lt;li&gt;  Improved performance in dense environments&lt;/li&gt;
&lt;li&gt;  Reduced unnecessary channel waiting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, BSS Coloring does not replace proper RF planning.&lt;/p&gt;




&lt;h2&gt;
  
  
  RX-SOP Optimization
&lt;/h2&gt;

&lt;p&gt;RX-SOP (Receiver Start of Packet) controls receiver sensitivity.&lt;/p&gt;

&lt;p&gt;By adjusting the threshold, an AP can ignore weaker neighboring signals&lt;br&gt;
and create more opportunities for spatial reuse.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Default: -85 dBm&lt;/li&gt;
&lt;li&gt;  Adjusted: -75 dBm&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Potential benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Reduced unnecessary waiting&lt;/li&gt;
&lt;li&gt;  Better airtime efficiency&lt;/li&gt;
&lt;li&gt;  Improved reuse opportunities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Potential risks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Hidden node problems&lt;/li&gt;
&lt;li&gt;  More retransmissions&lt;/li&gt;
&lt;li&gt;  Reduced reliability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;RX-SOP should only be tuned after RF measurements.&lt;/p&gt;




&lt;h2&gt;
  
  
  Channel Width: Wider Is Not Always Better
&lt;/h2&gt;

&lt;p&gt;A common assumption is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;80 MHz is always faster than 20 MHz.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In dense deployments, wider channels reduce the number of available&lt;br&gt;
independent channels.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Home networks may benefit from 40/80 MHz&lt;/li&gt;
&lt;li&gt;  Small offices often use 40 MHz&lt;/li&gt;
&lt;li&gt;  High-density environments often perform better with 20/40 MHz&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not maximum single-client speed.&lt;/p&gt;

&lt;p&gt;The goal is maximum total network capacity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Wi-Fi 6 Optimization Process
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Measure Before Changing
&lt;/h3&gt;

&lt;p&gt;Collect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Channel utilization&lt;/li&gt;
&lt;li&gt;  Noise floor&lt;/li&gt;
&lt;li&gt;  RSSI&lt;/li&gt;
&lt;li&gt;  SNR&lt;/li&gt;
&lt;li&gt;  Client distribution&lt;/li&gt;
&lt;li&gt;  Retransmission rate&lt;/li&gt;
&lt;li&gt;  Roaming behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without measurements, RF tuning becomes guesswork.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Reduce Excessive Coverage Overlap
&lt;/h3&gt;

&lt;p&gt;Review:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  AP placement&lt;/li&gt;
&lt;li&gt;  Transmit power&lt;/li&gt;
&lt;li&gt;  Antenna direction&lt;/li&gt;
&lt;li&gt;  Mounting location&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Optimize Channel Planning
&lt;/h3&gt;

&lt;p&gt;Consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Better 5 GHz channel reuse&lt;/li&gt;
&lt;li&gt;  DFS channels where supported&lt;/li&gt;
&lt;li&gt;  Avoiding unnecessary 80 MHz deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Tune Advanced Features Carefully
&lt;/h3&gt;

&lt;p&gt;Consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  BSS Coloring&lt;/li&gt;
&lt;li&gt;  Spatial Reuse&lt;/li&gt;
&lt;li&gt;  RX-SOP adjustment&lt;/li&gt;
&lt;li&gt;  OFDMA scheduling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Advanced features improve a good RF design. They cannot fix poor&lt;br&gt;
planning.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  Maximum Power Everywhere
&lt;/h3&gt;

&lt;p&gt;More power can create larger cells and increase interference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Maximum Channel Width Everywhere
&lt;/h3&gt;

&lt;p&gt;Wider channels may reduce frequency reuse.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding More APs Without Planning
&lt;/h3&gt;

&lt;p&gt;More APs can increase contention instead of improving capacity.&lt;/p&gt;




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

&lt;p&gt;Co-Channel Interference remains one of the biggest challenges in dense&lt;br&gt;
Wi-Fi deployments.&lt;/p&gt;

&lt;p&gt;Wi-Fi 6 provides better tools through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  BSS Coloring&lt;/li&gt;
&lt;li&gt;  Spatial Reuse&lt;/li&gt;
&lt;li&gt;  Improved scheduling mechanisms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But successful optimization still depends on practical RF engineering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Measure first&lt;/li&gt;
&lt;li&gt;  Reduce unnecessary overlap&lt;/li&gt;
&lt;li&gt;  Control transmit power&lt;/li&gt;
&lt;li&gt;  Select appropriate channel width&lt;/li&gt;
&lt;li&gt;  Tune advanced features carefully&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fastest Wi-Fi network is not necessarily the one with the strongest&lt;br&gt;
signal.&lt;/p&gt;

&lt;p&gt;It is the one that uses the wireless spectrum most efficiently.&lt;/p&gt;




</description>
      <category>wifi6</category>
      <category>networking</category>
      <category>wireless</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>OpsHome NOC + Console: Bringing Infrastructure Monitoring to More Screens</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Wed, 16 Sep 2026 14:05:33 +0000</pubDate>
      <link>https://dev.to/frankzhang/opshome-noc-console-bringing-infrastructure-monitoring-to-more-screens-on8</link>
      <guid>https://dev.to/frankzhang/opshome-noc-console-bringing-infrastructure-monitoring-to-more-screens-on8</guid>
      <description>&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%2F7kwaa5rzivxtmx1hl4n1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7kwaa5rzivxtmx1hl4n1.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;OpsHome NOC and Console shown across desktop, tablet and mobile devices&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  OpsHome NOC has always been centered around iOS.
&lt;/h2&gt;

&lt;p&gt;A phone is ideal for quickly checking service status, asset health, incident changes, and private infrastructure. As the number of monitored resources grows, though, larger screens become useful too: reviewing the whole environment from a computer, browsing incidents on an iPad, or keeping infrastructure status visible on a dedicated display.&lt;/p&gt;

&lt;p&gt;That is where &lt;strong&gt;OpsHome Console&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;With Console, the monitoring, asset, and incident views from OpsHome NOC can also be used in browsers, on tablets, and on larger displays. Windows, macOS, Linux, iPad, and mobile browsers can all become ways to view the same OpsHome environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Console, Multiple Screen Sizes
&lt;/h2&gt;

&lt;p&gt;Console is designed to adapt to different browser and screen sizes.&lt;/p&gt;

&lt;p&gt;On desktop browsers, the larger workspace makes it easier to review monitor matrices, infrastructure assets, trends, and incident details.&lt;/p&gt;

&lt;p&gt;An iPad in landscape mode works well for viewing a broader operational picture, while portrait mode is convenient for browsing incidents and asset information.&lt;/p&gt;

&lt;p&gt;On mobile browsers, the layout reorganizes the information hierarchy so that important status, incidents, and resources remain readable.&lt;/p&gt;

&lt;p&gt;For homelabs, workbenches, or long-running monitoring setups, Display Mode can keep Console visible on a dedicated screen.&lt;/p&gt;

&lt;p&gt;Desktop, tablet, and mobile all use the same Console experience, with the layout and information density adapting to the available screen space.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh8x2951rd7dpdydyci30.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh8x2951rd7dpdydyci30.png" alt=" " width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;OpsHome Console responsive interface across desktop, iPad, iPhone and external display&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Overview: See What Is Happening Now
&lt;/h2&gt;

&lt;p&gt;When Console opens, Overview provides a current summary of the OpsHome environment.&lt;/p&gt;

&lt;p&gt;The page brings together resource counts, active risks, infrastructure health, Active Incidents, 24-hour trends, and assets that need attention.&lt;/p&gt;

&lt;p&gt;You can check Overview first to understand whether the environment is healthy, then move into Monitors, Assets, or Incidents when more detail is needed.&lt;/p&gt;

&lt;p&gt;If Critical or Warning conditions are present, they are reflected in the overall status and Priority Assets without requiring you to inspect devices one by one.&lt;/p&gt;

&lt;p&gt;For day-to-day monitoring, this reduces a lot of unnecessary navigation.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fah7umw7iig17qwtzxvrc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fah7umw7iig17qwtzxvrc.png" alt=" " width="800" height="619"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;OpsHome Console Overview showing system health, active risks, infrastructure trends and priority assets&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Monitors: Public and Private Monitoring in One View
&lt;/h2&gt;

&lt;p&gt;OpsHome NOC supports monitoring types including HTTP, HTTPS, TCP, ICMP, SSL, and Domain checks.&lt;/p&gt;

&lt;p&gt;The Monitors page in Console is designed for reviewing multiple targets on a larger screen. Each monitor can show its current state, latency, availability, and recent trend information.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm8eqy42o4yxpaegddvdx.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm8eqy42o4yxpaegddvdx.png" alt=" " width="799" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Alt text: &lt;code&gt;OpsHome Console Monitors view showing public and private service monitoring&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cloud Monitors and Private Probe Monitors are organized separately, keeping public checks and internal network monitoring easy to distinguish.&lt;/p&gt;

&lt;p&gt;Homelab and SOHO environments often include a mixture of web services, NAS systems, internal management pages, databases, Docker services, virtualization platforms, and applications that are only available on the local network.&lt;/p&gt;

&lt;p&gt;Those internal services do not need to be exposed to the public internet just to be visible in Console.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private Monitoring without Port Forwarding&lt;/strong&gt; remains one of the core ways OpsHome handles private infrastructure. Internal resources stay inside the private network, without requiring public port forwarding for NAS systems, databases, or internal web services simply to check their status remotely.&lt;/p&gt;




&lt;h2&gt;
  
  
  Assets: Monitor the Infrastructure, Not Just the Service
&lt;/h2&gt;

&lt;p&gt;Knowing whether a service is online is useful, but it does not always tell the whole story.&lt;/p&gt;

&lt;p&gt;A NAS may still be reachable while its storage is approaching capacity. A virtualization host may remain online while CPU, memory, or datastore conditions require attention. A Linux host can also experience resource pressure while its services continue to respond.&lt;/p&gt;

&lt;p&gt;OpsHome therefore includes asset-level monitoring as well.&lt;/p&gt;

&lt;p&gt;Current infrastructure coverage includes &lt;strong&gt;Synology, Proxmox, VMware, and Linux&lt;/strong&gt;, together with related virtual machines, containers, storage, and workloads.&lt;/p&gt;

&lt;p&gt;The Assets page in Console brings these systems together in a single infrastructure view.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F11pt6ta7lwzm2q0b91gw.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F11pt6ta7lwzm2q0b91gw.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;OpsHome Console Assets view showing virtualization, NAS, Linux and infrastructure telemetry&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Each platform keeps the information that matters to it. Virtualization environments emphasize compute resources and workloads, NAS systems focus more heavily on storage and disk health, and Linux hosts provide general system-level visibility.&lt;/p&gt;

&lt;p&gt;That gives OpsHome coverage across:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Virtualization · NAS · Docker · Linux&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Service status and infrastructure health can be reviewed within the same OpsHome environment, making it easier to understand what needs attention.&lt;/p&gt;




&lt;h2&gt;
  
  
  Incidents: More Context on a Larger Screen
&lt;/h2&gt;

&lt;p&gt;Phone notifications are useful for telling you that something happened.&lt;/p&gt;

&lt;p&gt;When you want to look deeper, a larger screen is better suited to showing the full incident context.&lt;/p&gt;

&lt;p&gt;Console includes a dedicated Incident Workspace for both active and recovered incidents, with severity, start time, duration, affected resources, incident summaries, and timelines.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1e7vnvtigoll283bm7b1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1e7vnvtigoll283bm7b1.png" alt=" " width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;OpsHome Console Incident Workspace showing incident details, affected resources and timeline&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Incidents can be switched quickly from the list, while the detail area keeps the relevant context and resource information visible.&lt;/p&gt;

&lt;p&gt;This layout is especially useful for longer-running Warning or Critical conditions, as well as for reviewing incidents that have already recovered.&lt;/p&gt;

&lt;p&gt;Console keeps the experience read-only, allowing users to focus on monitoring results and incident context.&lt;/p&gt;




&lt;h2&gt;
  
  
  Light and Dark
&lt;/h2&gt;

&lt;p&gt;Console includes both Light and Dark themes.&lt;/p&gt;

&lt;p&gt;Light Mode works well for everyday desktop use and bright environments. Dark Mode is better suited to monitoring displays, nighttime use, and long-running Display Mode setups.&lt;/p&gt;

&lt;p&gt;Changing themes does not change the underlying features or data; it only changes how the interface is presented.&lt;/p&gt;

&lt;p&gt;Theme support is also available across desktop, tablet, and mobile layouts.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3b5lj86xaxr03gxecgef.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3b5lj86xaxr03gxecgef.png" alt=" " width="800" height="449"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjaf8125v2l1v4ki7yv5h.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjaf8125v2l1v4ki7yv5h.png" alt=" " width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;OpsHome Console Overview shown in light and dark themes&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Sign In With the Same Apple Account
&lt;/h2&gt;

&lt;p&gt;A web service often means another account and another password to manage.&lt;/p&gt;

&lt;p&gt;OpsHome Console continues to use the same Apple account experience as OpsHome NOC.&lt;/p&gt;

&lt;p&gt;Existing OpsHome NOC users can sign in to Console with the same Apple account, without creating a separate Console username or password.&lt;/p&gt;

&lt;p&gt;Authentication is handled by Apple. OpsHome does not receive or store the user's Apple ID password.&lt;/p&gt;

&lt;p&gt;The sign-in connection uses encrypted communication, and Console establishes a time-limited browser session.&lt;/p&gt;

&lt;p&gt;This keeps the App and Web Console experience consistent without adding another set of login credentials.&lt;/p&gt;




&lt;h2&gt;
  
  
  Beyond the iPhone, Open a Browser
&lt;/h2&gt;

&lt;p&gt;OpsHome NOC continues to provide the quick, portable monitoring experience on iOS.&lt;/p&gt;

&lt;p&gt;Console adds several practical ways to use the same environment:&lt;/p&gt;

&lt;p&gt;Review a larger monitoring matrix on Windows or macOS.&lt;br&gt;&lt;br&gt;
Keep an OpsHome view open next to a Linux workstation.&lt;br&gt;&lt;br&gt;
Browse assets and incidents from an iPad.&lt;br&gt;&lt;br&gt;
Run Display Mode on a dedicated screen.&lt;/p&gt;

&lt;p&gt;The same OpsHome data can stay visible across phones, desktops, tablets, and larger displays.&lt;/p&gt;

&lt;p&gt;For a product that originally used the iPhone as its primary interface, Console expands OpsHome into more everyday monitoring environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  OpsHome NOC + Console
&lt;/h2&gt;

&lt;p&gt;The current OpsHome experience can be summarized around four areas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private Monitoring&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;No Port Forwarding&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Virtualization · NAS · Docker&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Secure by Design&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpsHome NOC provides the mobile monitoring experience on iPhone, while Console brings the operational view to browsers, tablets, and larger displays.&lt;/p&gt;

&lt;p&gt;For a quick status check, open the app.&lt;/p&gt;

&lt;p&gt;For more room to review resources, trends, and incidents, open Console.&lt;/p&gt;

&lt;p&gt;For continuous visibility, keep Console running on a dedicated display.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Console:&lt;/strong&gt; &lt;a href="https://console.opshome.run" rel="noopener noreferrer"&gt;https://console.opshome.run&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://app.opshome.run" rel="noopener noreferrer"&gt;https://app.opshome.run&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Documentation:&lt;/strong&gt; &lt;a href="https://docs.opshome.run" rel="noopener noreferrer"&gt;https://docs.opshome.run&lt;/a&gt;&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>devops</category>
      <category>homelab</category>
      <category>noc</category>
    </item>
    <item>
      <title>Same Docker Network Name, But Containers Still Can’t Communicate? Here’s Why</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Tue, 15 Sep 2026 08:44:58 +0000</pubDate>
      <link>https://dev.to/frankzhang/same-docker-network-name-but-containers-still-cant-communicate-heres-why-4oe2</link>
      <guid>https://dev.to/frankzhang/same-docker-network-name-but-containers-still-cant-communicate-heres-why-4oe2</guid>
      <description>&lt;p&gt;Recently, I ran into a Docker networking issue that looked simple at first.&lt;/p&gt;

&lt;p&gt;Two independent Docker Compose projects were running on the same host:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a frontend service&lt;/li&gt;
&lt;li&gt;a backend API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both Compose files declared a network called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-net&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first glance, the setup looked straightforward.&lt;/p&gt;

&lt;p&gt;If both containers use &lt;code&gt;app-net&lt;/code&gt;, they should be able to communicate with each other.&lt;/p&gt;

&lt;p&gt;But they could not.&lt;/p&gt;

&lt;p&gt;The reason is an important Docker Compose detail:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The network name written in &lt;code&gt;compose.yaml&lt;/code&gt; is not always the actual Docker network name.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Example
&lt;/h2&gt;

&lt;p&gt;Imagine two independent projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Docker Host
│
├── portal/
│   └── compose.yaml
│
└── backend/
    └── compose.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontend project contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;portal-web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example/portal-web:latest&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-net&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-net&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend project contains almost the same configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;core-api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example/core-api:latest&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-net&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-net&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looking only at the YAML files, it seems like both containers are connected to the same network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;portal-web ─── app-net ─── core-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But Docker Compose normally creates resources within the scope of a &lt;strong&gt;Compose project&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That changes what actually happens.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Docker Really Creates
&lt;/h2&gt;

&lt;p&gt;Compose projects are usually named after their project directories unless a project name is explicitly configured.&lt;/p&gt;

&lt;p&gt;In this example, the projects may be called:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;When Compose creates the networks, it may prefix the network names with the project name.&lt;/p&gt;

&lt;p&gt;So this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-net&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;inside the &lt;code&gt;portal&lt;/code&gt; project may become:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;while the same configuration inside the &lt;code&gt;backend&lt;/code&gt; project may become:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The real structure is therefore closer to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Docker Host
│
├── portal-web
│      │
│      └── portal_app-net
│
└── core-api
       │
       └── backend_app-net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They are not connected to the same Docker network.&lt;/p&gt;

&lt;p&gt;The network key is identical in both Compose files, but the actual network objects are different.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify Instead of Guessing
&lt;/h2&gt;

&lt;p&gt;The easiest way to confirm this is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may see 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;NETWORK ID     NAME
a12bc34de567   portal_app-net
b98dc76fe543   backend_app-net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That immediately explains why the containers cannot communicate directly.&lt;/p&gt;

&lt;p&gt;You can also inspect a network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network inspect portal_app-net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output includes the containers attached to it.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;portal-web&lt;/code&gt; appears there but &lt;code&gt;core-api&lt;/code&gt; does not, the two services are isolated from each other.&lt;/p&gt;

&lt;p&gt;This is why checking the actual Docker network is often more useful than repeatedly reviewing the Compose YAML.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Cleaner Solution: A Shared Network
&lt;/h2&gt;

&lt;p&gt;If two independent Compose projects intentionally need to communicate, they can share a network managed outside either project.&lt;/p&gt;

&lt;p&gt;First, create the network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network create app-shared-net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then configure the frontend project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;portal-web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example/portal-web:latest&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-shared-net&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-shared-net&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the same network in the backend project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;core-api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example/core-api:latest&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-shared-net&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-shared-net&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now both containers attach to the same Docker network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Docker Host
│
├── portal-web
│       │
│       ├──── app-shared-net
│       │
│       └─────────────┐
│                     │
└── core-api ─────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells Compose:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do not create a project-specific network. Use an existing Docker network.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That makes the relationship between the two independent projects explicit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Docker DNS Matters
&lt;/h2&gt;

&lt;p&gt;Once both containers share a user-defined Docker network, Docker provides internal DNS-based name resolution.&lt;/p&gt;

&lt;p&gt;For example, the frontend can usually access the backend using the service name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://core-api:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of using a container IP such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://172.22.0.5:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is important because container IP addresses can change when containers are recreated.&lt;/p&gt;

&lt;p&gt;Service names are much better identifiers.&lt;/p&gt;

&lt;p&gt;You can test DNS resolution directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec &lt;/span&gt;portal-web-1 getent hosts core-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A successful result may look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;172.22.0.3    core-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then test the application itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec &lt;/span&gt;portal-web-1 curl http://core-api:8080/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the health endpoint responds, you have confirmed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Shared Network  ✓
Docker DNS      ✓
TCP Connection  ✓
Application     ✓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Port Publishing Is a Different Thing
&lt;/h2&gt;

&lt;p&gt;Another common source of confusion is Docker port mapping.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;means the service is exposed through the Docker host:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host:8080
   │
   ▼
core-api:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; automatically mean another container can resolve &lt;code&gt;core-api&lt;/code&gt; through Docker DNS.&lt;/p&gt;

&lt;p&gt;Host port publishing and container-to-container networking are separate concepts.&lt;/p&gt;

&lt;p&gt;For internal service communication, sharing a Docker network and using service names is usually cleaner.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Troubleshooting Workflow
&lt;/h2&gt;

&lt;p&gt;When two Docker containers cannot communicate, these checks usually find the problem quickly.&lt;/p&gt;

&lt;p&gt;First, confirm the containers are running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then check the real networks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inspect the intended network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network inspect app-shared-net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure both containers appear in the network.&lt;/p&gt;

&lt;p&gt;Then test DNS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec &lt;/span&gt;portal-web-1 getent hosts core-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, test the application port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec &lt;/span&gt;portal-web-1 curl http://core-api:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This sequence helps separate different types of failures:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Docker Network
      ↓
Docker DNS
      ↓
TCP Port
      ↓
Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If DNS resolution fails, debugging the application itself is probably too early.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Key Lesson
&lt;/h2&gt;

&lt;p&gt;The main lesson from this issue is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Two Docker Compose files can use the same network key without actually sharing the same Docker network.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-net&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may result in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;portal_app-net
backend_app-net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those networks are isolated.&lt;/p&gt;

&lt;p&gt;If independent Compose projects need direct communication, check the actual Docker network objects and deliberately attach both projects to the same shared network.&lt;/p&gt;

&lt;p&gt;The commands worth remembering are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network &lt;span class="nb"&gt;ls
&lt;/span&gt;docker network inspect &amp;lt;network&amp;gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt;container&amp;gt; getent hosts &amp;lt;service&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker networking becomes much easier to troubleshoot once you stop looking only at &lt;code&gt;compose.yaml&lt;/code&gt; and start checking what Docker actually created.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>networking</category>
      <category>containers</category>
    </item>
    <item>
      <title>Industrial NAT Design: Connecting Multiple Identical OEM Machines to a Factory OT Network</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Sun, 13 Sep 2026 02:52:44 +0000</pubDate>
      <link>https://dev.to/frankzhang/industrial-nat-design-connecting-multiple-identical-oem-machines-to-a-factory-ot-network-opshome-257a</link>
      <guid>https://dev.to/frankzhang/industrial-nat-design-connecting-multiple-identical-oem-machines-to-a-factory-ot-network-opshome-257a</guid>
      <description>&lt;p&gt;NETWORKING / INDUSTRIAL NAT / OT&lt;/p&gt;
&lt;h1&gt;Industrial NAT Design: Connecting Multiple Identical OEM Machines to a Factory OT Network&lt;/h1&gt;
&lt;span&gt;INDUSTRIAL NAT&lt;/span&gt;&lt;span&gt;PLC&lt;/span&gt;&lt;span&gt;OT NETWORK&lt;/span&gt;&lt;span&gt;OEM&lt;/span&gt;&lt;span&gt;SEGMENTATION&lt;/span&gt;
&lt;p&gt;Connecting one OEM machine to a factory network is usually straightforward. Connecting several identical machines becomes more difficult when every PLC and HMI arrives with the same IP address. Industrial NAT provides a practical way to preserve each machine's internal configuration while giving factory systems a unique address for every required device.&lt;/p&gt;

&lt;p&gt;&lt;span&gt;Topics: Industrial NAT, PLC, OEM machines, OT networking, network segmentation&lt;/span&gt;&lt;/p&gt;

&lt;h2&gt;Scope of this article&lt;/h2&gt;
&lt;p&gt;This article explains the network design approach for integrating multiple OEM machines with overlapping internal IP addresses into a factory OT network. It covers address mapping, segmentation and maintenance considerations. The addresses are illustrative; device-specific NAT configuration and industrial protocol compatibility must be checked for the actual deployment.&lt;/p&gt;

&lt;h2&gt;1. Why identical OEM machines often use identical IP addresses&lt;/h2&gt;

&lt;p&gt;In modern manufacturing environments, OEM machines are increasingly delivered as complete automation units. A typical skid may include a PLC, an HMI, an industrial switch, a remote maintenance interface and vendor-specific control applications.&lt;/p&gt;

&lt;p&gt;To simplify engineering and maintenance, many OEM vendors use a standardized internal network configuration. For example, each machine may contain the following addresses:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;OEM-side IP address&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PLC&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.10&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HMI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.20&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Industrial switch&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.254&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This design works well while each machine operates on its own isolated network. The challenge appears when the factory needs to connect several identical production units to shared SCADA, monitoring or engineering systems.&lt;/p&gt;

&lt;h2&gt;2. The IP conflict problem in multi-OEM deployments&lt;/h2&gt;

&lt;p&gt;Imagine a factory installs eight identical packaging machines. Every machine contains a PLC at &lt;code&gt;192.168.1.10&lt;/code&gt;, while the factory OT address space uses &lt;code&gt;10.50.0.0/16&lt;/code&gt;.&lt;/p&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;Internal PLC address&lt;/th&gt;
&lt;th&gt;Factory integration problem&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Machine 1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Address overlaps with the other machines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Machine 2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Address overlaps with the other machines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Machine 3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Address overlaps with the other machines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;From the OEM perspective, this is normal standardization. From the factory integration perspective, the devices need to be distinguishable. Connecting these internal networks directly into one shared Layer 2 network can introduce duplicate IP addresses, ARP conflicts and PLC communication failures.&lt;/p&gt;

&lt;p&gt;Even when the machines remain in separate network segments, shared systems still need an unambiguous way to reach each PLC. Otherwise, SCADA identification and remote maintenance become difficult.&lt;/p&gt;

&lt;h2&gt;3. Why not simply change every PLC IP address?&lt;/h2&gt;

&lt;p&gt;Assigning a unique subnet to every machine can work technically. However, in many industrial projects, changing the PLC address also requires reviewing HMI configurations, engineering software, PLC communication settings and remote support procedures.&lt;/p&gt;

&lt;p&gt;OEM vendors usually maintain a standard machine template. Changing that template for every installation can increase commissioning work and maintenance complexity. Instead of supporting one familiar configuration, engineers must track a different addressing plan for each machine.&lt;/p&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;Example of a redesigned internal subnet&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Machine A&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.10.0/24&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Machine B&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.20.0/24&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Machine C&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.30.0/24&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A network redesign may be appropriate when the factory and OEM agree on it. When preserving the delivered machine configuration is a priority, a translation boundary provides another option.&lt;/p&gt;

&lt;h2&gt;4. Use industrial NAT at the machine boundary&lt;/h2&gt;

&lt;p&gt;A common approach is to place a NAT router or industrial firewall between each OEM network and the factory OT network. Each machine keeps its original internal subnet, while the NAT device exposes unique factory-facing addresses for the devices that require access.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Factory OT address space&lt;/th&gt;
&lt;th&gt;Machine boundary&lt;/th&gt;
&lt;th&gt;Isolated OEM network&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;10.50.0.0/16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NAT-1&lt;/td&gt;
&lt;td&gt;Machine 1: &lt;code&gt;192.168.1.0/24&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;10.50.0.0/16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NAT-2&lt;/td&gt;
&lt;td&gt;Machine 2: &lt;code&gt;192.168.1.0/24&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;10.50.0.0/16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NAT-3&lt;/td&gt;
&lt;td&gt;Machine 3: &lt;code&gt;192.168.1.0/24&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The following mappings give SCADA a unique address for each PLC, even though all three PLCs retain the same internal address:&lt;/p&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;OT-side mapped address&lt;/th&gt;
&lt;th&gt;OEM-side PLC address&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Packaging Line 1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.50.1.10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.10&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Packaging Line 2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.50.2.10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.10&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Packaging Line 3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.50.3.10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.10&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The duplicate addresses remain inside separate machine networks. Factory systems use the unique mapped addresses.&lt;/strong&gt; The factory-side routing and the return path through each NAT device must support these mappings.&lt;/p&gt;

&lt;h2&gt;5. What this design improves&lt;/h2&gt;

&lt;h3&gt;Keep the OEM configuration consistent&lt;/h3&gt;

&lt;p&gt;The vendor can continue using &lt;code&gt;192.168.1.10&lt;/code&gt; for the PLC in every machine. Where the communication requirements and NAT behavior support it, the factory can integrate the machines without changing their internal device addressing.&lt;/p&gt;

&lt;h3&gt;Create a controlled access boundary&lt;/h3&gt;

&lt;p&gt;When the NAT device also provides firewall policy enforcement, the machine boundary can restrict which systems are allowed to communicate with the PLC. Address translation itself should not be treated as an access-control policy.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Destination&lt;/th&gt;
&lt;th&gt;Example policy&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Authorized SCADA server&lt;/td&gt;
&lt;td&gt;Mapped PLC address&lt;/td&gt;
&lt;td&gt;Allow required communications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;General office network&lt;/td&gt;
&lt;td&gt;Mapped PLC address&lt;/td&gt;
&lt;td&gt;Block direct access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;Simplify expansion&lt;/h3&gt;

&lt;p&gt;Adding another machine can follow the same pattern: retain its internal configuration, allocate unique OT-side mappings and apply the required routing and firewall rules. This reduces the need to redesign existing machine networks as production grows.&lt;/p&gt;

&lt;h2&gt;6. Why VLANs and Proxy ARP are not complete substitutes&lt;/h2&gt;

&lt;h3&gt;VLANs separate networks but do not create unique destination addresses&lt;/h3&gt;

&lt;p&gt;Putting each machine into a separate VLAN prevents their identical addresses from conflicting on the same Layer 2 segment. However, VLAN separation alone does not give a shared SCADA system a unique destination address for each PLC.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Segment&lt;/th&gt;
&lt;th&gt;PLC address&lt;/th&gt;
&lt;th&gt;What remains unresolved&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VLAN 10&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shared-system access to overlapping addresses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VLAN 20&lt;/td&gt;
&lt;td&gt;&lt;code&gt;192.168.1.10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shared-system access to overlapping addresses&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;VLANs remain useful for segmentation, but the overall design still needs a way to distinguish the overlapping networks when central systems access them.&lt;/p&gt;

&lt;h3&gt;Proxy ARP does not provide the required address mapping&lt;/h3&gt;

&lt;p&gt;Proxy ARP can help in some routing scenarios, but by itself it does not assign a unique factory-facing identity to each device using &lt;code&gt;192.168.1.10&lt;/code&gt;. It therefore does not replace the translation or separate routing context required to handle overlapping machine networks.&lt;/p&gt;

&lt;h2&gt;7. Industrial NAT compared with other approaches&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Result and trade-off&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Modify every PLC IP address&lt;/td&gt;
&lt;td&gt;Can resolve overlap, but requires coordination with the OEM and updates to dependent configurations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Put all machine networks in one VLAN&lt;/td&gt;
&lt;td&gt;Leaves duplicate addresses in one shared Layer 2 network and can cause conflicts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Put each machine in a separate VLAN&lt;/td&gt;
&lt;td&gt;Provides Layer 2 separation, but alone does not resolve shared access to overlapping destinations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use Proxy ARP alone&lt;/td&gt;
&lt;td&gt;Does not provide unique per-machine translated addresses.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use industrial NAT at each machine boundary&lt;/td&gt;
&lt;td&gt;Preserves internal addressing and exposes unique mapped addresses, subject to routing and protocol compatibility.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;8. Practical design and maintenance considerations&lt;/h2&gt;

&lt;h3&gt;Select a suitable industrial device&lt;/h3&gt;

&lt;p&gt;Evaluate NAT, firewall, routing and logging capabilities against the actual machine communication requirements. VPN support may also be needed if the boundary device handles remote maintenance. The device should be suitable for its installation environment.&lt;/p&gt;

&lt;h3&gt;Document every address mapping&lt;/h3&gt;

&lt;p&gt;Keep the machine name, original OEM address and OT-side mapped address together in the network documentation. The mapping table in Section 4 provides a simple starting point. Clear records help engineers distinguish machines that otherwise have identical internal configurations.&lt;/p&gt;

&lt;h3&gt;Control remote access&lt;/h3&gt;

&lt;p&gt;Avoid exposing PLC networks directly to the Internet. A controlled maintenance path can use an authenticated VPN connection followed by an industrial firewall policy that permits access only to the intended machine and required services.&lt;/p&gt;

&lt;p&gt;The access path is: remote engineer, VPN, industrial firewall, then the authorized OEM machine. Document this path alongside the address mappings so maintenance staff know which machine they are reaching.&lt;/p&gt;

&lt;h2&gt;9. Preserve the machine design while making factory access unambiguous&lt;/h2&gt;

&lt;p&gt;Duplicate IP addressing is a common integration challenge when multiple identical OEM machines join a factory OT environment. Changing every PLC address can resolve the overlap, but it may also increase maintenance work and disrupt the vendor's standardized configuration.&lt;/p&gt;

&lt;p&gt;Industrial NAT provides a practical alternative: keep each OEM network isolated, give the required devices unique OT-side addresses and enforce access through a defined firewall boundary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The key is to preserve a predictable configuration inside each machine while making every factory-facing connection clearly identifiable.&lt;/strong&gt; With suitable routing, compatible protocols and documented mappings, the same design can be repeated as additional production units are installed.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Industrial Wi-Fi Design in Metal-Rich Manufacturing Environments</title>
      <dc:creator>Frank Zhang</dc:creator>
      <pubDate>Sat, 12 Sep 2026 02:23:42 +0000</pubDate>
      <link>https://dev.to/frankzhang/industrial-wi-fi-design-in-metal-rich-manufacturing-environments-56lo</link>
      <guid>https://dev.to/frankzhang/industrial-wi-fi-design-in-metal-rich-manufacturing-environments-56lo</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Industrial Wi-Fi deployment is fundamentally different from office&lt;br&gt;
wireless networks.&lt;/p&gt;

&lt;p&gt;In factories, warehouses, and production facilities, wireless signals&lt;br&gt;
are affected by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Large metal structures&lt;/li&gt;
&lt;li&gt;  Manufacturing equipment&lt;/li&gt;
&lt;li&gt;  Steel racks&lt;/li&gt;
&lt;li&gt;  Moving machinery&lt;/li&gt;
&lt;li&gt;  Dense industrial devices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A common misunderstanding is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Poor Wi-Fi performance means the signal is not strong enough.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In many industrial environments, the real problem is not signal&lt;br&gt;
strength. It is &lt;strong&gt;RF propagation&lt;/strong&gt;, including metal shielding, multipath&lt;br&gt;
interference, and improper deployment design.&lt;/p&gt;

&lt;p&gt;This article discusses practical approaches for designing reliable Wi-Fi&lt;br&gt;
coverage in complex industrial environments.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Real Challenge: Metal Shielding and Multipath
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Metal Structures Create Coverage Problems
&lt;/h3&gt;

&lt;p&gt;Industrial sites contain many objects that affect wireless propagation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Machine enclosures&lt;/li&gt;
&lt;li&gt;  Control cabinets&lt;/li&gt;
&lt;li&gt;  Metal storage systems&lt;/li&gt;
&lt;li&gt;  Steel structures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Metal can reflect and block radio signals, creating areas where coverage&lt;br&gt;
becomes unpredictable.&lt;/p&gt;

&lt;p&gt;A handheld terminal may work normally in an open area but lose&lt;br&gt;
connectivity when moving behind a machine.&lt;/p&gt;

&lt;p&gt;The problem is not always distance from the access point.&lt;/p&gt;

&lt;p&gt;It may be caused by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  signal attenuation&lt;/li&gt;
&lt;li&gt;  physical obstruction&lt;/li&gt;
&lt;li&gt;  unstable propagation paths&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Multipath Reflection Causes Unstable Connections
&lt;/h3&gt;

&lt;p&gt;In industrial environments, wireless signals rarely travel through a&lt;br&gt;
single path.&lt;/p&gt;

&lt;p&gt;A client device may receive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  direct signals from an AP&lt;/li&gt;
&lt;li&gt;  reflected signals from machines&lt;/li&gt;
&lt;li&gt;  signals bounced from walls or metal structures
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             Metal Equipment

                  |
                  |

AP  ----------------  Client

        Reflected paths
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;These signals can combine differently depending on the environment.&lt;/p&gt;

&lt;p&gt;The result may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  unstable throughput&lt;/li&gt;
&lt;li&gt;  packet retransmissions&lt;/li&gt;
&lt;li&gt;  latency fluctuations&lt;/li&gt;
&lt;li&gt;  roaming failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why a strong RSSI value does not always mean a reliable&lt;br&gt;
connection.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Increasing TX Power Is Usually Not the Solution
&lt;/h2&gt;

&lt;p&gt;When coverage problems occur, increasing AP transmit power is often the&lt;br&gt;
first action.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TX Power:
17 dBm → 30 dBm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, this does not always solve the problem.&lt;/p&gt;

&lt;p&gt;Wi-Fi communication is bidirectional.&lt;/p&gt;

&lt;p&gt;The AP may transmit a stronger signal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AP  --------------------&amp;gt;  Client
        Strong signal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the client device still has limited transmit capability:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client  -------------&amp;gt;  AP
          Weak signal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Industrial devices such as handheld scanners, tablets, and mobile&lt;br&gt;
terminals cannot always transmit back with the same power level.&lt;/p&gt;

&lt;p&gt;This creates an imbalance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  AP can hear the client poorly&lt;/li&gt;
&lt;li&gt;  retransmissions increase&lt;/li&gt;
&lt;li&gt;  connection quality decreases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Higher transmit power can also increase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  co-channel interference&lt;/li&gt;
&lt;li&gt;  channel contention&lt;/li&gt;
&lt;li&gt;  overall RF noise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal of industrial Wi-Fi design should not be maximum signal&lt;br&gt;
strength.&lt;/p&gt;

&lt;p&gt;The goal should be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;predictable and stable wireless coverage.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Practical Industrial Wi-Fi Design Strategies
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Choose the Right Antenna
&lt;/h3&gt;

&lt;p&gt;Antenna selection is critical in complex environments.&lt;/p&gt;

&lt;p&gt;For long and narrow areas such as warehouse aisles, production lines,&lt;br&gt;
and logistics channels, directional antennas are often more effective&lt;br&gt;
than standard omnidirectional antennas.&lt;/p&gt;

&lt;p&gt;Directional antennas focus coverage where it is needed.&lt;/p&gt;

&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  better signal concentration&lt;/li&gt;
&lt;li&gt;  reduced interference&lt;/li&gt;
&lt;li&gt;  more predictable coverage&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Optimize AP Placement
&lt;/h3&gt;

&lt;p&gt;AP location often has a greater impact than transmit power.&lt;/p&gt;

&lt;p&gt;Avoid placing APs directly next to large metal objects.&lt;/p&gt;

&lt;p&gt;Poor design:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AP
 |
Large Metal Machine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Possible results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  signal reflection&lt;/li&gt;
&lt;li&gt;  shadow areas&lt;/li&gt;
&lt;li&gt;  unpredictable coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maintain reasonable distance between APs and large metal structures&lt;br&gt;
whenever possible.&lt;/p&gt;


&lt;h3&gt;
  
  
  Maintain Coverage Overlap for Roaming
&lt;/h3&gt;

&lt;p&gt;Industrial devices are often mobile:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  AGVs&lt;/li&gt;
&lt;li&gt;  barcode scanners&lt;/li&gt;
&lt;li&gt;  inspection terminals&lt;/li&gt;
&lt;li&gt;  tablets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reliable roaming requires overlapping coverage.&lt;/p&gt;

&lt;p&gt;A practical design target is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;20%--30% coverage overlap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For many industrial applications, a coverage boundary around:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RSSI &amp;gt;= -65 dBm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is a reasonable target.&lt;/p&gt;

&lt;p&gt;However, RSSI alone is not enough.&lt;/p&gt;

&lt;p&gt;Engineers should also evaluate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  SNR&lt;/li&gt;
&lt;li&gt;  interference&lt;/li&gt;
&lt;li&gt;  packet loss&lt;/li&gt;
&lt;li&gt;  latency&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Do Not Ignore Fresnel Zone
&lt;/h2&gt;

&lt;p&gt;For wireless bridges and long-distance links, signal strength is only&lt;br&gt;
part of the design.&lt;/p&gt;

&lt;p&gt;The Fresnel Zone around the transmission path also affects performance.&lt;/p&gt;

&lt;p&gt;Objects inside this area can affect the link:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  cranes&lt;/li&gt;
&lt;li&gt;  large machines&lt;/li&gt;
&lt;li&gt;  steel structures&lt;/li&gt;
&lt;li&gt;  moving equipment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even when RSSI appears acceptable, problems may still occur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  packet loss&lt;/li&gt;
&lt;li&gt;  jitter&lt;/li&gt;
&lt;li&gt;  unstable latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially important for factory wireless bridges and&lt;br&gt;
long-distance industrial connections.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Practical Deployment Approach
&lt;/h2&gt;

&lt;p&gt;A reliable industrial Wi-Fi deployment usually follows four steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Understand the Environment
&lt;/h3&gt;

&lt;p&gt;Analyze:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  factory layout&lt;/li&gt;
&lt;li&gt;  equipment locations&lt;/li&gt;
&lt;li&gt;  metal structures&lt;/li&gt;
&lt;li&gt;  device movement paths&lt;/li&gt;
&lt;li&gt;  application requirements&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Perform RF Survey
&lt;/h3&gt;

&lt;p&gt;Measure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  RSSI&lt;/li&gt;
&lt;li&gt;  SNR&lt;/li&gt;
&lt;li&gt;  interference&lt;/li&gt;
&lt;li&gt;  channel utilization&lt;/li&gt;
&lt;li&gt;  roaming behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not rely only on controller statistics.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Optimize RF Design
&lt;/h3&gt;

&lt;p&gt;Adjust:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  AP locations&lt;/li&gt;
&lt;li&gt;  antenna types&lt;/li&gt;
&lt;li&gt;  transmit power&lt;/li&gt;
&lt;li&gt;  channel planning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The objective is balanced coverage, not maximum power.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Validate Real Applications
&lt;/h3&gt;

&lt;p&gt;Test actual business scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  mobile terminal roaming&lt;/li&gt;
&lt;li&gt;  AGV connectivity&lt;/li&gt;
&lt;li&gt;  latency requirements&lt;/li&gt;
&lt;li&gt;  production reliability&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Industrial Wi-Fi 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;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Increasing TX power everywhere&lt;/td&gt;
&lt;td&gt;More interference and poor client balance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Using only omnidirectional antennas&lt;/td&gt;
&lt;td&gt;Difficult coverage control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checking only RSSI&lt;/td&gt;
&lt;td&gt;Missing RF quality issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ignoring Fresnel Zone&lt;/td&gt;
&lt;td&gt;Unstable wireless links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Installing APs near metal equipment&lt;/td&gt;
&lt;td&gt;Reflections and coverage holes&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;Industrial Wi-Fi is not simply a coverage problem.&lt;/p&gt;

&lt;p&gt;It is an RF engineering challenge involving:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  physical environment&lt;/li&gt;
&lt;li&gt;  antenna design&lt;/li&gt;
&lt;li&gt;  propagation paths&lt;/li&gt;
&lt;li&gt;  interference control&lt;/li&gt;
&lt;li&gt;  mobility requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In metal-rich manufacturing environments, reliable wireless networks are&lt;br&gt;
built through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  proper AP placement&lt;/li&gt;
&lt;li&gt;  suitable antennas&lt;/li&gt;
&lt;li&gt;  controlled coverage overlap&lt;/li&gt;
&lt;li&gt;  realistic RF targets&lt;/li&gt;
&lt;li&gt;  field validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The solution is not always increasing transmit power.&lt;/p&gt;

&lt;p&gt;The better approach is to design a predictable RF environment that&lt;br&gt;
supports real industrial operations.&lt;/p&gt;




</description>
      <category>networking</category>
      <category>wireless</category>
      <category>infrastructure</category>
      <category>industrialiot</category>
    </item>
  </channel>
</rss>
