<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged networking</title>
<link>https://coderlegion.com/tag/networking</link>
<description>Powered by Question2Answer</description>
<item>
<title>I Made AURA: A Windows 10 L2TP/IPsec VPN Client Written From Scratch in Python</title>
<link>https://coderlegion.com/32556/i-made-aura-a-windows-10-l2tp-ipsec-vpn-client-written-from-scratch-in-python</link>
<description>&lt;p&gt;For work I needed to connect to a private network over L2TP/IPsec. The VPN client built into Windows 10 refused to connect at all, and it gave me nothing to debug with: no log of the key exchange, no hint about which step failed. I went looking for another program that could do the job and found nothing suitable&lt;/p&gt;
&lt;p&gt;This became the reason for creating AURA — a VPN client that speaks the whole protocol itself, so when something goes wrong you can see exactly where&lt;/p&gt;
&lt;h3 id=&quot;-what-is-it-&quot;&gt;🔐 What is it?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;AURA&lt;/strong&gt; is a Windows 10 &lt;strong&gt;L2TP/IPsec VPN client&lt;/strong&gt; with its own IKEv1, ESP, L2TP and PPP stack, written in pure Python with PyQt5. The traffic goes through a &lt;strong&gt;Wintun&lt;/strong&gt; virtual adapter, the driver from the WireGuard project. Nothing of Windows' built-in VPN client is used: no RAS connection, no &lt;code&gt;rasdial&lt;/code&gt;, no Windows VPN service. The program needs administrator rights at launch, because the adapter, routes and DNS are system changes, and asks for them once through UAC&lt;/p&gt;
&lt;h3 id=&quot;-screenshots&quot;&gt;🖥️ Screenshots&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=16364643041434206570&quot; alt=&quot;Pic. 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=6780537254809234169&quot; alt=&quot;Pic. 2&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;-how-does-it-work-&quot;&gt;⚙️ How does it work?&lt;/h3&gt;
&lt;p&gt;You enter a server, a username, a password and, when the server wants one, a pre-shared key, then press CONNECT. AURA offers the server 18 IKE proposals (AES/3DES, SHA-256/SHA-1, DH 14/5/2) and uses whichever it picks, opens one L2TP tunnel and session, authenticates with MS-CHAPv2, CHAP or PAP, whatever the server asks for, and gets its address and DNS over IPCP. The status bar and the log panel walk through every stage&lt;/p&gt;
&lt;p&gt;The most interesting part was a bug I could not see. After a successful key exchange the server's replies were reaching the network card, but my socket received nothing. Windows hands ESP packets that arrive on UDP port 4500 to its own IPsec driver, and a user-mode socket bound to that port sees only the IKE messages. The fix was to send from an ephemeral local port: the server answers whatever port it observes&lt;/p&gt;
&lt;p&gt;Because the program changes routes and DNS, every change is recorded before it is made, and the next launch removes whatever a crash left behind. Your credentials stay on your machine: a password and a pre-shared key are written to disk only when you tick Remember, as a DPAPI blob that opens for your Windows account alone, and they never reach the log&lt;/p&gt;
&lt;h3 id=&quot;-key-features-&quot;&gt;✨ Key Features:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🔐 Own IKEv1/IPsec Stack&lt;/strong&gt;&lt;br&gt;
Main and quick mode with a pre-shared key, NAT traversal and dead peer detection. Offers 18 proposals (AES/3DES, SHA-256/SHA-1, DH 14/5/2) and uses whichever the server picks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🧵 L2TP + PPP&lt;/strong&gt;&lt;br&gt;
One tunnel and session with keepalive, then MS-CHAPv2 / CHAP / PAP (whatever the server asks for), IPCP for the address and DNS, and MPPE where a server demands it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🛡️ Wintun Virtual Adapter&lt;/strong&gt;&lt;br&gt;
Traffic goes through a real Wintun adapter named AURA. Route all sends everything through the tunnel, or list your own networks in &lt;code&gt;extraRoutes&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🗂️ Connection Profiles&lt;/strong&gt;&lt;br&gt;
Several saved servers in a combo box. Password and pre-shared key are kept only on request, protected with DPAPI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🧹 Crash Recovery Sweep&lt;/strong&gt;&lt;br&gt;
Every route, DNS entry and the adapter are recorded before they change, and the next launch removes whatever a crash left behind&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-roadmap-&quot;&gt;🗺️ Roadmap:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;In-place IPsec Rekey&lt;/strong&gt; — Renew the security association before it expires. Today the session ends when the server drops it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;IKEv2&lt;/strong&gt; — A second protocol next to IKEv1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Certificates&lt;/strong&gt; — Authentication beyond the pre-shared key&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;IPv6&lt;/strong&gt; — Addresses and routes inside the tunnel&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tray Icon&lt;/strong&gt; — Live in the notification area&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automatic Reconnect&lt;/strong&gt; — Come back after a lost link&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kill Switch&lt;/strong&gt; — No traffic outside the tunnel while it is meant to be up&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;L2TP Tunnel Secret&lt;/strong&gt; — Servers that authenticate the tunnel itself with a shared secret are refused today&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;-repository-link&quot;&gt;🔗 Repository Link&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/m-o-z-z-i-x/AURA&quot;&gt;https://github.com/m-o-z-z-i-x/AURA&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32556/i-made-aura-a-windows-10-l2tp-ipsec-vpn-client-written-from-scratch-in-python</guid>
<pubDate>Mon, 26 Oct 2026 13:22:30 +0000</pubDate>
</item>
<item>
<title>A Practical Periodic VPN Access Review for Small Teams</title>
<link>https://coderlegion.com/31179/a-practical-periodic-vpn-access-review-for-small-teams</link>
<description>&lt;p&gt;This checklist shows how to review people, devices, profile revisions and pending setup records using existing approved sources. Each unresolved item should end with an owner and a next action.&lt;/p&gt;
&lt;p&gt;Adapted with permission from &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/periodic-vpn-access-review-small-teams&quot;&gt;A Periodic VPN Access Review Checklist for Small Teams&lt;/a&gt; by Mohammad Hesameddin Montazerilisar, published July 10, 2026 and updated July 11, 2026. AI assistance was used for editing, the introduction and reference notes; the substantive source checklist is retained. The author writes technical guidance for Lisar Connect, operated by MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;AI-generated conceptual illustration of a VPN access review; not an application screenshot.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A periodic access review is a short check that the team’s VPN assignments still match real people, real devices, and current needs. It is not a live-session audit and it does not require collecting profile files or credentials.&lt;/p&gt;
&lt;p&gt;For a small team, the review can be a 20–30 minute pass through the access inventory after staff changes, device replacements, or profile updates.&lt;/p&gt;
&lt;h3 id=&quot;prepare-three-simple-sources&quot;&gt;Prepare three simple sources&lt;/h3&gt;
&lt;p&gt;Before starting, gather:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;the current team or contractor list;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the VPN access inventory;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the current profile labels or status information available through the approved source.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is usually enough. Do not ask people to send their profile files, passwords, tokens, or screenshots containing sensitive details.&lt;/p&gt;
&lt;h3 id=&quot;check-people-and-responsibilities&quot;&gt;Check people and responsibilities&lt;/h3&gt;
&lt;p&gt;Start with the roster:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Has anyone left the team?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Has a contractor’s task ended?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Has someone changed role or no longer needs the same assignment?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does every shared office device have a named responsible person?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is anyone listed twice under slightly different names?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Update the inventory or create a clear follow-up item for anything that no longer matches. The review should make ownership clearer, not simply produce more notes.&lt;/p&gt;
&lt;h3 id=&quot;check-devices&quot;&gt;Check devices&lt;/h3&gt;
&lt;p&gt;Next, compare each assignment with the device it is meant for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Is the laptop, phone, or router still in use?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Was the device replaced, lost, retired, or reassigned?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does the profile label match the current device name?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is an old device still shown as active in the inventory?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A profile file remaining on an old device does not prove that the assignment is current. Use the approved status source and the inventory rather than guessing from local files.&lt;/p&gt;
&lt;h3 id=&quot;check-profile-revisions&quot;&gt;Check profile revisions&lt;/h3&gt;
&lt;p&gt;Look for profiles that were replaced or reissued:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Does the inventory show the newest approved revision?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are any users still referring to an older filename or client entry?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Was a recent reissue checked on the intended device?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are similar profile names causing confusion?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The review does not need the technical contents of either version. It only needs a clear old-to-current relationship.&lt;/p&gt;
&lt;h3 id=&quot;check-records-that-are-waiting-for-action&quot;&gt;Check records that are waiting for action&lt;/h3&gt;
&lt;p&gt;Pay attention to statuses such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Awaiting setup&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Needs review&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Device replacement pending&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Profile update not yet checked&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Owner unclear&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For each one, decide one next action and one person responsible for it. Keep the note simple: what needs to happen and when it should be checked again.&lt;/p&gt;
&lt;p&gt;Avoid leaving vague entries such as &lt;code&gt;temporary&lt;/code&gt;, &lt;code&gt;maybe old&lt;/code&gt;, or &lt;code&gt;ask later&lt;/code&gt; with no owner.&lt;/p&gt;
&lt;h3 id=&quot;check-the-setup-documentation&quot;&gt;Check the setup documentation&lt;/h3&gt;
&lt;p&gt;A quick review should also confirm that the team’s setup notes still point to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;the correct supported client;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the current profile source;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the right import/save steps;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the current connection-check instructions;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;relevant troubleshooting articles;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a named document owner.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remove or replace screenshots that show outdated menus or unnecessary personal information. Do not add profile contents or credentials in an attempt to make the guide more complete.&lt;/p&gt;
&lt;h3 id=&quot;use-a-short-review-checklist&quot;&gt;Use a short review checklist&lt;/h3&gt;
&lt;p&gt;A practical sequence is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Compare the inventory with the current roster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirm each active assignment has a clear owner and purpose.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check whether the listed device is still in use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirm the recorded profile revision is current.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Review assignments marked Awaiting setup or Needs review.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check recent onboarding, offboarding, and device-replacement changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirm shared equipment has a responsible owner.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update stale setup links or screenshots.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assign a next step to anything unresolved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Record when the next review should happen.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result should be a cleaner, more accurate inventory—not a collection of secrets or an oversized audit report.&lt;/p&gt;
&lt;h3 id=&quot;decide-how-often-to-review&quot;&gt;Decide how often to review&lt;/h3&gt;
&lt;p&gt;The right cadence depends on how often the team changes. A stable team may only need a quarterly check. A team with frequent contractors or device changes may benefit from a monthly review.&lt;/p&gt;
&lt;p&gt;Also run a focused review after:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;several people join or leave;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a group of devices is replaced;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;profiles are reissued;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;responsibility for setup changes;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the inventory has not been updated for a long period.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;what-a-useful-outcome-looks-like&quot;&gt;What a useful outcome looks like&lt;/h3&gt;
&lt;p&gt;At the end of the review:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;active assignments match current people and devices;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unclear or old records have a next action;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the current profile revision is easy to identify;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;shared equipment has a named owner;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;setup documentation still matches the approved process;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;no profile files or credentials were collected.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is enough for a small-team review. Formal audit terminology and complex approval chains are unnecessary unless the organization already has a documented process that requires them.&lt;/p&gt;
&lt;h3 id=&quot;frequently-asked-questions&quot;&gt;Frequently asked questions&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Is this the same as monitoring active VPN sessions?&lt;/strong&gt;&lt;br&gt;
No. It reviews assignments, devices, and records. It does not show who is connected at a specific moment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How often should we run the checklist?&lt;/strong&gt;&lt;br&gt;
Use a cadence that matches team changes—often monthly or quarterly—and run an extra check after significant onboarding, offboarding, device replacement, or profile reissue work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Should reviewers collect profile files to confirm the revision?&lt;/strong&gt;&lt;br&gt;
No. Use non-sensitive profile labels, inventory records, and the approved status source. Do not collect profile contents or credentials.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What should happen when something is unclear?&lt;/strong&gt;&lt;br&gt;
Assign one owner and one next step. A clear follow-up is more useful than a long note with no decision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related guidance:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-setup-documentation-small-teams&quot;&gt;VPN Setup Documentation for Small Teams: What to Record and Why&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-setup-contractors-shared-expectations&quot;&gt;VPN Setup for Contractors: Shared Expectations Without Shared Secrets&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;technical-references-for-the-review&quot;&gt;Technical references for the review&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/connection-profiles.html&quot;&gt;OpenVPN connection profiles&lt;/a&gt; explains why profile files contain sensitive connection material. Use labels and approved status sources in the review.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/edit-a-profile.html&quot;&gt;Editing an OpenVPN Connect profile&lt;/a&gt; distinguishes the displayed profile name from other parameters. A naming mismatch is a reason to confirm the intended assignment, not to change server settings by guesswork.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/delete-a-profile.html&quot;&gt;Deleting a local OpenVPN Connect profile&lt;/a&gt; removes its entry from that app. Treat local cleanup and service-side access removal as separate tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These client references were checked on October 15, 2026. They support the operational distinctions above; this article does not report a live test of any team's access or client. Follow the organization's documented process where it requires additional controls.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/31179/a-practical-periodic-vpn-access-review-for-small-teams</guid>
<pubDate>Thu, 15 Oct 2026 08:29:16 +0000</pubDate>
</item>
<item>
<title>How to Name VPN Profiles for Clear Team Handoffs</title>
<link>https://coderlegion.com/31028/how-to-name-vpn-profiles-for-clear-team-handoffs</link>
<description>&lt;p&gt;This guide sets out a small naming convention for issued VPN profiles. It covers readable assignment labels, revision suffixes, matching client names, and what to keep out of filenames.&lt;/p&gt;
&lt;p&gt;Adapted with permission from &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-profile-naming-small-teams&quot;&gt;A Practical VPN Profile Naming Convention for Small Teams&lt;/a&gt; by Mohammad Hesameddin Montazerilisar, published July 10, 2026 and updated July 11, 2026. AI assistance was used for editing, destination framing, and reference notes; the substantive guidance below preserves the human-authored source. The author writes technical guidance for Lisar Connect and is Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C. The examples are illustrative, not real access records.&lt;/p&gt;
&lt;p&gt;Cover: AI-generated illustration. Example filename is fictional.&lt;/p&gt;
&lt;p&gt;A profile name should help someone choose the right connection without opening the file, guessing from a download date, or asking who created it. For a small team, that does not require a complicated asset-management system. A short, repeatable pattern is usually enough.&lt;/p&gt;
&lt;p&gt;The useful question is simple: &lt;strong&gt;can a teammate identify the owner, device, purpose, and current revision from the name alone?&lt;/strong&gt; If the answer is yes, the naming convention is doing its job.&lt;/p&gt;
&lt;h2 id=&quot;start-with-the-four-details-people-actually-need&quot;&gt;Start with the four details people actually need&lt;/h2&gt;
&lt;p&gt;Most teams only need four pieces of information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Owner or role&lt;/strong&gt; — who the profile is assigned to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Device&lt;/strong&gt; — which laptop, phone, or router it is intended for.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt; — normal work, travel, shared office, testing, or another approved use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Date or revision&lt;/strong&gt; — enough to distinguish the current copy from an older one.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A practical pattern is:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;owner-device-purpose-revision&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;mina-laptop-work-r03.ovpn&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;sales-router-office-r02.ovpn&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;contractor7-phone-travel-2026-07.ovpn&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The separator and exact order are less important than consistency. Pick a pattern that remains readable in a downloads folder and inside the VPN client.&lt;/p&gt;
&lt;h2 id=&quot;use-labels-people-already-understand&quot;&gt;Use labels people already understand&lt;/h2&gt;
&lt;p&gt;A naming convention should reduce explanation, not create a new internal language. Use names that your team already recognizes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;a person’s first name or approved staff ID;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a short device label already used by the team;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a plain purpose such as &lt;code&gt;work&lt;/code&gt;, &lt;code&gt;travel&lt;/code&gt;, or &lt;code&gt;office&lt;/code&gt;;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a simple revision such as &lt;code&gt;r02&lt;/code&gt; or a date such as &lt;code&gt;2026-07&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avoid codes that only one administrator understands. If a profile called &lt;code&gt;EU-7B-X4&lt;/code&gt; requires a separate spreadsheet just to decode it, the name is not helping the person who needs to import it.&lt;/p&gt;
&lt;h2 id=&quot;keep-filenames-and-client-names-aligned&quot;&gt;Keep filenames and client names aligned&lt;/h2&gt;
&lt;p&gt;A common source of confusion is a clear filename that becomes a vague client entry after import. When the client allows a display name, use the same identifying pattern or a shortened version of it.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;file: &lt;code&gt;mina-laptop-work-r03.ovpn&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;client entry: &lt;code&gt;Mina — Laptop — Work — R03&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The two names do not need to be character-for-character identical, but they should point to the same owner, device, purpose, and revision. That makes screenshots, support conversations, and future setup checks much easier to follow.&lt;/p&gt;
&lt;h2 id=&quot;do-not-put-sensitive-information-in-the-name&quot;&gt;Do not put sensitive information in the name&lt;/h2&gt;
&lt;p&gt;A profile name is visible in folders, screenshots, backups, and client interfaces. Keep it descriptive but non-sensitive.&lt;/p&gt;
&lt;p&gt;Do not include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;passwords or verification codes;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;private keys or certificate values;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;full email addresses when a short approved identifier is enough;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;payment information;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;internal server secrets;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;detailed infrastructure notes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A name should identify the assignment, not reveal how the profile works internally.&lt;/p&gt;
&lt;h2 id=&quot;make-the-current-revision-obvious&quot;&gt;Make the current revision obvious&lt;/h2&gt;
&lt;p&gt;When a profile is replaced, the new name should make the change visible. A simple revision suffix works well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;r01&lt;/code&gt; — original issue&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;r02&lt;/code&gt; — replacement or updated profile&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;r03&lt;/code&gt; — next approved revision&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A date can work too, especially when profiles are refreshed infrequently. Avoid informal endings such as &lt;code&gt;final&lt;/code&gt;, &lt;code&gt;final2&lt;/code&gt;, &lt;code&gt;new&lt;/code&gt;, and &lt;code&gt;newest&lt;/code&gt;. Those labels become unreliable as soon as another copy is issued.&lt;/p&gt;
&lt;p&gt;The current profile should also be reflected in the team’s access inventory or setup notes. The filename alone should not be the only record of which revision is current.&lt;/p&gt;
&lt;h2 id=&quot;keep-the-convention-short-enough-to-use&quot;&gt;Keep the convention short enough to use&lt;/h2&gt;
&lt;p&gt;A naming rule can become counterproductive if it tries to encode every fact. The purpose of the name is quick recognition, not complete documentation.&lt;/p&gt;
&lt;p&gt;Good names are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;short enough to scan;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;specific enough to distinguish assignments;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;consistent across the team;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;safe to show in a screenshot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;stable when the file moves between folders or devices.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Details such as who approved the assignment, when access should be reviewed, and why a change was made belong in the access inventory or change note, not in the filename.&lt;/p&gt;
&lt;h2 id=&quot;introduce-the-pattern-without-renaming-everything-at-once&quot;&gt;Introduce the pattern without renaming everything at once&lt;/h2&gt;
&lt;p&gt;A small team can adopt a naming convention gradually:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Agree on one pattern.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use it for every newly issued or replaced profile.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rename current local copies only after confirming which file is active.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update the matching client display name where the client supports it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Record the current revision in the access inventory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stop creating new filenames with informal suffixes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is no need to reopen or edit profile contents just to improve the filename. Renaming the local file is ordinary file organization; the actual profile data should remain unchanged.&lt;/p&gt;
&lt;h2 id=&quot;quick-checklist&quot;&gt;Quick checklist&lt;/h2&gt;
&lt;p&gt;Before accepting a profile name, check that it answers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Who or what is it for?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which device is it intended for?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What is its approved purpose?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which revision or issue date is current?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is the name free of secrets and unnecessary internal detail?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Will the same label make sense inside the VPN client?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the name answers those questions at a glance, it is probably good enough.&lt;/p&gt;
&lt;h2 id=&quot;frequently-asked-questions-1&quot;&gt;Frequently asked questions&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Should a profile name include the server country or location?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Only when location is a documented and stable part of the assignment. Do not encode assumptions that may change, and do not use the name to imply account-region or service-eligibility changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is a date better than a revision number?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Either can work. Dates are easy to sort; revision numbers are compact. The important point is to use one method consistently and record which version is current.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can I rename an &lt;code&gt;.ovpn file&lt;/code&gt; after downloading it?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A local filename can normally be renamed without changing the file’s contents. Confirm that you are renaming the intended current copy, and do not manually edit sensitive profile sections.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Should every user follow the same convention?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For a team, yes. A shared pattern makes support and handoff easier, even if each person’s actual profile remains assigned individually.&lt;/p&gt;
&lt;h2 id=&quot;official-references-and-the-limits-of-a-label&quot;&gt;Official references and the limits of a label&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/connection-profiles.html&quot;&gt;OpenVPN Connect: Connection Profiles&lt;/a&gt; explains that the profile contains connection parameters and certificates. A readable filename is an organizational label; it is not proof of the file contents or current access.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/edit-a-profile.html&quot;&gt;OpenVPN Connect: Edit a Profile&lt;/a&gt; documents the Profile Name field and notes that a connected profile cannot be edited. Use the supported naming control when appropriate; do not change server overrides, proxies, or connection data as a naming exercise.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/import-profile.html&quot;&gt;OpenVPN Connect: Import a Profile&lt;/a&gt; documents importing a profile from a file or URL. Importing and naming are separate from proving an active connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These references were checked on October 14, 2026. No device, VPN service, or client behavior was tested for this article. Follow the approved procedure for your actual client and managed device.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/31028/how-to-name-vpn-profiles-for-clear-team-handoffs</guid>
<pubDate>Wed, 14 Oct 2026 08:18:23 +0000</pubDate>
</item>
<item>
<title>A Controlled Method for Comparing VPN IP-Check Results</title>
<link>https://coderlegion.com/30905/a-controlled-method-for-comparing-vpn-ip-check-results</link>
<description>&lt;p&gt;A useful IP-check comparison records the address family, raw address, timing, and lookup labels separately. This keeps a database disagreement from becoming an unsupported diagnosis.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Adapted with permission from &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-ip-checks-different-results&quot;&gt;the original Lisar article&lt;/a&gt; by Mohammad Hesameddin Montazerilisar, published July 10, 2026 and updated July 11, 2026. AI assisted editing, platform framing, and fact-checking; the substantive source guidance is human-authored. No client, service, or IP-geolocation test was performed for this article.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;AI-generated illustration of one laptop with three differing map estimates; not a measured network result.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Two IP-checking websites can inspect the same public IP address and display different cities, network names, or location labels. That does not necessarily mean the VPN connection changed between pages. Most IP-checking services combine the observed address with their own databases, update schedules, and labeling rules.&lt;/p&gt;
&lt;p&gt;The IP address is the direct network observation. The city, region, provider, or “type” shown beside it is an interpretation.&lt;/p&gt;
&lt;h2 id=&quot;an-ip-address-can-have-several-public-descriptions&quot;&gt;An IP address can have several public descriptions&lt;/h2&gt;
&lt;p&gt;An IP-checking page may show:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;public IPv4 address;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;public IPv6 address;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;country or region;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;city;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;internet service provider or network operator;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;autonomous-system organization;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hosting, mobile, corporate, or proxy classification;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reverse-DNS name;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;time zone inferred from location.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These fields do not all come from the same source or have the same accuracy. The IP address observed by the site is usually the most direct result. The descriptive fields are database records or estimates.&lt;/p&gt;
&lt;h2 id=&quot;why-lookup-databases-disagree&quot;&gt;Why lookup databases disagree&lt;/h2&gt;
&lt;p&gt;IP ranges are assigned and routed by network operators, but location databases are maintained by separate companies and services. They may use registration records, routing information, user corrections, network measurements, commercial feeds, or historical data.&lt;/p&gt;
&lt;p&gt;One provider may associate a range with the operator’s registered office. Another may estimate the location of network infrastructure. A third may use a broad country-level label because it lacks reliable city data.&lt;/p&gt;
&lt;p&gt;Updates do not arrive at the same time. A recently reassigned or newly announced range can show an old city in one database and a new country or operator in another.&lt;/p&gt;
&lt;h2 id=&quot;country-city-isp-and-organization-fields-have-different-accuracy&quot;&gt;Country, city, ISP, and organization fields have different accuracy&lt;/h2&gt;
&lt;p&gt;Country-level data is often more stable than city-level data, but neither should be treated as a guaranteed physical location. A city result can represent the network’s registration, routing point, or database estimate rather than the exact server or user position.&lt;/p&gt;
&lt;p&gt;The “ISP” or “organization” field can also differ. One service may display the company that owns the address range, another the network that announces it, and another a brand or hosting provider.&lt;/p&gt;
&lt;p&gt;A label such as hosting or proxy is a classification produced by that service. It is not a universal fact shared by every website.&lt;/p&gt;
&lt;h2 id=&quot;ipv4-and-ipv6-can-produce-different-observations&quot;&gt;IPv4 and IPv6 can produce different observations&lt;/h2&gt;
&lt;p&gt;A device may have both IPv4 and IPv6 connectivity. Different test sites, browsers, or applications may prefer one protocol over the other. If the VPN or local network handles them differently, one page can report an IPv4 address while another reports an IPv6 address.&lt;/p&gt;
&lt;p&gt;That is why an IP test should state which address family it observed. Do not assume two different-looking addresses represent two random results when one is IPv4 and the other is IPv6.&lt;/p&gt;
&lt;p&gt;A complete investigation may require checking both protocols according to the documented setup. Avoid changing network or router settings as a general response.&lt;/p&gt;
&lt;h2 id=&quot;cache-and-update-timing-matter&quot;&gt;Cache and update timing matter&lt;/h2&gt;
&lt;p&gt;Browsers, DNS resolvers, content-delivery networks, and the IP-checking service itself can cache results. A page may also load some information from a previous request while another field is refreshed.&lt;/p&gt;
&lt;p&gt;Repeat the test in a controlled way rather than refreshing many pages rapidly. Confirm the VPN status, note the time, and record the raw public IP shown by each service. If the raw address is the same while the city differs, the disagreement is clearly in the database description.&lt;/p&gt;
&lt;h2 id=&quot;use-a-controlled-ip-check-method&quot;&gt;Use a controlled IP-check method&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Confirm the VPN client reports Connected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Record the profile or intended connection in non-sensitive terms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Close or avoid pages that requested browser location permission.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open two or three reputable IP-checking services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Record the exact IPv4 and IPv6 addresses shown.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Record country, city, and network labels separately.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repeat once after a short interval if necessary.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compare the raw addresses before comparing location names.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Do not grant precise browser location permission during a basic IP test. That would introduce a different signal.&lt;/p&gt;
&lt;h2 id=&quot;what-a-disagreement-does-and-does-not-prove&quot;&gt;What a disagreement does and does not prove&lt;/h2&gt;
&lt;p&gt;If two sites show the same IP but different cities, the VPN connection can still be functioning normally. The sites are interpreting the same address differently.&lt;/p&gt;
&lt;p&gt;If they show different public IPs at the same time, check whether:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;one result is IPv4 and the other IPv6;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the VPN changed state between tests;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the browser used a cached result;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;different applications are using different network paths;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a network transition occurred;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;one page displayed a browser-location result instead of IP geolocation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A differing city does not prove a leak. A matching city does not prove complete privacy or security. The meaning depends on the raw address and the test method.&lt;/p&gt;
&lt;h2 id=&quot;how-to-report-a-meaningful-result&quot;&gt;How to report a meaningful result&lt;/h2&gt;
&lt;p&gt;A useful report includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;date and time;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;VPN client status;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;device and network type;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;test-service names;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;raw IPv4 and IPv6 results;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;location and organization labels from each service;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;whether browser location permission was blocked;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;whether the result was repeatable.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Do not include profile files, credentials, tokens, or internal configuration.&lt;/p&gt;
&lt;h2 id=&quot;why-the-answers-can-disagree&quot;&gt;Why the answers can disagree&lt;/h2&gt;
&lt;p&gt;IP-check services rely on separate databases and update schedules. Two sites can map the same public IP differently without proving that the VPN connection is switching locations. Confirm the actual public IP first, then treat the displayed city as an estimate rather than an exact device position.&lt;/p&gt;
&lt;h2 id=&quot;frequently-asked-questions-2&quot;&gt;Frequently asked questions&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Which IP-checking site is correct?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They may all observe the same IP while using different descriptive databases. The raw address is more direct than the city label.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why does one site show a nearby city and another a distant city?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;City-level IP geolocation is approximate and may reflect registration or network infrastructure rather than exact physical location.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can IPv4 and IPv6 show different locations?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yes. They are different address ranges and may have different database records or network paths.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does a wrong city mean the VPN is not connected?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No. Confirm the client status and raw public IP before interpreting the city estimate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Should I grant browser location permission for an IP test?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No. That introduces device location and makes the result harder to interpret.&lt;/p&gt;
&lt;h2 id=&quot;authoritative-references&quot;&gt;Authoritative references&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://support.maxmind.com/knowledge-base/articles/maxmind-geolocation-accuracy&quot;&gt;MaxMind: Geolocation accuracy&lt;/a&gt; — limitations, differing databases, and location estimates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc8305.html&quot;&gt;IETF RFC 8305: Happy Eyeballs Version 2&lt;/a&gt; — background on connection attempts across IPv4 and IPv6.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API&quot;&gt;MDN: Geolocation API&lt;/a&gt; — browser permission and device-provided location.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Author affiliation: Mohammad Hesameddin Montazerilisar writes and maintains Lisar Connect technical guidance and is Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C. This article gives general diagnostic guidance and makes no product compatibility, privacy, or access guarantee.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30905/a-controlled-method-for-comparing-vpn-ip-check-results</guid>
<pubDate>Tue, 13 Oct 2026 08:18:16 +0000</pubDate>
</item>
<item>
<title>17NAS IPv6 Test</title>
<link>https://coderlegion.com/30831/17nas-ipv6-test</link>
<description>&lt;h3 id=&quot;17nas-ipv6-test-free-online-ipv6-connection-test&quot;&gt;17NAS IPv6 Test — free online IPv6 connection test&lt;/h3&gt;
&lt;p&gt;Not sure if your network really supports IPv6? This free tool checks it in real time, right in your browser.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it shows:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your IPv4 and IPv6 addresses side by side&lt;/li&gt;
&lt;li&gt;Connection latency for each protocol&lt;/li&gt;
&lt;li&gt;ISP information&lt;/li&gt;
&lt;li&gt;Dual-stack status and a connection quality score&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It runs both protocols in parallel, so you get the full picture in seconds. There's also a simple curl-based API if you want to script the check.&lt;/p&gt;
&lt;p&gt;No sign-up, no uploads — everything runs locally in your browser.&lt;/p&gt;
&lt;p&gt;Try it: &lt;a rel=&quot;nofollow&quot; href=&quot;https://17nas.com/ipv6-test.php&quot;&gt;https://17nas.com/ipv6-test.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Built by the 17NAS team. Feedback welcome!&lt;/p&gt;
</description>
<category>Tutorials</category>
<guid isPermaLink="true">https://coderlegion.com/30831/17nas-ipv6-test</guid>
<pubDate>Mon, 12 Oct 2026 16:22:24 +0000</pubDate>
</item>
<item>
<title>A Practical Change Record for Reissued VPN Profiles</title>
<link>https://coderlegion.com/30786/a-practical-change-record-for-reissued-vpn-profiles</link>
<description>&lt;p&gt;A profile reissue needs a small, useful change record: the assignment, the old-to-new revision, and which setup stage has actually completed. The record should help the next person continue without receiving any secrets.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Adapted with permission from &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-profile-change-log&quot;&gt;the original Lisar article&lt;/a&gt; by Mohammad Hesameddin Montazerilisar, published July 10, 2026 and updated July 11, 2026. AI assisted editing, platform framing, and fact-checking; the substantive source guidance is human-authored. No client or service test was performed for this article.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;AI-generated illustration of six profile-handoff stages. Conceptual guidance, not a product screenshot.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When a VPN profile is replaced, the team needs a clear answer to three questions: &lt;strong&gt;which assignment changed, which copy is now current, and has the intended device been checked?&lt;/strong&gt; A short change note is enough. It does not need to become a formal project or expose what is inside the profile.&lt;/p&gt;
&lt;p&gt;The goal is to stop old and new copies from being confused during setup or troubleshooting.&lt;/p&gt;
&lt;h2 id=&quot;record-the-reason-in-plain-language&quot;&gt;Record the reason in plain language&lt;/h2&gt;
&lt;p&gt;Use a short, ordinary reason such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;device replacement;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;updated connection information;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;compatibility correction;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;scheduled profile refresh;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;user or role change;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;incorrect earlier delivery.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Do not copy sensitive configuration differences into the note. The reason should explain the operational context, not reveal credentials, keys, certificates, or internal infrastructure details.&lt;/p&gt;
&lt;h2 id=&quot;identify-the-exact-assignment-affected&quot;&gt;Identify the exact assignment affected&lt;/h2&gt;
&lt;p&gt;A useful record should identify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;the person or approved role;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the intended device;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the purpose of the profile;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the previous profile label or revision;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the new profile label or revision.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Mina / Laptop-07 / Work / R02 → R03&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;That line is often more useful than a long paragraph because it makes the relationship between the old and new copies obvious.&lt;/p&gt;
&lt;h2 id=&quot;keep-issue-delivery-and-verification-separate&quot;&gt;Keep issue, delivery, and verification separate&lt;/h2&gt;
&lt;p&gt;A profile can be created without reaching the user, delivered without being imported, or imported without establishing a connection. Record these steps separately when they matter:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Issued&lt;/strong&gt; — the new profile or revision became available.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Delivered&lt;/strong&gt; — the intended user received it through the approved path.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Imported/saved&lt;/strong&gt; — the profile was added to the intended client.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Connected&lt;/strong&gt; — the client reached an active connection.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Checked&lt;/strong&gt; — the user confirmed the expected basic behavior.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inventory updated&lt;/strong&gt; — the new revision is recorded as current.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A small team may combine some steps in one note, but it should not mark the change complete merely because a file was sent.&lt;/p&gt;
&lt;h2 id=&quot;tell-the-user-which-profile-to-select&quot;&gt;Tell the user which profile to select&lt;/h2&gt;
&lt;p&gt;The user-facing message should be simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;the name of the new profile;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the device it is intended for;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the approved place to obtain it;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the basic import/save action;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how to recognize the correct client entry;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;what to do if the new profile does not connect.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avoid forwarding a profile through an informal shared channel or encouraging people to test profiles assigned to someone else.&lt;/p&gt;
&lt;h2 id=&quot;handle-old-copies-without-creating-confusion&quot;&gt;Handle old copies without creating confusion&lt;/h2&gt;
&lt;p&gt;The record should say that the previous revision is no longer the current reference copy. The exact service-side handling belongs to the authorized process; the public note does not need to describe deletion, revocation, or internal administrative steps.&lt;/p&gt;
&lt;p&gt;On the user’s device, the priority is making the new profile easy to identify. Clear naming and a current-revision record reduce the chance that someone reconnects with an older client entry later.&lt;/p&gt;
&lt;h2 id=&quot;keep-the-note-short-enough-to-maintain&quot;&gt;Keep the note short enough to maintain&lt;/h2&gt;
&lt;p&gt;A practical change note can fit in a few fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Assignment&lt;/strong&gt; — Mina / Laptop-07 / Work&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reason&lt;/strong&gt; — Device replacement&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Previous revision&lt;/strong&gt; — R02&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Current revision&lt;/strong&gt; — R03&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Issued&lt;/strong&gt; — 2026-07-10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Connection checked&lt;/strong&gt; — 2026-07-11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inventory updated&lt;/strong&gt; — Yes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open issue&lt;/strong&gt; — None&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use non-sensitive identifiers. Do not attach the profile file or paste its contents into the record.&lt;/p&gt;
&lt;h2 id=&quot;note-exceptions-in-a-useful-way&quot;&gt;Note exceptions in a useful way&lt;/h2&gt;
&lt;p&gt;Sometimes the new profile cannot be checked immediately because a device is offline, the user is travelling, or the client needs an update. A useful exception note says:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;what is waiting;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;who will follow up;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the next practical step;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;when it should be checked again.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is enough. Avoid elaborate risk scoring or a long approval chain unless the team already has a documented reason to use one.&lt;/p&gt;
&lt;h2 id=&quot;when-the-change-is-complete&quot;&gt;When the change is complete&lt;/h2&gt;
&lt;p&gt;Treat the reissue as complete when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;the intended user or device has the new profile;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the client entry is identifiable;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the connection has been checked where required;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the access inventory shows the new revision as current;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;any unresolved exception has a clear owner and next step.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The change record should make the current state easy to understand without exposing the profile itself.&lt;/p&gt;
&lt;h2 id=&quot;frequently-asked-questions-3&quot;&gt;Frequently asked questions&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Do we need to record exactly what changed inside the profile?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No. Record the reason and the old-to-new revision relationship. Sensitive profile contents should not appear in the change note.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is sending the new profile enough to close the change?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not always. Delivery and successful setup are different steps. At minimum, record whether the intended person or device completed the required check.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Should a service renewal be recorded as a profile reissue?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Only when a new profile is actually issued. Renewal and profile replacement are separate events.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What if the user still sees the older client entry?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Make the current profile label clear and follow the approved local cleanup guidance. Do not rely on trial and error with several similar profiles.&lt;/p&gt;
&lt;h2 id=&quot;official-client-references&quot;&gt;Official client references&lt;/h2&gt;
&lt;p&gt;OpenVPN documents &lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/connection-profiles.html&quot;&gt;what a connection profile contains&lt;/a&gt;, the &lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/import-profile.html&quot;&gt;separate file-import process&lt;/a&gt;, and &lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/edit-a-profile.html&quot;&gt;where the displayed profile name is edited&lt;/a&gt;. These references explain client behavior; a display-name change is not a new provider-issued revision or proof of service-side access changes. Use the approved administrator or provider process for those changes.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30786/a-practical-change-record-for-reissued-vpn-profiles</guid>
<pubDate>Mon, 12 Oct 2026 08:15:40 +0000</pubDate>
</item>
<item>
<title>VPN Configuration Permission: Check Consent Separately from Connection State</title>
<link>https://coderlegion.com/30691/vpn-configuration-permission-check-consent-separately-from-connection-state</link>
<description>&lt;p&gt;A VPN configuration prompt is a system permission decision. This guide separates that decision from profile import and connection state, including why switching VPN apps on Android can bring the prompt back.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Adapted with permission from &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-client-add-configuration-permission&quot;&gt;the original Lisar article&lt;/a&gt; by Mohammad Hesameddin Montazerilisar, published July 10, 2026 and updated September 25, 2026. AI assisted editing, platform framing, and fact-checking; the substantive source guidance is human-authored. No device test was performed for this article.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;AI-generated conceptual illustration: system permission and a working VPN connection are separate checks. This is not a product or operating-system screenshot.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A VPN client cannot establish a system-level VPN connection without permission from the operating system. That is why a phone, tablet, or computer may display a prompt asking whether the client can add a VPN configuration.&lt;/p&gt;
&lt;p&gt;The wording can sound more serious than the action feels. In ordinary use, the prompt is the operating system asking whether the client may create and manage the connection entry that you are trying to set up. It is not, by itself, confirmation that the profile is correct, that access is active, or that a connection has been established.&lt;/p&gt;
&lt;h2 id=&quot;what-the-permission-prompt-is-asking&quot;&gt;What the permission prompt is asking&lt;/h2&gt;
&lt;p&gt;A VPN connection affects how network traffic leaves the device. Because that happens at the operating-system level, the client needs explicit permission to create a VPN configuration.&lt;/p&gt;
&lt;p&gt;Depending on the device, the prompt may refer to adding a VPN configuration, allowing a VPN connection, or permitting the client to manage VPN settings. The exact words and screen design vary between operating systems and client versions.&lt;/p&gt;
&lt;p&gt;This is different from a normal website permission. A browser page cannot create the system connection on its own. The compatible VPN client handles the imported or saved profile, while the operating system controls whether that client may create the VPN connection.&lt;/p&gt;
&lt;h2 id=&quot;why-the-operating-system-shows-it&quot;&gt;Why the operating system shows it&lt;/h2&gt;
&lt;p&gt;The prompt creates a clear boundary between installing or opening a client and allowing that client to affect network routing on the device. It gives the device owner a chance to confirm that the action was intentional.&lt;/p&gt;
&lt;p&gt;You will commonly see it during first-time setup, after installing a client on a new device, or when the operating system needs fresh confirmation after a material software change. You may not see it for every later connection because the permission can remain associated with the approved client and configuration.&lt;/p&gt;
&lt;p&gt;The absence of a new prompt does not prove that the profile is current. It only means the operating system did not need to ask for that permission again at that moment.&lt;/p&gt;
&lt;h2 id=&quot;what-to-verify-before-approving&quot;&gt;What to verify before approving&lt;/h2&gt;
&lt;p&gt;Use a short check rather than treating the prompt as a routine button:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Confirm the client.&lt;/strong&gt; The application named in the prompt should be the compatible VPN client you intentionally opened.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Confirm the source.&lt;/strong&gt; The profile should have come from a trusted and expected source. Do not use a profile passed around casually.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Confirm the device.&lt;/strong&gt; Personal devices and organization-managed devices may follow different rules.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Confirm the action.&lt;/strong&gt; The prompt should follow a setup action or a connection attempt you intentionally started. A new import is not required every time permission is requested.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Confirm ownership.&lt;/strong&gt; The profile should be assigned or otherwise authorized for your use.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There is no need to open sensitive parts of a profile file to make this decision. The useful checks are source, assignment, client, device, and the action you intentionally started.&lt;/p&gt;
&lt;h2 id=&quot;why-android-may-ask-again-after-another-vpn-app&quot;&gt;Why Android may ask again after another VPN app&lt;/h2&gt;
&lt;p&gt;Android allows one active VPN service per user or work profile. Starting a different VPN app can replace the current VPN connection. Allowing that other app can also revoke the previous app’s system approval, so returning to your usual client may bring up the permission request again. See the &lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.android.com/develop/connectivity/vpn&quot;&gt;Android VPN guide&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.android.com/reference/android/net/VpnService&quot;&gt;VpnService permission reference&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The request can appear when you tap Connect, even if the profile is already imported. The &lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/android-installation-guide.html&quot;&gt;OpenVPN Connect Android guide&lt;/a&gt; describes granting permission at that step. A repeated request alone does not show that your profile is damaged; it is not a reason to re-import the file or reinstall the client.&lt;/p&gt;
&lt;p&gt;Confirm the app named in the prompt and the connection you intended to start. On a managed device, follow the administrator’s VPN policy. After granting permission, check the client’s connection status separately.&lt;/p&gt;
&lt;h2 id=&quot;what-happens-if-you-decline&quot;&gt;What happens if you decline&lt;/h2&gt;
&lt;p&gt;If you decline, the client normally cannot create the requested system VPN configuration. The profile might still appear in the client, or the setup may remain incomplete, depending on the operating system and client.&lt;/p&gt;
&lt;p&gt;If you are uncertain, pause or decline and verify the source before continuing. The requested configuration remains unapproved; network availability may depend on the device policy already in force.&lt;/p&gt;
&lt;p&gt;When you return to the setup flow after verifying everything, the operating system may show the prompt again. The exact behavior depends on the device and client.&lt;/p&gt;
&lt;h2 id=&quot;managed-devices-and-organization-policies&quot;&gt;Managed devices and organization policies&lt;/h2&gt;
&lt;p&gt;A company-managed phone or computer may restrict who can add VPN configurations. It may also require a specific client, profile, or approval process.&lt;/p&gt;
&lt;p&gt;Do not try to work around those controls. If the device blocks the action or the prompt differs from the documented setup, check with the person responsible for the device or network access. A valid profile does not override device-management policy.&lt;/p&gt;
&lt;p&gt;This is one reason setup can differ between a personal device and an organization-managed device even when both use the same general profile type.&lt;/p&gt;
&lt;h2 id=&quot;permission-granted-does-not-mean-connected&quot;&gt;Permission granted does not mean connected&lt;/h2&gt;
&lt;p&gt;Approving the system prompt completes only one part of setup. Several separate states are easy to confuse:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The client is installed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The profile is imported or saved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The operating system has allowed a VPN configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The client has attempted to connect.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The connection is active.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A successful permission step does not prove the last two states. After setup, use the client status and the normal first-connection checks to confirm whether the connection is actually active.&lt;/p&gt;
&lt;h2 id=&quot;frequently-asked-questions-4&quot;&gt;Frequently asked questions&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Why did I see the prompt on one device but not another?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Operating systems, client versions, prior permissions, and device-management rules can produce different setup flows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can the request appear when I tap Connect?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yes. On Android, a client may ask for system VPN permission when you start a connection with an already imported profile. Granting permission does not by itself confirm an active connection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why does Android ask again after I use another VPN app?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Allowing another VPN app can revoke the previous app’s approval. When you return to the earlier client, Android may ask for permission again. This alone does not mean the saved profile is damaged.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Original author: Mohammad Hesameddin Montazerilisar, technical author for Lisar Connect and Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C, which develops and operates Lisar Connect.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30691/vpn-configuration-permission-check-consent-separately-from-connection-state</guid>
<pubDate>Sun, 11 Oct 2026 08:17:48 +0000</pubDate>
</item>
<item>
<title>A Post-Restart VPN Checklist: Network Readiness, Client State, and Android Startup Settings</title>
<link>https://coderlegion.com/30569/post-restart-vpn-checklist-network-readiness-client-state-and-android-startup-settings</link>
<description>&lt;p&gt;This checklist explains how to verify a VPN after a device restart, including network readiness and the difference between client launch settings and Android traffic-blocking policy.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Adapted with permission from &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-after-device-restart&quot;&gt;the original Lisar article&lt;/a&gt; by Mohammad Hesameddin Montazerilisar, published July 10, 2026 and updated September 26, 2026. AI assisted editing, platform framing, and fact-checking; the substantive source guidance is human-authored. No connection test was performed for this article.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Restarting a phone, tablet, or computer ends active processes and network sessions. A VPN profile may remain saved in its client, but the connection that existed before the restart should not be assumed to remain active afterward.&lt;/p&gt;
&lt;p&gt;The useful distinction is between &lt;strong&gt;stored configuration&lt;/strong&gt; and &lt;strong&gt;current connection state&lt;/strong&gt;. A restart can leave one intact while resetting the other.&lt;/p&gt;
&lt;h2 id=&quot;what-survives-a-restart-and-what-does-not&quot;&gt;What survives a restart and what does not&lt;/h2&gt;
&lt;p&gt;A saved profile is configuration information stored by the client. An active VPN session is a live network state. Most devices preserve the client and its profiles through a normal restart, but they stop the active session while the operating system shuts down.&lt;/p&gt;
&lt;p&gt;After startup, the client may:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;remain disconnected until you open it;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reconnect automatically when the operating system and network are ready;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;display the saved profile but require a new Connect action;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ask for permission again after a major update or policy change;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;report an error because the underlying network is not ready yet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These behaviors vary. The presence of a profile entry does not prove an active connection, and the absence of an automatic reconnection does not by itself mean the profile is damaged.&lt;/p&gt;
&lt;h2 id=&quot;wait-for-the-normal-network-to-become-usable&quot;&gt;Wait for the normal network to become usable&lt;/h2&gt;
&lt;p&gt;After startup, Wi-Fi and mobile services may take time to reconnect. A guest or public network may require a sign-in page again. A laptop can also reconnect to a different remembered network than the one used before shutdown.&lt;/p&gt;
&lt;p&gt;Check network readiness together with any VPN policy already applied:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;the expected Wi-Fi or mobile connection is active;&lt;/li&gt;
&lt;li&gt;ordinary internet access works where device policy permits it; if non-VPN traffic is blocked, check the client status instead of treating this test as proof of a network failure;&lt;/li&gt;
&lt;li&gt;any permitted captive-portal sign-in is complete, or the network administrator has provided an approved way to finish it;&lt;/li&gt;
&lt;li&gt;the device is not still applying startup updates or network policy.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Starting several VPN attempts while the underlying network is changing can produce timeouts or duplicate status messages that disappear once the device is fully ready.&lt;/p&gt;
&lt;h2 id=&quot;android-startup-and-traffic-blocking-are-different-settings&quot;&gt;Android: startup and traffic blocking are different settings&lt;/h2&gt;
&lt;p&gt;On a compatible Android client, &lt;strong&gt;Always-on VPN&lt;/strong&gt; can start the VPN service after boot. The client still has to establish its connection. The separate &lt;strong&gt;Block connections without VPN&lt;/strong&gt; option can prevent ordinary internet access until that happens. A failed browsing test in this state does not by itself show that the saved profile is damaged. Availability depends on the client and device configuration; see the &lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.android.com/develop/connectivity/vpn&quot;&gt;Android VPN documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;OpenVPN Connect has its own &lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/app-settings-android.html&quot;&gt;Android launch settings&lt;/a&gt;: &lt;strong&gt;Connect latest&lt;/strong&gt; tries the most recently connected profile, &lt;strong&gt;Restore connection&lt;/strong&gt; tries to restore the connection active before shutdown, and &lt;strong&gt;None&lt;/strong&gt; takes no action after reboot. Its &lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/tutorials/tutorial--enable-always-on-vpn-in-openvpn-connect-on-android.html&quot;&gt;Always-on tutorial&lt;/a&gt; covers the separate system option. These examples describe OpenVPN Connect; check the documentation for the client you actually use.&lt;/p&gt;
&lt;p&gt;Read the current client status and any system notification before deciding what failed. On a managed device, ask the administrator for an approved network test or sign-in path; do not disable a required VPN or security policy.&lt;/p&gt;
&lt;h2 id=&quot;confirm-time-and-note-what-changed&quot;&gt;Confirm time and note what changed&lt;/h2&gt;
&lt;p&gt;Check that the system's actual date and time are correct. A wrong system clock can interfere with connection validation; a different time-zone display alone does not establish that problem.&lt;/p&gt;
&lt;p&gt;Also record whether the restart followed an operating-system or client update, a reinstall, a device-management change, a restore, or a network reset. Those events can change permissions or client behavior, but the timing alone does not prove the cause.&lt;/p&gt;
&lt;h2 id=&quot;open-the-intended-client-and-profile&quot;&gt;Open the intended client and profile&lt;/h2&gt;
&lt;p&gt;Confirm that the expected client starts normally and that the intended current profile is visible. If several similarly named profiles exist, compare the approved label, assignment, or delivery date instead of choosing the first one.&lt;/p&gt;
&lt;p&gt;A common mistake is to download the file again after every restart. That is usually unnecessary when the current profile is already saved. Repeated import attempts can create duplicate client entries and make it harder to know which one was tested.&lt;/p&gt;
&lt;p&gt;Do not inspect, copy, or share sensitive profile contents to identify the file. Use the authorized source, visible name, revision label, user or device assignment, and service status.&lt;/p&gt;
&lt;h2 id=&quot;handle-permission-prompts-carefully&quot;&gt;Handle permission prompts carefully&lt;/h2&gt;
&lt;p&gt;A system may ask again for permission to add or use a VPN configuration after a major update, client reinstall, device migration, or policy change. Confirm that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;you intentionally opened the expected client;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the prompt names that client;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the profile came from the approved source;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;you are allowed to add the configuration on this device.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On an organization-managed device, do not work around a blocked or altered prompt. Follow the approved device policy and contact the responsible administrator.&lt;/p&gt;
&lt;h2 id=&quot;recheck-connection-status-instead-of-assuming&quot;&gt;Recheck connection status instead of assuming&lt;/h2&gt;
&lt;p&gt;After the client is ready, distinguish these states:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;profile is visible;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;profile is selected;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;client is Connecting;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;client reports Connected;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ordinary internet and expected services work while connected.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A familiar system icon from before the restart is not reliable evidence. Open the client or operating-system VPN status and confirm the current state.&lt;/p&gt;
&lt;p&gt;If the client reports Connected, use the normal first-connection verification steps documented for the service.&lt;/p&gt;
&lt;h2 id=&quot;avoid-duplicate-setup-attempts&quot;&gt;Avoid duplicate setup attempts&lt;/h2&gt;
&lt;p&gt;When the first attempt fails after startup, preserve the result before changing anything. Record the visible status, timing, network, client version, and whether the restart followed an update. Then compare one condition, such as waiting for the network to stabilize or trying another authorized network.&lt;/p&gt;
&lt;p&gt;Avoid:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;repeatedly importing the same file;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;deleting profiles without confirming which revision is current;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;manually editing &lt;code&gt;.ovpn&lt;/code&gt; file contents;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;changing router, firewall, or device-security settings;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;using another person’s profile;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;assuming a reinstall is always required.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;frequently-asked-questions-5&quot;&gt;Frequently asked questions&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Do I need to import the profile after every restart?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Normally not when the current profile remains saved in the client. Reimport only when the documented setup or access owner requires a new file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can the VPN reconnect automatically after startup?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It depends on the client and approved settings. For example, OpenVPN Connect on Android documents launch choices for the last-used connection and for restoring a previously active connection. An automatic attempt is not proof that the VPN connected.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why can internet access be unavailable until the VPN connects?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If Android is configured to block connections without VPN, ordinary traffic can remain unavailable while the client connects. Check the active policy and client status. On a managed device, ask the administrator for an approved test instead of disabling the policy.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Original author: Mohammad Hesameddin Montazerilisar, technical author for Lisar Connect and Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C, which develops and operates Lisar Connect.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30569/post-restart-vpn-checklist-network-readiness-client-state-and-android-startup-settings</guid>
<pubDate>Sat, 10 Oct 2026 08:14:32 +0000</pubDate>
</item>
<item>
<title>A VPN Offboarding Checklist: Confirm Access Removal and Clear Returned Devices</title>
<link>https://coderlegion.com/30418/a-vpn-offboarding-checklist-confirm-access-removal-and-clear-returned-devices</link>
<description>&lt;p&gt;&lt;em&gt;Adapted from &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-offboarding-access-removal&quot;&gt;Removing VPN Access When Someone Leaves: An Offboarding Checklist&lt;/a&gt; by Mohammad Hesameddin Montazerilisar, published July 9, 2026 and updated September 27, 2026. AI assistance was used for editing, introductory framing, and a short reference note. The author writes for Lisar Connect and is Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Use this checklist to coordinate a departure without confusing local file cleanup with confirmed access removal. Keep the account-side action with the authorized administrator or service support.&lt;/p&gt;
&lt;p&gt;Per-person setup can make offboarding easier to track. When a team member leaves, identify their assigned access, confirm its removal through the authorized process, and handle returned-device cleanup separately. This is a non-technical checklist for coordinating those steps.&lt;/p&gt;
&lt;p&gt;A note on scope up front: this article is about the team's practical offboarding steps and routing the account side to the right process. It deliberately doesn't provide technical account-side procedures — those belong to the account, admin, and official support process, not to a public checklist.&lt;/p&gt;
&lt;h2 id=&quot;step-1-identify-who-is-leaving-and-what-they-had&quot;&gt;Step 1: Identify who is leaving and what they had&lt;/h2&gt;
&lt;p&gt;Start with clarity: who is leaving, and what VPN setup did they have — which devices, whose profile. Where setup is per-person, use the assignment records to identify that person’s profiles and authorized devices; verify the record rather than assuming it is complete. Knowing exactly what existed is what makes the rest of the checklist concrete rather than guesswork.&lt;/p&gt;
&lt;h2 id=&quot;step-2-stop-relying-on-any-shared-files&quot;&gt;Step 2: Stop relying on any shared files&lt;/h2&gt;
&lt;p&gt;If, despite best intentions, anything was ever shared — a profile file that got forwarded, a copy in a shared folder — offboarding is the moment to stop relying on it and correct the pattern. Keep future assignments per-person, but also resolve the copies that may already exist.&lt;/p&gt;
&lt;p&gt;If a profile or credential was shared, tell the administrator which assignments may be affected without distributing the secret again. Ask them to confirm the required invalidation or replacement. Moving future users to individual profiles does not revoke an existing shared copy.&lt;/p&gt;
&lt;h2 id=&quot;step-3-follow-the-account-and-support-process-for-access&quot;&gt;Step 3: Follow the account and support process for access&lt;/h2&gt;
&lt;p&gt;The actual removal of access on the account side goes through the proper channel: the account, admin, and official Lisar support process. That's deliberately where it lives — not in a public how-to — because it's the correct, supported path and because the specifics belong to the team's account context.&lt;/p&gt;
&lt;p&gt;Ask the authorized administrator or official Lisar support to remove the departing person’s access and confirm when that action is complete. Record any session termination or credential/profile invalidation that the actual service process requires. Sending a request is not confirmation that access has ended; do not mark offboarding complete while that result is unverified.&lt;/p&gt;
&lt;h2 id=&quot;step-4-remove-local-files-from-returned-devices&quot;&gt;Step 4: Remove local files from returned devices&lt;/h2&gt;
&lt;p&gt;On returned devices you are authorized to administer, remove downloaded profile files and the separate imported profiles or saved VPN configurations through the client or operating-system controls. &lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/delete-a-profile.html&quot;&gt;OpenVPN Connect documents profile removal from the app&lt;/a&gt;. Removing the download alone leaves an imported entry intact; neither local action invalidates copies on other devices.&lt;/p&gt;
&lt;p&gt;For devices handled by your team's normal device-return process anyway, that process covers it. The deliberate file-removal step matters most for devices that are simply handed back and reused as-is. This is local file hygiene — not an account action, and not something that touches anyone else's setup.&lt;/p&gt;
&lt;h2 id=&quot;step-5-update-team-documentation&quot;&gt;Step 5: Update team documentation&lt;/h2&gt;
&lt;p&gt;Update the team’s records with the confirmed access-removal outcome, the returned-device cleanup outcome, and any unresolved step. Do not record the person’s offboarding as complete merely because a request was sent. If the team keeps a simple setup document, note the change there so the picture stays current for whoever onboards or offboards next.&lt;/p&gt;
&lt;h2 id=&quot;what-offboarding-must-not-involve&quot;&gt;What offboarding must not involve&lt;/h2&gt;
&lt;p&gt;Two firm boundaries. First, no sharing of sensitive material as part of offboarding — no passing around the departing person's profile file, credentials, or screenshots of setup details &quot;to sort things out.&quot; Departure is not a reason to move material that shouldn't move at any time. Second, no improvised technical removal — access removal is the account/admin/support process's job, and a team's role is to initiate and follow it, not to invent steps.&lt;/p&gt;
&lt;h2 id=&quot;use-documentation-for-the-actual-system&quot;&gt;Use documentation for the actual system&lt;/h2&gt;
&lt;p&gt;The OpenVPN Connect instructions linked above describe removing an imported profile from that client; they do not document revoking a Lisar account. For a separate identity-system example, &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/entra/identity/users/users-revoke-access&quot;&gt;Microsoft’s Entra access-revocation guidance&lt;/a&gt; distinguishes account controls from session and token behavior. This illustrates why completion depends on the actual service. It does not imply Lisar uses Entra or shares its procedures or timing.&lt;/p&gt;
&lt;h2 id=&quot;two-questions-to-close-before-offboarding-is-complete&quot;&gt;Two questions to close before offboarding is complete&lt;/h2&gt;
&lt;h3 id=&quot;what-if-a-profile-file-was-shared-before-we-knew-better-&quot;&gt;What if a profile file was shared before we knew better?&lt;/h3&gt;
&lt;p&gt;Notify the administrator or official support and confirm whether the shared credential/profile must be invalidated or replaced. Do not assume that deleting a file or moving future users to individual profiles disables earlier copies.&lt;/p&gt;
&lt;h3 id=&quot;what-can-we-do-on-the-device-side-during-offboarding-&quot;&gt;What can we do on the device side during offboarding?&lt;/h3&gt;
&lt;p&gt;On returned devices you are authorized to manage, remove downloaded files and imported client profiles or saved configurations using the documented controls. Keep account-side access removal separate and confirm it through the administrator or official support.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30418/a-vpn-offboarding-checklist-confirm-access-removal-and-clear-returned-devices</guid>
<pubDate>Fri, 09 Oct 2026 08:15:26 +0000</pubDate>
</item>
<item>
<title>A Diagnostic Order for Video-Call Problems While a VPN Is Connected</title>
<link>https://coderlegion.com/30238/a-diagnostic-order-for-video-call-problems-while-a-vpn-is-connected</link>
<description>&lt;p&gt;&lt;em&gt;Adapted from &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-video-calls-expectations&quot;&gt;VPN and Video Calls: Realistic Expectations&lt;/a&gt; by Mohammad Hesameddin Montazerilisar, published July 9, 2026 and updated September 27, 2026. AI assistance was used for editing and the introductory framing. The author writes for Lisar Connect and is Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Use this checklist when a call is rough while the VPN client shows Connected. Its purpose is to isolate the next useful observation without treating the most recent configuration change as proof of the cause.&lt;/p&gt;
&lt;p&gt;Video calls are demanding, and when one goes poorly it's tempting to pin it on whatever changed most recently — often the VPN. But call quality depends on a whole set of factors, and a VPN is one of them, not the whole story. This article sets realistic expectations for using a VPN during video calls and gives a calm order for troubleshooting when a call isn't going well.&lt;/p&gt;
&lt;p&gt;Up front, the honest framing: this article doesn't claim a VPN makes calls better, faster, or more stable. It explains how a VPN fits into the many things that shape a call, so your expectations and your troubleshooting both land in the right place.&lt;/p&gt;
&lt;h3 id=&quot;what-actually-shapes-a-video-call&quot;&gt;What actually shapes a video call&lt;/h3&gt;
&lt;p&gt;A video call's quality is the product of many factors working together. Your network's quality and how busy it is at that moment. The stability of your Wi-Fi, or whether you're on a marginal signal. How much your device is doing — a loaded machine handles video differently than an idle one. The latency and path your connection takes. And the meeting platform's own behavior, servers, and current conditions, which are entirely outside your setup.&lt;/p&gt;
&lt;p&gt;A VPN adds one more factor to that set: your traffic takes the VPN's path. It joins the crowd rather than overriding it — which is exactly why call quality can't be attributed to the VPN alone, in either direction.&lt;/p&gt;
&lt;h3 id=&quot;a-calm-troubleshooting-order-for-rough-calls&quot;&gt;A calm troubleshooting order for rough calls&lt;/h3&gt;
&lt;p&gt;When a call is going badly, work through the factors in a sensible order rather than changing everything at once:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Start with the basics that matter most.&lt;/strong&gt; Is your Wi-Fi signal solid, or are you on a marginal spot? Is your device overloaded with other work? These local factors shape calls heavily and are practical early checks: moving closer to the router or closing unnecessary heavy apps may help.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check whether it's the platform.&lt;/strong&gt; Meeting platforms have their own outages and busy periods. If calls are rough across the board, the platform's own status is worth a look before assuming anything local — it may not be your setup at all.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Consider your network at this moment.&lt;/strong&gt; Networks get congested, especially at peak times. A rough call on a busy network may be about that moment; testing at another time or on another network helps separate a one-off from a pattern.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Then consider the VPN as one factor.&lt;/strong&gt; If you're troubleshooting methodically, you can observe how a call behaves as one variable among the others — for an OpenVPN-based Lisar setup, verify the intended current profile and supported client. Re-download only when the profile evidence warrants it; a current profile does not rule out routing, client, or service issues. Change one thing at a time, so you can actually tell what affected what.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remember what you don't control.&lt;/strong&gt; The other participants' connections, the platform's servers, and the wider internet between you all affect a call and sit outside your setup entirely. Some call quality simply isn't yours to fix.&lt;/p&gt;
&lt;h3 id=&quot;realistic-expectations-stated-plainly&quot;&gt;Realistic expectations, stated plainly&lt;/h3&gt;
&lt;p&gt;The honest set of expectations looks like this. A VPN is one factor in call quality, not the determining one. It does not guarantee faster, smoother, or more stable calls — nor does it promise any particular call will work a certain way, since too much of the picture (the platform, the other participants, the moment's network conditions) is outside any one setup's control. And not every network or situation will handle a demanding video call the same way.&lt;/p&gt;
&lt;p&gt;What you can do is control your own side sensibly: a solid local connection, a device that isn't overloaded, a methodical troubleshooting order, and realistic expectations about the parts that aren't yours. That's the productive version of &quot;using a VPN during video calls.&quot;&lt;/p&gt;
&lt;h3 id=&quot;use-the-meeting-platform-s-own-diagnostics&quot;&gt;Use the meeting platform’s own diagnostics&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://support.google.com/meet/answer/10620583?hl=en&quot;&gt;Google Meet’s troubleshooting guide&lt;/a&gt; covers local load and connectivity; it also notes that a VPN’s additional route can delay media.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://support.microsoft.com/en-us/teams/meetings/monitor-call-and-meeting-quality-in-microsoft-teams&quot;&gt;Microsoft Teams Call health&lt;/a&gt; exposes roundtrip time, packet loss and jitter. These observations help describe a call problem; they do not, by themselves, locate its cause.&lt;/p&gt;
&lt;p&gt;Keep required company controls in place. Any comparison that changes the VPN route should follow the device and network owner’s approved process; do not disable required protection just to run a test.&lt;/p&gt;
&lt;h3 id=&quot;frequently-asked-questions-6&quot;&gt;Frequently asked questions&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Will a VPN make my video calls better or more stable?&lt;/strong&gt;&lt;br&gt;
This article makes no such claim. A VPN is one factor in call quality among many — your network, Wi-Fi, device load, and the meeting platform all matter too. It doesn't act as a control knob over calls; its effect depends on all the other factors around it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My video calls are rough while connected — is the VPN the cause?&lt;/strong&gt;&lt;br&gt;
Not necessarily. Call quality depends on many things, and the VPN is one factor, not the whole story. Check the basics first — Wi-Fi signal, device load — then the platform's status, then your network at that moment, before treating the VPN as the cause.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does a VPN work with every meeting platform and network for calls?&lt;/strong&gt;&lt;br&gt;
Not every network or situation handles a demanding video call the same way, and platforms have their own behavior and conditions. Rather than assuming universal compatibility, troubleshoot methodically and keep expectations realistic about the parts outside your setup.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30238/a-diagnostic-order-for-video-call-problems-while-a-vpn-is-connected</guid>
<pubDate>Thu, 08 Oct 2026 08:17:52 +0000</pubDate>
</item>
<item>
<title>Handling a Cold-Starting Android Backend</title>
<link>https://coderlegion.com/30209/handling-a-cold-starting-android-backend</link>
<description>&lt;p&gt;When an application backend sleeps between requests or takes time to start, an Android app can mistake a temporary cold start for a permanent outage. The opposite failure is also common: a loading spinner retries forever and gives the user no clear way forward. How should an Android app handle an unavailable or cold-starting backend without showing an infinite startup spinner? For a related implementation, see &lt;a rel=&quot;nofollow&quot; href=&quot;https://raylabs.app/articles/android-viewmodel-partial-success-refresh-failure/&quot;&gt;Viewmodel Partial Success Refresh Failure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The solution is to treat startup health checks as a finite state machine rather than an endless loop. By performing a single pass across configured endpoint candidates during launch, the application can quickly determine if the service is reachable. If the backend fails to respond, the app moves to an explicit unavailable state instead of locking the user into a permanent loading loop. When the user chooses to try again, an explicit retry action refreshes the remote configuration and checks again on a fixed interval, bounded by a visible deadline.&lt;/p&gt;
&lt;h3 id=&quot;the-startup-state-machine-and-endpoint-checks&quot;&gt;The Startup State Machine and Endpoint Checks&lt;/h3&gt;
&lt;p&gt;A robust mobile architecture separates initial startup discovery from active user sessions. During the first launch phase, the ViewModel checks configured base URLs once and selects the first healthy endpoint. If none of the candidates respond within the initial pass, the UI exposes a distinct unavailable state. For a related implementation, see &lt;a rel=&quot;nofollow&quot; href=&quot;https://raylabs.app/articles/how-to-build-robust-viewmodel-unit-tests/&quot;&gt;To Robust Viewmodel Unit Tests&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This design prevents wasted network traffic and gives the user immediate clarity. Instead of guessing whether the application is frozen or broken, the user sees that the backend is currently offline. The application can distinguish between ordinary unavailability, maintenance modes, and configuration mismatches by evaluating response codes and payload flags.&lt;/p&gt;
&lt;h3 id=&quot;bounded-retry-with-cancellation&quot;&gt;Bounded Retry with Cancellation&lt;/h3&gt;
&lt;p&gt;When a cold-starting backend requires a moment to wake up, a manual retry mechanism gives users control without risking runaway resource consumption. The implementation uses a fixed two-second interval and a 75-second total deadline. These specific values correspond to the backend cold-start profile and are not universal defaults.&lt;/p&gt;
&lt;p&gt;To prevent overlapping network calls, every new check cancels the previous coroutine job. This cancellation guarantee ensures that if a user triggers multiple retries or if configuration changes mid-check, obsolete requests do not continue running in the background.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;class BackendRetryViewModel : ViewModel() {
    private var retryJob: Job? = null

    fun startBoundedRetry() {
        retryJob?.cancel()
        retryJob = viewModelScope.launch {
            val startTime = System.currentTimeMillis()
            while (System.currentTimeMillis() - startTime &amp;lt; 75_000) {
                if (checkHealth()) {
                    _uiState.value = UiState.Ready
                    return@launch
                }
                delay(2_000)
            }
            _uiState.value = UiState.Unavailable
        }
    }

    private suspend fun checkHealth(): Boolean {
        // Perform lightweight health endpoint check
        return false
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;testing-failure-and-recovery&quot;&gt;Testing Failure and Recovery&lt;/h3&gt;
&lt;p&gt;Verifying timeout and recovery logic requires deterministic test execution. Unit tests must cover the initial healthy endpoint selection, the transition to the unavailable state after all candidates fail, the forced configuration refresh on manual retry, and the successful recovery when a later attempt succeeds. Using virtual time control in coroutine tests allows developers to simulate the 75-second deadline and the two-second intervals instantly without slowing down the test suite.&lt;/p&gt;
&lt;h3 id=&quot;adapting-retry-strategies-for-production&quot;&gt;Adapting Retry Strategies for Production&lt;/h3&gt;
&lt;p&gt;While a fixed interval and a manual trigger work well for predictable cold starts, production systems often require more sophisticated patterns. Developers should consider exponential backoff, jitter, and provider Retry-After headers when dealing with public APIs or heavily loaded microservices. Evaluating connectivity classification helps determine whether a retry should be attempted at all when the device is offline or on a metered connection.&lt;/p&gt;
&lt;h3 id=&quot;conclusion-for-resilient-startup-flows&quot;&gt;Conclusion for Resilient Startup Flows&lt;/h3&gt;
&lt;p&gt;Designing a resilient mobile startup flow means balancing persistence with user experience. By implementing a finite health-check pass, offering a bounded manual retry, and cancelling superseded requests, you protect both the client application and the backend service from unnecessary strain. Grounding your retry intervals in actual service behavior rather than guesswork ensures a predictable experience when services wake up.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30209/handling-a-cold-starting-android-backend</guid>
<pubDate>Thu, 08 Oct 2026 03:44:20 +0000</pubDate>
</item>
<item>
<title>Diagnosing DNS Filtering Delays Without Resetting the Network</title>
<link>https://coderlegion.com/30088/diagnosing-dns-filtering-delays-without-resetting-the-network</link>
<description>&lt;p&gt;When a filtering change appears to have no effect, waiting is useful only after you know which setting and resolver the client is using. This checklist keeps the diagnosis focused.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Adapted with permission from &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/dns-caching-vpn-filtering-delay&quot;&gt;the original Lisar article&lt;/a&gt; by Mohammad Hesameddin Montazerilisar, published July 9, 2026 and updated September 27, 2026. AI assisted editing, platform-specific framing, and the documentation note; the substantive source guidance is human-authored.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A DNS change may not be visible immediately because a device, browser or resolver still has an earlier answer cached. Caching is one possible explanation, not proof that a configuration is correct or that waiting will resolve the problem.&lt;/p&gt;
&lt;h3 id=&quot;what-dns-caching-retains&quot;&gt;What DNS caching retains&lt;/h3&gt;
&lt;p&gt;DNS translates a domain name into records a client can use. Cached records are normally reusable for their time to live (TTL). The &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc1034.html&quot;&gt;DNS specification&lt;/a&gt; describes this caching model. There is no single waiting period that fits every domain, resolver and application.&lt;/p&gt;
&lt;p&gt;DNS cache is different from downloaded page content and an existing network connection. A page can keep displaying an already-loaded ad after DNS settings change. A running app may reuse an established connection without performing another lookup.&lt;/p&gt;
&lt;h3 id=&quot;check-the-setting-before-blaming-the-cache&quot;&gt;Check the setting before blaming the cache&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Confirm the profile's active plan and whether DNS AdBlock is included.&lt;/li&gt;
&lt;li&gt;Confirm the intended VPN profile is connected.&lt;/li&gt;
&lt;li&gt;Identify the domain or application and note the time of the change.&lt;/li&gt;
&lt;li&gt;Check whether the browser or device uses a separate secure-DNS resolver.&lt;/li&gt;
&lt;li&gt;Compare a fresh request under the same conditions after allowing the relevant cache time to pass.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A browser using another resolver can show different results even after its cache expires. A changed setting on one profile does not establish that another device or profile has the same configuration.&lt;/p&gt;
&lt;p&gt;For a documented browser example, &lt;a rel=&quot;nofollow&quot; href=&quot;https://support.mozilla.org/en-US/kb/dns-over-https&quot;&gt;Mozilla describes different DNS-over-HTTPS protection modes&lt;/a&gt; in Firefox. Default protection can disable secure DNS when a VPN or enterprise policy is active, while other modes use the selected provider differently. Read the active mode and policy; do not assume every browser sends every lookup to the same resolver.&lt;/p&gt;
&lt;h3 id=&quot;why-devices-disagree&quot;&gt;Why devices disagree&lt;/h3&gt;
&lt;p&gt;Devices may hold answers obtained at different times or use different resolvers, clients and network routes. A new result on one device and an old result on another can be consistent with caching, but the difference is not enough to diagnose caching by itself.&lt;/p&gt;
&lt;p&gt;Keep the comparison narrow: same destination, intended profile and network where possible. Record browser secure-DNS and device DNS settings without changing managed policies.&lt;/p&gt;
&lt;h3 id=&quot;do-you-need-to-restart-&quot;&gt;Do you need to restart?&lt;/h3&gt;
&lt;p&gt;Usually start by confirming the applied settings and opening a fresh request. Reopening an application or restarting a device may clear some local state, but it does not clear an upstream resolver's cache or guarantee a different answer. Save work before any restart.&lt;/p&gt;
&lt;p&gt;A full network reset, client reinstall or router restart is not a routine first step for a suspected DNS cache delay. If a local cache flush is specifically needed, use the operating system's documented procedure; a managed device or network may require its administrator.&lt;/p&gt;
&lt;h3 id=&quot;if-nothing-changes&quot;&gt;If nothing changes&lt;/h3&gt;
&lt;p&gt;Report the domain, time, device, client, profile entitlement, network and the expected versus actual result to the service support team. Do not send your complete profile or credentials. Check whether the issue is actually an ad served from the same allowed domain: DNS filtering cannot separate that ad from the content by domain alone.&lt;/p&gt;
&lt;h3 id=&quot;frequently-asked-questions-7&quot;&gt;Frequently asked questions&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;How long should I wait?&lt;/strong&gt; There is no universal delay. The relevant TTL, resolver behavior and application state matter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Will restarting clear every DNS cache?&lt;/strong&gt; No. It may affect local state, but upstream caches and application behavior are separate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does an unchanged result mean the setting failed?&lt;/strong&gt; Not necessarily. Check whether it was applied, which resolver is used and whether an old answer or existing connection is being reused.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can DNS AdBlock remove an ad already on screen?&lt;/strong&gt; No. It affects relevant lookups; it does not edit content that has already loaded.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Original author: Mohammad Hesameddin Montazerilisar, technical author for Lisar Connect and Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C, which develops and operates Lisar Connect.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30088/diagnosing-dns-filtering-delays-without-resetting-the-network</guid>
<pubDate>Wed, 07 Oct 2026 08:33:32 +0000</pubDate>
</item>
<item>
<title>Analyzing TP-Link Tapo Protocol Using Wireshark</title>
<link>https://coderlegion.com/30079/analyzing-tp-link-tapo-protocol-using-wireshark</link>
<description>&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Wireshark dissector for a proprietary protocol found on TP-Link Tapo cameras, dissecting device discovery packets on ports &lt;code&gt;UDP/20002&lt;/code&gt; and &lt;code&gt;UDP/20004&lt;/code&gt;, as well as control and media stream packets on port &lt;code&gt;TCP/8800&lt;/code&gt; and keep-alive packets on port &lt;code&gt;TCP/8001&lt;/code&gt;. Tested on TP-Link Tapo C100 IP camera.&lt;/p&gt;
&lt;p&gt;While trying to understand how my personal accounts and personal data is being secured, I've done some research on TP-Link's Tapo Android application as well (it includes analysis of HTTP request signature and termID building processes), which can be found &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/KostasEreksonas/Tapo_application_analysis&quot;&gt;by following this link to a Github repo&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;filters&quot;&gt;Filters&lt;/h2&gt;
&lt;p&gt;The following filters are programmed for this Tapo protocol dissector:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;center&quot;&gt;Port&lt;/th&gt;&lt;th align=&quot;center&quot;&gt;Packet Type&lt;/th&gt;&lt;th align=&quot;center&quot;&gt;Field Name&lt;/th&gt;&lt;th align=&quot;center&quot;&gt;Description&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;UDP/20002&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Device discovery packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.header&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Full header, saved as raw bytes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;UDP/20002&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Device discovery packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.version&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Packet version&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;UDP/20002&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Device discovery packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.type&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Packet type&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;UDP/20002&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Device discovery packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.opcode&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Operation code for current message&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;UDP/20002&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Device discovery packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.payload_length&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Payload length&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;UDP/20002&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Device discovery packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.flags&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Flags for current message&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;UDP/20002&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Device discovery packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.align&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Extra value for struct alignment&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;UDP/20002&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Device discovery packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.serial_number&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Serial number&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;UDP/20002&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Device discovery packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.checksum&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Cheksum&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;UDP/20002&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Device discovery packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.data&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;JSON payload&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;UDP/20002&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Device discovery packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.binary&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Discovery packet + binary data&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;TCP/8800&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Contol/media packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.device_stream_boundary&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Device stream boundary&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;TCP/8800&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Contol/media packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.content_type&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Content Type&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;TCP/8800&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Contol/media packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.content_length&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Content Length&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;TCP/8800&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Contol/media packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.session_id&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Session ID&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;TCP/8800&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Contol/media packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.encrypted&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Payload encryption flag&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;TCP/8001&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Keep-alive packet&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;tapo.data&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;JSON payload&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;device-discovery-packets&quot;&gt;Device Discovery Packets&lt;/h2&gt;
&lt;p&gt;Ports &lt;code&gt;UDP/20002&lt;/code&gt; and &lt;code&gt;UDP/20004&lt;/code&gt; are used with configuration and cryptography-related information being sent.&lt;/p&gt;
&lt;h3 id=&quot;header-structure&quot;&gt;Header Structure&lt;/h3&gt;
&lt;p&gt;A writeup on &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.flashback.sh/blog/lao-bomb-tplink-archer-lan-rce&quot;&gt;command injection vulnerability within tdpServer daemon that listens on port UDP/200002&lt;/a&gt;, as well as a writeup on &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.synacktiv.com/publications/pwn2own-tokyo-2020-defeating-the-tp-link-ac1750&quot;&gt;remote code execution (RCE) vulnerability found in the TP-Link AC1750 Smart Wi-Fi router&lt;/a&gt;, describe that a device discovery packet has 16 bytes long header with it's fields defined as follows:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=5159285027642947917&quot; alt=&quot;Device discovery packet header schema&quot;&gt;&lt;/p&gt;
&lt;p&gt;The fields are identified as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Byte 1:&lt;/strong&gt; Packet version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Byte 2:&lt;/strong&gt; Packet type.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bytes 3-4:&lt;/strong&gt; Packet opcode.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bytes 5-6:&lt;/strong&gt; Packet payload length.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Byte 7:&lt;/strong&gt; Packet flags.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Byte 8:&lt;/strong&gt; Struct alignment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bytes 9-12:&lt;/strong&gt; Serial Number.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bytes 13-16:&lt;/strong&gt; Checksum.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Below is the header's representation in Wireshark:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=1634966362717395479&quot; alt=&quot;Device discovery packet header in wireshark&quot;&gt;&lt;/p&gt;
&lt;p&gt;More information about header structure of the tapo device discovery packet can be found &lt;a rel=&quot;nofollow&quot; href=&quot;https://stackoverflow.com/questions/62493536/decoding-the-binary-part-of-a-discovery-udp-packet-payload-for-tp-link-tapo-c200&quot;&gt;on this Stack Overflow discussion thread&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;payloads&quot;&gt;Payloads&lt;/h3&gt;
&lt;p&gt;Observed payloads include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Device configuration messages, some data encrypted with AES key:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;error_code&quot;: 0,
  &quot;result&quot;: {
    &quot;device_id&quot;: &quot;REDACTED&quot;,
    &quot;device_name&quot;: &quot;Tapo C100&quot;,
    &quot;device_type&quot;: &quot;SMART.IPCAMERA&quot;,
    &quot;device_model&quot;: &quot;C100&quot;,
    &quot;ip&quot;: &quot;REDACTED&quot;,
    &quot;mac&quot;: &quot;REDACTED&quot;,
    &quot;hardware_version&quot;: &quot;4.0&quot;,
    &quot;firmware_version&quot;: &quot;1.1.21 Build 220511 Rel.42882n(4555)&quot;,
    &quot;factory_default&quot;: false,
    &quot;mgt_encrypt_schm&quot;: {
      &quot;is_support_https&quot;: true
    },
    &quot;encrypt_info&quot;: {
      &quot;sym_schm&quot;: &quot;AES&quot;,
      &quot;key&quot;: &quot;REDACTED&quot;,
      &quot;data&quot;: &quot;REDACTED&quot;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Public RSA key:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;params&quot;: {
    &quot;rsa_key&quot;: &quot;-----BEGIN PUBLIC KEY-----\\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvzPNrLCSw3Rqf+AKwla2\\nntENZ+P4UUwGDzwvSc5HyJIYkY5+aQ8tpdQAO6NfN1JlVAUm94gxH5cw9s+xGgok\\nusbhFCHvMFp2g0CxvFg1P225+fq8Hmqqm9JN/ZkL2qwR4to6yvn256IqUxzmwKi8\\nFiX60VmAkmeJDOy8XGcN8ch385T9/sX1KyKZNxzX4z5xJEOlwcr5ZdhUeOmB6dbF\\njFF8GliOKSZdE01GVgeZPqJA21/8EQa1yJy8v31o+NNRd3QJaWjIzFqjGs1sl+Zj\\niPggKWcR/LqGt8Dd031velv2gVgmyBIjqi779cxns8IA5zYsvJbkxm0pFr3CU3GZ\\nYQIDAQAB\\n-----END PUBLIC
KEY-----\\n&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;control-and-media-packets&quot;&gt;Control and Media Packets&lt;/h2&gt;
&lt;p&gt;A proprietary protocol that manages JSON control messages and encrypted media (audio + video) streams runs on port &lt;code&gt;TCP/8800&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;header-structure-1&quot;&gt;Header Structure&lt;/h3&gt;
&lt;p&gt;Header is formed from the first 28 bytes of a control and media packet. Fields are text based rather than byte-based:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;center&quot;&gt;Field Name&lt;/th&gt;&lt;th align=&quot;center&quot;&gt;Description&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;----device-stream-boundary--&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Every control/media packet starts with this text as a start boundary&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;Content-Type: &lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;code&gt;application/json&lt;/code&gt; for JSON payloads and &lt;code&gt;video/mp2t&lt;/code&gt; for video stream&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;Content-Length: &lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Length of a single message&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;X-Session-Id: &lt;/td&gt;&lt;td align=&quot;center&quot;&gt;ID of a current session&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;X-If-Encrypt: &lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Payload encryption flag; 0 - unencrypted, 1 - encrypted&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;payloads-1&quot;&gt;Payloads&lt;/h3&gt;
&lt;p&gt;Payloads of this protocol include JSON-formatted stream information and encrypted video stream with a type of &lt;code&gt;mp2t&lt;/code&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Video stream request:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;params&quot;: {
    &quot;preview&quot;: {
      &quot;audio&quot;: [
        &quot;default&quot;
      ],
      &quot;audio_config&quot;: {
        &quot;encode_type&quot;: &quot;G711alaw&quot;,
        &quot;sample_rate&quot;: &quot;8&quot;
      },
      &quot;channels&quot;: [
        0
      ],
      &quot;deviceId&quot;: &quot;REDACTED&quot;,
      &quot;resolutions&quot;: [
        &quot;HD&quot;
      ],
      &quot;track_id&quot;: &quot;REDACTED&quot;
    },
    &quot;method&quot;: &quot;get&quot;
  },
  &quot;seq&quot;: 1,
  &quot;type&quot;: &quot;request&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Response on success:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;type&quot;: &quot;response&quot;,
  &quot;seq&quot;: 1,
  &quot;params&quot;: {
    &quot;error_code&quot;: 0,
    &quot;session_id&quot;: &quot;1&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Channel lens mask info:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;type&quot;: &quot;notification&quot;,
  &quot;params&quot;: {
    &quot;event_type&quot;: &quot;channel_lens_mask_info&quot;,
    &quot;channels&quot;: 0,
    &quot;enabled&quot;: &quot;off&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Channel resolution info:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;type&quot;: &quot;notification&quot;,
  &quot;params&quot;: {
    &quot;event_type&quot;: &quot;channel_resolution_info&quot;,
    &quot;channels&quot;: 0,
    &quot;resolution&quot;: &quot;1280*720&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30079/analyzing-tp-link-tapo-protocol-using-wireshark</guid>
<pubDate>Wed, 07 Oct 2026 05:48:40 +0000</pubDate>
</item>
<item>
<title>How to Identify the Intended VPN Profile When Client Entries Look Alike</title>
<link>https://coderlegion.com/29818/how-to-identify-the-intended-vpn-profile-when-client-entries-look-alike</link>
<description>&lt;p&gt;A VPN client can hold several profiles with nearly identical labels. If the selected entry is wrong, even a careful connection test may describe the wrong configuration. Start by resolving the profile identity through its source, assignment, and intended use.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Adapted with permission from &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/multiple-similar-vpn-profiles-client&quot;&gt;the original Lisar article&lt;/a&gt; by Mohammad Hesameddin Montazerilisar, published July 10, 2026 and updated September 27, 2026. AI assisted the editing, platform-specific framing, and reference notes; the substantive source guidance is human-authored.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This article explains how look-alike profiles accumulate in a client, why connecting to the wrong one is so misleading, and how to identify the intended profile using things you can actually verify — without casually clearing entries, guessing your way through them, or sharing them around.&lt;/p&gt;
&lt;h2 id=&quot;how-you-end-up-with-look-alike-profiles&quot;&gt;How you end up with look-alike profiles&lt;/h2&gt;
&lt;p&gt;Duplicate-looking entries pile up for ordinary reasons. You might import a profile more than once, keep an older download alongside a newer one, or receive files whose names are similar enough that the client shows near-identical entries. Profiles intended for different devices, different people, or different purposes can also sit side by side and look alike. None of this means anything went wrong — it's just what happens when several imports accumulate over time, and the client shows them all without knowing which you consider current.&lt;/p&gt;
&lt;p&gt;The result is a list where the &lt;em&gt;intended&lt;/em&gt; profile isn't obvious, which is the problem worth solving.&lt;/p&gt;
&lt;h2 id=&quot;why-the-wrong-profile-produces-misleading-results&quot;&gt;Why the wrong profile produces misleading results&lt;/h2&gt;
&lt;p&gt;The reason this matters is that connecting to the wrong profile quietly corrupts your troubleshooting. If you're using an entry that isn't the one meant for your situation, whatever you observe afterward may be telling you about that entry rather than about any real problem — so you can spend time chasing an issue that only exists because of the profile you picked. Getting the intended profile straight &lt;em&gt;first&lt;/em&gt; means anything you notice afterward is actually informative.&lt;/p&gt;
&lt;h2 id=&quot;a-profile-name-alone-doesn-t-prove-much&quot;&gt;A profile name alone doesn't prove much&lt;/h2&gt;
&lt;p&gt;It's tempting to trust the name, but a profile's name on its own doesn't establish that it's the right one, that it's current, that it belongs to you, or that it's safe to rely on. Names can be similar, generic, or carried over from an older copy, so treating the label as proof is exactly how the wrong entry gets used. The name is a hint, not evidence — what settles it is the verifiable information behind the entry, which is where to look instead.&lt;/p&gt;
&lt;h2 id=&quot;identify-the-intended-profile-by-what-you-can-verify&quot;&gt;Identify the intended profile by what you can verify&lt;/h2&gt;
&lt;p&gt;Rather than guessing, identify the intended profile by details you can actually confirm. Two are especially useful.&lt;/p&gt;
&lt;h3 id=&quot;import-date-and-source&quot;&gt;Import date and source&lt;/h3&gt;
&lt;p&gt;When did this entry come from, and where did it come from? A known import date and trusted source help identify an entry, but a newer download date alone does not prove that it is the current assigned revision. If you're not sure when or where an entry came from, that uncertainty is itself a signal — so confirm the intended revision with your access owner or authorized source before importing another copy.&lt;/p&gt;
&lt;h3 id=&quot;assignment-and-intended-use&quot;&gt;Assignment and intended use&lt;/h3&gt;
&lt;p&gt;Who and what is this profile for? Profiles can be assigned to particular devices, people, or purposes, so the intended one is the profile assigned to you for the use you have in mind. If you can't tell which entry that is, that's a question for whoever manages your access rather than something to resolve by trying entries at random. Notably, the fact that an entry exists in your client doesn't by itself mean it's the one assigned to you.&lt;/p&gt;
&lt;p&gt;A small habit prevents most of this: when you import a profile, note its date, its source, what it's assigned to, and its intended use. That short record turns a list of look-alikes into a list you can actually read.&lt;/p&gt;
&lt;h2 id=&quot;coordinate-with-whoever-manages-your-access&quot;&gt;Coordinate with whoever manages your access&lt;/h2&gt;
&lt;p&gt;When you genuinely can't tell which profile is intended — or you're unsure whether an entry is even meant for you — the right move is to check with the person or team responsible for your access, not to connect to entries at random to see what happens. Trying profiles that aren't assigned to you isn't a good way to sort out the list; it can produce misleading results and it isn't the intended use of someone else's assigned access. A quick question to your access owner is simpler and cleaner than trial and error.&lt;/p&gt;
&lt;h2 id=&quot;keep-client-entries-aligned-with-organized-source-files&quot;&gt;Keep client entries aligned with organized source files&lt;/h2&gt;
&lt;p&gt;Finally, the entries in your client are easiest to keep straight when they match an organized set of source files. If your downloaded profile files are tidy — clearly named, one current copy, old copies cleared once the current one is confirmed — then the entries in your client are far easier to reconcile against them. The two go together: organized files on disk make organized entries in the client. Keeping both aligned, rather than clearing entries on a hunch, is the calm way to keep the list readable — and if an entry does need clearing, that's a decision to make deliberately once you've confirmed which one is current, not a guess.&lt;/p&gt;
&lt;h2 id=&quot;what-the-client-documentation-can-establish&quot;&gt;What the client documentation can establish&lt;/h2&gt;
&lt;p&gt;OpenVPN Connect's &lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/troubleshooting-faqs.html&quot;&gt;troubleshooting FAQ&lt;/a&gt; explains that it supports multiple profiles and may add numbered suffixes to colliding profile names. That helps explain a look-alike list; the suffix is not proof of an authorized assignment or a newer access revision. Import behavior can depend on the client and import route, so check the documentation for the version you use.&lt;/p&gt;
&lt;p&gt;The official &lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/edit-a-profile.html&quot;&gt;profile editing guide&lt;/a&gt; distinguishes a display name from parameters such as a server override. Where the approved setup permits a clearer display label, use it only after confirming the entry. Do not change server, proxy, credentials, or configuration content just to make names easier to recognize.&lt;/p&gt;
&lt;p&gt;Keep any reconciliation note free of passwords, private keys, certificates, and profile contents. A non-secret label, delivery date, intended device or user, and access owner's confirmation are enough to make the next troubleshooting result more meaningful.&lt;/p&gt;
&lt;h2 id=&quot;a-practical-check-before-the-next-connection&quot;&gt;A practical check before the next connection&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Look-alike profiles accumulate from repeated imports, old and new files, and similar names.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connecting to the wrong profile produces misleading troubleshooting results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A profile name alone doesn't prove it's the right, current, owned, or safe entry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Identify the intended profile by verifiable details: import date, source, assignment, and intended use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When unsure, coordinate with whoever manages your access instead of trying entries at random.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep client entries aligned with an organized set of source files rather than clearing them on a hunch.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Mohammad Hesameddin Montazerilisar is the technical author for Lisar Connect and Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C, which develops and operates Lisar Connect. This guidance does not authorize access through another person's assigned profile or changes to managed-device policy.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29818/how-to-identify-the-intended-vpn-profile-when-client-entries-look-alike</guid>
<pubDate>Mon, 05 Oct 2026 08:35:05 +0000</pubDate>
</item>
<item>
<title>A Controlled Checklist for VPN Problems After an Operating-System Update</title>
<link>https://coderlegion.com/29704/a-controlled-checklist-for-vpn-problems-after-an-operating-system-update</link>
<description>&lt;p&gt;A VPN setup that behaves differently after an operating-system update needs a controlled comparison. The profile may be unchanged while the client environment, permissions, or network behavior has changed. Identify the failing stage before replacing files or changing several settings.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Adapted with permission from &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/os-update-changes-vpn-behavior&quot;&gt;the original Lisar article&lt;/a&gt; by Mohammad Hesameddin Montazerilisar, published July 10, 2026 and updated July 11, 2026. AI assisted the editing, platform-specific framing, and reference notes; the substantive source guidance is human-authored.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That does not mean every update causes a VPN problem. It means “the profile did not change” is not the same as “nothing relevant changed.” A calm comparison of before and after is more useful than immediately replacing the profile or changing several settings.&lt;/p&gt;
&lt;h2 id=&quot;the-profile-can-stay-the-same-while-the-environment-changes&quot;&gt;The profile can stay the same while the environment changes&lt;/h2&gt;
&lt;p&gt;A profile is only one part of the connection. The full path includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The operating system&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The compatible VPN client&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;System permission for the VPN configuration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The device's network connection&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The assigned profile and its current access state&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An update can affect the first three items without altering the downloaded file. That is why a previously working profile may behave differently after the device restarts into a newer system version.&lt;/p&gt;
&lt;p&gt;Keep the distinction clear: the update is a possible trigger, not proof of the cause.&lt;/p&gt;
&lt;h2 id=&quot;permissions-may-be-requested-again&quot;&gt;Permissions may be requested again&lt;/h2&gt;
&lt;p&gt;After a system, client, or management change, you may encounter a permission prompt that did not appear during recent connections. Check the actual requesting client and current device policy; the timing alone does not establish which change caused the prompt.&lt;/p&gt;
&lt;p&gt;Treat the prompt as a new decision. Confirm that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You opened the intended compatible client.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You are using the expected assigned profile.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The system prompt names the client you intended to use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You are authorized to add or use a VPN configuration on the device.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On a managed device, the organization may control the permission. Do not attempt to work around a policy restriction.&lt;/p&gt;
&lt;h2 id=&quot;networking-behavior-can-shift&quot;&gt;Networking behavior can shift&lt;/h2&gt;
&lt;p&gt;System updates can change network handling at a broad level. Examples include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;How the device transitions between Wi-Fi and mobile data&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How it resumes connectivity after sleep or restart&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How DNS settings interact with the active connection&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How local-network access is handled&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How status is displayed when connectivity changes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are categories, not promises about a specific device. The actual change depends on the operating system, client, device policy, and network.&lt;/p&gt;
&lt;p&gt;If the issue appears only on one network after the update, keep network-specific causes in the comparison. If it appears on every allowed network tested, the device or client becomes a stronger area to examine.&lt;/p&gt;
&lt;h2 id=&quot;client-compatibility-matters&quot;&gt;Client compatibility matters&lt;/h2&gt;
&lt;p&gt;The installed VPN client may also need to support the updated operating system. Check the client's official compatibility information and version rather than assuming the existing installation is current.&lt;/p&gt;
&lt;p&gt;A client update and a profile update are separate things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A &lt;strong&gt;client update&lt;/strong&gt; changes the application that reads and uses profiles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An &lt;strong&gt;operating-system update&lt;/strong&gt; changes the environment where the client runs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;strong&gt;profile update&lt;/strong&gt; changes the connection instructions supplied to the client.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Do not replace one merely because another changed. First identify which layer is showing the problem.&lt;/p&gt;
&lt;p&gt;For a concrete client check, use the &lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/release-notes.html&quot;&gt;OpenVPN Connect release notes for the relevant operating system&lt;/a&gt;. Compare the installed client with its documented changes and supported environment. A release note is evidence about that client version, not proof that it caused your particular failure.&lt;/p&gt;
&lt;h2 id=&quot;background-and-power-rules-may-change&quot;&gt;Background and power rules may change&lt;/h2&gt;
&lt;p&gt;Mobile and laptop operating systems manage background activity and power use. An update may change default behavior or ask the user to confirm permissions again.&lt;/p&gt;
&lt;p&gt;The visible symptom might be a connection that does not resume as expected after the device sleeps, changes networks, or remains idle. This can resemble a profile issue even when the profile imported correctly.&lt;/p&gt;
&lt;p&gt;Use the client and operating-system documentation for the specific device. Avoid copying device-specific steps from an unrelated operating system or client version.&lt;/p&gt;
&lt;p&gt;For example, the &lt;a rel=&quot;nofollow&quot; href=&quot;https://developer.android.com/develop/connectivity/vpn&quot;&gt;Android VPN documentation&lt;/a&gt; separates the system-managed VPN service lifecycle from the client's responsibility for establishing the gateway connection. It also describes background-service restrictions and settings that can block non-VPN traffic. These distinctions explain why startup, background operation, and a usable connection need separate observations. They do not establish that an unspecified OS update reset a setting or damaged a profile.&lt;/p&gt;
&lt;h2 id=&quot;a-controlled-after-update-checklist&quot;&gt;A controlled after-update checklist&lt;/h2&gt;
&lt;p&gt;Use this sequence:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Confirm ordinary internet access without the VPN only where device policy permits it. If required VPN settings block non-VPN traffic, use the approved administrator test instead of disabling the policy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Record the operating-system version and update date.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Record the VPN client name and version.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirm that the intended profile is still present and identified correctly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Note whether the failure occurs at import, permission, connection, reconnection, or after connection.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Review any new system permission prompt carefully.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test the same setup on one other allowed network when appropriate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Record the exact result before making another change.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This process preserves the evidence. It also prevents duplicate profile entries created by repeatedly importing the same file without knowing whether import was the issue.&lt;/p&gt;
&lt;h2 id=&quot;managed-devices-need-policy-aware-handling&quot;&gt;Managed devices need policy-aware handling&lt;/h2&gt;
&lt;p&gt;Organization-managed devices can receive an operating-system update and a policy change at nearly the same time. The user may not be able to see which one altered the behavior.&lt;/p&gt;
&lt;p&gt;Record both possibilities. Ask the responsible administrator whether the supported client, device policy, or VPN configuration process changed. Do not try to override management controls or use an unapproved client.&lt;/p&gt;
&lt;p&gt;A profile that works on a personal device does not prove that the same workflow is permitted on a managed device.&lt;/p&gt;
&lt;h2 id=&quot;when-the-update-is-only-a-coincidence&quot;&gt;When the update is only a coincidence&lt;/h2&gt;
&lt;p&gt;The timing may be coincidental. Around the same time, any of these may also have changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The network&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The client version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The assigned profile&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Access validity&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Device date and time&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Captive-portal state&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is why a simple timeline matters. Record the last successful connection, the update time, the first failure, and any other changes. If the first failure started before the update, the update is less likely to be the trigger.&lt;/p&gt;
&lt;h2 id=&quot;keep-the-comparison-useful&quot;&gt;Keep the comparison useful&lt;/h2&gt;
&lt;p&gt;An operating-system update can change VPN behavior without changing the profile file. Permissions, networking, background rules, status display, and client compatibility may all be involved. Compare the exact before-and-after state, keep tests controlled, and follow organization policy on managed devices.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Mohammad Hesameddin Montazerilisar is Technical Author for Lisar Connect and Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C. This article is general troubleshooting guidance, not a report of a tested device incident or a product-performance claim.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29704/a-controlled-checklist-for-vpn-problems-after-an-operating-system-update</guid>
<pubDate>Sun, 04 Oct 2026 08:20:04 +0000</pubDate>
</item>
<item>
<title>I wrote bi-directional tcp congestion control... and survived!</title>
<link>https://coderlegion.com/29702/i-wrote-bi-directional-tcp-congestion-control-and-survived</link>
<description>&lt;p&gt;I'm back again after a loong break but this time I have done a lot of things apart from what I said in the last blog (obviously 🙃).&lt;/p&gt;
&lt;p&gt;This time I'll be discussing on how I wrote the logic for using TCP in an event loop even though it is a stream oriented protocol. So my idea was simple but it took a long time to come, and this time it was purely my idea — I was sleeping and suddenly I woke up in the middle of the night and my brain was like &quot;Hey, what if we write the size of the packet in it?&quot; and I was like &quot;BROO, right now?&quot;&lt;/p&gt;
&lt;p&gt;That did not happen exactly 😂. I simply slept without acknowledging the idea and the next day I woke up and again thought for an hour and then I remembered about this idea.&lt;/p&gt;
&lt;h3 id=&quot;so-what-was-the-idea-&quot;&gt;So what was the idea?&lt;/h3&gt;
&lt;p&gt;The idea is that say I have my TCP packet wherein I have some fixed size data (we'll do variable size later). Now its really easy in UDP just because UDP is packet oriented which means it preserves packet boundaries meanwhile TCP does not (that's one of the reasons why it is so good!)&lt;/p&gt;
&lt;p&gt;So how do we get this amazing UDP property from TCP? The idea is simple, write down the packet size on the packet itself.&lt;/p&gt;
&lt;p&gt;Say you have the packet struct defined as:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;struct myPacket {
    size_t packetSize;
    int someData;
    char someData2;
    // ...some more data
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now here, we if do &lt;code&gt;sizeof(struct myPacket)&lt;/code&gt; we will get the answer as &lt;code&gt;16&lt;/code&gt; (yes it's not &lt;code&gt;13&lt;/code&gt; as I expected earlier because of compiler adding some padding to make &lt;code&gt;13&lt;/code&gt; a multiple of &lt;code&gt;4&lt;/code&gt; which makes it easier for the CPU to fetch the pages from memory).&lt;/p&gt;
&lt;p&gt;And the value of the &lt;code&gt;packetSize&lt;/code&gt; member is &lt;code&gt;16&lt;/code&gt;. So now picture this, you're doing&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int got = read(fd, buf, ???);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here you don't know the value you should put into your buffer since you don't know what packet is coming. But now if every packet sent by the other side (which is also your own code, atleast in my case it is 😂) has this size defined as the first member of the struct you could simply do this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int got = read(fd, size, sizeof(int));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And once you get that, read the value of buf and figure out the packet size like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int size;
int got = read(fd, &amp;amp;size, sizeof(int));

if (size == sizeof(struct myPacket)) {
    struct myPacket *mp = malloc(size * sizeof(char));
    mp-&amp;gt;packetSize = size;
    got = read(fd, (char *)mp + sizeof(int), size - sizeof(int));
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here I've written more code than needed because I wanted to make it look more &quot;complete&quot; 😅&lt;/p&gt;
&lt;p&gt;What's happening here is that first we read an int from the stream. now this int contains the size of the packet (ofc, you'd need ntohs here, but I figured that'd make this more hard to read). And then you simply read the rest of the packet in a struct. Now you don't have to read the remaining data at the start of the struct hence the &lt;code&gt;mp + size&lt;/code&gt; instead of &lt;code&gt;mp&lt;/code&gt; alone. Now I know it would be much better and safer to use &lt;code&gt;offsetof&lt;/code&gt; but for an example this works great.&lt;/p&gt;
&lt;p&gt;Anyways this was when everything is great and life is simple. But sadly that ain't true (I wish it was ). So now what if the data hasn't arrived yet? I mean the member &lt;code&gt;someData&lt;/code&gt; has arrived but &lt;code&gt;someData2&lt;/code&gt; is still travelling on the network. And when you demand for the entire data &lt;code&gt;read&lt;/code&gt; does something clever, it simply blocks you. And that is not a good thing when you're in an event loop since the kernel does not know that you're doing multi threading without telling it and one such blocking call is quite deadly since the entire process goes into the blocked state until the packet is not complete.&lt;/p&gt;
&lt;p&gt;Think about that for a second, until the entire packet arrives, no heartbeats, no voting, nothing the node can do. For the node it simply underwent time travel 😵. So we do not want to handle time glitches in a system that is already handling a thousand other things. So the kernel gives us a solution, make the &lt;code&gt;read&lt;/code&gt; function non blocking (hurray!). I already wrote this in the previous blog but I'll anyways repeat it. So once the &lt;code&gt;read&lt;/code&gt; function is non-blocking we have the control to what we want to do except sleeping.&lt;/p&gt;
&lt;p&gt;So here's the thing, the Assigner I have in mind acts as a congestion control for the Gateway and the Worker and hence it looks something like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=17841522860052557572&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;So if suppose the diagram was simpler with the &lt;code&gt;Gateway Data (IN)&lt;/code&gt; going to &lt;code&gt;Worker Data (OUT)&lt;/code&gt;. Now in this case if the Gateway sends more data than what I can store (say, my TCP buffer is full as well as the buffer I allocate using malloc) but the worker is slow and hence the buffer in the workers side sending data eventually fills up and no more data can go in. To visualize it:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=16513439908981610869&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;So here as you see the data flows in chunks, green indicates the data is there but the buffer is not yet full. Then red indicates the buffer is full and there is not space. So now to implement congestion control I need to stop the gateway when the worker's internal buffer fills up. And since we're using epoll how do we do this?&lt;/p&gt;
&lt;p&gt;First thing we do is add the events &lt;code&gt;EPOLLIN&lt;/code&gt; and &lt;code&gt;EPOLLOUT&lt;/code&gt; to both the sockets along with &lt;code&gt;EPOLLET&lt;/code&gt;. Now you'll find the descriptions in the man pages of epoll (7) but its better if I maintain the flow here. So &lt;code&gt;EPOLLET&lt;/code&gt; simply means that if the buffer was full and now some data is removed tell me and if the buffer was empty and some data has come in tell me. It won't tell you unless the extremes change, i.e., if new data arrives and there was data previously which you forgot to read, you're basically dead meat 😂, epoll in &lt;code&gt;EPOLLET&lt;/code&gt; mode won't tell you if something like that happens. It simply ignores that but if you're in the default mode (i.e., you don't have the flag added) you'll get a totally normal behaviour of epoll continuously waking you up when data is available.&lt;/p&gt;
&lt;p&gt;However, in this case the best thing is to use &lt;code&gt;EPOLLET&lt;/code&gt; with &lt;code&gt;EPOLLIN&lt;/code&gt; and &lt;code&gt;EPOLLOUT&lt;/code&gt;. And that is better explained with a visual 😁:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=2667848448844991775&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;There's a ton of steps but believe me its easy once you understand it (wait for two way congestion control 😁)&lt;/p&gt;
&lt;p&gt;Step 1: the gateway sends data and the data is stored in the internal buffer of the socket and the EPOLLIN event is triggered for the gateway socket&lt;/p&gt;
&lt;p&gt;Step 2: the assigner reads all the data from the gateway and empties out the internal buffer and puts that data into its own buffer.&lt;/p&gt;
&lt;p&gt;Step 3: the assigner writes that data to the internal buffer of the worker socket.&lt;/p&gt;
&lt;p&gt;Step 4: more data comes from the gateway, and steps 1-3 repeat.&lt;/p&gt;
&lt;p&gt;Step 5: Now the worker socket's internal buffer is full hence &lt;code&gt;send&lt;/code&gt; returns -1 with &lt;code&gt;errno&lt;/code&gt; set as &lt;code&gt;EAGAIN&lt;/code&gt;. So now the assigner will simply remove the &lt;code&gt;EPOLLIN&lt;/code&gt; event from the gateway socket. So now even if the gateway sends the data, TCP will simply not allow data to flow because its own buffer is full.&lt;/p&gt;
&lt;p&gt;Step 6: The gateway is fast and won't stop so the gateway socket's internal socket gets full. But since the assigner does not read the data, TCP by default stops the data transfer until the data is read.&lt;/p&gt;
&lt;p&gt;Step 7: Once the worker reads something, its &lt;code&gt;EPOLLOUT&lt;/code&gt; event will trigger because the buffer was full and now it is not hence &lt;code&gt;EPOLLOUT&lt;/code&gt;. So now the assigner will first empty its own buffer (not visible in the diagram since it would have introduced a lot more steps) into the workers socket. Now if only some data goes in and the &lt;code&gt;send&lt;/code&gt; function again returns an error we don't have an option and we simply wait on the &lt;code&gt;EPOLLOUT&lt;/code&gt; event again. But if all the data is sent from the assigner's buffer, the assigner will read more data from the gateway socket. And this newly read data will also go to the worker socket.&lt;/p&gt;
&lt;p&gt;Step 8: This newly read data might not again be fully absorbed by the &lt;code&gt;send&lt;/code&gt; function hence we don't change any events on the sockets.&lt;/p&gt;
&lt;p&gt;Step 9: Now the case when we &lt;code&gt;read&lt;/code&gt; from the gateway socket and it returns a value less than the size of the buffer we specified. This means that the gateway has stopped sending the data from the other side and the gateway socket is completely drained. Now what? We simply add the &lt;code&gt;EPOLLIN&lt;/code&gt; event to the gateway socket. So now the gateway socket has the &lt;code&gt;EPOLLIN&lt;/code&gt; and &lt;code&gt;EPOLLOUT&lt;/code&gt; events attached to it.&lt;/p&gt;
&lt;p&gt;Step 10: Now keep on feeding the worker until the assigner's buffer isn't empty. Once the assigner's buffer is also empty we simply do nothing since that is the last time the &lt;code&gt;EPOLLOUT&lt;/code&gt; event will trigger. From then on the buffer will be at the minimum 1 byte not filled unless the gateway starts sending like a freak again 😂&lt;/p&gt;
&lt;p&gt;So that's all the steps the visual is trying to explain. Now you should have a question that why we're using &lt;code&gt;EPOLLIN&lt;/code&gt; and &lt;code&gt;EPOLLOUT&lt;/code&gt; instead of using only the events which are actually needed. So the gateway never uses &lt;code&gt;EPOLLOUT&lt;/code&gt; and the worker never uses &lt;code&gt;EPOLLIN&lt;/code&gt; then we should keep the other events for these sockets right?&lt;/p&gt;
&lt;p&gt;That's where the bi-directional congestion control comes into play 😁&lt;/p&gt;
&lt;h3 id=&quot;bi-directional-congestion-control-&quot;&gt;Bi-directional Congestion Control?&lt;/h3&gt;
&lt;p&gt;So now you know how we can do congestion control in a single direction but a node will always send and receive so things are never so simple &lt;/p&gt;
&lt;p&gt;First you can try to figure out the bi-directional congestion control mechanism yourself but I'll anyways explain it to you.&lt;/p&gt;
&lt;p&gt;So as you see in the diagram below you have two sockets each side:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=17841522860052557572&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;And you have to make sure congestion control in one direction does not interfere with the data flow of the other direction&lt;/p&gt;
&lt;p&gt;Firstly let's name the sockets:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;GIN&lt;/code&gt; - Gateway Data IN&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GOUT&lt;/code&gt; - Gateway Data OUT&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WIN&lt;/code&gt; - Worker Data IN&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WOUT&lt;/code&gt; - Worker Data OUT&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GTW&lt;/code&gt; - Gateway To Worker data flow&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WTG&lt;/code&gt; - Worker To Gateway data flow&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;&lt;p&gt;Note: Here &lt;code&gt;GIN&lt;/code&gt; and &lt;code&gt;GOUT&lt;/code&gt; are a single socket because TCP is a duplex connnection but for a better understand I have shown them separately. And the same goes for &lt;code&gt;WIN&lt;/code&gt; and &lt;code&gt;WOUT&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So now if the Worker has a lot of output to send to the gateway your &lt;code&gt;WIN&lt;/code&gt; socket will keep on throwing &lt;code&gt;EPOLLIN&lt;/code&gt; events whenever you finish reading it. But then at the same time if the &lt;code&gt;WOUT&lt;/code&gt; was full and you've kept only &lt;code&gt;EPOLLOUT&lt;/code&gt; then you'll be in trouble because then you won't receive &lt;code&gt;EPOLLIN&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So there is a clever strategy I developed on my own (yeah, this time no gemini brainstorming sessions 😂). You always keep &lt;code&gt;EPOLLOUT&lt;/code&gt; on all the &lt;code&gt;OUT&lt;/code&gt; sockets. So this means we have &lt;code&gt;EPOLLOUT&lt;/code&gt; on &lt;code&gt;WOUT&lt;/code&gt; and &lt;code&gt;GOUT&lt;/code&gt;. Now you should ask:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Why meet why?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is because having &lt;code&gt;EPOLLOUT&lt;/code&gt; along with &lt;code&gt;EPOLLET&lt;/code&gt; gives you a solid advantage to handling bi-directional congestion control. Firstly &lt;code&gt;EPOLLOUT&lt;/code&gt; is only ever triggered when the socket goes from totally full to a not full state. So you won't be handling the &lt;code&gt;EPOLLOUT&lt;/code&gt; event when some data goes out every time but only when the socket was full and not has at mininum a single byte of free space.&lt;/p&gt;
&lt;p&gt;So now that &lt;code&gt;EPOLLOUT&lt;/code&gt; is not going anywhere the only event we will ever add/remove is &lt;code&gt;EPOLLIN&lt;/code&gt; (&lt;code&gt;EPOLLET&lt;/code&gt; is the default, like &lt;code&gt;EPOLLOUT&lt;/code&gt; it won't go anywhere 😁). So the advantage of only ever changing &lt;code&gt;EPOLLIN&lt;/code&gt; is that if I remove the &lt;code&gt;EPOLLIN&lt;/code&gt; from &lt;code&gt;WIN&lt;/code&gt; and wait for &lt;code&gt;GOUT&lt;/code&gt;'s &lt;code&gt;EPOLLOUT&lt;/code&gt; to trigger, I can still handle &lt;code&gt;EPOLLIN&lt;/code&gt; from &lt;code&gt;GIN&lt;/code&gt; or wait for &lt;code&gt;WOUT&lt;/code&gt;'s &lt;code&gt;EPOLLOUT&lt;/code&gt; without having to worry about what the other side is doing.&lt;/p&gt;
&lt;p&gt;Isn't that a great advantage? I mean for my case it works pretty well &lt;/p&gt;
&lt;h3 id=&quot;let-s-code-it&quot;&gt;Let's code it&lt;/h3&gt;
&lt;p&gt;So for a bi-directional congestion control mechanism I am not sure if a visual will help or just leave you confused but here it is anyways 🙃&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=3086013601600476222&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;This two way congestion control is working in a similar way to the one way congestion control except now its happening at two places simultaneously 😵&lt;/p&gt;
&lt;p&gt;Now its easier to see this in code. So first let's assume some things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;There is a socket named &lt;code&gt;w&lt;/code&gt; and a socket named &lt;code&gt;g&lt;/code&gt; and in here both are TCP sockets so &lt;code&gt;WIN&lt;/code&gt; and &lt;code&gt;WOUT&lt;/code&gt; both are &lt;code&gt;w&lt;/code&gt; itself and similarly &lt;code&gt;GIN&lt;/code&gt; and &lt;code&gt;GOUT&lt;/code&gt; both are &lt;code&gt;g&lt;/code&gt; itself.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Both the sockets are added to a &lt;code&gt;epoll&lt;/code&gt; loop and the loop is configured in a way that it runs either of the two functions on any event received and also passes the events down&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;resetEpollEvent&lt;/code&gt; is a function which takes in the socket and the new events to be added to the socket&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So first we write the gateway handler (&lt;code&gt;EPOLLIN&lt;/code&gt; for now):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void *handle_gateway(void *args) {
    int events = *(int *)args;
    if (events &amp;amp; EPOLLIN) {
        // data received on g
        int size = recv(g, buf, sizeof(buf));
        sent_size = send(w, buf, size);
        if (sent_size != size) {
            // all data was not sent, the buffer is full!
            resetEpollEvent(g, EPOLLOUT | EPOLLET);
            size_to_send = size - sent_size;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And similarly you can guess the &lt;code&gt;EPOLLIN&lt;/code&gt; branch for the worker handler:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void *handle_worker(void *args) {
    int events = *(int *)args;
    if (events &amp;amp; EPOLLIN) {
        // data received on w
        int size = recv(w, buf, sizeof(buf));
        sent_size = send(g, buf, size);
        if (sent_size != size) {
            // all data was not sent, the buffer is full!
            resetEpollEvent(w, EPOLLOUT | EPOLLET);
            size_to_send = size - sent_size;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now these were for the &lt;code&gt;EPOLLIN&lt;/code&gt; event but now let's write the gateway to handle the &lt;code&gt;EPOLLOUT&lt;/code&gt; event as well:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;void *handle_gateway(void *args) {
    int events = *(int *)args;
    if (events &amp;amp; EPOLLOUT) {
        // now g can be fed some data
        int size = send(g, buf, size_to_send);
        if (size == size_to_send) {
            // all data was sent! take more and send
            int sent_size = 0;
            size = recv(w, buf, sizeof(buf));
            while (size != -1) {
                sent_size = send(g, buf, size);
                if (sent_size != size) {
                    // the buffer is full again!
                    size_to_send = size - max(sent_size, 0);
                    // here max function is implicitly declared and its purpose is to keep sent_size as a minimum 0 in cases where sent_size might become -1
                    break;
                }
                size = recv(w, buf, sizeof(buf));
            }
            if (size == -1) {
                // yay! all data was sent!
                resetEpollEvent(w, EPOLLIN | EPOLLOUT | EPOLLET);
            }
        }
        // if the size does not match what we want to send, then just keep waiting again
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I know its a bit longer code than what I wrote for &lt;code&gt;EPOLLIN&lt;/code&gt; but I assure you it is worth the dive 😁&lt;/p&gt;
&lt;p&gt;And now you should try writing the code for the worker's &lt;code&gt;EPOLLOUT&lt;/code&gt; branch yourself (Hey, I'm not lazy 😑)&lt;/p&gt;
&lt;p&gt;Apart from the &lt;code&gt;EPOLLIN&lt;/code&gt; and &lt;code&gt;EPOLLOUT&lt;/code&gt; events you also have 3 events to tell you that the connection is cut &lt;code&gt;EPOLLRDHUP&lt;/code&gt;, &lt;code&gt;EPOLLHUP&lt;/code&gt; and &lt;code&gt;EPOLLERR&lt;/code&gt; these three together can detect almost any kind of connection cuts.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;EPOLLRDHUP&lt;/code&gt; detects if a socket is closed from the other side of the network as in using the &lt;code&gt;shutdown&lt;/code&gt; function which I think no one generally uses 😂. If this event occurs, your socket is writable but not readable and the writability is local, the peer won't be able to read what you wrote if it has closed its reading end.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;EPOLLHUP&lt;/code&gt; also detects if a socket is closed from the other side but this event detects any errors from the socket and if this event happens then your socket is neither readable nor writable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;EPOLLERR&lt;/code&gt; detects some error that happened on the socket. Yeah that's it 😂&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now this was congestion control and tcp packet parsing but both aren't independent, you'll have to handle both together so the parsing happens on the data that comes from the data flow mechanism which also handles congestion inside itself &lt;/p&gt;
&lt;p&gt;But now that you do know the concept this should be much easier. And yeah I struggled to come up with the idea first and then struggled more to implement it but then combining both seemed trivial once I had them independently done.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;If I can do it, you can too!&lt;/p&gt;
&lt;p&gt;— Some genius (Me 😜)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Just joking! The parsing and congestion control should mostly never overlap since congestion control is for a middleman like an assigner and parsing is for a consumer like a worker or a producer like a gateway (could be the other way round too). A consumer always consumes at its own pace and a producer produces at its own pace and hence the middleman needs congestion control.&lt;/p&gt;
&lt;p&gt;In my case the worker (consumer) uses a blocking socket hence even if it is slow or fast does not matter since it will experience time glitches which are fine in my case.&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I hope you did not get confused and got to learn something good from this blog but I'm happy to answer any questions you face in the chats.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Disclaimer: Meet can make mistakes, always verify with someone/something&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The packet parsing was a bit trivial once I added the size member to the head of the struct. But figuring out the congestion control mechanism demanded me to look into TCP's congestion control (which was of very little help) and in general congestion control and mix them up and create a new mechanism. But then that mechanism was, I'd say, not so &quot;good&quot; hence I threw it in the trash and explored distributed algorithms like paxos, raft and distributed systems like bit torrent and one morning my brain wished me a &quot;Good Morning&quot; with this idea and I was surprised I could think of such a good mechanism. (Yeah I'm proud of my creation, for the first time though 😁)&lt;/p&gt;
&lt;p&gt;Currently I'm also new to the distributed realm and you're a better expert than me so if you spot any mistake in my approach or anything please do let me know, I'm more than happy to recreate a new mechanism from scratch and throw this in the trash too 😂 but the new one should be worth it!&lt;/p&gt;
&lt;h3 id=&quot;so-what-s-next-&quot;&gt;So, what's next?&lt;/h3&gt;
&lt;p&gt;Currently I'm learning some Rust cause I heard it is a harder language than C and I just want to see exactly how hard it is. I'm starting with the fundamentals and mostly using the book &lt;a rel=&quot;nofollow&quot; href=&quot;https://doc.rust-lang.org/book/&quot;&gt;The Rust Programming Language&lt;/a&gt; which is not exactly a book but a webpage. And I think its pretty awesome since this is the first community I saw making such an amazing and deep &quot;documentation&quot;.&lt;/p&gt;
&lt;p&gt;And the next time I'm going to discuss on linux containers and how to use OverlayFS on the containers. Also I &quot;might&quot; discuss about GARP and OPFS but all depends on time 😁&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=207092418960745090&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29702/i-wrote-bi-directional-tcp-congestion-control-and-survived</guid>
<pubDate>Sun, 04 Oct 2026 07:11:48 +0000</pubDate>
</item>
<item>
<title>Show a single Windows application window in any web browser on LAN</title>
<link>https://coderlegion.com/29696/show-a-single-windows-application-window-in-any-web-browser-on-lan</link>
<description>&lt;p&gt;Ever needed to show one app window on a tablet without any remote-desktop software? &lt;/p&gt;
&lt;p&gt;I built WindowStream for exactly that, and Ive just open-sourced it. &lt;/p&gt;
&lt;p&gt;Its a small Windows tray app that streams a chosen window as MJPEG over HTTP on your local network. On the tablet or other PC you just open a browser: nothing to install, and its strictly view-only. &lt;/p&gt;
&lt;p&gt;What Im happy with: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Any modern browser works as the viewer (Android, iOS, another PC), with pinch-zoom, panning and fullscreen. &lt;/li&gt;
&lt;li&gt;Two capture modes: a screen copy, or PrintWindow, which keeps streaming the window even when other windows cover it. &lt;/li&gt;
&lt;li&gt;Light on resources: a frame is encoded only when the picture has changed, and JPEG encoding goes through libjpeg-turbo. &lt;/li&gt;
&lt;li&gt;Starts with Windows and finds the window again even if its title changes. &lt;/li&gt;
&lt;li&gt;English and Russian interface, a single-exe build, unit tests, and user manuals in three languages. Python, MIT licensed. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One caveat: there is no password or encryption, so its meant for trusted networks only, and the docs say so clearly. &lt;/p&gt;
&lt;p&gt;Code, a release with the ready-made exe, and documentation: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/eugenyh/WindowStream&quot;&gt;https://github.com/eugenyh/WindowStream&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Feedback and ideas are very welcome!&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29696/show-a-single-windows-application-window-in-any-web-browser-on-lan</guid>
<pubDate>Sun, 04 Oct 2026 05:51:45 +0000</pubDate>
</item>
<item>
<title>Building a Line-Rate Linux Kernel Firewall in Pure Rust with Aya and eBPF/XDP</title>
<link>https://coderlegion.com/29624/building-a-line-rate-linux-kernel-firewall-in-pure-rust-with-aya-and-ebpf-xdp</link>
<description>&lt;p&gt;Volumetric Distributed Denial of Service (DDoS) and transport-layer flooding attacks pose an existential challenge to modern cloud infrastructure, edge gateways, and container workloads. &lt;/p&gt;
&lt;p&gt;Conventional Linux packet filtering utilities such as Netfilter (&lt;code&gt;iptables&lt;/code&gt; and &lt;code&gt;nftables&lt;/code&gt;) evaluate incoming frames only after the kernel has allocated a socket buffer (&lt;code&gt;sk_buff&lt;/code&gt;) descriptor and scheduled softirq processing through the core TCP/IP stack. Under multi-gigabit line-rate flood conditions (millions of packets per second), the operating system spends the vast majority of its CPU cycles simply allocating and freeing &lt;code&gt;sk_buff&lt;/code&gt; memory metadata, triggering kernel starvation and packet drop bottlenecks even before firewall rules are evaluated.&lt;/p&gt;
&lt;p&gt;To address this fundamental OS-level bottleneck, I built &lt;strong&gt;xdp-guard&lt;/strong&gt;: a production-grade, memory-safe in-kernel defense engine and per-IP rate limiter implemented strictly in &lt;strong&gt;Pure Rust&lt;/strong&gt; using the &lt;strong&gt;Aya&lt;/strong&gt; eBPF framework.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-ebpf-xdp-at-the-driver-layer-&quot;&gt;Why eBPF / XDP at the Driver Layer?&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;eXpress Data Path (XDP)&lt;/strong&gt; provides a programmable, bare-metal packet processing execution hook directly inside the Network Interface Card (NIC) driver subsystem before any memory descriptor allocation occurs.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Conventional Path:
[NIC RX] -&amp;gt; [IRQ / SoftIRQ] -&amp;gt; [Allocate sk_buff] -&amp;gt; [Netfilter/iptables] -&amp;gt; [Socket / App]
                                      ^
                           Severe CPU Allocation Overhead

xdp-guard Path:
[NIC RX] -&amp;gt; [eBPF / XDP Driver Hook] ---&amp;gt; (Match Blocklist) ---&amp;gt; [ XDP_DROP ] (Near-Zero CPU)
                             |
                      (Match Allowlist)
                             |
                             v
                   [ Pass to OS Stack ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When hostile or unapproved packets are identified, returning &lt;code&gt;XDP_DROP&lt;/code&gt; causes the network driver to immediately recycle the packet ring buffer without allocating a single byte of kernel socket memory.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;architectural-highlights&quot;&gt;Architectural Highlights&lt;/h3&gt;
&lt;h4 id=&quot;1-zero-c-dependencies-pure-rust-&quot;&gt;1. Zero C Dependencies (Pure Rust)&lt;/h4&gt;
&lt;p&gt;Traditional eBPF tools rely heavily on C toolchains (&lt;code&gt;clang&lt;/code&gt;, &lt;code&gt;llvm&lt;/code&gt;, &lt;code&gt;libbpf&lt;/code&gt;). &lt;code&gt;xdp-guard&lt;/code&gt; is built entirely in Rust from the user-space management CLI down to the &lt;code&gt;no_std&lt;/code&gt; kernel eBPF bytecode using &lt;strong&gt;Aya&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id=&quot;2-strict-64-bit-memory-boundary-alignments&quot;&gt;2. Strict 64-Bit Memory Boundary Alignments&lt;/h4&gt;
&lt;p&gt;To ensure safe zero-copy communication across the kernel-userspace boundary, shared structures use explicit padding fields to guarantee 8-byte alignment:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-rust&quot;&gt;#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct RuleValue {
    pub action: u32,       // 0 = Pass, 1 = Drop
    pub _pad: u32,         // Explicit 4-byte padding for 8-byte boundary
    pub created_at: u64,   // Monotonic timestamp
    pub ttl_secs: u64,     // Time-to-live expiration
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The presence of &lt;code&gt;_pad: u32&lt;/code&gt; is critical: it prevents architecture-specific compiler padding discrepancies and satisfies the Linux Kernel BPF Verifier.&lt;/p&gt;
&lt;h4 id=&quot;3-dynamic-bpf-virtual-filesystem-bpffs-synchronization&quot;&gt;3. Dynamic BPF Virtual Filesystem (bpffs) Synchronization&lt;/h4&gt;
&lt;p&gt;Firewall rules (blocklist and allowlist) are dynamically synchronized using pinned BPF hash maps located in &lt;code&gt;/sys/fs/bpf/xdp_guard&lt;/code&gt;. Rules can be inserted or deleted instantaneously from the CLI without tearing down network interfaces or interrupting traffic flows.&lt;/p&gt;
&lt;h4 id=&quot;4-in-kernel-token-bucket-rate-limiter&quot;&gt;4. In-Kernel Token-Bucket Rate Limiter&lt;/h4&gt;
&lt;p&gt;In addition to static blocklists, &lt;code&gt;xdp-guard&lt;/code&gt; embeds a stateful token-bucket rate limiter directly in kernel space. Monotonic arrival intervals ($\Delta t = t&lt;em&gt;{now} - t&lt;/em&gt;{last}$) are computed using nanosecond &lt;code&gt;bpf_ktime_get_ns()&lt;/code&gt; clocks, discarding over-limit burst floods at line-rate.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;empirical-verification-real-linux-kernel-telemetry&quot;&gt;Empirical Verification: Real Linux Kernel Telemetry&lt;/h3&gt;
&lt;p&gt;To validate &lt;code&gt;xdp-guard&lt;/code&gt; under realistic operating conditions, we set up an automated Linux network namespace testbed over virtual ethernet (&lt;code&gt;veth&lt;/code&gt;) pairs (&lt;code&gt;xdp_client&lt;/code&gt; at &lt;code&gt;10.10.0.2&lt;/code&gt; and &lt;code&gt;xdp_server&lt;/code&gt; at &lt;code&gt;10.10.0.1&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Telemetry streamed directly from the kernel &lt;code&gt;STATS_MAP&lt;/code&gt; array demonstrated instantaneous 100.00% packet mitigation upon inserting an attacker IP into the kernel blocklist, followed by zero-loss recovery:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;TIMESTAMP            PASSED (PKTS)   DROPPED (PKTS)  DROP RATIO     
-----------------------------------------------------------------
09:56:56 | Pass: 1        (30.2 KB) | Drop: 0        (0 B)   | Ratio: 0.00%
[!] Inserting IP 10.10.0.2 into BLOCKLIST_MAP... [SUCCESS]
09:56:57 | Pass: 0        (30.2 KB) | Drop: 1        (98 B)  | Ratio: 100.00%
09:56:58 | Pass: 0        (30.2 KB) | Drop: 1        (196 B) | Ratio: 100.00%
09:56:59 | Pass: 0        (30.2 KB) | Drop: 1        (294 B) | Ratio: 100.00%
...
09:57:55 | Pass: 0        (30.2 KB) | Drop: 1        (5.7 KB)| Ratio: 100.00%
[!] Removing IP 10.10.0.2 from BLOCKLIST_MAP... [SUCCESS]
09:57:56 | Pass: 1        (30.3 KB) | Drop: 0        (5.7 KB)| Ratio: 0.00%
09:57:57 | Pass: 1        (30.4 KB) | Drop: 0        (5.7 KB)| Ratio: 0.00%
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every single drop occurred directly within the NIC driver hook, requiring zero kernel TCP/IP stack overhead.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;source-code-amp-research-paper&quot;&gt;Source Code &amp;amp; Research Paper&lt;/h3&gt;
&lt;p&gt;The complete project, documentation, and formal research paper are fully open-source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/rahadbhuiya/xdp-guard&quot;&gt;https://github.com/rahadbhuiya/xdp-guard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Citable Zenodo DOI:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://doi.org/10.5281/zenodo.23120995&quot;&gt;10.5281/zenodo.23120995&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automated CI:&lt;/strong&gt; Continuous testing across Rust Stable and Nightly LLVM targets via GitHub Actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are working on Linux kernel systems, eBPF, or Rust networking, I would love to hear your thoughts, feedback, or suggestions!&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29624/building-a-line-rate-linux-kernel-firewall-in-pure-rust-with-aya-and-ebpf-xdp</guid>
<pubDate>Sat, 03 Oct 2026 13:29:33 +0000</pubDate>
</item>
<item>
<title>A Practical Response Checklist for Account Alerts After Network Changes</title>
<link>https://coderlegion.com/29603/a-practical-response-checklist-for-account-alerts-after-network-changes</link>
<description>&lt;p&gt;&lt;em&gt;Cover: Conceptual illustration; may be AI-generated. Original creation method is unverified. The alert, padlock and location symbols are illustrative, not a real account incident, current application screenshot or security test. Image from the Lisar Website archive.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Original author:&lt;/strong&gt; Mohammad Hesameddin Montazerilisar, Technical Author for Lisar Connect and Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C. Adapted from &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/account-security-alerts-network-changes&quot;&gt;the original Lisar guide&lt;/a&gt;, published July 10, 2026 and updated July 11, 2026.&lt;/p&gt;
&lt;p&gt;Editorial disclosure: The substantive guidance comes from the human-authored source. AI assistance was used for editing, platform framing and source checking. This is explanatory guidance, not a report of a new device or VPN test.&lt;/p&gt;
&lt;p&gt;A developer switching between home, mobile and office networks may encounter an account alert. Before editing a VPN profile, establish whether the activity was expected. This checklist keeps account verification with the service that owns it and reserves connection notes for a useful, non-sensitive support timeline.&lt;/p&gt;
&lt;p&gt;Online services may show a new-sign-in, unusual-activity, or security alert after the public IP or network changes. A VPN connection can contribute to that change, but the timing alone does not establish why the service sent an alert. Services may also evaluate device, browser, time, cookies, authentication method, sign-in history, and account behavior.&lt;/p&gt;
&lt;p&gt;An alert should be reviewed through the service’s official account-security process. It should not be dismissed as “just the VPN,” and it should not be used as proof that the VPN caused an account restriction.&lt;/p&gt;
&lt;h3 id=&quot;why-services-react-to-changes-in-sign-in-context&quot;&gt;Why services react to changes in sign-in context&lt;/h3&gt;
&lt;p&gt;Security systems try to distinguish expected activity from activity that may require verification. A sign-in can look different when it comes from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;a new public IP;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a different network operator or country estimate;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a new device or browser;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cleared cookies;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a private-browsing session;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a different time than usual;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repeated failed sign-ins;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a changed authentication method;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a recent password or account-security change.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A network transition—home Wi-Fi to mobile data, office network to hotel Wi-Fi, or direct connection to VPN—can alter the visible IP. The service may ask for confirmation because the overall context changed.&lt;/p&gt;
&lt;h3 id=&quot;network-change-is-one-signal-not-the-whole-decision&quot;&gt;Network change is one signal, not the whole decision&lt;/h3&gt;
&lt;p&gt;It is tempting to draw a simple conclusion: “The IP changed, therefore the alert appeared.” That may be true in some cases, but users normally cannot see the service’s complete risk model.&lt;/p&gt;
&lt;p&gt;The same account may change networks without an alert when the device and browser are familiar. Another sign-in may trigger verification even from the usual network because the browser, cookies, password, or behavior changed.&lt;/p&gt;
&lt;p&gt;Use cautious language. A VPN may be associated with the timing of an alert, but it does not prove why a service made a security decision.&lt;/p&gt;
&lt;h3 id=&quot;read-the-alert-details-before-acting&quot;&gt;Read the alert details before acting&lt;/h3&gt;
&lt;p&gt;Open the service directly through its known application or website rather than following an unexpected message link. Review:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;sign-in time;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;device or browser shown;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;approximate location or IP information;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;whether the session is recognized;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;actions recommended by the service;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;other recent account-security events.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Location labels may be based on an approximate IP database and can be inaccurate. Focus on the combination of time, device, browser, and your actual activity.&lt;/p&gt;
&lt;p&gt;If the alert is not recognized, follow the service’s official account-security instructions. A VPN troubleshooting article should not replace that process.&lt;/p&gt;
&lt;h3 id=&quot;verify-the-sign-in-through-the-service-itself&quot;&gt;Verify the sign-in through the service itself&lt;/h3&gt;
&lt;p&gt;When the activity was yours, complete the service’s normal verification if required. Do not attempt to bypass device confirmation, multi-factor authentication, account review, or other security controls.&lt;/p&gt;
&lt;p&gt;When the activity was not yours:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;use the service’s official security page;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;review active sessions where available;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;follow its account-recovery or password guidance;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;preserve relevant alert details;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;contact the service through its official support route if needed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Do not share verification codes, recovery codes, tokens, cookies, or screenshots containing sensitive account information.&lt;/p&gt;
&lt;h3 id=&quot;avoid-assuming-the-vpn-caused-every-alert&quot;&gt;Avoid assuming the VPN caused every alert&lt;/h3&gt;
&lt;p&gt;Check what else changed around the same time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Was this a new device?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Was the browser reinstalled or reset?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Were cookies cleared?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Did the operating system update?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Was the account password changed?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Did the user travel or change time zones?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Did the sign-in occur after several failed attempts?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Did the service send the alert before the VPN connection began?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A timeline prevents the VPN from becoming a catch-all explanation for unrelated account events.&lt;/p&gt;
&lt;h3 id=&quot;reduce-avoidable-confusion-without-bypassing-controls&quot;&gt;Reduce avoidable confusion without bypassing controls&lt;/h3&gt;
&lt;p&gt;Users can make legitimate activity easier to understand by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;keeping device date and time correct;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;using the service’s official application or website;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;avoiding rapid sign-ins from several browsers during troubleshooting;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;recording which network and device were used;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;completing the service’s required verification;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;signing out of abandoned or shared devices through approved account controls;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;following employer or service policies.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Do not promise that a stable network or profile will prevent alerts. Security systems can still request verification for other reasons.&lt;/p&gt;
&lt;h3 id=&quot;what-to-record-for-a-legitimate-repeated-alert&quot;&gt;What to record for a legitimate repeated alert&lt;/h3&gt;
&lt;p&gt;If recognized activity repeatedly triggers alerts, record:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;service name;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;date and time;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;device and browser;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;whether the VPN was connected;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;network type before connecting;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;approximate location shown by the alert;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;whether cookies or browser state changed;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;verification step requested;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;whether the issue occurs with the same account on another authorized network.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Share only non-sensitive details with support. Do not send authentication secrets or raw session information.&lt;/p&gt;
&lt;h3 id=&quot;a-safe-response-sequence&quot;&gt;A safe response sequence&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open the service directly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Review time, device, browser, and approximate location.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decide whether the activity is recognized.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complete official verification for recognized activity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use official account-security steps for unrecognized activity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build a timeline if alerts repeat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Treat network change as one possible factor, not a proven cause.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-to-interpret-the-alert-calmly&quot;&gt;How to interpret the alert calmly&lt;/h3&gt;
&lt;p&gt;An account alert may follow a network change, a new device, an unusual sign-in pattern, or another provider-specific signal. Read the exact message, use the platform’s official security flow, and avoid assuming the VPN is either the sole cause or a way to prevent future checks.&lt;/p&gt;
&lt;h3 id=&quot;use-the-account-provider-s-own-interpretation&quot;&gt;Use the account provider's own interpretation&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://support.google.com/accounts/answer/2590353?hl=en&quot;&gt;Google's security-alert guidance&lt;/a&gt; distinguishes activity you recognize from activity that was not yours and asks you to review the sign-in details. Its &lt;a rel=&quot;nofollow&quot; href=&quot;https://support.google.com/accounts/answer/3067630?hl=en&quot;&gt;device and session guidance&lt;/a&gt; also explains that one device may have multiple sessions and a displayed time may reflect background synchronization. These are provider-specific details: use your service's documentation instead of treating one timestamp or location label as a complete diagnosis.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29603/a-practical-response-checklist-for-account-alerts-after-network-changes</guid>
<pubDate>Sat, 03 Oct 2026 08:29:22 +0000</pubDate>
</item>
<item>
<title>Public Wi-Fi for Work Travel: A Practical VPN and Device Checklist</title>
<link>https://coderlegion.com/29505/public-wi-fi-for-work-travel-a-practical-vpn-and-device-checklist</link>
<description>&lt;p&gt;&lt;em&gt;Cover: Conceptual illustration; may be AI-generated. Original creation method is unverified. Symbols do not represent tested security or a current application screen. Image from the Lisar Website archive.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Before working from a hotel, airport or coworking space, check the actual travel device, the VPN setup and the rules for the task. This checklist keeps tunnel coverage and device security in view.&lt;/p&gt;
&lt;p&gt;Originally written by Mohammad Hesameddin Montazerilisar, Technical Author for Lisar Connect and Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C. Adapted from the human-authored &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/public-wifi-work-travel-vpn-expectations&quot;&gt;Public Wi-Fi for Work Travel: What a VPN Helps With and What It Does Not&lt;/a&gt;, published July 1, 2026 and updated September 27, 2026. AI assistance was used for editing, platform framing and source checking; the substantive human source is retained.&lt;/p&gt;
&lt;h3 id=&quot;public-wi-fi-is-not-a-controlled-work-environment&quot;&gt;Public Wi-Fi is not a controlled work environment&lt;/h3&gt;
&lt;p&gt;At the office or at home, the network may have a known owner and configuration. On public Wi-Fi, the traveler may have neither. That's not a scare story — hotel, airport, and coworking networks serve thousands of people uneventfully every day — it's a planning fact: the environment's configuration, maintenance, and other users are all outside the traveler's control and knowledge.&lt;/p&gt;
&lt;p&gt;Treating public Wi-Fi as uncontrolled doesn't mean avoiding it. It means not extending office assumptions to it: not assuming the network is maintained, not assuming it behaves like the last one, and not assuming any single tool covers what the environment doesn't provide.&lt;/p&gt;
&lt;p&gt;The &lt;a rel=&quot;nofollow&quot; href=&quot;https://consumer.ftc.gov/articles/are-public-wi-fi-networks-safe-what-you-need-know&quot;&gt;FTC notes that widespread website encryption makes public Wi-Fi usually safe&lt;/a&gt;, while warning that encrypted sites can still be scams. A protected connection and a trustworthy destination are separate questions.&lt;/p&gt;
&lt;h3 id=&quot;what-a-vpn-can-help-organize-on-shared-networks&quot;&gt;What a VPN can help organize on shared networks&lt;/h3&gt;
&lt;p&gt;A compatible VPN carries the traffic routed through its encrypted tunnel between the device and VPN gateway. On public Wi-Fi, this separates that covered traffic from the local network path. It also gives the traveler a prepared setup to use where the network supports it. Choose the current &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/setup/&quot;&gt;guide for the actual device&lt;/a&gt;: L2TP/IPsec where compatible and appropriate, or an OpenVPN profile with a compatible client where L2TP/IPsec is unavailable or unsuitable. Use only that person's authorized active profile and keep its connection values private.&lt;/p&gt;
&lt;p&gt;The tunnel has a defined scope: it does not secure the destination website, fix a compromised device or force every app through the same route. Continue using HTTPS and the device controls your work requires, and confirm the active connection rather than relying on a saved profile.&lt;/p&gt;
&lt;h3 id=&quot;what-a-vpn-does-not-make-safe-by-itself&quot;&gt;What a VPN does not make safe by itself&lt;/h3&gt;
&lt;p&gt;A VPN does not make public Wi-Fi, hotel Wi-Fi, airport Wi-Fi, coworking networks, or mobile networks fully safe. It doesn't guarantee anonymity, doesn't guarantee speed, doesn't guarantee access to any service or work tool, and isn't a bypass or unblocking mechanism for whatever a network or service restricts.&lt;/p&gt;
&lt;p&gt;It also isn't malware protection, endpoint security, or a substitute for the traveler's own habits. Device updates, safe browsing, screen awareness in shared spaces, and ordinary skepticism about unexpected prompts all still matter on public Wi-Fi — VPN or not.&lt;/p&gt;
&lt;h3 id=&quot;hotel-airport-coworking-and-mobile-networks-can-behave-differently&quot;&gt;Hotel, airport, coworking, and mobile networks can behave differently&lt;/h3&gt;
&lt;p&gt;Public networks aren't interchangeable. Hotel and airport networks often sit behind captive portals and their own management layers; coworking networks vary with the operator; mobile networks behave differently again. Any of them may restrict, throttle, or simply not support a given setup, and no network is guaranteed to allow or support every setup.&lt;/p&gt;
&lt;p&gt;For planning, that means expecting variation rather than being surprised by it — and having the relevant Lisar setup guide reachable when a network behaves unlike the last one, rather than improvising changes to a working configuration.&lt;/p&gt;
&lt;h3 id=&quot;why-setup-should-be-checked-before-the-trip&quot;&gt;Why setup should be checked before the trip&lt;/h3&gt;
&lt;p&gt;The worst place to discover a setup problem is the environment least suited to fixing it. Setup checked at home, on a familiar network, with the panel and guides at hand, is a routine task; the same problem in an airport, on deadline, over a captive portal, is not.&lt;/p&gt;
&lt;p&gt;The pre-trip check is short: the setup works on the actual devices traveling, tested from a familiar network; any new device gets set up from that person's own panel profile using the relevant guide before departure, not after; and the traveler knows where the setup guides and official support live.&lt;/p&gt;
&lt;h3 id=&quot;company-managed-devices-and-employer-policy-still-apply&quot;&gt;Company-managed devices and employer policy still apply&lt;/h3&gt;
&lt;p&gt;A managed work laptop is still managed at the airport. Device policies restricting apps, VPN profiles, certificates, and network settings travel with the device, and public Wi-Fi doesn't suspend them — nor does it suspend the employer's rules about what work happens on which networks.&lt;/p&gt;
&lt;p&gt;VPN setup works within device policy, not around it. For work travel specifically, the employer's IT function is part of the pre-trip picture: what the device allows, and what policy expects on public networks, are their questions to answer.&lt;/p&gt;
&lt;h3 id=&quot;profile-safety-on-the-road&quot;&gt;Profile safety on the road&lt;/h3&gt;
&lt;p&gt;Travel is where profile-safety habits get tested, because travel is when people ask for help from odd places at odd hours. The habits stay the same: profile-specific setup information comes from the person's own Lisar panel profile, not from old screenshots or saved messages; downloaded &lt;code&gt;.ovpn&lt;/code&gt; profile files, credentials, and profile details stay out of shared documents and chat threads; and any screenshot sent to anyone — including support — gets checked for profile-specific details first.&lt;/p&gt;
&lt;p&gt;Shared or public computers deserve special mention for travelers: setup details don't get entered or saved on machines that aren't the traveler's own.&lt;/p&gt;
&lt;h3 id=&quot;what-to-check-before-using-public-wi-fi-for-work&quot;&gt;What to check before using public Wi-Fi for work&lt;/h3&gt;
&lt;p&gt;The working checklist, kept to planning:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Is the VPN setup tested on the actual travel devices, from a familiar network, before departure?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are device OS and apps updated before the trip rather than over hotel Wi-Fi?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is the device company-managed — and if so, what do its policy and the employer's network rules expect?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does the traveler know the network may not allow or support the setup, and what the permitted fallback plan is, such as mobile data where allowed?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are profile details kept private, with setup values obtained from the traveler's own panel and nothing entered on shared machines?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is sensitive work matched to the environment — screen awareness in shared spaces, and judgment about what to do on which network?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does the traveler know where the setup guides and official support live, before needing them?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;further-reading&quot;&gt;Further reading&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://consumer.ftc.gov/articles/protect-your-personal-information-hackers-and-scammers&quot;&gt;FTC: Protect Your Personal Information From Hackers and Scammers&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29505/public-wi-fi-for-work-travel-a-practical-vpn-and-device-checklist</guid>
<pubDate>Fri, 02 Oct 2026 09:35:21 +0000</pubDate>
</item>
<item>
<title>A Practical VPN Access Inventory: Fields, Statuses and Update Events</title>
<link>https://coderlegion.com/29367/a-practical-vpn-access-inventory-fields-statuses-and-update-events</link>
<description>&lt;p&gt;&lt;em&gt;Cover: Conceptual illustration; may be AI-generated. Original creation method is unverified. Image supplied from the Lisar Website article archive.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A small VPN inventory is most useful when it answers operational questions: who owns the assignment, which device it belongs to, and what changed. This guide provides fields and lifecycle statuses that a team can maintain without copying access material.&lt;/p&gt;
&lt;p&gt;Originally written by Mohammad Hesameddin Montazerilisar, Technical Author for Lisar Connect and Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C. Edited republication of &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-access-inventory-small-teams&quot;&gt;How to Maintain a VPN Access Inventory for a Small Team&lt;/a&gt;. AI assisted the editing and platform-specific presentation; the substantive guidance comes from the human-authored source.&lt;/p&gt;
&lt;p&gt;A VPN access inventory is a simple list of &lt;strong&gt;who has access, which device the access is meant for, what the assignment is used for, and whether it is still current&lt;/strong&gt;. It is not a copy of profile files and it is not a password list.&lt;/p&gt;
&lt;p&gt;For a small team, a spreadsheet or lightweight internal table is usually enough. The value comes from keeping it accurate when people join, leave, replace a device, or receive an updated profile.&lt;/p&gt;
&lt;h3 id=&quot;what-the-inventory-should-answer&quot;&gt;What the inventory should answer&lt;/h3&gt;
&lt;p&gt;A useful inventory lets the team answer these questions without opening profile files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Who is the access assigned to?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which device or router is it intended for?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What is the approved purpose?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which profile revision is current?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is the assignment active, awaiting setup, or no longer needed?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Who should review the record when something changes?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the table cannot answer those questions, it is probably either too sparse or filled with the wrong kind of detail.&lt;/p&gt;
&lt;h3 id=&quot;use-a-small-set-of-practical-fields&quot;&gt;Use a small set of practical fields&lt;/h3&gt;
&lt;p&gt;Start with fields the team will actually maintain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Owner — Person or approved role responsible for the assignment&lt;/li&gt;
&lt;li&gt;Device — Laptop, phone, router, or approved device label&lt;/li&gt;
&lt;li&gt;Purpose — Work, travel, office router, contractor access, or another approved use&lt;/li&gt;
&lt;li&gt;Profile label — The same non-sensitive label used in the filename or client&lt;/li&gt;
&lt;li&gt;Current revision — A date or revision such as R03&lt;/li&gt;
&lt;li&gt;Status — Awaiting setup, active, needs review, replaced, or closed&lt;/li&gt;
&lt;li&gt;Last checked — When the assignment was last confirmed&lt;/li&gt;
&lt;li&gt;Notes — Short non-sensitive context or next step&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is enough for many teams. Add fields only when they solve a recurring problem.&lt;/p&gt;
&lt;h3 id=&quot;keep-profile-contents-and-credentials-out-of-the-inventory&quot;&gt;Keep profile contents and credentials out of the inventory&lt;/h3&gt;
&lt;p&gt;The inventory is a tracking tool, not a secret store. Do not paste or attach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;.ovpn file&lt;/code&gt; contents;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;passwords, tokens, or verification codes;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;private keys or certificate data;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;screenshots containing sensitive values;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;billing or payment details.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A profile label such as &lt;code&gt;mina-laptop-work-r03&lt;/code&gt; is useful. The profile itself is not.&lt;/p&gt;
&lt;h3 id=&quot;update-the-inventory-at-the-moment-work-happens&quot;&gt;Update the inventory at the moment work happens&lt;/h3&gt;
&lt;p&gt;Inventories become unreliable when updates are postponed. The best time to update a record is during the event that changed it.&lt;/p&gt;
&lt;h4 id=&quot;when-someone-joins&quot;&gt;When someone joins&lt;/h4&gt;
&lt;p&gt;Create the assignment record before or during setup. Record the intended owner, device, purpose, and initial profile label. Once the person confirms a successful connection, update the status and last-checked date.&lt;/p&gt;
&lt;h4 id=&quot;when-a-device-is-replaced&quot;&gt;When a device is replaced&lt;/h4&gt;
&lt;p&gt;Do not overwrite the old device label with no explanation. Mark the old assignment as replaced or closed, then create or update the record for the new device. This keeps the history understandable without storing technical secrets.&lt;/p&gt;
&lt;h4 id=&quot;when-a-profile-is-reissued&quot;&gt;When a profile is reissued&lt;/h4&gt;
&lt;p&gt;Update the current revision and add a short note explaining the ordinary reason, such as device replacement or updated connection information. The detailed profile content should not be copied into the inventory.&lt;/p&gt;
&lt;h4 id=&quot;when-someone-leaves-or-no-longer-needs-access&quot;&gt;When someone leaves or no longer needs access&lt;/h4&gt;
&lt;p&gt;Mark the record for the approved offboarding process and track the resulting status. Do not assume that deleting a local file alone changes the service-side access state.&lt;/p&gt;
&lt;h3 id=&quot;use-clear-statuses-instead-of-vague-notes&quot;&gt;Use clear statuses instead of vague notes&lt;/h3&gt;
&lt;p&gt;A small set of status values makes the table easier to scan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Awaiting setup&lt;/strong&gt; — assigned but not yet confirmed on the intended device.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Active&lt;/strong&gt; — current assignment confirmed for normal use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Needs review&lt;/strong&gt; — something changed or the record has not been confirmed recently.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Replaced&lt;/strong&gt; — a newer assignment or profile revision took its place.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Closed&lt;/strong&gt; — the assignment is no longer part of the active inventory.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avoid statuses such as &lt;code&gt;maybe&lt;/code&gt;, &lt;code&gt;old?&lt;/code&gt;, or &lt;code&gt;probably fine&lt;/code&gt;. If the team is uncertain, &lt;code&gt;Needs review&lt;/code&gt; is clearer and gives someone a next action.&lt;/p&gt;
&lt;h3 id=&quot;give-each-record-one-clear-owner&quot;&gt;Give each record one clear owner&lt;/h3&gt;
&lt;p&gt;The owner does not need to be a full-time administrator. It can be the person using the profile, the team lead, or whoever handles setup. The important point is that someone knows they are responsible for confirming the record when a device, role, or profile changes.&lt;/p&gt;
&lt;p&gt;For shared office equipment, assign the record to a named responsible person or role rather than leaving it as “shared” with no owner.&lt;/p&gt;
&lt;h3 id=&quot;review-the-inventory-in-a-short-repeatable-way&quot;&gt;Review the inventory in a short, repeatable way&lt;/h3&gt;
&lt;p&gt;A lightweight review can take a few minutes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Compare the list with the current team roster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check whether any devices were replaced or retired.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirm that the profile revision recorded as current still matches the setup notes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Look for &lt;code&gt;Awaiting setup&lt;/code&gt; or &lt;code&gt;Needs review&lt;/code&gt; records that have no next step.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirm that shared equipment still has a named owner.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Close or update records that no longer reflect current use.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The review is about keeping the list useful, not collecting more data.&lt;/p&gt;
&lt;h3 id=&quot;a-simple-example&quot;&gt;A simple example&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mina — Laptop-07 — Daily work — mina-laptop-work-r03 — Active&lt;/li&gt;
&lt;li&gt;Sales room coordinator — Router-02 — Shared office — sales-router-office-r02 — Needs review&lt;/li&gt;
&lt;li&gt;Contractor 7 — Phone-04 — Travel task — contractor7-phone-travel-r01 — Awaiting setup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The example identifies assignments without exposing any access material.&lt;/p&gt;
&lt;h3 id=&quot;frequently-asked-questions-8&quot;&gt;Frequently asked questions&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Do we need special inventory software?&lt;/strong&gt;&lt;br&gt;
Not necessarily. A protected spreadsheet or internal table is usually enough for a small team, provided access is limited and someone keeps it current.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Should the inventory include every downloaded copy of a profile?&lt;/strong&gt;&lt;br&gt;
No. Track the approved assignment and current revision, not every local duplicate in a downloads folder.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is the inventory proof that a connection is active right now?&lt;/strong&gt;&lt;br&gt;
No. It records assignment and lifecycle information. A live VPN client status is a separate signal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How often should the list be reviewed?&lt;/strong&gt;&lt;br&gt;
Review it when people, devices, or profiles change, plus a periodic check that fits the pace of the team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related guidance:&lt;/strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/document-vpn-setup-without-secrets&quot;&gt;How to Document VPN Setup Without Recording Secrets&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-profile-change-log&quot;&gt;What to Record When VPN Profiles Are Reissued&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;keep-the-record-separate-from-the-access-control&quot;&gt;Keep the record separate from the access control&lt;/h3&gt;
&lt;p&gt;A status in the inventory is a record to maintain. It does not itself enable, disable, or verify a live VPN connection. OpenVPN documents &lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/delete-a-profile.html&quot;&gt;removing a saved profile from OpenVPN Connect&lt;/a&gt; as a client action; follow the access administrator’s approved process for service-side changes. For broader organizational controls, the &lt;a rel=&quot;nofollow&quot; href=&quot;https://csrc.nist.gov/pubs/sp/800/53/r5/upd1/final&quot;&gt;NIST SP 800-53 control catalog&lt;/a&gt; is a separate reference, not a certification supplied by this checklist.&lt;/p&gt;
&lt;p&gt;Keep the inventory small, access-limited and current. Update the assignment when the work happens, and give unresolved records a clear review owner.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29367/a-practical-vpn-access-inventory-fields-statuses-and-update-events</guid>
<pubDate>Thu, 01 Oct 2026 08:36:29 +0000</pubDate>
</item>
<item>
<title>Reading OpenVPN Connect Import Problems Without Blind Retries</title>
<link>https://coderlegion.com/29213/reading-openvpn-connect-import-problems-without-blind-retries</link>
<description>&lt;p&gt;Cover: Conceptual illustration; may be AI-generated. Original creation method is unverified. Image supplied from the Lisar Website archive.&lt;/p&gt;
&lt;p&gt;An import error is useful evidence only when it is tied to the correct stage. This guide separates file selection, download completeness, client compatibility and device permissions from the later connection attempt.&lt;/p&gt;
&lt;p&gt;By Mohammad Hesameddin Montazerilisar, Technical Author for Lisar Connect and Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C. Edited republication of his human-authored &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/openvpn-connect-import-problems&quot;&gt;Common OpenVPN Connect Import Problems and How to Read Them&lt;/a&gt; (published July 9, updated September 27, 2026). AI assistance was used for editing, framing and reference checks. No new hands-on test is claimed.&lt;/p&gt;
&lt;p&gt;When importing a profile into OpenVPN Connect doesn't go smoothly, it rarely means something is seriously wrong — most import hiccups fall into a handful of recognizable categories, and knowing the categories turns &quot;it won't work&quot; into &quot;ah, it's probably that one.&quot; This is a field guide to reading them calmly.&lt;/p&gt;
&lt;p&gt;Throughout, the supported path is the same reference point: download the .ovpn file, open OpenVPN Connect, choose Upload File, import and save the profile, and connect. Most import problems are simply one of the steps in that path needing another look.&lt;/p&gt;
&lt;p&gt;If you need the ordinary upload sequence rather than help with an error, start with &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/openvpn-ovpn-file-upload-setup&quot;&gt;the step-by-step .ovpn Upload File guide&lt;/a&gt;. If OpenVPN Connect says the profile failed to import, first confirm which setup stage actually failed.&lt;/p&gt;
&lt;h3 id=&quot;if-openvpn-connect-says-the-profile-failed-to-import&quot;&gt;If OpenVPN Connect says the profile failed to import&lt;/h3&gt;
&lt;p&gt;An import-stage failure means the profile never appears in the client's profile list after Upload File. Before trying again, note the exact error wording shown on your device — but do not paste or share the contents of the &lt;code&gt;.ovpn&lt;/code&gt; file. Confirm that you selected the complete current &lt;code&gt;.ovpn&lt;/code&gt; file freshly downloaded from your own Lisar Panel profile, then use a supported, current OpenVPN-compatible client and allow only the device permissions required by the setup flow.&lt;/p&gt;
&lt;p&gt;If the profile already appears in the client, the import succeeded. Do not keep re-importing it as a blind retry; use &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-profile-imported-but-wont-connect&quot;&gt;the separate post-import connection guide&lt;/a&gt; to diagnose the connection stage. If the profile never appears, continue through the file, client, permission, and network checks below.&lt;/p&gt;
&lt;h3 id=&quot;wrong-file&quot;&gt;Wrong file&lt;/h3&gt;
&lt;p&gt;One straightforward category to check is the selected file: the file being imported isn't the profile file. It's easy to grab the wrong thing — a different download, a renamed file, something that isn't actually the &lt;code&gt;.ovpn&lt;/code&gt; profile at all. If the client doesn't recognize what it's given, the first check is whether the file you selected is genuinely the &lt;code&gt;.ovpn&lt;/code&gt; file you downloaded from your own Lisar Panel profile.&lt;/p&gt;
&lt;p&gt;Reading it: &quot;this doesn't look like a profile&quot; usually means exactly that. Re-download fresh from the Panel and select that file specifically.&lt;/p&gt;
&lt;h3 id=&quot;incomplete-or-corrupted-download&quot;&gt;Incomplete or corrupted download&lt;/h3&gt;
&lt;p&gt;A profile file that didn't finish downloading — or got interrupted partway — can look present while being incomplete. Spotty connections, an interrupted transfer, or a download that was cut short all produce a file that isn't whole, and a client can't import instructions that aren't all there.&lt;/p&gt;
&lt;p&gt;Reading it: if a file that should be fine won't import, treat the download itself as suspect. Download it again, fresh from the Panel, on a stable connection, and try importing the new copy.&lt;/p&gt;
&lt;h3 id=&quot;outdated-profile&quot;&gt;Outdated profile&lt;/h3&gt;
&lt;p&gt;Sometimes the file imports but reflects an older state, because it's an old saved copy rather than a current one. Profiles have lifecycles, and a file kept from months ago may no longer match what your current profile should be.&lt;/p&gt;
&lt;p&gt;Reading it: if you're importing from something saved earlier, that's the thing to replace. The current profile is whatever your own Lisar Panel provides now — download fresh rather than reusing an old file, and let the Panel be the source of truth.&lt;/p&gt;
&lt;h3 id=&quot;client-behavior-and-versions&quot;&gt;Client behavior and versions&lt;/h3&gt;
&lt;p&gt;Clients differ in how they present the import step, and behavior can vary between versions or platforms. A screen that doesn't match a guide, an option in a different place, or a client that behaves unexpectedly can all make import feel stuck when the profile is fine.&lt;/p&gt;
&lt;p&gt;Reading it: verify the client version and the exact import error. Even a current profile can contain an option that a particular client cannot import. Follow the guide for the actual platform and retain the original file while support checks compatibility; do not remove certificate verification to silence an error.&lt;/p&gt;
&lt;h3 id=&quot;device-permissions&quot;&gt;Device permissions&lt;/h3&gt;
&lt;p&gt;Setting up a VPN profile touches parts of a device that ask permission — and if a needed permission isn't granted, the client may be unable to complete the import or enable the connection. This is normal device behavior, not a fault: the device is asking before allowing.&lt;/p&gt;
&lt;p&gt;Reading it: if the client indicates it needs permission to proceed, that's a device-level prompt to complete as directed, following the setup guide for that operating system. On company- or client-managed devices, what's permitted is the policy owner's call — asked first, always — and this article doesn't suggest working around any device policy.&lt;/p&gt;
&lt;h3 id=&quot;duplicate-profiles&quot;&gt;Duplicate profiles&lt;/h3&gt;
&lt;p&gt;Importing a profile that's already present, or importing the same one twice, can produce confusion about which is which. A pile of similar-looking profiles makes it hard to tell the current one from an old attempt.&lt;/p&gt;
&lt;p&gt;Reading it: keep it tidy. Work from a single current profile, freshly downloaded, and clear out stale duplicates so there's one obvious right answer — again following your client's own documented way of managing its profile list.&lt;/p&gt;
&lt;h3 id=&quot;network-restrictions&quot;&gt;Network restrictions&lt;/h3&gt;
&lt;p&gt;Network conditions matter when downloading a profile or establishing the VPN connection. Importing a complete local file is a separate step and usually does not require contacting the VPN server. Identify which step failed before treating a network problem as an import problem.&lt;/p&gt;
&lt;p&gt;Reading it: if things behave oddly on one network but not others, suspect the network. Complete any captive portal first, test on a network you know works, and remember that not every network will support every setup — a fallback beats fighting one uncooperative network.&lt;/p&gt;
&lt;h3 id=&quot;reading-them-together&quot;&gt;Reading them together&lt;/h3&gt;
&lt;p&gt;Separate the file, import, permission and connection stages. Re-download when the copy is incomplete, wrong or confirmed outdated. If the profile is already imported, avoid repeated imports and record the connection error instead. A current file plus a clear client version and error message gives support a useful starting point.&lt;/p&gt;
&lt;h3 id=&quot;frequently-asked-questions-9&quot;&gt;Frequently asked questions&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Why won't OpenVPN Connect recognize my profile file?&lt;/strong&gt;&lt;br&gt;
Most often the wrong file was selected, or the download didn't finish. Re-download the &lt;code&gt;.ovpn&lt;/code&gt; file fresh from your own Lisar Panel profile on a stable connection, and select that specific file when importing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My profile imported but something seems off — could it be outdated?&lt;/strong&gt;&lt;br&gt;
Yes, if you imported an old saved copy. Profiles have lifecycles, so a fresh download from the Panel is more reliable than a file kept from earlier. The Panel is the source of truth for your current profile.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The import screen doesn't match the guide I'm following. What now?&lt;/strong&gt;&lt;br&gt;
Client screens vary by version and platform. If the file is current and correct, follow the setup guide for your actual device and client rather than a generic one, and make sure the client is a supported, up-to-date OpenVPN-compatible client.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The client is asking for a device permission — is that a problem?&lt;/strong&gt;&lt;br&gt;
No — that's normal device behavior, asking before allowing. Complete the prompt as directed, following the setup guide for your operating system. On managed devices, what's permitted is the policy owner's call.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Import works at home but not on hotel Wi-Fi. Why?&lt;/strong&gt;&lt;br&gt;
First identify whether downloading, local-file import or connecting failed. A captive portal can prevent download or connection. If the complete file is already on the device but cannot be imported, record the import error and client version; do not assume hotel Wi-Fi caused the local parsing failure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why did OpenVPN Connect fail to import my profile?&lt;/strong&gt;&lt;br&gt;
The message alone does not establish one cause. Check that you selected the complete current &lt;code&gt;.ovpn&lt;/code&gt; file from your own Lisar Panel profile, that the client is supported and current for the device, and that required device permissions are allowed. If the profile already appears in the client, import succeeded and the remaining issue is at the connection stage.&lt;/p&gt;
&lt;h3 id=&quot;current-client-references&quot;&gt;Current client references&lt;/h3&gt;
&lt;p&gt;The official &lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/import-profile.html&quot;&gt;OpenVPN Connect import guide&lt;/a&gt; documents the file-import sequence. Its &lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/troubleshooting-faqs.html&quot;&gt;troubleshooting FAQ&lt;/a&gt; provides client-specific checks, including referenced certificate files and profile format. Apply the instructions for your actual client and provider; do not publish a profile or private key when asking for help. References checked September 30, 2026.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29213/reading-openvpn-connect-import-problems-without-blind-retries</guid>
<pubDate>Wed, 30 Sep 2026 08:18:30 +0000</pubDate>
</item>
<item>
<title>Diagnosing a VPN That Connects and Then Disconnects</title>
<link>https://coderlegion.com/29014/diagnosing-a-vpn-that-connects-and-then-disconnects</link>
<description>&lt;p&gt;&lt;em&gt;Cover: Conceptual illustration; may be AI-generated. Original creation method is unverified. Image supplied from the Lisar Website archive.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A connection that succeeds briefly and then drops needs a different investigation from one that never connects. Start with timing and repeatable conditions.&lt;/p&gt;
&lt;p&gt;Originally written by Mohammad Hesameddin Montazerilisar, Technical Author for Lisar Connect and Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C. This is an edited republication of &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-connects-then-disconnects&quot;&gt;VPN Connects, Then Disconnects: How to Read the Pattern&lt;/a&gt;. AI assisted the editing and platform presentation; the example timeline is illustrative, and no connection test was performed for this article.&lt;/p&gt;
&lt;p&gt;A VPN that reaches Connected and then drops is a different problem from a client that never completes a connection. The temporary active state is the client’s report of that moment. The useful question is therefore not only why did it disconnect? but also what happened immediately before it disconnected?&lt;/p&gt;
&lt;p&gt;Timing, device state, and network transitions usually provide more useful evidence than repeatedly reconnecting or trying unrelated profiles.&lt;/p&gt;
&lt;h2 id=&quot;why-a-later-disconnect-is-different-from-a-failed-connection&quot;&gt;Why a later disconnect is different from a failed connection&lt;/h2&gt;
&lt;p&gt;When the client reports Connected, the device has progressed beyond import and the initial connection attempt. A later disconnect can still have many causes, but it shifts attention toward session continuity: the underlying network may have changed, the device may have entered sleep, the client may have lost permission to continue in the background, or the access state may have changed after the initial connection.&lt;/p&gt;
&lt;p&gt;A brief Connected status does not prove that every application was using the expected route or that the session should remain active indefinitely. It only confirms the state reported by the client at that moment.&lt;/p&gt;
&lt;h2 id=&quot;classify-the-disconnect-by-timing&quot;&gt;Classify the disconnect by timing&lt;/h2&gt;
&lt;p&gt;Start by placing the behavior into one of these categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Immediate: the client reports Connected and returns to Disconnected within seconds.&lt;/li&gt;
&lt;li&gt;Consistent interval: it drops after roughly the same number of minutes each time.&lt;/li&gt;
&lt;li&gt;Device event: it drops when the screen locks, the laptop sleeps, or the device wakes.&lt;/li&gt;
&lt;li&gt;Network event: it drops when moving between Wi-Fi and mobile data or between access points.&lt;/li&gt;
&lt;li&gt;Application event: it appears to drop when a particular application starts heavy network activity.&lt;/li&gt;
&lt;li&gt;Irregular: there is no repeatable timing or visible trigger.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These categories do not identify the cause by themselves, but they determine what evidence to collect next. A consistent interval is especially valuable because it suggests a repeatable policy, timeout, network behavior, or lifecycle event rather than random instability.&lt;/p&gt;
&lt;h2 id=&quot;identify-which-connection-failed-first&quot;&gt;Identify which connection failed first&lt;/h2&gt;
&lt;p&gt;Check whether the VPN disconnected first or the device lost ordinary network access first. These two sequences lead in different directions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ordinary internet fails, then VPN disconnects. The underlying Wi-Fi, mobile connection, router, or captive network may be the first layer to investigate.&lt;/li&gt;
&lt;li&gt;VPN disconnects while ordinary internet continues. Focus on the client, device background behavior, profile, access state, or a network condition specific to the VPN connection.&lt;/li&gt;
&lt;li&gt;Both appear to fail together. Record the exact order and test again only enough to confirm the pattern.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Do not assume that a working browser after the drop means the network was stable throughout the session. Some devices reconnect to ordinary internet quickly after the VPN ends.&lt;/p&gt;
&lt;h2 id=&quot;account-for-sleep-roaming-and-background-limits&quot;&gt;Account for sleep, roaming, and background limits&lt;/h2&gt;
&lt;p&gt;Phones and laptops constantly change power and network state. A phone may move from Wi-Fi to mobile data, suspend background activity, or restrict an application under battery-saving rules. A laptop may sleep, close its lid, move between wireless access points, or wake with a different network address.&lt;/p&gt;
&lt;p&gt;A VPN client may reconnect automatically in some environments and require manual action in others. That behavior depends on the operating system, client, device policy, and profile. Do not describe automatic reconnection as guaranteed.&lt;/p&gt;
&lt;p&gt;Record whether the disconnect follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;screen lock or sleep;&lt;/li&gt;
&lt;li&gt;lid close or wake;&lt;/li&gt;
&lt;li&gt;Wi-Fi signal loss;&lt;/li&gt;
&lt;li&gt;switching to mobile data;&lt;/li&gt;
&lt;li&gt;moving between office or home access points;&lt;/li&gt;
&lt;li&gt;battery saver activation;&lt;/li&gt;
&lt;li&gt;a client or operating-system update.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;check-lifecycle-status-without-guessing&quot;&gt;Check lifecycle status without guessing&lt;/h2&gt;
&lt;p&gt;An expired, inactive, replaced, or superseded profile can sometimes produce repeated disconnections, but a generic disconnect message does not prove a lifecycle issue. Use the authoritative account or profile-status source rather than interpreting the client label alone.&lt;/p&gt;
&lt;p&gt;Also distinguish service renewal from profile replacement. A renewed service may continue using the same profile, while a reissued profile may require the newly delivered file. The exact workflow must follow the documented service behavior rather than a general assumption.&lt;/p&gt;
&lt;h2 id=&quot;run-a-controlled-comparison&quot;&gt;Run a controlled comparison&lt;/h2&gt;
&lt;p&gt;Change one approved variable at a time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;same device and profile on another authorized network;&lt;/li&gt;
&lt;li&gt;same network after a permitted ordinary Wi-Fi reconnection, without changing security settings;&lt;/li&gt;
&lt;li&gt;same assigned profile on another supported device, when permitted;&lt;/li&gt;
&lt;li&gt;same device after confirming automatic date and time;&lt;/li&gt;
&lt;li&gt;same test while the device remains awake and stationary.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Do not cycle through old or unassigned profiles. Do not disable organization controls or change firewall, router, NAT, or routing rules as a general troubleshooting step.&lt;/p&gt;
&lt;h2 id=&quot;create-a-short-event-timeline&quot;&gt;Create a short event timeline&lt;/h2&gt;
&lt;p&gt;The following is an illustrative timeline, not a measured test or a real customer incident:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;14:02 — ordinary internet confirmed;&lt;/li&gt;
&lt;li&gt;14:03 — client reported Connecting;&lt;/li&gt;
&lt;li&gt;14:03 — client reported Connected;&lt;/li&gt;
&lt;li&gt;14:11 — screen locked;&lt;/li&gt;
&lt;li&gt;14:12 — client reported Disconnected;&lt;/li&gt;
&lt;li&gt;14:12 — ordinary internet still available;&lt;/li&gt;
&lt;li&gt;14:14 — second attempt remained connected while screen stayed active.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Include the client version, operating system, network type, profile revision label, and non-sensitive status wording. Do not include credentials, private configuration values, profile files, tokens, or verification codes.&lt;/p&gt;
&lt;h2 id=&quot;choose-the-next-owner-based-on-the-pattern&quot;&gt;Choose the next owner based on the pattern&lt;/h2&gt;
&lt;p&gt;The evidence should point toward the responsible layer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;network loss first → network owner or connectivity support;&lt;/li&gt;
&lt;li&gt;sleep or device event → device/client documentation or device administrator;&lt;/li&gt;
&lt;li&gt;access status non-current → service or access owner;&lt;/li&gt;
&lt;li&gt;one specific client version → client compatibility review;&lt;/li&gt;
&lt;li&gt;no clear trigger with a repeatable timeline → provide the timeline to support.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The goal is not to prove a cause alone. It is to collect enough structured evidence that the next person does not have to restart the investigation from zero.&lt;/p&gt;
&lt;h2 id=&quot;what-the-pattern-tells-you&quot;&gt;What the pattern tells you&lt;/h2&gt;
&lt;p&gt;A connection that repeatedly drops after a similar interval provides more useful evidence than a single unexplained failure. Record when it disconnects, what the device and network were doing, and whether the pattern follows a specific network, device state, or profile before changing several settings at once.&lt;/p&gt;
&lt;h2 id=&quot;frequently-asked-questions-10&quot;&gt;Frequently asked questions&lt;/h2&gt;
&lt;h3 id=&quot;does-a-brief-connected-status-prove-the-configuration-is-correct-&quot;&gt;Does a brief Connected status prove the configuration is correct?&lt;/h3&gt;
&lt;p&gt;It proves only that the client reported an active state for a period. It does not explain why the session ended or guarantee that it will remain active.&lt;/p&gt;
&lt;h3 id=&quot;why-does-the-vpn-disconnect-when-the-screen-turns-off-&quot;&gt;Why does the VPN disconnect when the screen turns off?&lt;/h3&gt;
&lt;p&gt;The device may change sleep, background, battery, or network behavior. The exact result depends on the operating system, client, and device policy.&lt;/p&gt;
&lt;h3 id=&quot;should-i-try-another-profile-&quot;&gt;Should I try another profile?&lt;/h3&gt;
&lt;p&gt;Only when the authorized setup assigns another current profile. Randomly trying old or unassigned profiles makes the evidence less reliable.&lt;/p&gt;
&lt;h3 id=&quot;what-if-it-always-disconnects-after-the-same-interval-&quot;&gt;What if it always disconnects after the same interval?&lt;/h3&gt;
&lt;p&gt;Record the interval precisely and report it. A repeatable interval is valuable evidence for the network, client, service, or access owner.&lt;/p&gt;
&lt;h3 id=&quot;can-switching-from-wi-fi-to-mobile-data-end-the-connection-&quot;&gt;Can switching from Wi-Fi to mobile data end the connection?&lt;/h3&gt;
&lt;p&gt;It can. The underlying network path changes, and reconnection behavior varies by client and operating system.&lt;/p&gt;
&lt;h2 id=&quot;check-the-documentation-for-the-exact-client&quot;&gt;Check the documentation for the exact client&lt;/h2&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/app-settings-android.html&quot;&gt;OpenVPN Connect’s Android settings reference&lt;/a&gt; describes a Battery Saver option that pauses the connection when the screen goes blank. That is a client-specific behavior to check, not a universal diagnosis for every screen-off disconnect. Record the setting and ask the device administrator before changing managed settings.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/windows-release-notes.html&quot;&gt;OpenVPN Connect’s Windows release notes&lt;/a&gt; document changes and fixes across client versions. Record the exact installed version before comparing behavior with a release note; a similar symptom is not proof that a listed issue caused your disconnect.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29014/diagnosing-a-vpn-that-connects-and-then-disconnects</guid>
<pubDate>Tue, 29 Sep 2026 08:44:12 +0000</pubDate>
</item>
<item>
<title>How to Compare VPN Speed Tests Without Changing Every Variable</title>
<link>https://coderlegion.com/28892/how-to-compare-vpn-speed-tests-without-changing-every-variable</link>
<description>&lt;p&gt;&lt;em&gt;Cover: Conceptual illustration; may be AI-generated. Original creation method is unverified. Image supplied from the Lisar Website archive.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A slow result is an observation to investigate. Start by recording the test conditions, then compare repeated runs that differ in one permitted variable.&lt;/p&gt;
&lt;p&gt;Originally written by Mohammad Hesameddin Montazerilisar, Technical Author for Lisar Connect and Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C. This is an edited republication of &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/how-to-read-vpn-speed-tests&quot;&gt;How to Read VPN Speed Tests: Latency, Distance, and Realistic Expectations&lt;/a&gt;. AI assisted the editing and platform presentation; no benchmark was performed for this article.&lt;/p&gt;
&lt;p&gt;A speed test produces a number, and numbers feel like verdicts. But a test result is a measurement of one moment, on one path, through one set of conditions — and reading it as more than that is how people fool themselves in both directions, blaming a VPN for a busy network or crediting a setup for a quiet hour.&lt;/p&gt;
&lt;p&gt;This article is about reading tests honestly: what the measurements mean, what actually moves them, and how to compare in a way that tells you something.&lt;/p&gt;
&lt;h3 id=&quot;what-a-test-actually-measures&quot;&gt;What a test actually measures&lt;/h3&gt;
&lt;p&gt;Most tests report several distinct things. Latency describes delay to the test endpoint; the precise measurement depends on the test method. Throughput figures describe how much data moved during a sampling window, in each direction. Each is a measurement of that moment, not a fixed property of a connection.&lt;/p&gt;
&lt;p&gt;The first honest-reading habit follows immediately: never treat one run as a verdict. A single test tells you what one moment looked like; patterns across matched runs tell you about your setup.&lt;/p&gt;
&lt;h3 id=&quot;the-factors-that-move-the-numbers&quot;&gt;The factors that move the numbers&lt;/h3&gt;
&lt;p&gt;A VPN adds a real variable — your traffic takes a path through the VPN route, and path length shows up in latency most visibly. But it joins a crowd of variables that move test results just as readily: the time of day and how busy networks are along the way, the quality of your local link at that moment (wireless conditions especially), what the device itself is doing while testing, how your internet provider routes traffic just then, the test service's own endpoint and method, and which direction of traffic the test emphasizes.&lt;/p&gt;
&lt;p&gt;That crowd is why two tests an hour apart can differ meaningfully with nothing changed on your side — and why attributing every difference to the VPN gets the analysis wrong before it starts.&lt;/p&gt;
&lt;h3 id=&quot;distance-and-route-honestly-stated&quot;&gt;Distance and route, honestly stated&lt;/h3&gt;
&lt;p&gt;Route and distance can influence latency, alongside congestion, peering and device conditions. A geographically nearby endpoint does not by itself guarantee a better result. Identify the route and endpoint you actually tested before comparing numbers.&lt;/p&gt;
&lt;p&gt;A specific exit, where the selected plan and setup support one, may be chosen for a routing requirement. That choice does not guarantee a latency or throughput result. Keep the intended route in the test record.&lt;/p&gt;
&lt;h3 id=&quot;how-to-test-so-the-result-means-something&quot;&gt;How to test so the result means something&lt;/h3&gt;
&lt;p&gt;Fair testing is mostly discipline about conditions. Test the same way each time: the same device, the same test service, comparable times of day, and a stable local link rather than a marginal wireless spot. Compare like with like — connected runs against connected runs under matched conditions, and any permitted with/without comparison done back-to-back rather than across different hours. Run more than once and look at the pattern, not the outlier. And change one thing between comparisons, because a test that varies the network, the device, and the hour simultaneously has measured everything and isolated nothing.&lt;/p&gt;
&lt;p&gt;Do that much and your results start meaning something: not a verdict about &quot;speed,&quot; but a readable picture of how your setup behaves under the conditions you actually use it in.&lt;/p&gt;
&lt;h3 id=&quot;reading-results-without-fooling-yourself&quot;&gt;Reading results without fooling yourself&lt;/h3&gt;
&lt;p&gt;A few interpretive habits close the loop. Expect variation and treat bands, not single numbers, as the signal. Let latency and throughput answer their own questions — a distant route can add delay while data still moves well, and those are different facts. Weigh the moment: an evening test on busy networks describes evenings, not your setup. And when a result genuinely surprises you across repeated, matched runs, that's an observation worth writing down — conditions, times, device, network — because specifics are what turn &quot;it seems slow&quot; into something official support can actually engage with.&lt;/p&gt;
&lt;p&gt;No test, read well or badly, changes what this series has said throughout: performance depends on many parties between you and any service, and no number from one moment promises the next. Read tests as weather reports, not contracts, and they become genuinely useful.&lt;/p&gt;
&lt;h3 id=&quot;read-the-measurement-method&quot;&gt;Read the measurement method&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://speed.cloudflare.com/about&quot;&gt;Cloudflare describes its test methodology&lt;/a&gt;, including why routing and methodology can produce different results across test services. &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.measurementlab.net/tests/ndt/&quot;&gt;M-Lab describes NDT&lt;/a&gt; as a single-stream bulk-transport measurement. The services are references for understanding a result, not interchangeable benchmarks. Review the chosen test service’s data handling before running a test.&lt;/p&gt;
&lt;h3 id=&quot;keep-a-useful-comparison-record&quot;&gt;Keep a useful comparison record&lt;/h3&gt;
&lt;p&gt;Record the device and client version, local network, VPN state, intended profile, test service and endpoint, time, and repeated results. Keep latency separate from upload and download throughput. If disconnecting the VPN is not permitted by device or network policy, keep it connected and ask the responsible administrator for an approved comparison.&lt;/p&gt;
&lt;p&gt;No credential, profile-file contents, or private endpoint is needed in a public report. A repeated pattern under matched conditions is a useful support observation; it does not prove which component caused it.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/28892/how-to-compare-vpn-speed-tests-without-changing-every-variable</guid>
<pubDate>Mon, 28 Sep 2026 09:02:22 +0000</pubDate>
</item>
<item>
<title>A Safe Clock Check for VPN Validation Failures</title>
<link>https://coderlegion.com/28787/a-safe-clock-check-for-vpn-validation-failures</link>
<description>&lt;p&gt;When a VPN profile that worked previously fails during validation, the device clock is one low-risk thing to check. The useful question is whether the system represents the correct instant, not whether two devices show the same local hour.&lt;/p&gt;
&lt;p&gt;By Mohammad Hesameddin Montazerilisar, technical author for Lisar Connect. Adapted from the &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/device-date-time-vpn-connection&quot;&gt;original Lisar guide&lt;/a&gt;, published July 10, 2026 and updated September 22, 2026. AI assistance was used for editing and presentation; the technical guidance follows the original article.&lt;/p&gt;
&lt;h3 id=&quot;why-certificate-checks-depend-on-time&quot;&gt;Why certificate checks depend on time&lt;/h3&gt;
&lt;p&gt;Many secure connections evaluate validity periods. In certificate-based checks, the current time is compared with the certificate's validity period. If a device believes it is in the wrong day, month, or year, a certificate can appear expired or not yet valid.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc5280#section-4.1.2.5&quot;&gt;RFC 5280, section 4.1.2.5&lt;/a&gt; describes that validity interval. Checking the clock does not require opening a sensitive profile or inspecting private certificate material.&lt;/p&gt;
&lt;p&gt;Correcting a wrong clock does not renew a genuinely expired certificate. If the error remains after the clock is correct, report it to the responsible service or administrator. Do not turn the clock back or disable certificate validation to make the connection work.&lt;/p&gt;
&lt;h3 id=&quot;separate-the-clock-the-time-zone-and-synchronization&quot;&gt;Separate the clock, the time zone, and synchronization&lt;/h3&gt;
&lt;p&gt;These are related settings with different jobs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;System clock:&lt;/strong&gt; the device's estimate of the current instant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Time zone:&lt;/strong&gt; the rules used to display that instant as a local date and time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Synchronization:&lt;/strong&gt; the supported process that keeps the clock aligned with an appropriate time source.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Microsoft documents that Windows maintains &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/windows/win32/sysinfo/system-time&quot;&gt;system time in UTC&lt;/a&gt;, while &lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/windows/win32/sysinfo/local-time&quot;&gt;local time&lt;/a&gt; is derived using the configured time zone.&lt;/p&gt;
&lt;p&gt;Two devices can therefore show different local hours and still represent the same instant. A different display zone alone is not evidence of a certificate-time problem. Manually changing the hour to compensate for the wrong zone can move the actual clock away from the correct time.&lt;/p&gt;
&lt;p&gt;Likewise, an enabled automatic-time setting does not establish that the last synchronization succeeded, particularly after a long offline period or a restored snapshot.&lt;/p&gt;
&lt;h3 id=&quot;use-a-controlled-check&quot;&gt;Use a controlled check&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Check the complete date, including the year.&lt;/li&gt;
&lt;li&gt;Check the local time and configured time zone separately.&lt;/li&gt;
&lt;li&gt;Inspect the supported automatic-time and synchronization settings.&lt;/li&gt;
&lt;li&gt;Confirm that ordinary internet access is available.&lt;/li&gt;
&lt;li&gt;Follow the operating system's or organization's approved process if the clock needs correction.&lt;/li&gt;
&lt;li&gt;Reopen the compatible VPN client and test the same assigned profile.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;On a managed device, some of these controls may be administered centrally. Contact the responsible administrator when they are restricted or when the clock repeatedly changes. A VPN troubleshooting task is not permission to override device policy.&lt;/p&gt;
&lt;p&gt;Keep the comparison small. Replacing the profile, changing networks, adjusting the clock, and updating the client in one step makes the result harder to interpret.&lt;/p&gt;
&lt;h3 id=&quot;treat-symptoms-as-clues&quot;&gt;Treat symptoms as clues&lt;/h3&gt;
&lt;p&gt;A validation failure after a device has been restored, a previously working profile failing on one device, or date-related warnings from other secure services can justify a clock check. None proves that time is the cause.&lt;/p&gt;
&lt;p&gt;Record the exact client message and the stage at which it appears. A broad connection error can represent several different causes.&lt;/p&gt;
&lt;p&gt;If another authorized device works with the same assigned profile, compare its clock, operating-system version, client version, network, and failure stage. Do not borrow another person's profile to create a comparison.&lt;/p&gt;
&lt;h3 id=&quot;continue-when-the-clock-is-correct&quot;&gt;Continue when the clock is correct&lt;/h3&gt;
&lt;p&gt;After the clock check, return to the ordinary diagnostic order: internet access, current profile assignment, compatible client, required permissions, and the exact connection stage.&lt;/p&gt;
&lt;p&gt;Repeatedly importing the same file is unlikely to clarify a clock issue. It can leave several similar entries in the client and make the intended profile harder to identify.&lt;/p&gt;
&lt;p&gt;A useful support note records the device and client versions, whether date and synchronization were checked, the network type, the exact status, and what happened in a controlled retest. Keep profile files, credentials, and private account details out of a public report.&lt;/p&gt;
&lt;p&gt;The clock check is a small diagnostic step with a specific purpose. It helps separate time-based validation from display preferences while keeping the existing security checks in place.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cover: Conceptual illustration; may be AI-generated. Original creation method is unverified. Image supplied from the Lisar Website archive.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/28787/a-safe-clock-check-for-vpn-validation-failures</guid>
<pubDate>Sun, 27 Sep 2026 08:46:22 +0000</pubDate>
</item>
<item>
<title>A Local Printer Disappears on VPN: A Non-Destructive Diagnostic Checklist</title>
<link>https://coderlegion.com/28130/a-local-printer-disappears-on-vpn-a-non-destructive-diagnostic-checklist</link>
<description>&lt;p&gt;A printer missing from the discovery list can look like a VPN failure even while websites continue to load. The first task is to identify which destination and which operation are failing. This checklist keeps the comparison controlled and leaves network changes with the responsible administrator.&lt;/p&gt;
&lt;p&gt;Originally written by Mohammad Hesameddin Montazerilisar, Technical Author for Lisar Connect and Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C. Adapted from his human-authored &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-local-network-printers-devices&quot;&gt;VPN and Local Network Devices: Printers, NAS, and Nearby Services&lt;/a&gt;, with AI assistance for editing and structure.&lt;/p&gt;
&lt;h3 id=&quot;separate-the-destination-from-the-connection-state&quot;&gt;Separate the destination from the connection state&lt;/h3&gt;
&lt;p&gt;A website is an internet destination. A printer, NAS, or casting device in your building is usually a local-network destination. Reaching one does not establish that you can reach the other. A working internet connection can therefore coexist with a missing nearby device.&lt;/p&gt;
&lt;p&gt;Keep the symptom specific. “The printer is absent from the device list” describes a discovery problem. “The printer is listed, but the job does not complete” describes a different observation. Neither observation alone proves the VPN service is down. Start with what the device actually shows.&lt;/p&gt;
&lt;h3 id=&quot;check-the-local-device-before-changing-the-vpn-setup&quot;&gt;Check the local device before changing the VPN setup&lt;/h3&gt;
&lt;p&gt;Confirm that the printer or storage device is powered on, awake, and connected to the network you expect. Check whether the computer is on that same intended local network. A nearby object is not necessarily reachable from the network your computer has joined.&lt;/p&gt;
&lt;p&gt;Then open a known website while the VPN is connected. Record the result separately from the local-device result. If browsing works, focus the next checks on local access and discovery. If browsing also fails, keep that broader symptom visible rather than treating every failure as a printer problem.&lt;/p&gt;
&lt;h3 id=&quot;compare-conditions-one-at-a-time&quot;&gt;Compare conditions one at a time&lt;/h3&gt;
&lt;p&gt;Where your device and network policies permit it, note whether the same nearby device is reachable with the VPN disconnected. Do not interrupt a connection that your organization requires to remain active. Ask the responsible administrator for an approved comparison instead.&lt;/p&gt;
&lt;p&gt;A change associated with the connection is a useful clue, not a complete diagnosis. Avoid changing the client, profile, network, and printer configuration at once. That would remove the stable baseline needed to understand the difference.&lt;/p&gt;
&lt;p&gt;If another authorized device is available on the same local network, compare its result too. Record the operating system, VPN client, and connection state of each device. One laptop working while another fails does not prove the profile is faulty; their local conditions may differ.&lt;/p&gt;
&lt;h3 id=&quot;account-for-where-the-vpn-runs&quot;&gt;Account for where the VPN runs&lt;/h3&gt;
&lt;p&gt;A VPN client on one laptop and a VPN connection on a router are different arrangements. They relate to the local network differently, and neither arrangement guarantees access to every nearby device.&lt;/p&gt;
&lt;p&gt;Client behavior, operating-system settings, and network policy also matter. Do not assume that a particular printer, NAS, router, or client combination will behave the same everywhere. The documented setup and the network owner's requirements determine which behavior is intended.&lt;/p&gt;
&lt;h3 id=&quot;keep-configuration-changes-with-their-owner&quot;&gt;Keep configuration changes with their owner&lt;/h3&gt;
&lt;p&gt;This first check should produce a clear observation, not an improvised routing change. On a workplace, venue, or managed network, ask its administrator whether local-device access is permitted and which setup supports it.&lt;/p&gt;
&lt;p&gt;Do not disable firewalls, change router settings, or add broad access rules just to make discovery work. Those decisions belong to the person responsible for the network. Lisar profile management does not replace network administration or grant permission to reach local resources.&lt;/p&gt;
&lt;h3 id=&quot;use-platform-guidance-for-the-next-supported-step&quot;&gt;Use platform guidance for the next supported step&lt;/h3&gt;
&lt;p&gt;Microsoft's &lt;a rel=&quot;nofollow&quot; href=&quot;https://support.microsoft.com/en-us/windows/hardware/printer/share-a-printer-as-a-network-printer&quot;&gt;network printer sharing guidance&lt;/a&gt; covers the requirements for a Windows shared printer. Apple's &lt;a rel=&quot;nofollow&quot; href=&quot;https://support.apple.com/en-ae/guide/mac-help/-mh14002/mac&quot;&gt;printing troubleshooting guidance&lt;/a&gt; includes checking the printer's power and network connection and asking its manager for help when needed.&lt;/p&gt;
&lt;p&gt;Apply the guidance that matches the actual device and approved setup. These references do not establish universal printer compatibility with Lisar or promise that a VPN setting will solve the problem.&lt;/p&gt;
&lt;h3 id=&quot;what-the-checks-establish&quot;&gt;What the checks establish&lt;/h3&gt;
&lt;p&gt;If the internet works but the nearby device does not, keep the local-access question separate. Confirm power and network membership, compare permitted connection states, and record device differences. Then use the network owner's supported path. This narrows the question without presenting an untested configuration change as a fix.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cover: Conceptual illustration; may be AI-generated. Original creation method is unverified. Image supplied from the Lisar Website archive.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/28130/a-local-printer-disappears-on-vpn-a-non-destructive-diagnostic-checklist</guid>
<pubDate>Tue, 22 Sep 2026 08:45:39 +0000</pubDate>
</item>
<item>
<title>How Kubernetes Networking Works | Pods, Services &amp; DNS Explained for Beginners</title>
<link>https://coderlegion.com/27950/how-kubernetes-networking-works-pods-services-dns-explained-for-beginners</link>
<description>&lt;p&gt;A new video is out!&lt;/p&gt;
&lt;p&gt;I’m explaining Kubernetes networking in my little way, especially how Pods, Services, and DNS work together.&lt;/p&gt;
&lt;p&gt;If you’re learning Kubernetes and networking has been confusing, this one is for you.&lt;/p&gt;
&lt;p&gt;How Kubernetes Networking Works | Pods, Services &amp;amp; DNS Explained for Beginners&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://youtu.be/pwoCmGGoTzI&quot;&gt;Watch the full video here&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;kubernetes-devops-cloudnative-techcommunity&quot;&gt;Kubernetes #DevOps #CloudNative #TechCommunity&lt;/h2&gt;
</description>
<category>Videos</category>
<guid isPermaLink="true">https://coderlegion.com/27950/how-kubernetes-networking-works-pods-services-dns-explained-for-beginners</guid>
<pubDate>Mon, 21 Sep 2026 12:24:10 +0000</pubDate>
</item>
<item>
<title>Before You Import a VPN Profile, Check Who Manages the Device</title>
<link>https://coderlegion.com/27902/before-you-import-a-vpn-profile-check-who-manages-the-device</link>
<description>&lt;p&gt;When a VPN rollout reaches a company laptop, the first dependency is often a policy decision. The person using the device may not be allowed to install a client, add a profile, import a certificate, or change network settings. A useful preflight makes those boundaries explicit before anyone starts changing the machine.&lt;/p&gt;
&lt;p&gt;Originally written by Mohammad Hesameddin Montazerilisar, Technical Author for Lisar Connect and Manager of MONTAZERI COMPUTERS &amp;amp; REQUISITES TRADING CO. L.L.C. Adapted from his human-authored &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/company-managed-devices-vpn-setup&quot;&gt;Company-Managed Devices and VPN Setup&lt;/a&gt;, with AI assistance for editing and structure.&lt;/p&gt;
&lt;h2 id=&quot;establish-the-policy-owner&quot;&gt;Establish the policy owner&lt;/h2&gt;
&lt;p&gt;Start by separating personal, company-managed, and client-managed devices. Ask who owns the policy for each group. The person who uses a laptop every day is not necessarily the person authorized to approve its apps or network configuration.&lt;/p&gt;
&lt;p&gt;This matters particularly for contractors using a client's hardware. A setup path accepted on your own company's devices does not establish permission on the client's device. Route the question through the team that manages that device.&lt;/p&gt;
&lt;h2 id=&quot;check-the-four-surfaces-setup-may-touch&quot;&gt;Check the four surfaces setup may touch&lt;/h2&gt;
&lt;p&gt;Ask the policy owner which actions are permitted:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Installing the intended VPN client.&lt;/li&gt;
&lt;li&gt;Adding or importing a VPN profile.&lt;/li&gt;
&lt;li&gt;Importing certificates, when the approved setup requires them.&lt;/li&gt;
&lt;li&gt;Changing relevant network settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Treat an unclear answer as an unresolved dependency. Do not use repeated installation attempts or unrelated settings changes to discover a policy by trial and error. A blocked control is a reason to ask its owner for the supported path.&lt;/p&gt;
&lt;p&gt;Device management may also provide the configuration centrally. Microsoft documents assigning VPN settings to users and devices through Intune. Apple's deployment documentation describes managed VPN payloads and their platform and enrollment constraints. These are examples of management mechanisms; they do not establish which policy your organization uses or certify any particular service integration.&lt;/p&gt;
&lt;h2 id=&quot;record-the-permitted-path-before-rollout&quot;&gt;Record the permitted path before rollout&lt;/h2&gt;
&lt;p&gt;A compact planning record can answer six questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Which device group is in scope?&lt;/li&gt;
&lt;li&gt;Who confirmed the applicable policy?&lt;/li&gt;
&lt;li&gt;Which client and configuration method are permitted for that group?&lt;/li&gt;
&lt;li&gt;Where does each person obtain the profile assigned to them?&lt;/li&gt;
&lt;li&gt;Who handles setup questions or a blocked step?&lt;/li&gt;
&lt;li&gt;What is the disposition when no setup path is permitted?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The last answer can legitimately be “no setup on this device.” Keep that decision visible so it is not mistaken for unfinished installation work. Record ownership and instructions without putting profile contents, credentials, tokens, or private keys into the shared document.&lt;/p&gt;
&lt;h2 id=&quot;a-profile-file-operates-within-the-policy&quot;&gt;A profile file operates within the policy&lt;/h2&gt;
&lt;p&gt;Where device policy permits an appropriate OpenVPN-compatible client, an assigned .ovpn file provides that client's connection configuration. The file does not grant installation rights or change management restrictions.&lt;/p&gt;
&lt;p&gt;For Lisar, profile-specific information comes from the user's own Panel profile. Select a setup method supported by the actual device and allowed by its policy. Keep downloaded profile files and access material out of shared planning documents and public support threads.&lt;/p&gt;
&lt;p&gt;A successful file download is therefore one step in an allowed setup process. It is not evidence that the device owner has approved that process.&lt;/p&gt;
&lt;h2 id=&quot;travel-and-router-placement-do-not-remove-the-boundary&quot;&gt;Travel and router placement do not remove the boundary&lt;/h2&gt;
&lt;p&gt;A managed laptop remains managed at home, at a hotel, or in a coworking space. Check its approved setup before departure, when the policy owner and support team are available. A change of location does not create permission for an improvised configuration.&lt;/p&gt;
&lt;p&gt;Router-based VPN setup also changes where the connection is handled, not who controls the laptop. It depends on the router's actual compatibility and the approved network plan. It does not remove device restrictions or substitute for permission to use a service.&lt;/p&gt;
&lt;h2 id=&quot;verify-the-agreed-scope&quot;&gt;Verify the agreed scope&lt;/h2&gt;
&lt;p&gt;Once the policy owner has confirmed an allowed path, follow the corresponding instructions and verify the intended connection and authorized resource separately. If a step is unavailable, preserve the observed stage and ask the responsible team to resolve it.&lt;/p&gt;
&lt;p&gt;VPN setup does not replace endpoint security, identity management, SSO, device management, firewall policy, or the organization's other controls. A connection by itself does not guarantee access to a company system. The practical outcome of preflight is a clear owner and a permitted setup path for each device group.&lt;/p&gt;
&lt;h2 id=&quot;platform-references&quot;&gt;Platform references&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://learn.microsoft.com/en-us/intune/device-configuration/templates/configure-vpn&quot;&gt;Microsoft Intune: Create VPN profiles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://support.apple.com/en-au/guide/deployment/-dep2d2adb35d/web&quot;&gt;Apple: VPN device management settings overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These references describe platform management capabilities. Your organization's IT team determines the configuration and policy that apply to its devices.&lt;/p&gt;
&lt;p&gt;Conceptual illustration; may be AI-generated. Original creation method is unverified. Image supplied from the Lisar Website archive.&lt;/p&gt;
&lt;p&gt;Cover image description: A blue illustration shows a laptop with a VPN warning and a broken connection path. Beside it, linked icons represent notes, a screenshot, a clock, and a report; a checklist notebook sits in front. This is conceptual artwork, not a live interface or test result.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27902/before-you-import-a-vpn-profile-check-who-manages-the-device</guid>
<pubDate>Mon, 21 Sep 2026 08:38:30 +0000</pubDate>
</item>
<item>
<title>Before You Ask for VPN Help: Record the Stage, Status, and Timeline</title>
<link>https://coderlegion.com/27816/before-you-ask-for-vpn-help-record-the-stage-status-and-timeline</link>
<description>&lt;p&gt;Before trying another fix, record the last successful setup stage, the exact status, and the timing. A small, controlled problem report is more useful than a list of unrelated changes.&lt;/p&gt;
&lt;p&gt;By Mohammad Hesameddin Montazerilisar, who writes technical guidance for Lisar Connect. Edited with AI assistance from the author's &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/record-vpn-problem-before-asking-help&quot;&gt;original article&lt;/a&gt;, published July 10, 2026 and updated July 11, 2026. The substantive guidance comes from that human-authored source.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Cover illustration: A blue illustration shows a laptop with a VPN warning and a broken connection path. Beside it, linked icons represent notes, a screenshot, a clock, and a report; a checklist notebook sits in front. This is conceptual artwork, not a live interface or test result. Existing source artwork, potentially AI-generated; the original creation method is unverified.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;identify-the-last-step-that-worked&quot;&gt;Identify the last step that worked&lt;/h2&gt;
&lt;p&gt;“VPN not working” describes an outcome, but it does not show where the process stopped. Separate downloading the profile, importing it, approving the device permission, connecting, and using the connection.&lt;/p&gt;
&lt;p&gt;Record the last stage you can confirm:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The profile file downloaded.&lt;/li&gt;
&lt;li&gt;The compatible client accepted the file.&lt;/li&gt;
&lt;li&gt;The profile was imported or saved.&lt;/li&gt;
&lt;li&gt;The operating system allowed the VPN configuration.&lt;/li&gt;
&lt;li&gt;The client attempted to connect.&lt;/li&gt;
&lt;li&gt;The client showed an active connection.&lt;/li&gt;
&lt;li&gt;Internet access and the expected services worked after connection.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;“Import succeeded, but Connect returns to disconnected after ten seconds” gives the reviewer a specific transition to investigate. If you cannot tell whether import completed, say so. Uncertainty is useful when it identifies the next fact to check.&lt;/p&gt;
&lt;h2 id=&quot;record-the-device-client-and-network&quot;&gt;Record the device, client, and network&lt;/h2&gt;
&lt;p&gt;Include the device type, operating-system version, VPN client and version, and whether the device is personal or managed by an organization. Use the version actually shown by the device or client. Also note whether the setup worked before and whether software changed recently.&lt;/p&gt;
&lt;p&gt;Record the network type: home or office Wi-Fi, hotel or public Wi-Fi, or mobile data. Note whether ordinary internet access worked before the VPN attempt and whether a network sign-in page appeared. If the device moved between Wi-Fi and mobile data during the test, include that fact.&lt;/p&gt;
&lt;p&gt;Do not change an organization's router or firewall settings to create a comparison. When appropriate, a second network you are allowed to use is enough. A successful test on one device also does not establish that another device has the same client capabilities or operating-system behavior.&lt;/p&gt;
&lt;h2 id=&quot;preserve-the-exact-wording-and-a-short-timeline&quot;&gt;Preserve the exact wording and a short timeline&lt;/h2&gt;
&lt;p&gt;Write down the client's actual status or error. Keep the observation separate from your interpretation.&lt;/p&gt;
&lt;p&gt;“The client shows Connecting for 15 seconds, then returns to Disconnected” records behavior. “The server rejected me” assigns a cause that the observation alone may not establish.&lt;/p&gt;
&lt;p&gt;Note when the wording appeared: during import, when Connect was pressed, or after an active connection had been shown. Add the approximate date and local time, the last successful connection, the first failed attempt, and relevant changes between them.&lt;/p&gt;
&lt;p&gt;A few lines are enough. The original guide gives this illustrative sequence: a successful connection on home Wi-Fi, an operating-system update that evening, a connection failure the next morning despite a successful import, and the same result on mobile data that afternoon. The sequence is an example, not a measured incident or a claim that the update caused the failure.&lt;/p&gt;
&lt;h2 id=&quot;keep-the-evidence-small-and-private&quot;&gt;Keep the evidence small and private&lt;/h2&gt;
&lt;p&gt;A screenshot can preserve a status message or permission prompt. Review it before sharing and remove unrelated account names, email addresses, billing information, notifications, device identifiers, QR codes, access links, and credentials.&lt;/p&gt;
&lt;p&gt;Capture the relevant status area without opening the profile's contents. Pair the image with the stage and time; a screenshot alone may omit what happened immediately beforehand.&lt;/p&gt;
&lt;p&gt;Do not routinely attach an assigned profile file, password, verification code, token, cookie, private key, or certificate material. Start with device, version, stage, network type, wording, and timing. If a formal support process requires more, confirm the recipient and channel and follow that process.&lt;/p&gt;
&lt;h2 id=&quot;use-a-repeatable-report&quot;&gt;Use a repeatable report&lt;/h2&gt;
&lt;p&gt;Copy the fields below into your notes and fill only what you can establish:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Device and operating-system version:&lt;/li&gt;
&lt;li&gt;VPN client and version:&lt;/li&gt;
&lt;li&gt;Personal or managed device:&lt;/li&gt;
&lt;li&gt;Assigned profile current or uncertain:&lt;/li&gt;
&lt;li&gt;Network used:&lt;/li&gt;
&lt;li&gt;Ordinary internet access before VPN:&lt;/li&gt;
&lt;li&gt;Last successful setup stage:&lt;/li&gt;
&lt;li&gt;Exact status or error:&lt;/li&gt;
&lt;li&gt;Approximate date and local time:&lt;/li&gt;
&lt;li&gt;Last known successful connection:&lt;/li&gt;
&lt;li&gt;Recent changes:&lt;/li&gt;
&lt;li&gt;Result on another allowed network or device:&lt;/li&gt;
&lt;li&gt;Screenshot reviewed for private information:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This record identifies the setup and the failure without exposing the profile itself.&lt;/p&gt;
&lt;h2 id=&quot;change-one-variable-at-a-time&quot;&gt;Change one variable at a time&lt;/h2&gt;
&lt;p&gt;Keep the device, client, and profile fixed when comparing two allowed networks. For an authorized comparison between devices, keep the network and intended profile assignment clear.&lt;/p&gt;
&lt;p&gt;Changing clients, importing several copies, switching networks, and altering device settings in one pass makes the final result harder to interpret. Stop once the evidence is sufficient. More tests are not automatically better, especially on managed devices.&lt;/p&gt;
&lt;h2 id=&quot;questions-to-settle-before-sending&quot;&gt;Questions to settle before sending&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;What matters most?&lt;/strong&gt; The last successful stage and the stage that failed. “Imported but did not connect” gives support a clearer starting point than “not working.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Should the profile file be attached?&lt;/strong&gt; Not as a routine first step. Begin with the limited record above; use an explicitly authorized process if more is required.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why record the time?&lt;/strong&gt; It helps correlate the issue with software, profile, network, or service changes without sharing credentials.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Are screenshots enough?&lt;/strong&gt; They are useful when reviewed for private information and accompanied by the stage and timeline.&lt;/p&gt;
&lt;h2 id=&quot;further-reference&quot;&gt;Further reference&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/import-profile.html&quot;&gt;OpenVPN Connect: Import a Profile&lt;/a&gt; documents the import stage.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/troubleshooting.html&quot;&gt;OpenVPN Connect: Troubleshooting Hub&lt;/a&gt; separates connection-profile and authentication help.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/troubleshooting-faqs.html&quot;&gt;OpenVPN Connect: Troubleshooting FAQs&lt;/a&gt; provides client-specific guidance; use the section matching the observed issue.&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27816/before-you-ask-for-vpn-help-record-the-stage-status-and-timeline</guid>
<pubDate>Sun, 20 Sep 2026 09:03:09 +0000</pubDate>
</item>
<item>
<title>DHCP Snooping (Networking)</title>
<link>https://coderlegion.com/27208/dhcp-snooping-networking</link>
<description>&lt;p&gt;What is DHCP Snooping?&lt;br&gt;
DHCP snooping is a Layer 2 security feature on network switches that blocks unauthorized devices from acting as fake DHCP servers.&lt;br&gt;
I practiced it via Cisco Packet tracer.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27208/dhcp-snooping-networking</guid>
<pubDate>Tue, 15 Sep 2026 02:43:10 +0000</pubDate>
</item>
<item>
<title>ICMP vs TCP vs UDP: the difference, explained for developers</title>
<link>https://coderlegion.com/27050/icmp-vs-tcp-vs-udp-the-difference-explained-for-developers</link>
<description>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;TL;DR.&lt;/strong&gt; ICMP, TCP and UDP all travel inside IP packets, but they ask different questions. ICMP echo (ping) asks &quot;does this address answer at all?&quot; and needs no port. TCP asks &quot;is a program listening on this port?&quot; and gets a clear yes, a clear no, or silence. UDP asks nothing by itself: you only learn something if the program on the other side chooses to reply. A closed port answers differently on each one, and that difference is most of what a network check can and cannot tell you. The &lt;a rel=&quot;nofollow&quot; href=&quot;https://uptimepage.dev/blog/icmp-vs-tcp-vs-udp?utm_source=coderlegion&amp;amp;utm_medium=community&amp;amp;utm_campaign=icmp-tcp-udp&amp;amp;utm_content=inline&quot;&gt;original post&lt;/a&gt; has the same text with a collapsible FAQ and the RFC list at the end.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;one-address-three-ways-to-knock&quot;&gt;One address, three ways to knock&lt;/h3&gt;
&lt;p&gt;Every packet on the internet is an IP packet. IP knows how to move a packet from one address to another and nothing else. One byte in the IP header says what is inside, and &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml&quot;&gt;IANA keeps the list&lt;/a&gt;: ICMP is protocol 1, TCP is protocol 6, UDP is protocol 17. The three are siblings: same addresses, same routers, and a different promise about what happens once the packet arrives.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://uptimepage.dev/static/marketing/blog-icmp-tcp-udp-exchanges.webp&quot; alt=&quot;ICMP echo, TCP three-way handshake and UDP datagram drawn as three lanes between you and a host, each ending with what silence means on that protocol.&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Three ways to knock on one address. The last row of each lane is what silence means there.&lt;/em&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;ICMP &lt;/th&gt;&lt;th&gt;TCP &lt;/th&gt;&lt;th&gt;UDP&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Specification &lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc792&quot;&gt;RFC 792&lt;/a&gt; (1981), &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc4443&quot;&gt;RFC 4443&lt;/a&gt; for IPv6 &lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc9293&quot;&gt;RFC 9293&lt;/a&gt; (2022) &lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc768&quot;&gt;RFC 768&lt;/a&gt; (1980)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;IP protocol number &lt;/td&gt;&lt;td&gt;1 (58 for ICMPv6) &lt;/td&gt;&lt;td&gt;6 &lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Ports &lt;/td&gt;&lt;td&gt;none &lt;/td&gt;&lt;td&gt;source and destination &lt;/td&gt;&lt;td&gt;source and destination&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Handshake &lt;/td&gt;&lt;td&gt;none &lt;/td&gt;&lt;td&gt;three packets before any data &lt;/td&gt;&lt;td&gt;none&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Delivery guarantee &lt;/td&gt;&lt;td&gt;none &lt;/td&gt;&lt;td&gt;ordered, complete, retransmitted &lt;/td&gt;&lt;td&gt;none&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Header &lt;/td&gt;&lt;td&gt;8 bytes for an echo &lt;/td&gt;&lt;td&gt;20 bytes minimum &lt;/td&gt;&lt;td&gt;8 bytes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Typical users &lt;/td&gt;&lt;td&gt;ping, traceroute, error reports &lt;/td&gt;&lt;td&gt;HTTP/1.1 and HTTP/2, TLS, SSH, SQL, SMTP &lt;/td&gt;&lt;td&gt;DNS, NTP, QUIC and HTTP/3, video, games&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;icmp-the-network-talking-about-itself&quot;&gt;ICMP: the network talking about itself&lt;/h3&gt;
&lt;p&gt;ICMP is not a transport. RFC 792 says it plainly: ICMP &quot;is actually an integral part of IP, and must be implemented by every IP module.&quot; It exists so that routers and hosts can report on delivery: this destination is unreachable, that packet ran out of hops. ICMP messages have a type and a code but no ports, because nothing sits on top of ICMP waiting for them. The IP stack consumes them itself.&lt;/p&gt;
&lt;p&gt;The one ICMP message everybody has typed is the echo. &lt;code&gt;ping&lt;/code&gt; sends an echo request (type 8, or 128 in ICMPv6) and the far host's kernel sends back an echo reply (type 0, or 129). No program had to be running. &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc1122&quot;&gt;RFC 1122&lt;/a&gt;, the host requirements standard, makes it a rule: &quot;Every host MUST implement an ICMP Echo server function that receives Echo Requests and sends corresponding Echo Replies.&quot;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ping -c 1 uptimepage.dev
PING uptimepage.dev (204.168.246.94): 56 data bytes
64 bytes from 204.168.246.94: icmp_seq=0 ttl=50 time=96.069 ms
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A reply proves two things: the address belongs to a machine that is switched on, and packets can travel there and back. It also gives you the round-trip time for free.&lt;/p&gt;
&lt;p&gt;That is all a ping proves. It says nothing about whether a web server, a database or anything else is running, and a host can answer every ping while every service on it is dead.&lt;/p&gt;
&lt;p&gt;Two things about ICMP surprise people. The first is that no reply does not mean down. Firewalls drop ICMP all the time. On AWS a fresh security group blocks it, and the &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html&quot;&gt;documentation&lt;/a&gt; says so: &quot;To ping your instance, you must add one of the following inbound ICMP rules.&quot; Before you rely on ping for a host, confirm the host answers a ping at all.&lt;/p&gt;
&lt;p&gt;The second is that sending ICMP needs privilege. A raw socket needs &lt;code&gt;CAP_NET_RAW&lt;/code&gt;. Linux has an unprivileged alternative, the ICMP datagram socket, but the &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.kernel.org/networking/ip-sysctl.html&quot;&gt;kernel documentation&lt;/a&gt; says the default &lt;code&gt;ping_group_range&lt;/code&gt; is &quot;1 0&quot;, &quot;meaning, that nobody (not even root) may create ping sockets.&quot; Docker opens that range in every container that gets its own network namespace, which is why ping works there without anyone thinking about it; a container on &lt;code&gt;--network host&lt;/code&gt; inherits the host's setting instead. I learned the limits of that the slow way: the same probe binary that pinged fine in Docker could not open an ICMP socket at all on a Firecracker microVM, until I gave it &lt;code&gt;CAP_NET_RAW&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;tcp-a-promise-before-the-first-byte&quot;&gt;TCP: a promise before the first byte&lt;/h3&gt;
&lt;p&gt;TCP is a connection. Before either side sends a byte of data, the two ends run the three-way handshake: SYN, SYN-ACK, ACK. RFC 9293, which replaced the 1981 specification in 2022, calls it &quot;the procedure used to establish a connection.&quot; It costs one round trip, and that round trip pays for every promise TCP makes afterwards: bytes arrive in order, lost segments are sent again, the receiver is not flooded (flow control), and the network is not flooded (congestion control). To the program it looks like a stream. You write bytes on one side and read the same bytes, in the same order, on the other.&lt;/p&gt;
&lt;p&gt;This is what HTTP/1.1, HTTP/2, TLS, SSH, PostgreSQL, MySQL, SMTP and most of what you deploy run on.&lt;/p&gt;
&lt;p&gt;The handshake is also a good probe, because a SYN gets one of three answers:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SYN-ACK.&lt;/strong&gt; A program is listening. The connect succeeds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RST.&lt;/strong&gt; Nothing is listening. RFC 9293 says that if the connection does not exist, &quot;a reset is sent in response to any incoming segment except another reset.&quot; Your connect fails at once with &quot;connection refused&quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nothing.&lt;/strong&gt; A firewall dropped the SYN, or the host is gone. The kernel keeps retrying. On Linux the default &lt;code&gt;tcp_syn_retries&lt;/code&gt; is 6, and the kernel documentation puts the final timeout for an active connection attempt at 131 seconds.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here are all three from my laptop. The last one has a three second limit; without it macOS waits 75 seconds.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ nc -zv uptimepage.dev 443
Connection to uptimepage.dev port 443 [tcp/https] succeeded!

$ nc -zv 127.0.0.1 9
nc: connectx to 127.0.0.1 port 9 (tcp) failed: Connection refused

$ nc -zv -G 3 uptimepage.dev 8443
nc: connectx to uptimepage.dev port 8443 (tcp) failed: Operation timed out
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://nmap.org/book/man-port-scanning-basics.html&quot;&gt;Nmap's documentation&lt;/a&gt; gives these states the names everyone uses: open, closed and filtered.&lt;/p&gt;
&lt;p&gt;What a successful handshake proves: a process accepted a connection on that port. Not that it is healthy. A database that accepts connections and then rejects every query still passes. That is why a TCP check belongs on things that have no HTTP surface (SSH, SMTP, a database port) and an HTTP check belongs on things that do.&lt;/p&gt;
&lt;h3 id=&quot;udp-a-message-nothing-more&quot;&gt;UDP: a message, nothing more&lt;/h3&gt;
&lt;p&gt;UDP is the smallest transport there is. RFC 768 fits on three pages. It adds a source port, a destination port, a length and a checksum to an IP packet, 8 bytes in total, and stops. The RFC says: &quot;The protocol is transaction oriented, and delivery and duplicate protection are not guaranteed.&quot; There is no handshake, no acknowledgement, no ordering and no retransmission, and no congestion control either. &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc8085&quot;&gt;RFC 8085&lt;/a&gt; opens by saying UDP &quot;has no inherent congestion control mechanisms&quot; and then spends more than fifty pages telling application designers how to add their own.&lt;/p&gt;
&lt;p&gt;Why anyone uses it: latency and control. A DNS lookup is one packet out and one packet back, no handshake. &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc1035&quot;&gt;RFC 1035&lt;/a&gt; capped a DNS answer over UDP at 512 bytes. EDNS(0) (&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc6891&quot;&gt;RFC 6891&lt;/a&gt;) later let a client advertise a bigger buffer, so most answers fit in one datagram today; one that still does not fit is cut short with the TC bit set, and the client asks again over TCP (&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc7766&quot;&gt;RFC 7766&lt;/a&gt;). NTP, most game traffic and real-time video use UDP because a late packet is worth less than the next one, so waiting for a retransmission is the wrong trade. And QUIC, the transport under HTTP/3, is built entirely on UDP. &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc9000&quot;&gt;RFC 9000&lt;/a&gt; states that &quot;QUIC packets are carried in UDP datagrams&quot; and gives the reason as &quot;to better facilitate deployment in existing systems and networks&quot;. In practice that means QUIC does its own handshake, loss recovery and congestion control in the application, and can change them without waiting for every operating system to update its TCP stack.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ dig @1.1.1.1 uptimepage.dev A +noall +answer +stats
; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.10.6 &amp;lt;&amp;lt;&amp;gt;&amp;gt; @1.1.1.1 uptimepage.dev A +noall +answer +stats
; (1 server found)
;; global options: +cmd
uptimepage.dev.3600INA204.168.246.94
;; Query time: 125 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Wed Sep 02 11:40:44 EEST 2026
;; MSG SIZE  rcvd: 59
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One datagram out, one datagram back carrying a 59-byte answer (67 bytes with the UDP header), and no handshake before it. Over TCP the same lookup costs two round trips, one for the handshake and one for the query, which is why DNS defaults to UDP.&lt;/p&gt;
&lt;p&gt;Now the probing problem. Send a UDP datagram to a port and what comes back?&lt;/p&gt;
&lt;p&gt;If nothing listens there, the host's IP stack should answer with an ICMP error. RFC 1122 again: &quot;If a datagram arrives addressed to a UDP port for which there is no pending LISTEN call, UDP SHOULD send an ICMP Port Unreachable message.&quot; So &quot;closed&quot; is detectable, and it is ICMP that detects it.&lt;/p&gt;
&lt;p&gt;If something listens, you get whatever that program chooses to send. A DNS server sends an answer. A syslog receiver sends nothing, ever. So silence means open, or filtered, or dead, and Nmap has a state for this, &lt;code&gt;open|filtered&lt;/code&gt;. Its documentation explains: &quot;This occurs for scan types in which open ports give no response.&quot;&lt;/p&gt;
&lt;p&gt;The consequence is that a generic &quot;UDP port check&quot; does not exist. To check a UDP service you have to speak its protocol: send a real DNS query and read the answer, send a real NTP request and check the timestamp. This is why monitoring tools have a DNS check and a TCP check but rarely a UDP check.&lt;/p&gt;
&lt;h3 id=&quot;the-same-closed-door-three-answers&quot;&gt;The same closed door, three answers&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Situation &lt;/th&gt;&lt;th&gt;ICMP echo &lt;/th&gt;&lt;th&gt;TCP SYN &lt;/th&gt;&lt;th&gt;UDP datagram&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Service up &lt;/td&gt;&lt;td&gt;echo reply &lt;/td&gt;&lt;td&gt;SYN-ACK &lt;/td&gt;&lt;td&gt;the program's reply, or nothing&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Port closed, host up &lt;/td&gt;&lt;td&gt;echo reply (ICMP has no ports) &lt;/td&gt;&lt;td&gt;RST, &quot;connection refused&quot; &lt;/td&gt;&lt;td&gt;ICMP port unreachable&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Firewall drops the packet &lt;/td&gt;&lt;td&gt;silence &lt;/td&gt;&lt;td&gt;silence, retried for about two minutes &lt;/td&gt;&lt;td&gt;silence&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Host gone &lt;/td&gt;&lt;td&gt;silence, or an unreachable error from the last router &lt;/td&gt;&lt;td&gt;silence, or that same ICMP error surfacing as &quot;no route to host&quot; &lt;/td&gt;&lt;td&gt;silence, or that same ICMP error&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Read the table by columns. TCP is the only one where &quot;closed&quot; and &quot;filtered&quot; look different on their own, UDP borrows ICMP to say &quot;closed&quot;, and ICMP cannot see ports at all. Silence is the ambiguous answer on all three, which is why no check should conclude &quot;down&quot; from one silent probe sent from one place. Two or three consecutive misses, seen from more than one network, is the honest bar. I wrote about that in &lt;a rel=&quot;nofollow&quot; href=&quot;https://uptimepage.dev/blog/stop-false-uptime-alerts?utm_source=coderlegion&amp;amp;utm_medium=community&amp;amp;utm_campaign=icmp-tcp-udp&amp;amp;utm_content=inline&quot;&gt;how to stop false uptime alerts&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;what-this-means-for-a-monitor&quot;&gt;What this means for a monitor&lt;/h3&gt;
&lt;p&gt;I build &lt;a rel=&quot;nofollow&quot; href=&quot;https://uptimepage.dev/?utm_source=coderlegion&amp;amp;utm_medium=community&amp;amp;utm_campaign=icmp-tcp-udp&amp;amp;utm_content=inline&quot;&gt;Uptimepage&lt;/a&gt;, and its check types map onto these questions, so this is how the theory turns into a config.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ping sends one ICMP echo with a 32-byte payload, the size Windows &lt;code&gt;ping&lt;/code&gt; uses (Unix &lt;code&gt;ping&lt;/code&gt; sends 56, as the transcript above shows), so middleboxes see ordinary diagnostic traffic. It tries the first IPv4 and the first IPv6 address of the host and splits the timeout between them. Silence for the whole budget is down, because an echo has no way to refuse. Use it for routers, gateways and hosts that expose no service.&lt;/li&gt;
&lt;li&gt;TCP runs the handshake and closes the connection. Accepted is up, refused is down, and a timeout is recorded as an error with the time it took. An error counts as a failed check for alerting exactly like down, so a firewalled port still opens an incident once the confirmation threshold is met. Use it for databases, brokers, SSH and mail, where &quot;a process accepted the connection&quot; is the most you can assert from outside.&lt;/li&gt;
&lt;li&gt;DNS sends a real query and checks the answer's content, so it is the UDP check for the one UDP service almost everyone depends on. It can point at a specific resolver, which matters when you want that server's view and not your cache's.&lt;/li&gt;
&lt;li&gt;HTTP is a TCP handshake, then TLS, then a request, and it records the time spent in each phase: DNS, connect, TLS and time to first byte. The connect phase is the handshake from this article, measured inside a bigger check.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pick the check that asks the question you care about, and remember what each one cannot see. There is a fuller version of that decision in the &lt;a rel=&quot;nofollow&quot; href=&quot;https://uptimepage.dev/docs/monitor-types?utm_source=coderlegion&amp;amp;utm_medium=community&amp;amp;utm_campaign=icmp-tcp-udp&amp;amp;utm_content=inline&quot;&gt;monitor types documentation&lt;/a&gt;, and a story-shaped version in &lt;a rel=&quot;nofollow&quot; href=&quot;https://uptimepage.dev/blog/osi-layers?utm_source=coderlegion&amp;amp;utm_medium=community&amp;amp;utm_campaign=icmp-tcp-udp&amp;amp;utm_content=inline&quot;&gt;the mystery of the &quot;down&quot; website&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;common-questions&quot;&gt;Common questions&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Is ICMP a transport protocol like TCP and UDP?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No. ICMP is a control protocol that belongs to IP itself, and RFC 792 says every IP module must implement it. It has no ports and carries no application data. It reports on delivery: a destination is unreachable, a packet ran out of hops, and the echo pair that ping uses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why does ping work while my website is down?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Because ping only proves that the host's IP stack answers and that packets can travel there and back. The kernel sends the echo reply, so no web server, database or other program has to be running. A host can answer every ping while every service on it is dead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why does a closed TCP port fail at once but a firewalled one hangs?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A closed port sends back a TCP reset, so the connect fails immediately with connection refused. A firewall that drops the SYN sends nothing, and the kernel keeps retrying. On Linux the default is six retries, and the kernel documentation puts the final timeout at 131 seconds.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can I check a UDP port the way I check a TCP port?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No, because an open UDP port sends nothing back unless the program behind it chooses to answer. A closed port is detectable, since the host should reply with an ICMP port unreachable message, but open and filtered both look like silence. To check a UDP service you have to speak its protocol, for example send a real DNS query.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If UDP is unreliable, why does HTTP/3 use it?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;UDP itself gives no delivery guarantee, and QUIC adds its own on top. QUIC runs inside UDP datagrams and does its own handshake, retransmission and congestion control in the application, which lets it evolve without waiting for every operating system to update its TCP stack.&lt;/p&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;IETF, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc792&quot;&gt;RFC 792: Internet Control Message Protocol&lt;/a&gt;, September 1981.&lt;/li&gt;
&lt;li&gt;IETF, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc4443&quot;&gt;RFC 4443: ICMPv6 for the Internet Protocol Version 6&lt;/a&gt;, March 2006.&lt;/li&gt;
&lt;li&gt;IETF, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc768&quot;&gt;RFC 768: User Datagram Protocol&lt;/a&gt;, August 1980.&lt;/li&gt;
&lt;li&gt;IETF, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc9293&quot;&gt;RFC 9293: Transmission Control Protocol&lt;/a&gt;, August 2022.&lt;/li&gt;
&lt;li&gt;IETF, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc1122&quot;&gt;RFC 1122: Requirements for Internet Hosts, Communication Layers&lt;/a&gt;, October 1989. Sections 3.2.2.6 and 4.1.3.1.&lt;/li&gt;
&lt;li&gt;IETF, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc8085&quot;&gt;RFC 8085: UDP Usage Guidelines&lt;/a&gt;, March 2017.&lt;/li&gt;
&lt;li&gt;IETF, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc1035&quot;&gt;RFC 1035: Domain Names, Implementation and Specification&lt;/a&gt;, November 1987. Section 4.2.1.&lt;/li&gt;
&lt;li&gt;IETF, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc6891&quot;&gt;RFC 6891: Extension Mechanisms for DNS (EDNS(0))&lt;/a&gt;, April 2013.&lt;/li&gt;
&lt;li&gt;IETF, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc7766&quot;&gt;RFC 7766: DNS Transport over TCP, Implementation Requirements&lt;/a&gt;, March 2016.&lt;/li&gt;
&lt;li&gt;IETF, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.rfc-editor.org/rfc/rfc9000&quot;&gt;RFC 9000: QUIC, a UDP-Based Multiplexed and Secure Transport&lt;/a&gt;, May 2021.&lt;/li&gt;
&lt;li&gt;IANA, &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml&quot;&gt;Assigned Internet Protocol Numbers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Linux kernel, &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.kernel.org/networking/ip-sysctl.html&quot;&gt;IP sysctl documentation&lt;/a&gt;, &lt;code&gt;tcp_syn_retries&lt;/code&gt; and &lt;code&gt;ping_group_range&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Nmap, &lt;a rel=&quot;nofollow&quot; href=&quot;https://nmap.org/book/man-port-scanning-basics.html&quot;&gt;Port scanning basics&lt;/a&gt;, the six port states.&lt;/li&gt;
&lt;li&gt;Amazon Web Services, &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html&quot;&gt;Security group rules for different use cases&lt;/a&gt;, rules for ping/ICMP.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I build &lt;a rel=&quot;nofollow&quot; href=&quot;https://uptimepage.dev/?utm_source=coderlegion&amp;amp;utm_medium=community&amp;amp;utm_campaign=icmp-tcp-udp&amp;amp;utm_content=cta&quot;&gt;Uptimepage&lt;/a&gt; because I wanted these checks for my own services: ping, TCP, DNS and HTTP with per-phase timing, plus TLS and domain expiry, heartbeats for background jobs, and browser flows, from several regions. It is AGPL-3.0 open source, so you can run it on your own server if you prefer.&lt;/p&gt;
&lt;p&gt;Now the question for the comments: do you still run ping checks on anything, and what for? I keep them for routers, gateways and hosts that expose no service, and almost nothing else. If a ping check has earned its keep for you somewhere I have not listed, I would like to hear where.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27050/icmp-vs-tcp-vs-udp-the-difference-explained-for-developers</guid>
<pubDate>Sun, 13 Sep 2026 10:00:58 +0000</pubDate>
</item>
<item>
<title>VPN Client, Profile, and Service: Three Roles to Check During Setup</title>
<link>https://coderlegion.com/27048/vpn-client-profile-and-service-three-roles-to-check-during-setup</link>
<description>&lt;p&gt;A working VPN setup involves software, connection instructions, and a service account. This guide separates those responsibilities so that an import problem is not confused with a connection-state or profile-management question.&lt;/p&gt;
&lt;p&gt;By Mohammad Hesameddin Montazerilisar. This article is adapted from the author’s &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-client-profile-service-explained&quot;&gt;original Lisar Connect article&lt;/a&gt;, first published July 8, 2026 and updated September 11, 2026. The author writes technical guidance for Lisar Connect. AI assisted the editing and presentation of this human-authored source.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Illustration of a client connection-status dashboard, not a screenshot of the current Lisar UI or a measured test.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-client-runs-the-connection&quot;&gt;The client runs the connection&lt;/h2&gt;
&lt;p&gt;The VPN client is the program on your device that establishes and maintains the connection: the software with the connect control, status indicator, and prompts. In an OpenVPN Connect setup, it reads the imported OpenVPN profile and runs the connection on the device.&lt;/p&gt;
&lt;p&gt;Client, profile, and service describe different roles. The client runs the connection, the profile supplies its connection settings, and the service manages the account, profiles, and plan. Follow the current setup guide for your device and profile when choosing the software and settings to use.&lt;/p&gt;
&lt;p&gt;This distinction matters before troubleshooting begins. A client can be installed without the intended profile being present. A profile can be imported without a connection being established. Check the stage that has actually completed instead of treating the app's presence as proof that every part is ready.&lt;/p&gt;
&lt;h2 id=&quot;the-profile-supplies-the-connection-instructions&quot;&gt;The profile supplies the connection instructions&lt;/h2&gt;
&lt;p&gt;The client needs to be told what connection to run, and that is the profile's job. In the documented OpenVPN Connect flow, the profile arrives as a &lt;code&gt;.ovpn&lt;/code&gt; file carrying the setup information for that particular connection. Obtain it from the approved source for your own assignment and follow the guide for the intended device.&lt;/p&gt;
&lt;p&gt;The file-import sequence brings the parts together: obtain the current &lt;code&gt;.ovpn&lt;/code&gt; file, open OpenVPN Connect, choose Upload File, import and save the profile, and connect. The exact screens depend on the client version and device; the current supported guide takes precedence over remembered button wording.&lt;/p&gt;
&lt;p&gt;Because the file carries profile-specific setup information, treat it as sensitive material. Do not paste its contents into a support ticket or public discussion. Do not pass it through casual chats or shared folders. When a new device needs setup, use the approved download and assignment process rather than borrowing another person's file.&lt;/p&gt;
&lt;h2 id=&quot;the-service-manages-accounts-profiles-and-plans&quot;&gt;The service manages accounts, profiles, and plans&lt;/h2&gt;
&lt;p&gt;Behind the client and file sits the service layer. It manages the account, profiles, and plan. Its current management interface is where profile-specific questions belong: which assignment is current, what the plan includes, and what status the service records for a profile.&lt;/p&gt;
&lt;p&gt;Connection-state questions start at the client and device in front of you. Questions about the client software belong with its maker's documentation. Profile and plan questions belong with the service's management interface and official support. A status shown in one layer does not automatically answer a question about another.&lt;/p&gt;
&lt;h2 id=&quot;ask-each-part-the-right-question&quot;&gt;Ask each part the right question&lt;/h2&gt;
&lt;p&gt;The service layer manages the assignment, the profile carries the instructions, and the client runs them. In the documented OpenVPN Connect flow, these roles meet in that order: management interface to file to client. Other supported setup paths use the settings and software specified in their own guides.&lt;/p&gt;
&lt;p&gt;Consider three common questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;“The button says disconnected.”&lt;/strong&gt; Start with the current client and device state. Record the wording and the stage where setup stopped.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“Is my profile still active, and what does my plan include?”&lt;/strong&gt; Check the current service-side information, rather than inferring it from an old downloaded file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“Which file should this new tablet use?”&lt;/strong&gt; Confirm the intended assignment and obtain its current profile through the supported process for that device.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This keeps a support request precise. Instead of “my VPN is missing,” describe which client is installed, whether the intended profile has been imported, what the client currently reports, and which service-side status you checked. Keep the profile contents and other secrets out of that record.&lt;/p&gt;
&lt;h2 id=&quot;keep-expectations-within-each-layer&quot;&gt;Keep expectations within each layer&lt;/h2&gt;
&lt;p&gt;The client reports connection state; it does not decide what an unrelated website or application does with the traffic. The profile supplies connection settings; it does not grant permission to use unrelated accounts or services. The service manages its own plans and profiles; it does not override the rules of networks or devices you do not control.&lt;/p&gt;
&lt;p&gt;On a managed device, follow the organization's setup process. Use the supported client and assigned profile, then verify the connection separately. The model is useful because it gives each question an appropriate starting point without promising that one status indicator proves everything.&lt;/p&gt;
&lt;h2 id=&quot;frequently-asked-questions-11&quot;&gt;Frequently asked questions&lt;/h2&gt;
&lt;h3 id=&quot;is-openvpn-connect-itself-the-vpn-service-&quot;&gt;Is OpenVPN Connect itself the VPN service?&lt;/h3&gt;
&lt;p&gt;No. OpenVPN's documentation distinguishes its client application from the compatible server or service that supplies the connection profile.&lt;/p&gt;
&lt;h3 id=&quot;does-importing-a-profile-mean-i-am-connected-&quot;&gt;Does importing a profile mean I am connected?&lt;/h3&gt;
&lt;p&gt;Importing makes the profile available to the client. Check the client's current connection state after the connection step; do not infer it from an import confirmation.&lt;/p&gt;
&lt;h3 id=&quot;where-should-a-profile-or-plan-question-go-&quot;&gt;Where should a profile or plan question go?&lt;/h3&gt;
&lt;p&gt;Use the service's current management interface and official support. For client-software questions, use the client's own documentation. Do not share profile contents to explain which layer you are checking.&lt;/p&gt;
&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/import-profile.html&quot;&gt;OpenVPN Connect: Import a Profile&lt;/a&gt; — the file-import flow and the distinction between client and service.&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/get-connection-profile.html&quot;&gt;OpenVPN Connect: How to Get Your Connection Profile&lt;/a&gt; — obtaining the profile from the responsible provider, administrator, or supported server setup.&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27048/vpn-client-profile-and-service-three-roles-to-check-during-setup</guid>
<pubDate>Sun, 13 Sep 2026 09:55:01 +0000</pubDate>
</item>
<item>
<title>VPN Troubleshooting: One Layer at a Time, A Diagnostic Checklist</title>
<link>https://coderlegion.com/26975/vpn-troubleshooting-one-layer-at-a-time-a-diagnostic-checklist</link>
<description>&lt;p&gt;By &lt;strong&gt;Mohammad Hesameddin Montazerilisar&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Originally published on &lt;a rel=&quot;nofollow&quot; href=&quot;https://lisar.io/articles/vpn-troubleshooting-checklist&quot;&gt;Lisar Connect&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Author disclosure: I write technical guidance for Lisar Connect. I wrote the original article; AI was used only for editorial assistance.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;VPN troubleshooting goes wrong in a predictable way: people change three things at once, and whatever happens next, they have learned little about the cause. A more useful approach is to check one layer at a time, in an order that rules things out, and write down what each check shows. This checklist provides that order.&lt;/p&gt;
&lt;p&gt;Before starting, respect the policies of the network and device you are using. If your organization manages the device, involve its IT team. Do not disable device security tools as a troubleshooting step. The goal is to identify where a problem occurs while staying within the supported setup.&lt;/p&gt;
&lt;h2 id=&quot;1-check-the-device-basics&quot;&gt;1. Check the device basics&lt;/h2&gt;
&lt;p&gt;Start with the simple checks: restart the VPN client. If that changes nothing, restart the device. Confirm that the operating system and VPN client are up to date through their supported update process.&lt;/p&gt;
&lt;p&gt;Note whether anything changed around the time the problem started: an operating-system update, a new application, different settings, or a change of location. Record the timing before making further changes. It gives you something concrete to compare with the client's behavior.&lt;/p&gt;
&lt;h2 id=&quot;2-test-the-internet-without-the-vpn&quot;&gt;2. Test the internet without the VPN&lt;/h2&gt;
&lt;p&gt;Disconnect the VPN and test ordinary browsing. If the connection also fails without the VPN, resolve the underlying internet connection first. There is little value in diagnosing later layers while this baseline does not work.&lt;/p&gt;
&lt;p&gt;If browsing works without the VPN and fails with it, you have narrowed the problem. Write down that difference before continuing.&lt;/p&gt;
&lt;h2 id=&quot;3-read-the-client-s-actual-state&quot;&gt;3. Read the client's actual state&lt;/h2&gt;
&lt;p&gt;Open the client and inspect what it reports. Is it connected, still trying to connect, or disconnected? Is the correct profile selected—the current one, rather than an older entry left over from a previous setup?&lt;/p&gt;
&lt;p&gt;Disconnect and reconnect once, deliberately, and watch the result. Record the status or error message instead of relying on a general description such as “the VPN is broken.”&lt;/p&gt;
&lt;p&gt;If several profiles have accumulated in the client, note that too. Selecting a stale entry can make the behavior difficult to interpret. Confirm which profile the current setup instructions require before changing or removing entries.&lt;/p&gt;
&lt;h2 id=&quot;4-confirm-that-the-profile-is-current&quot;&gt;4. Confirm that the profile is current&lt;/h2&gt;
&lt;p&gt;A setup that worked for months and then stopped deserves a profile-lifecycle check. Verify whether the profile is still active and whether it has been replaced or its status has changed.&lt;/p&gt;
&lt;p&gt;For a Lisar profile, check the Lisar Panel and the current setup instructions. If the profile has been replaced, follow the supported setup flow: download the current &lt;code&gt;.ovpn&lt;/code&gt; file, open OpenVPN Connect, choose &lt;strong&gt;Upload File&lt;/strong&gt;, import and save the profile, and connect. Once the replacement is working, remove the superseded file and stale client entry as directed by the setup instructions.&lt;/p&gt;
&lt;p&gt;The current Panel and setup guidance are the reference for this check. An old downloaded file or saved note may no longer describe the active profile.&lt;/p&gt;
&lt;h2 id=&quot;5-record-dns-shaped-symptoms-precisely&quot;&gt;5. Record DNS-shaped symptoms precisely&lt;/h2&gt;
&lt;p&gt;Sometimes the client reports a connection while browsing still fails: pages do not load by name, or applications cannot find their services. Treat this as a pattern to investigate, rather than a diagnosis to assume.&lt;/p&gt;
&lt;p&gt;Reconnect once. Try another site or application to check whether the problem affects more than one destination. Record exactly what fails and what still works.&lt;/p&gt;
&lt;p&gt;Avoid changing DNS or other configuration based on unrelated advice threads while you are collecting evidence. A precise description—such as “the client reports connected, but these names fail to load”—is useful to official support. Changing several settings at once can erase the distinction you were trying to capture.&lt;/p&gt;
&lt;h2 id=&quot;6-compare-with-another-permitted-network&quot;&gt;6. Compare with another permitted network&lt;/h2&gt;
&lt;p&gt;Try the same device and setup on a different network you are permitted to use: for example, home Wi-Fi and mobile data. Keep the device and profile the same so that the network is the variable being compared.&lt;/p&gt;
&lt;p&gt;If the problem follows the device, revisit the earlier device, client, and profile checks. If it stays with one network, that network's behavior or policies are part of the investigation.&lt;/p&gt;
&lt;p&gt;On a network you do not control, respect those policies. Use a permitted network that works, record the difference, and involve the appropriate administrator when needed.&lt;/p&gt;
&lt;h2 id=&quot;7-send-support-a-useful-record&quot;&gt;7. Send support a useful record&lt;/h2&gt;
&lt;p&gt;Even if the checklist does not resolve the problem, it can produce a much clearer support request. Include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The device and operating-system version.&lt;/li&gt;
&lt;li&gt;The VPN client and its version.&lt;/li&gt;
&lt;li&gt;When the problem started and what changed around that time.&lt;/li&gt;
&lt;li&gt;The checks you performed and what each showed.&lt;/li&gt;
&lt;li&gt;The client's status or error message.&lt;/li&gt;
&lt;li&gt;Which networks behaved differently.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Review screenshots for profile-specific or sensitive details before sending them. Use official support channels rather than posting profile information publicly.&lt;/p&gt;
&lt;p&gt;A concise report of the checks and their results gives support a starting point. It records both where the problem appears and which layers you have already tested.&lt;/p&gt;
&lt;h2 id=&quot;frequently-asked-questions-12&quot;&gt;Frequently asked questions&lt;/h2&gt;
&lt;h3 id=&quot;what-order-should-i-follow-&quot;&gt;What order should I follow?&lt;/h3&gt;
&lt;p&gt;Check the device basics, internet access without the VPN, the client's state, profile freshness, DNS-shaped symptoms, and behavior on a different permitted network. Record each result before moving on.&lt;/p&gt;
&lt;h3 id=&quot;my-vpn-worked-for-months-and-suddenly-stopped-where-should-i-look-&quot;&gt;My VPN worked for months and suddenly stopped. Where should I look?&lt;/h3&gt;
&lt;p&gt;Include the profile's current status in your checks. For Lisar, verify it in the Panel. If the profile has been replaced, use the current file and supported import process instead of repeatedly reconnecting with the old entry.&lt;/p&gt;
&lt;h3 id=&quot;it-connects-but-pages-and-applications-cannot-find-anything-what-next-&quot;&gt;It connects, but pages and applications cannot find anything. What next?&lt;/h3&gt;
&lt;p&gt;Reconnect once, test another destination, and capture the exact symptoms. A connected client does not explain every application failure; give official support the observed pattern before changing configuration.&lt;/p&gt;
&lt;h3 id=&quot;what-does-failure-on-only-one-network-tell-me-&quot;&gt;What does failure on only one network tell me?&lt;/h3&gt;
&lt;p&gt;It identifies a useful difference. Record which network works and which does not, keeping the device and profile unchanged. The network's behavior or policies may need the administrator's attention.&lt;/p&gt;
&lt;h3 id=&quot;should-i-switch-off-security-tools-to-test-the-vpn-&quot;&gt;Should I switch off security tools to test the VPN?&lt;/h3&gt;
&lt;p&gt;No. Keep device security protections in place. On a managed device, involve your organization's IT team in the troubleshooting.&lt;/p&gt;
&lt;h2 id=&quot;references-1&quot;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/import-profile.html&quot;&gt;OpenVPN Connect: Import a profile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openvpn.net/connect-docs/troubleshooting-faqs.html&quot;&gt;OpenVPN Connect: Troubleshooting FAQs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/26975/vpn-troubleshooting-one-layer-at-a-time-a-diagnostic-checklist</guid>
<pubDate>Sat, 12 Sep 2026 15:24:57 +0000</pubDate>
</item>
<item>
<title>How the Internet Finds Its Way: A Guide to DNS Resolution</title>
<link>https://coderlegion.com/25263/how-the-internet-finds-its-way-a-guide-to-dns-resolution</link>
<description>&lt;p&gt;Have you ever wondered how typing a few letters into your browser magically brings up your favorite website in milliseconds? This seamless connection is powered by a vital background process called &lt;strong&gt;DNS resolution&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id=&quot;what-is-dns-resolution-&quot;&gt;What is DNS Resolution?&lt;/h4&gt;
&lt;p&gt;DNS (Domain Name System) resolution is the translation process that converts human-readable web addresses, like &lt;code&gt;dev.to&lt;/code&gt; or &lt;code&gt;google.com&lt;/code&gt;, into machine-readable numerical coordinates known as IP (Internet Protocol) addresses, such as &lt;code&gt;192.0.2.1&lt;/code&gt;. Computers and servers do not understand words; they communicate entirely through numbers. DNS resolution acts as the global, automated directory of the internet, mapping names to numbers so that your web browser can establish a connection to the correct server.&lt;/p&gt;
&lt;h4 id=&quot;the-contact-list-analogy&quot;&gt;The Contact List Analogy&lt;/h4&gt;
&lt;p&gt;To understand how this works, think about making a phone call to your friend, Alex. You probably do not have Alex’s ten-digit phone number memorized. Instead, you open your phone’s contact list, search for the name &quot;Alex,&quot; and tap the call button. Your phone looks up the name &quot;Alex&quot; in its local database, retrieves the associated phone number, and dials it.&lt;/p&gt;
&lt;p&gt;In this analogy, the name &quot;Alex&quot; is the domain name (like &lt;code&gt;mysite.com&lt;/code&gt;). Your phone's contact list is the DNS directory, and the ten-digit phone number is the numerical IP address. Without this automated lookup, you would have to carry around a physical notebook of numbers for every person you ever wanted to call, just as you would have to memorize long strings of numbers for every website you want to visit.&lt;/p&gt;
&lt;h4 id=&quot;the-journey-of-a-lookup&quot;&gt;The Journey of a Lookup&lt;/h4&gt;
&lt;p&gt;When you request an IP address, your computer does not just search one massive list. The request goes on a rapid relay race:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The Recursive Resolver:&lt;/strong&gt; Usually managed by your Internet Service Provider (ISP), this acts as your personal assistant, hunting down the address on your behalf.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Root Server:&lt;/strong&gt; The assistant asks the Root Server, which directs them to the top-level directory (like the &lt;code&gt;.com&lt;/code&gt; or &lt;code&gt;.org&lt;/code&gt; registry).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The TLD Server:&lt;/strong&gt; The Top-Level Domain server pointing specifically to where that type of domain is managed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Authoritative Name Server:&lt;/strong&gt; The final destination that holds the official, absolute mapping of the domain to the IP address.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;why-it-matters-in-the-tech-industry&quot;&gt;Why It Matters in the Tech Industry&lt;/h4&gt;
&lt;p&gt;For software engineers and system administrators, understanding DNS resolution is critical. It is the bedrock of how web traffic is routed, secured, and optimized.&lt;/p&gt;
&lt;p&gt;First, engineers use DNS settings to implement &lt;strong&gt;failovers and high availability&lt;/strong&gt;. If a primary server in New York goes offline due to a power outage, engineers can quickly update the DNS records to point the domain to a healthy backup server in Chicago. Users will still type the same website name, completely unaware that they are now being served from a different physical location.&lt;/p&gt;
&lt;p&gt;Second, DNS resolution directly affects &lt;strong&gt;website latency&lt;/strong&gt;. Every time a user visits a site, their device must perform a DNS lookup. If this lookup takes too long, the website feels slow, even if the hosting server itself is lightning-fast. Engineers optimize this by using Content Delivery Networks (CDNs) and configuring &quot;Time-to-Live&quot; (TTL) settings to cache these lookups closer to the user.&lt;/p&gt;
&lt;h4 id=&quot;dns-resolution-in-code&quot;&gt;DNS Resolution in Code&lt;/h4&gt;
&lt;p&gt;Here is how you can perform a DNS resolution programmatically in JavaScript using Node.js. This script takes a domain name and returns its corresponding IPv4 address.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const dns = require('dns');

const domain = 'dev.to';

dns.resolve4(domain, (err, addresses) =&amp;gt; {
  if (err) {
    console.error('Error during DNS resolution:', err.message);
    return;
  }

  console.log(`The IP addresses for ${domain} are:`);
  addresses.forEach((ip) =&amp;gt; {
    console.log(`- ${ip}`);
  });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;the-takeaway&quot;&gt;The Takeaway&lt;/h4&gt;
&lt;p&gt;DNS resolution is the digital translator that bridges human language with computer networking. By mastering how domain names are mapped to IP addresses, engineers can design systems that load faster, route users intelligently around the globe, and survive server failures with zero interruption to the end user.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;resources&quot;&gt;Resources&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Saurav-TB-Pandey/react-hook-lab&quot;&gt;react-hook-lab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;react-hook-lab:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.npmjs.com/package/react-hook-lab&quot;&gt;npm package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connect with me on LinkedIn:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/pandeysaurav/&quot;&gt;Saurav Pandey&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on my blog. You can &lt;a rel=&quot;nofollow&quot; href=&quot;https://sauravtbpandey.blogspot.com/2026/08/demystifying-dns-resolution-internets.html&quot;&gt;read the alternative breakdown here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on my blog. You can &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/saurav_tb_pandey/how-the-internet-finds-its-way-a-guide-to-dns-resolution-4ok0&quot;&gt;read the alternative breakdown here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25263/how-the-internet-finds-its-way-a-guide-to-dns-resolution</guid>
<pubDate>Mon, 07 Sep 2026 09:55:22 +0000</pubDate>
</item>
<item>
<title>The Physics Under The Protocols: A Developer's Tour Of Electromagnetism</title>
<link>https://coderlegion.com/26213/the-physics-under-the-protocols-a-developers-tour-of-electromagnetism</link>
<description>&lt;p&gt;Most of us debug things that ride on electromagnetic waves all day without ever looking at the physics underneath. This is the short version, written for developers, of why radio, WiFi and visible light are literally the same phenomenon.&lt;/p&gt;
&lt;h3 id=&quot;one-force-not-two&quot;&gt;One Force, Not Two&lt;/h3&gt;
&lt;p&gt;Until 1820 electricity and magnetism were treated as unrelated curiosities. Then Hans Christian Oersted noticed a compass needle deflect when current ran through a nearby wire. That was the entire experiment, and it meant the two could not be independent.&lt;/p&gt;
&lt;p&gt;Andre-Marie Ampere had the mathematics for the force between current carrying wires within months. In the 1830s Michael Faraday showed the reverse, that a changing magnetic field induces a current in a nearby wire.&lt;/p&gt;
&lt;p&gt;In the 1860s James Clerk Maxwell turned all of it into four equations. They predicted a self sustaining wave travelling at roughly 3 x 10^8 meters per second, a number already known from optics as the speed of light. Maxwell had derived light from equations written about wires and magnets. Heinrich Hertz generated and detected radio waves in 1887 and confirmed it.&lt;/p&gt;
&lt;h3 id=&quot;why-the-spectrum-is-continuous&quot;&gt;Why The Spectrum Is Continuous&lt;/h3&gt;
&lt;p&gt;Radio, microwave, infrared, visible light, ultraviolet, X-rays and gamma rays are one phenomenon sliced by frequency. Nothing physical changes at the boundaries between them, only the wavelength and what that wavelength happens to interact with.&lt;/p&gt;
&lt;p&gt;Once that clicks, a lot of separate networking facts collapse into one. Antenna length tracking wavelength, why 2.4 GHz passes through a wall better than 5 GHz, why interference shows up where two links share a band. Same equations, different numbers.&lt;/p&gt;
&lt;h3 id=&quot;induction-is-the-part-you-touch-every-day&quot;&gt;Induction Is The Part You Touch Every Day&lt;/h3&gt;
&lt;p&gt;A changing magnetic field induces a current in any nearby conductor. That is the transformer inside your power brick and the wireless charging pad on your desk.&lt;/p&gt;
&lt;p&gt;It is also crosstalk. A fast switching signal trace induces current in the trace beside it whether you wanted that or not, which is Faraday's law showing up as a bug rather than a feature. Ground planes and spacing rules exist because of a discovery from the 1830s.&lt;/p&gt;
&lt;h3 id=&quot;ohm-s-law-is-still-the-fastest-debugging-tool&quot;&gt;Ohm's Law Is Still The Fastest Debugging Tool&lt;/h3&gt;
&lt;p&gt;V = IR. Voltage is the potential difference pushing charge, current is the rate that charge flows, resistance is what opposes it. Measure any two and the third follows.&lt;/p&gt;
&lt;p&gt;For hardware faults that is often quicker than reaching for a logic analyzer. A multimeter tells you whether the rail is at voltage, whether current is being drawn, and whether something in the path has gone open or short, and that narrows most problems before you ever look at a waveform.&lt;/p&gt;
&lt;h3 id=&quot;what-makes-this-worth-reading-twice&quot;&gt;What Makes This Worth Reading Twice&lt;/h3&gt;
&lt;p&gt;The pattern is worth borrowing beyond physics. Two domains looked separate, one experiment linked them, and a single mathematical description then covered both. That description went on to predict something nobody had put into it, and the prediction turned out to be a number already measured in a different field.&lt;/p&gt;
&lt;p&gt;A description reorganizes what you already know. A model tells you something you did not.&lt;/p&gt;
&lt;p&gt;The full walkthrough, covering charge and current, electric and magnetic fields, the four equations, the spectrum, induction and circuits, is in &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.learnhowtoscience.com/electromagnetism-explained/&quot;&gt;this guide to how electromagnetism works&lt;/a&gt;.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/26213/the-physics-under-the-protocols-a-developers-tour-of-electromagnetism</guid>
<pubDate>Fri, 04 Sep 2026 14:25:09 +0000</pubDate>
</item>
<item>
<title>How Can an App Reach a Database That the Internet Cannot?</title>
<link>https://coderlegion.com/25926/how-can-an-app-reach-a-database-that-the-internet-cannot</link>
<description>&lt;p&gt;In the &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.aniksikder.me/articles/networking/how-does-one-server-find-another-server-dns-private-dns-and-service-discovery-explained&quot;&gt;&lt;strong&gt;previous article&lt;/strong&gt;&lt;/a&gt;, we answered a fundamental question:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;How does one server find another server?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We explored &lt;strong&gt;DNS, Private DNS, and Service Discovery&lt;/strong&gt; the mechanisms that turn something like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;postgres.internal.company
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;into a reachable destination inside a network.&lt;/p&gt;
&lt;p&gt;But finding a server is only half of the story.&lt;/p&gt;
&lt;p&gt;Knowing &lt;strong&gt;where&lt;/strong&gt; a server is doesn't automatically mean you're allowed to connect to it.&lt;/p&gt;
&lt;p&gt;That leads us to a more interesting question.&lt;/p&gt;
&lt;p&gt;Most developers eventually learn this architecture:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;User
  ↓
Application
  ↓
Database
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But how does this actually work at the network level?&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;If the application can connect to PostgreSQL, why can't someone on the Internet connect to the same database?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This sounds like a simple networking question.&lt;/p&gt;
&lt;p&gt;It isn't.&lt;/p&gt;
&lt;p&gt;The answer involves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Network routing&lt;/li&gt;
&lt;li&gt;Public and private subnets&lt;/li&gt;
&lt;li&gt;VPCs&lt;/li&gt;
&lt;li&gt;Security groups&lt;/li&gt;
&lt;li&gt;Firewall rules&lt;/li&gt;
&lt;li&gt;Network isolation&lt;/li&gt;
&lt;li&gt;Access boundaries&lt;/li&gt;
&lt;li&gt;Defense in depth&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And these concepts ultimately determine something much bigger:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Which systems are allowed to talk to which other systems?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That's one of the most important questions in production infrastructure.&lt;/p&gt;
&lt;p&gt;Because there is a critical difference between:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Can I find the server?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Can I reach the server?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And an even more important difference between:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Can I reach the server?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Am I allowed to connect?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the previous article, we focused on &lt;strong&gt;finding the destination&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In this article, we'll focus on &lt;strong&gt;controlling access to that destination&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Let's break it down.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-architecture-we-usually-see&quot;&gt;The Architecture We Usually See&lt;/h3&gt;
&lt;p&gt;Imagine a typical SaaS application:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;                    Internet
                        │
                        ▼
                 Load Balancer
                        │
                        ▼
                  Application
                        │
                        ▼
                   PostgreSQL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The application needs the database.&lt;/p&gt;
&lt;p&gt;Customers don't.&lt;/p&gt;
&lt;p&gt;That distinction is extremely important.&lt;/p&gt;
&lt;p&gt;The customer needs:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Internet
   ↓
Application
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The application needs:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application
   ↓
Database
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But there should usually be no direct path like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Internet
   ↓
Database
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is where cloud networking starts becoming interesting.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-first-principle-not-everything-needs-to-be-reachable&quot;&gt;The First Principle: Not Everything Needs to Be Reachable&lt;/h3&gt;
&lt;p&gt;A common mistake in infrastructure design is thinking:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;If a service needs to work,
it should be reachable.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Modern infrastructure follows almost the opposite principle:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Make only what needs to be reachable,
reachable.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Public
  │
  ├── Load Balancer
  │
  └── API Gateway

Private
  │
  ├── Application Servers
  ├── Background Workers
  ├── Redis
  └── PostgreSQL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The database doesn't need to accept connections from the public Internet.&lt;/p&gt;
&lt;p&gt;So why expose it?&lt;/p&gt;
&lt;p&gt;You don't.&lt;/p&gt;
&lt;p&gt;This simple decision dramatically reduces the attack surface.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;public-subnet-vs-private-subnet&quot;&gt;Public Subnet vs Private Subnet&lt;/h3&gt;
&lt;p&gt;Inside a cloud network such as a VPC, resources are commonly organized into different network boundaries.&lt;/p&gt;
&lt;p&gt;Two of the most important concepts are:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Public Subnet
Private Subnet
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Think about a building.&lt;/p&gt;
&lt;p&gt;There might be:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Public Area
     ↓
Reception
Meeting Room
Waiting Area
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And deeper inside:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Restricted Area
     ↓
Operations
Finance
Infrastructure
Records
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Not everyone who can enter the building should be able to enter every room.&lt;/p&gt;
&lt;p&gt;Cloud networks work with a similar principle.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-is-a-public-subnet-&quot;&gt;What Is a Public Subnet?&lt;/h3&gt;
&lt;p&gt;A public subnet is a subnet whose routing configuration provides a path toward an Internet Gateway.&lt;/p&gt;
&lt;p&gt;Resources placed there can be Internet-facing when their own network configuration also permits it for example, when they have a public IP or are exposed through a public load balancer.&lt;/p&gt;
&lt;p&gt;Typical examples include:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Load Balancers
Reverse Proxies
Internet-facing Web Servers
Bastion Hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A simplified architecture might look like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;                 Internet
                     │
                     ▼
              Internet Gateway
                     │
                     ▼
               Public Subnet
                     │
                     ▼
              Load Balancer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is where Internet-facing traffic enters the system.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-is-a-private-subnet-&quot;&gt;What Is a Private Subnet?&lt;/h3&gt;
&lt;p&gt;A private subnet is designed for resources that should not be directly reachable from the public Internet.&lt;/p&gt;
&lt;p&gt;Typical resources include:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application Servers
PostgreSQL
MySQL
Redis
RabbitMQ
Kafka
Background Workers
Internal Services
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A simplified architecture:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Internet
   ✖
   │
   ▼
Private Subnet
   │
   ├── Application
   ├── Redis
   └── PostgreSQL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The important idea is not:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;Nobody can access these machines.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&quot;They are not directly reachable from the public Internet.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That distinction matters.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;private-does-not-mean-isolated&quot;&gt;Private Does Not Mean Isolated&lt;/h3&gt;
&lt;p&gt;This is one of the most common misunderstandings.&lt;/p&gt;
&lt;p&gt;Many developers hear:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Private Subnet
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and think:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Nothing can connect to it.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Not true.&lt;/p&gt;
&lt;p&gt;A private subnet can communicate with other resources inside the same VPC.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application Server
10.0.1.10
       │
       ▼
PostgreSQL
10.0.2.20
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Both resources may exist inside:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;VPC
10.0.0.0/16
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The traffic can remain inside the cloud network.&lt;/p&gt;
&lt;p&gt;It doesn't need to travel across the public Internet.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;so-how-does-the-app-reach-the-database-&quot;&gt;So How Does the App Reach the Database?&lt;/h3&gt;
&lt;p&gt;Suppose:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application Server
10.0.1.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;needs to connect to:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;PostgreSQL
10.0.2.20:5432
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The application creates a TCP connection:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;10.0.1.10
      │
      │ TCP :5432
      ▼
10.0.2.20
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The VPC routing system determines how packets should move between those network destinations.&lt;/p&gt;
&lt;p&gt;If the route exists and the relevant security controls permit the traffic, the connection succeeds.&lt;/p&gt;
&lt;p&gt;There is no requirement for the database to have a public IP.&lt;/p&gt;
&lt;p&gt;In fact, keeping the database private is usually the safer design.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;then-what-stops-everyone-else-&quot;&gt;Then What Stops Everyone Else?&lt;/h3&gt;
&lt;p&gt;This is where &lt;strong&gt;Security Groups&lt;/strong&gt; become important.&lt;/p&gt;
&lt;p&gt;Routing answers:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Where should this packet go?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Security controls answer:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Is this traffic allowed?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;These are different questions.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;security-groups-the-access-control-layer&quot;&gt;Security Groups: The Access Control Layer&lt;/h3&gt;
&lt;p&gt;In AWS, a Security Group acts as a stateful virtual firewall associated with resources such as EC2 instances and certain managed services.&lt;/p&gt;
&lt;p&gt;Imagine a building.&lt;/p&gt;
&lt;p&gt;The subnet is the area of the building.&lt;/p&gt;
&lt;p&gt;The security group is the access control at the door.&lt;/p&gt;
&lt;p&gt;The database exists.&lt;/p&gt;
&lt;p&gt;The network path may exist.&lt;/p&gt;
&lt;p&gt;But access can still be restricted.&lt;/p&gt;
&lt;p&gt;For PostgreSQL, the standard port is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;5432
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A dangerous rule might look like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Inbound

Port: 5432
Source: 0.0.0.0/0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That effectively allows connection attempts from anywhere that can reach the database.&lt;/p&gt;
&lt;p&gt;That is rarely what you want for a production database.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-better-rule&quot;&gt;The Better Rule&lt;/h3&gt;
&lt;p&gt;Instead of:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Allow everyone
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;define:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Allow application servers
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Database Security Group
        │
        └── Inbound
              │
              ├── Protocol: TCP
              ├── Port: 5432
              └── Source: App Security Group
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now the access relationship becomes:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Internet User
      ✖

Random Server
      ✖

Unrelated Service
      ✖

Application Server
      ✔
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is much more meaningful than simply allowing a large IP range.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-security-group-references-matter&quot;&gt;Why Security Group References Matter&lt;/h3&gt;
&lt;p&gt;Consider an application running on multiple servers.&lt;/p&gt;
&lt;p&gt;Initially:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;10.0.1.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So someone might configure:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Allow 10.0.1.10 → PostgreSQL:5432
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then autoscaling happens.&lt;/p&gt;
&lt;p&gt;Now there are:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;10.0.1.10
10.0.1.11
10.0.1.12
10.0.1.13
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tomorrow there may be twenty.&lt;/p&gt;
&lt;p&gt;The infrastructure is dynamic.&lt;/p&gt;
&lt;p&gt;Hardcoding individual IP addresses creates unnecessary operational complexity.&lt;/p&gt;
&lt;p&gt;Instead, define an application security group:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;app-sg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Attach it to application servers.&lt;/p&gt;
&lt;p&gt;Then configure the database:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;db-sg

Inbound:
5432
Source:
app-sg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now the rule expresses the actual architectural relationship:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application Layer
       │
       │ allowed
       ▼
Database Layer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The exact server IP becomes less important.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;network-access-is-a-chain-of-decisions&quot;&gt;Network Access Is a Chain of Decisions&lt;/h3&gt;
&lt;p&gt;A database connection isn't simply:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Can I ping the database?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Multiple layers can influence whether traffic succeeds.&lt;/p&gt;
&lt;p&gt;Conceptually:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application
    │
    ▼
DNS Resolution
    │
    ▼
Route
    │
    ▼
Network ACL
    │
    ▼
Security Group
    │
    ▼
Database Listener
    │
    ▼
PostgreSQL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If any required layer is incorrectly configured, the connection can fail.&lt;/p&gt;
&lt;p&gt;This is why production networking can feel confusing.&lt;/p&gt;
&lt;p&gt;There isn't always one single &quot;firewall.&quot;&lt;/p&gt;
&lt;p&gt;There are multiple boundaries.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;a-production-style-architecture&quot;&gt;A Production-Style Architecture&lt;/h3&gt;
&lt;p&gt;A more realistic architecture might look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;                         Internet
                             │
                             ▼
                    ┌─────────────────┐
                    │  Load Balancer  │
                    │     Public      │
                    └────────┬────────┘
                             │
                             ▼
                    ┌─────────────────┐
                    │ Application     │
                    │    Servers      │
                    │    Private      │
                    └────────┬────────┘
                             │
                  ┌──────────┴──────────┐
                  │                     │
                  ▼                     ▼
          ┌──────────────┐      ┌──────────────┐
          │    Redis     │      │  PostgreSQL  │
          │   Private    │      │   Private    │
          └──────────────┘      └──────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice the boundaries.&lt;/p&gt;
&lt;p&gt;The Internet can reach the load balancer.&lt;/p&gt;
&lt;p&gt;The load balancer can reach the application.&lt;/p&gt;
&lt;p&gt;The application can reach PostgreSQL.&lt;/p&gt;
&lt;p&gt;But the Internet does not get a direct path to PostgreSQL.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;this-is-defense-in-depth&quot;&gt;This Is Defense in Depth&lt;/h3&gt;
&lt;p&gt;Now imagine the application itself contains a vulnerability.&lt;/p&gt;
&lt;p&gt;An attacker manages to compromise a public-facing component.&lt;/p&gt;
&lt;p&gt;A poorly designed network might look like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Compromised Server
       │
       ├── Database ✔
       ├── Redis ✔
       ├── Internal APIs ✔
       └── Everything Else ✔
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The blast radius becomes enormous.&lt;/p&gt;
&lt;p&gt;A better architecture might look like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Compromised Server
       │
       ├── Database ✔
       ├── Redis ✖
       ├── Internal Service ✖
       └── Other Systems ✖
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The attacker may still have compromised one component.&lt;/p&gt;
&lt;p&gt;But the compromise doesn't automatically become a compromise of the entire environment.&lt;/p&gt;
&lt;p&gt;That is the value of &lt;strong&gt;segmentation&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;security-is-about-blast-radius&quot;&gt;Security Is About Blast Radius&lt;/h3&gt;
&lt;p&gt;One of the most useful ways to think about infrastructure security is:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;What happens if one component is compromised?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Can anything ever be hacked?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That second question is unrealistic.&lt;/p&gt;
&lt;p&gt;Production systems should be designed with the assumption that individual components can fail or become compromised.&lt;/p&gt;
&lt;p&gt;The goal is to limit the damage.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Internet
   │
   ▼
Public Service
   │
   ▼
Private Application
   │
   ▼
Private Database
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each layer has a limited set of allowed relationships.&lt;/p&gt;
&lt;p&gt;This creates smaller blast radiuses.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-this-matters-beyond-security&quot;&gt;Why This Matters Beyond Security&lt;/h3&gt;
&lt;p&gt;Network isolation isn't only about preventing attackers.&lt;/p&gt;
&lt;p&gt;It also improves operational control.&lt;/p&gt;
&lt;p&gt;Suppose a database is publicly accessible.&lt;/p&gt;
&lt;p&gt;Then many different systems can potentially attempt to connect:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Internet
   │
   ├── Bots
   ├── Scanners
   ├── Attackers
   ├── Unknown Services
   └── Legitimate Clients
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now the database must deal with traffic it never needed in the first place.&lt;/p&gt;
&lt;p&gt;A private database changes the model:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application Layer
       │
       ▼
Database
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The allowed communication becomes explicit.&lt;/p&gt;
&lt;p&gt;That improves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Reliability&lt;/li&gt;
&lt;li&gt;Troubleshooting&lt;/li&gt;
&lt;li&gt;Operational visibility&lt;/li&gt;
&lt;li&gt;Compliance&lt;/li&gt;
&lt;li&gt;Change management&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-business-impact-is-hidden-in-the-architecture&quot;&gt;The Business Impact Is Hidden in the Architecture&lt;/h3&gt;
&lt;p&gt;A network diagram may look purely technical.&lt;/p&gt;
&lt;p&gt;But every boundary represents a business decision.&lt;/p&gt;
&lt;p&gt;Consider a database containing:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Customer Accounts
Payment Records
Orders
Personal Information
Internal Business Data
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If that database is accidentally exposed, the consequences can extend far beyond engineering:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Misconfiguration
      ↓
Unauthorized Access
      ↓
Data Exposure
      ↓
Incident Response
      ↓
Downtime / Investigation
      ↓
Customer Impact
      ↓
Financial &amp;amp; Reputation Cost
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The infrastructure decision happened at the technical layer.&lt;/p&gt;
&lt;p&gt;The consequences don't stay there.&lt;/p&gt;
&lt;p&gt;This is why architecture is ultimately connected to business continuity.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;-nobody-knows-the-database-ip-is-not-security&quot;&gt;&quot;Nobody Knows the Database IP&quot; Is Not Security&lt;/h3&gt;
&lt;p&gt;Another common assumption is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Nobody knows my database IP.

Therefore:
I'm safe.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That's security through obscurity.&lt;/p&gt;
&lt;p&gt;A better assumption is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Assume the attacker knows the address.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then ask:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Can they establish a connection?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the answer is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;No route
+
No public exposure
+
Security group denies access
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;then knowing the address doesn't help much.&lt;/p&gt;
&lt;p&gt;The important boundary is not secrecy.&lt;/p&gt;
&lt;p&gt;It is &lt;strong&gt;reachability and authorization&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;public-exposure-vs-private-access&quot;&gt;Public Exposure vs Private Access&lt;/h3&gt;
&lt;p&gt;Let's compare the two models.&lt;/p&gt;
&lt;h4 id=&quot;public-database&quot;&gt;Public Database&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Internet
    │
    ▼
Public IP
    │
    ▼
PostgreSQL:5432
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The database is directly exposed to Internet traffic.&lt;/p&gt;
&lt;p&gt;Even if authentication is strong, the attack surface is unnecessarily large.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;private-database&quot;&gt;Private Database&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Internet
    │
    ✖
    │
    ▼
Private Network
    │
    ▼
PostgreSQL:5432
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application
    │
    ✔
    ▼
PostgreSQL:5432
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The database only needs to serve the application.&lt;/p&gt;
&lt;p&gt;So the network should reflect that requirement.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;a-simple-mental-model&quot;&gt;A Simple Mental Model&lt;/h3&gt;
&lt;p&gt;Think of your infrastructure as a building.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;                 STREET
                   │
                   ▼
             Public Lobby
                   │
                   ▼
             Employee Area
                   │
                   ▼
                Vault
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The public can enter the lobby.&lt;/p&gt;
&lt;p&gt;Employees can enter restricted areas.&lt;/p&gt;
&lt;p&gt;Only authorized systems can reach the vault.&lt;/p&gt;
&lt;p&gt;Now translate that into cloud architecture:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;                 Internet
                    │
                    ▼
              Public Subnet
                    │
                    ▼
          Private Application Layer
                    │
                    ▼
            Private Database Layer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And Security Groups define:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Who can move between the layers.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That's the mental model worth remembering.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-bigger-engineering-principle&quot;&gt;The Bigger Engineering Principle&lt;/h3&gt;
&lt;p&gt;A strong production architecture doesn't ask:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;How do we make everything communicate?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It asks:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What actually needs to communicate?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then it creates the smallest set of allowed paths.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Load Balancer
      │
      ▼
Application
      │
      ├──────► PostgreSQL
      │
      └──────► Redis
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Internet ─────X────► PostgreSQL

Internet ─────X────► Redis

Redis ─────────X────► PostgreSQL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;unless those connections are explicitly required.&lt;/p&gt;
&lt;p&gt;This is the principle of &lt;strong&gt;least privilege applied to networking&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;key-takeaways&quot;&gt;Key Takeaways&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Public subnets are designed for Internet-facing resources.&lt;/li&gt;
&lt;li&gt;Private subnets are used for resources that should not be directly reachable from the public Internet.&lt;/li&gt;
&lt;li&gt;A private subnet does not mean the resources inside it cannot communicate.&lt;/li&gt;
&lt;li&gt;VPC routing enables communication between private resources when routes exist.&lt;/li&gt;
&lt;li&gt;Security Groups control which traffic is allowed.&lt;/li&gt;
&lt;li&gt;Databases generally should not be directly exposed to the public Internet.&lt;/li&gt;
&lt;li&gt;Security Group references can express application-to-database relationships more effectively than hardcoded IP addresses.&lt;/li&gt;
&lt;li&gt;Network segmentation limits blast radius when a component is compromised.&lt;/li&gt;
&lt;li&gt;Security is not about making systems unreachable.&lt;/li&gt;
&lt;li&gt;Security is about making &lt;strong&gt;only the necessary systems reachable by the necessary systems&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Infrastructure decisions can directly affect security, reliability, compliance, operational cost, and customer trust.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The most important idea is simple:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Great infrastructure is not about
making everything reachable.

Great infrastructure is about
making only the right things reachable.
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25926/how-can-an-app-reach-a-database-that-the-internet-cannot</guid>
<pubDate>Mon, 31 Aug 2026 14:41:50 +0000</pubDate>
</item>
<item>
<title>How Does One Server Find Another Server? DNS, Private DNS, and Service Discovery Explained</title>
<link>https://coderlegion.com/25712/how-does-one-server-find-another-server-dns-private-dns-and-service-discovery-explained</link>
<description>&lt;p&gt;Hey developers! 👋&lt;/p&gt;
&lt;p&gt;Welcome back to our networking and infrastructure deep-dive series.&lt;/p&gt;
&lt;p&gt;In the &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.aniksikder.me/articles/networking/internet-free-infrastructure-how-two-servers-talk-without-using-the-internet&quot;&gt;&lt;strong&gt;previous article&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;we learned something surprising:&lt;/p&gt;
&lt;p&gt;Two servers inside AWS, Azure, GCP, or a private datacenter can communicate without touching the public internet.&lt;/p&gt;
&lt;p&gt;No ISP.&lt;/p&gt;
&lt;p&gt;No public IP.&lt;/p&gt;
&lt;p&gt;No internet routing.&lt;/p&gt;
&lt;p&gt;Just private networking.&lt;/p&gt;
&lt;p&gt;But that raises a much bigger question.&lt;/p&gt;
&lt;p&gt;A question every backend developer eventually encounters.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-mystery-nobody-talks-about&quot;&gt;The Mystery Nobody Talks About&lt;/h3&gt;
&lt;p&gt;Imagine you have:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Web Server
    |
    |
    ▼
PostgreSQL Server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Your application needs to connect to PostgreSQL.&lt;/p&gt;
&lt;p&gt;Simple.&lt;/p&gt;
&lt;p&gt;Right?&lt;/p&gt;
&lt;p&gt;Not really.&lt;/p&gt;
&lt;p&gt;Because the web server doesn't magically know:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Where PostgreSQL is.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Servers are not humans.&lt;/p&gt;
&lt;p&gt;They cannot read dashboards.&lt;/p&gt;
&lt;p&gt;They cannot open AWS Console.&lt;/p&gt;
&lt;p&gt;They cannot browse Kubernetes UI.&lt;/p&gt;
&lt;p&gt;So the real question becomes:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;How does one server discover another server?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This seemingly simple question led to the creation of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS&lt;/li&gt;
&lt;li&gt;Private DNS&lt;/li&gt;
&lt;li&gt;Service Discovery&lt;/li&gt;
&lt;li&gt;Consul&lt;/li&gt;
&lt;li&gt;Eureka&lt;/li&gt;
&lt;li&gt;Kubernetes DNS&lt;/li&gt;
&lt;li&gt;Cloud Map&lt;/li&gt;
&lt;li&gt;Service Meshes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And ultimately became one of the most important problems in distributed systems.&lt;/p&gt;
&lt;p&gt;Today we're going deep into that rabbit hole.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;imagine-a-new-city&quot;&gt;Imagine a New City&lt;/h3&gt;
&lt;p&gt;Suppose you move into a new city.&lt;/p&gt;
&lt;p&gt;You need to find:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Hospital
Bank
Police Station
Restaurant
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do you memorize every building's GPS coordinates?&lt;/p&gt;
&lt;p&gt;Of course not.&lt;/p&gt;
&lt;p&gt;Instead you use:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Names
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Such as:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;city-hospital.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;instead of:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;104.22.18.150
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Computers do exactly the same thing.&lt;/p&gt;
&lt;p&gt;Humans prefer names.&lt;/p&gt;
&lt;p&gt;Networks use IP addresses.&lt;/p&gt;
&lt;p&gt;Something must translate between them.&lt;/p&gt;
&lt;p&gt;That something is DNS.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;dns-the-internet-s-phonebook&quot;&gt;DNS: The Internet's Phonebook&lt;/h3&gt;
&lt;p&gt;DNS stands for:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Domain Name System
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Its job is simple:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Name -&amp;gt; IP Address
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;google.com

↓

142.250.x.x
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you visit:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;https://google.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;your computer first asks:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;What's the IP address of google.com?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DNS replies:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;142.250.x.x
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Only then can the connection begin.&lt;/p&gt;
&lt;p&gt;Without DNS:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;The internet would be a giant spreadsheet of IP addresses.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nobody wants that.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-actually-happens-&quot;&gt;What Actually Happens?&lt;/h3&gt;
&lt;p&gt;When your browser requests:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;google.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;the flow looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Browser
   |
   ▼
DNS Resolver
   |
   ▼
Root DNS
   |
   ▼
.com Nameserver
   |
   ▼
Google Nameserver
   |
   ▼
IP Address Returned
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Browser
   |
   ▼
Google Server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Connection established.&lt;/p&gt;
&lt;p&gt;This process often completes in milliseconds.&lt;/p&gt;
&lt;p&gt;Billions of times every day.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;but-cloud-infrastructure-has-a-problem&quot;&gt;But Cloud Infrastructure Has a Problem&lt;/h3&gt;
&lt;p&gt;Public DNS works great for public websites.&lt;/p&gt;
&lt;p&gt;But what about:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Backend API
Redis
PostgreSQL
RabbitMQ
Elasticsearch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These services are not public.&lt;/p&gt;
&lt;p&gt;In fact:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;They should NEVER be public.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;api.company.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;can be public.&lt;/p&gt;
&lt;p&gt;But:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;postgres.company.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;should almost never be exposed to the internet.&lt;/p&gt;
&lt;p&gt;So where do we keep internal server names?&lt;/p&gt;
&lt;p&gt;This is where Private DNS enters the picture.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;private-dns-the-hidden-phonebook&quot;&gt;Private DNS: The Hidden Phonebook&lt;/h3&gt;
&lt;p&gt;Think of Private DNS as:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;An internal company directory.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Only employees can access it.&lt;/p&gt;
&lt;p&gt;Not outsiders.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;db.internal
redis.internal
auth.internal
payments.internal
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These names resolve only inside the private network.&lt;/p&gt;
&lt;p&gt;Outside users see:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Nothing.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Inside AWS this is common.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;ip-10-0-4-25.ec2.internal
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;db.production.internal
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Only resources inside the VPC can resolve these names.&lt;/p&gt;
&lt;p&gt;The public internet has no idea they exist.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;real-production-example&quot;&gt;Real Production Example&lt;/h3&gt;
&lt;p&gt;Suppose you're building an e-commerce platform.&lt;/p&gt;
&lt;p&gt;Architecture:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Internet
    |
    ▼
Load Balancer
    |
    ▼
Web Servers
    |
    ▼
API Service
    |
    ├────────► PostgreSQL
    |
    ├────────► Redis
    |
    └────────► RabbitMQ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Question:&lt;/p&gt;
&lt;p&gt;How does API Service find PostgreSQL?&lt;/p&gt;
&lt;p&gt;Do we hardcode:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;10.0.12.55
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;inside the application?&lt;/p&gt;
&lt;p&gt;Never.&lt;/p&gt;
&lt;p&gt;Because servers change.&lt;/p&gt;
&lt;p&gt;Instances restart.&lt;/p&gt;
&lt;p&gt;Containers move.&lt;/p&gt;
&lt;p&gt;Databases failover.&lt;/p&gt;
&lt;p&gt;IP addresses evolve.&lt;/p&gt;
&lt;p&gt;Hardcoded IPs become operational nightmares.&lt;/p&gt;
&lt;p&gt;Instead:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;DATABASE_HOST = &quot;postgres.internal&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now infrastructure can move PostgreSQL anywhere.&lt;/p&gt;
&lt;p&gt;DNS updates.&lt;/p&gt;
&lt;p&gt;Application remains unchanged.&lt;/p&gt;
&lt;p&gt;Beautiful.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-ip-address-problem&quot;&gt;The IP Address Problem&lt;/h3&gt;
&lt;p&gt;Modern infrastructure is dynamic.&lt;/p&gt;
&lt;p&gt;Very dynamic.&lt;/p&gt;
&lt;p&gt;Consider Kubernetes.&lt;/p&gt;
&lt;p&gt;A container crashes.&lt;/p&gt;
&lt;p&gt;A new container starts.&lt;/p&gt;
&lt;p&gt;The new container may receive:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Completely different IP
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;within seconds.&lt;/p&gt;
&lt;p&gt;Imagine every service storing IPs manually.&lt;/p&gt;
&lt;p&gt;The system would collapse.&lt;/p&gt;
&lt;p&gt;This is why names matter.&lt;/p&gt;
&lt;p&gt;Names remain stable.&lt;/p&gt;
&lt;p&gt;IPs do not.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;enter-service-discovery&quot;&gt;Enter Service Discovery&lt;/h3&gt;
&lt;p&gt;DNS solved:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Find a machine
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Service Discovery solves:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Find a service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those sound similar.&lt;/p&gt;
&lt;p&gt;They are not.&lt;/p&gt;
&lt;p&gt;Let's see why.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-microservice-nightmare&quot;&gt;The Microservice Nightmare&lt;/h3&gt;
&lt;p&gt;Imagine:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;User Service

Order Service

Payment Service

Notification Service

Inventory Service

Recommendation Service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each service runs:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Multiple Instances
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Payment Service

payment-1
payment-2
payment-3
payment-4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now User Service wants Payment Service.&lt;/p&gt;
&lt;p&gt;Which instance should it choose?&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;payment-1 ?
payment-2 ?
payment-3 ?
payment-4 ?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hardcoding doesn't work.&lt;/p&gt;
&lt;p&gt;Static DNS doesn't fully solve it.&lt;/p&gt;
&lt;p&gt;We need something smarter.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-service-discovery-actually-does&quot;&gt;What Service Discovery Actually Does&lt;/h3&gt;
&lt;p&gt;A service registry keeps track of:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Who exists
Where they are
Whether they are healthy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Think of it like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Air Traffic Control
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;for services.&lt;/p&gt;
&lt;p&gt;Every service announces:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;I'm alive.
Here's my address.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Registry stores that information.&lt;/p&gt;
&lt;p&gt;Other services ask:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Where is Payment Service?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Registry responds:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;payment-2
payment-3
payment-4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now requests can flow.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;netflix-solved-this-years-ago&quot;&gt;Netflix Solved This Years Ago&lt;/h3&gt;
&lt;p&gt;When Netflix moved to microservices they faced a huge challenge.&lt;/p&gt;
&lt;p&gt;Thousands of services.&lt;/p&gt;
&lt;p&gt;Millions of requests.&lt;/p&gt;
&lt;p&gt;Servers constantly scaling.&lt;/p&gt;
&lt;p&gt;They created:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Eureka
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A service discovery platform.&lt;/p&gt;
&lt;p&gt;Services register themselves.&lt;/p&gt;
&lt;p&gt;Other services discover them dynamically.&lt;/p&gt;
&lt;p&gt;Without manual configuration.&lt;/p&gt;
&lt;p&gt;This became one of the foundational patterns of cloud-native architecture.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;kubernetes-service-discovery-on-steroids&quot;&gt;Kubernetes: Service Discovery on Steroids&lt;/h3&gt;
&lt;p&gt;Kubernetes has built-in service discovery.&lt;/p&gt;
&lt;p&gt;Suppose you deploy:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;payment-service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;with:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;4 Pods
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Kubernetes automatically creates:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;payment-service.default.svc.cluster.local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Your application simply uses:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;PAYMENT_URL = &quot;http://payment-service&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No IP required.&lt;/p&gt;
&lt;p&gt;No server management.&lt;/p&gt;
&lt;p&gt;No lookup tables.&lt;/p&gt;
&lt;p&gt;Kubernetes DNS handles everything.&lt;/p&gt;
&lt;p&gt;Behind the scenes:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;payment-service
        |
        ▼
Cluster DNS
        |
        ▼
Healthy Pods
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Magic?&lt;/p&gt;
&lt;p&gt;Not really.&lt;/p&gt;
&lt;p&gt;Just extremely sophisticated automation.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-happens-during-a-request-&quot;&gt;What Happens During a Request?&lt;/h3&gt;
&lt;p&gt;Imagine:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Order Service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;calls:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Payment Service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Flow:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Order Service
       |
       ▼
DNS Query
       |
       ▼
Cluster DNS
       |
       ▼
Payment Service Endpoints
       |
       ▼
Healthy Pod Selected
       |
       ▼
Request Sent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All this happens in milliseconds.&lt;/p&gt;
&lt;p&gt;Most developers never see it.&lt;/p&gt;
&lt;p&gt;Yet every request depends on it.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;health-checks-change-everything&quot;&gt;Health Checks Change Everything&lt;/h3&gt;
&lt;p&gt;Modern service discovery isn't just:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Where is the service?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It also asks:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Is the service healthy?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Suppose:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;payment-3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;crashes.&lt;/p&gt;
&lt;p&gt;Registry detects failure.&lt;/p&gt;
&lt;p&gt;Immediately removes it.&lt;/p&gt;
&lt;p&gt;Now traffic goes only to:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;payment-1
payment-2
payment-4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No code changes required.&lt;/p&gt;
&lt;p&gt;No deployment required.&lt;/p&gt;
&lt;p&gt;Infrastructure heals itself.&lt;/p&gt;
&lt;p&gt;This is one of the superpowers of modern cloud systems.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;dns-vs-service-discovery&quot;&gt;DNS vs Service Discovery&lt;/h3&gt;
&lt;p&gt;Many engineers confuse them.&lt;/p&gt;
&lt;p&gt;Let's simplify.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Feature                &lt;/th&gt;&lt;th&gt;DNS     &lt;/th&gt;&lt;th&gt;Service Discovery&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Finds Machines         &lt;/td&gt;&lt;td&gt;Yes     &lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Finds Services         &lt;/td&gt;&lt;td&gt;Limited &lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Tracks Health          &lt;/td&gt;&lt;td&gt;No      &lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Dynamic Scaling        &lt;/td&gt;&lt;td&gt;Limited &lt;/td&gt;&lt;td&gt;Excellent&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Cloud Native           &lt;/td&gt;&lt;td&gt;Partial &lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Microservices Friendly &lt;/td&gt;&lt;td&gt;Partial &lt;/td&gt;&lt;td&gt;Excellent&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Think of DNS as:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;A phonebook
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Think of Service Discovery as:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;A live GPS system with traffic updates.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Huge difference.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;aws-example&quot;&gt;AWS Example&lt;/h3&gt;
&lt;p&gt;AWS provides:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;AWS Cloud Map
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Services register themselves.&lt;/p&gt;
&lt;p&gt;Applications discover services dynamically.&lt;/p&gt;
&lt;p&gt;Instead of:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;10.0.22.17
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;you use:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;payment.production.internal
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;AWS continuously keeps records updated.&lt;/p&gt;
&lt;p&gt;Your applications stay clean.&lt;/p&gt;
&lt;p&gt;Infrastructure stays flexible.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-hidden-system-every-developer-uses&quot;&gt;The Hidden System Every Developer Uses&lt;/h3&gt;
&lt;p&gt;Whenever your application connects to:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Database
Cache
Queue
API
Microservice
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;one of the following is usually working behind the scenes:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;DNS

Private DNS

Service Discovery
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Without them:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Modern cloud architecture would be impossible.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Not difficult.&lt;/p&gt;
&lt;p&gt;Impossible.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;visual-mental-model&quot;&gt;Visual Mental Model&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application
     |
     ▼
Service Name

(payment-service)

     |
     ▼
DNS / Service Discovery

     |
     ▼
Healthy Instance

(payment-2)

     |
     ▼
TCP Connection

     |
     ▼
Response
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Simple.&lt;/p&gt;
&lt;p&gt;Powerful.&lt;/p&gt;
&lt;p&gt;Cloud Native.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-system-designers-care&quot;&gt;Why System Designers Care&lt;/h3&gt;
&lt;p&gt;Junior developers often think:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Database Host = Some String
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;System designers think:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;How is that string resolved?

Who owns it?

What happens during failover?

How is health tracked?

How does scaling affect discovery?

How quickly do updates propagate?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These questions separate:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application Development
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;from&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Infrastructure Engineering
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Understanding service discovery is one of the first steps toward thinking like a platform engineer, DevOps engineer, cloud architect, or distributed systems designer.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;tl-dr-quick-recap&quot;&gt;TL;DR Quick Recap&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Servers communicate using IP addresses.&lt;/li&gt;
&lt;li&gt;Humans prefer names.&lt;/li&gt;
&lt;li&gt;DNS translates names into IP addresses.&lt;/li&gt;
&lt;li&gt;Private DNS provides internal-only naming.&lt;/li&gt;
&lt;li&gt;Modern infrastructure avoids hardcoded IPs.&lt;/li&gt;
&lt;li&gt;Service Discovery tracks service locations dynamically.&lt;/li&gt;
&lt;li&gt;Kubernetes provides built-in service discovery.&lt;/li&gt;
&lt;li&gt;Healthy instances are automatically discovered.&lt;/li&gt;
&lt;li&gt;Failed instances are automatically removed.&lt;/li&gt;
&lt;li&gt;Every modern cloud platform depends heavily on these mechanisms.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;final-thoughts-the-invisible-map-of-the-cloud-&quot;&gt;Final Thoughts: The Invisible Map of the Cloud 🗺️&lt;/h3&gt;
&lt;p&gt;Most developers spend years writing:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;DATABASE_HOST=&quot;postgres&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;without asking:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Who told the application where postgres is?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Behind that tiny configuration value sits an enormous ecosystem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DNS Servers&lt;/li&gt;
&lt;li&gt;Private DNS&lt;/li&gt;
&lt;li&gt;Service Registries&lt;/li&gt;
&lt;li&gt;Health Checks&lt;/li&gt;
&lt;li&gt;Load Balancers&lt;/li&gt;
&lt;li&gt;Cloud Networking&lt;/li&gt;
&lt;li&gt;Kubernetes Controllers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All working together to answer one deceptively simple question:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;Where is the thing I'm trying to talk to?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And surprisingly, that question powers almost every distributed system on Earth.&lt;/p&gt;
&lt;p&gt;In the next article, we'll go even deeper:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How Does Traffic Know Which Server Should Receive the Request?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Load Balancers → Reverse Proxies → Traffic Routing → Health Checks&lt;/p&gt;
&lt;p&gt;Because finding a service is only half the story.&lt;/p&gt;
&lt;p&gt;Choosing the right instance is where things get really interesting. 🚀&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25712/how-does-one-server-find-another-server-dns-private-dns-and-service-discovery-explained</guid>
<pubDate>Fri, 28 Aug 2026 16:58:06 +0000</pubDate>
</item>
<item>
<title>Internet-Free Infrastructure: How Two Servers Talk Without Using the Internet</title>
<link>https://coderlegion.com/25364/internet-free-infrastructure-how-two-servers-talk-without-using-the-internet</link>
<description>&lt;p&gt;Imagine you're building a SaaS platform.&lt;/p&gt;
&lt;p&gt;Nothing unusual.&lt;/p&gt;
&lt;p&gt;A web application.&lt;/p&gt;
&lt;p&gt;A PostgreSQL database.&lt;/p&gt;
&lt;p&gt;A Redis cache.&lt;/p&gt;
&lt;p&gt;Everything runs in the cloud.&lt;/p&gt;
&lt;p&gt;The architecture looks something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Users
  ↓
Application Server
  ↓
PostgreSQL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Simple.&lt;/p&gt;
&lt;p&gt;A user sends a request.&lt;/p&gt;
&lt;p&gt;The application queries the database.&lt;/p&gt;
&lt;p&gt;The database responds.&lt;/p&gt;
&lt;p&gt;The application returns data.&lt;/p&gt;
&lt;p&gt;Feature shipped.&lt;/p&gt;
&lt;p&gt;Customers happy.&lt;/p&gt;
&lt;p&gt;Everyone moves on.&lt;/p&gt;
&lt;p&gt;For a while.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-question-nobody-asks&quot;&gt;The Question Nobody Asks&lt;/h3&gt;
&lt;p&gt;Most engineers focus on:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application Logic
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Database Queries
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;API Design
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But infrastructure engineers eventually ask a different question:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;How does the application server actually reach the database server?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not conceptually.&lt;/p&gt;
&lt;p&gt;Literally.&lt;/p&gt;
&lt;p&gt;How does one machine know where another machine is?&lt;/p&gt;
&lt;p&gt;How does a packet travel from one server to another?&lt;/p&gt;
&lt;p&gt;And perhaps the most surprising question:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;If both servers live in the cloud, why doesn't their communication go through the Internet?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-common-misconception&quot;&gt;The Common Misconception&lt;/h3&gt;
&lt;p&gt;Many people imagine cloud infrastructure like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application Server
        ↓
     Internet
        ↓
Database Server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It seems reasonable.&lt;/p&gt;
&lt;p&gt;After all, both servers exist somewhere inside AWS, Azure, or Google Cloud.&lt;/p&gt;
&lt;p&gt;Surely the traffic goes through the Internet.&lt;/p&gt;
&lt;p&gt;Right?&lt;/p&gt;
&lt;p&gt;Actually, no.&lt;/p&gt;
&lt;p&gt;In most production systems, internal communication never touches the public Internet.&lt;/p&gt;
&lt;p&gt;Instead, it looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application Server
        ↓
 Private Network
        ↓
Database Server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No public Internet.&lt;/p&gt;
&lt;p&gt;No ISP.&lt;/p&gt;
&lt;p&gt;No external routers.&lt;/p&gt;
&lt;p&gt;No public IP addresses.&lt;/p&gt;
&lt;p&gt;Just private infrastructure.&lt;/p&gt;
&lt;p&gt;This distinction matters because it changes everything about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Reliability&lt;/li&gt;
&lt;li&gt;Cost&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To understand why, we need to start with the first building block.&lt;/p&gt;
&lt;p&gt;The VPC.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-cloud-is-a-giant-city&quot;&gt;The Cloud Is A Giant City&lt;/h3&gt;
&lt;p&gt;Imagine AWS as a massive country.&lt;/p&gt;
&lt;p&gt;Inside that country:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Netflix

Airbnb

Stripe

Shopify

Your Startup

Thousands of Others
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All of them are running servers.&lt;/p&gt;
&lt;p&gt;All of them are storing data.&lt;/p&gt;
&lt;p&gt;All of them are deploying applications.&lt;/p&gt;
&lt;p&gt;Now imagine there were no boundaries.&lt;/p&gt;
&lt;p&gt;No isolation.&lt;/p&gt;
&lt;p&gt;No separation.&lt;/p&gt;
&lt;p&gt;Every server could see every other server.&lt;/p&gt;
&lt;p&gt;That would be a security nightmare.&lt;/p&gt;
&lt;p&gt;Cloud providers solve this problem using something called a:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Virtual Private Cloud
(VPC)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Think of a VPC as:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Your own private city
inside a giant country.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The cloud provider owns the country.&lt;/p&gt;
&lt;p&gt;You own the city.&lt;/p&gt;
&lt;p&gt;Inside that city:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your servers can communicate&lt;/li&gt;
&lt;li&gt;Your databases can communicate&lt;/li&gt;
&lt;li&gt;Your caches can communicate&lt;/li&gt;
&lt;li&gt;Other companies cannot access them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first thing cloud infrastructure gives you is not a server.&lt;/p&gt;
&lt;p&gt;It's a private network.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-infrastructure-starts-with-a-network&quot;&gt;Why Infrastructure Starts With A Network&lt;/h3&gt;
&lt;p&gt;New engineers often think infrastructure begins here:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;EC2 Instance

Virtual Machine

Server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It doesn't.&lt;/p&gt;
&lt;p&gt;Infrastructure usually begins here:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;VPC
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Because servers without networks are useless.&lt;/p&gt;
&lt;p&gt;Imagine buying a house.&lt;/p&gt;
&lt;p&gt;But there are:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;No roads

No addresses

No transportation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The house exists.&lt;/p&gt;
&lt;p&gt;But nobody can reach it.&lt;/p&gt;
&lt;p&gt;Servers have the same problem.&lt;/p&gt;
&lt;p&gt;Before machines can communicate, they need a network.&lt;/p&gt;
&lt;p&gt;The VPC creates that network.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-next-problem&quot;&gt;The Next Problem&lt;/h3&gt;
&lt;p&gt;Suppose your company grows.&lt;/p&gt;
&lt;p&gt;Now you have:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application Servers

Database Servers

Redis

Background Workers

Message Queues

Monitoring Systems

Admin Tools
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Everything lives inside one VPC.&lt;/p&gt;
&lt;p&gt;At first this sounds convenient.&lt;/p&gt;
&lt;p&gt;Until security enters the conversation.&lt;/p&gt;
&lt;p&gt;Should a database be reachable from everywhere?&lt;/p&gt;
&lt;p&gt;Probably not.&lt;/p&gt;
&lt;p&gt;Should every server have Internet access?&lt;/p&gt;
&lt;p&gt;Probably not.&lt;/p&gt;
&lt;p&gt;Should internal systems be exposed publicly?&lt;/p&gt;
&lt;p&gt;Definitely not.&lt;/p&gt;
&lt;p&gt;This is where subnets appear.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;subnets-are-neighborhoods&quot;&gt;Subnets Are Neighborhoods&lt;/h3&gt;
&lt;p&gt;If a VPC is a city:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;VPC = City
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Subnet = Neighborhood
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A company might create:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;VPC
│
├── Public Subnet
│
├── Application Subnet
│
└── Database Subnet
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each subnet serves a purpose.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Public Subnet

Load Balancer
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Private Application Subnet

App Server 1
App Server 2
App Server 3
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Private Database Subnet

PostgreSQL
Redis
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice something important.&lt;/p&gt;
&lt;p&gt;The database sits deeper inside the infrastructure.&lt;/p&gt;
&lt;p&gt;Further away from the Internet.&lt;/p&gt;
&lt;p&gt;This is intentional.&lt;/p&gt;
&lt;p&gt;Because good infrastructure is built around reducing exposure.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-database-doesn-t-need-the-internet&quot;&gt;The Database Doesn't Need The Internet&lt;/h3&gt;
&lt;p&gt;Many founders are surprised by this.&lt;/p&gt;
&lt;p&gt;A database usually doesn't need users.&lt;/p&gt;
&lt;p&gt;A database needs applications.&lt;/p&gt;
&lt;p&gt;That's a completely different requirement.&lt;/p&gt;
&lt;p&gt;Consider:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Customer
    ↓
Application
    ↓
Database
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The customer never talks directly to PostgreSQL.&lt;/p&gt;
&lt;p&gt;Only the application does.&lt;/p&gt;
&lt;p&gt;So exposing the database publicly creates risk without creating value.&lt;/p&gt;
&lt;p&gt;This is why production databases often live in private subnets.&lt;/p&gt;
&lt;p&gt;The database can still be reached.&lt;/p&gt;
&lt;p&gt;But only by trusted systems.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;every-server-gets-a-private-address&quot;&gt;Every Server Gets A Private Address&lt;/h3&gt;
&lt;p&gt;Now imagine an application server wants to reach PostgreSQL.&lt;/p&gt;
&lt;p&gt;How does it find the database?&lt;/p&gt;
&lt;p&gt;The same way you find a building.&lt;/p&gt;
&lt;p&gt;Addresses.&lt;/p&gt;
&lt;p&gt;Every server receives an IP address.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application

10.0.1.10
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Database

10.0.2.20
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These are private IP addresses.&lt;/p&gt;
&lt;p&gt;Not public ones.&lt;/p&gt;
&lt;p&gt;Nobody on the Internet can reach them.&lt;/p&gt;
&lt;p&gt;But machines inside the VPC can.&lt;/p&gt;
&lt;p&gt;Now the application knows:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Database

10.0.2.20
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Problem solved?&lt;/p&gt;
&lt;p&gt;Not quite.&lt;/p&gt;
&lt;p&gt;Knowing an address isn't enough.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;knowing-the-address-doesn-t-create-a-path&quot;&gt;Knowing The Address Doesn't Create A Path&lt;/h3&gt;
&lt;p&gt;Imagine someone gives you:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;221B Baker Street
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Great.&lt;/p&gt;
&lt;p&gt;You know the destination.&lt;/p&gt;
&lt;p&gt;But how do you get there?&lt;/p&gt;
&lt;p&gt;You need roads.&lt;/p&gt;
&lt;p&gt;Networks have the same problem.&lt;/p&gt;
&lt;p&gt;An IP address tells you:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Where
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But not:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;How
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That responsibility belongs to routing.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;routing-is-the-gps-of-the-cloud&quot;&gt;Routing Is The GPS Of The Cloud&lt;/h3&gt;
&lt;p&gt;Every network contains routing rules.&lt;/p&gt;
&lt;p&gt;These rules answer one question:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Where should this packet go next?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A route table might contain:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Destination      Target

10.0.0.0/16      Local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Meaning:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Any traffic
inside this VPC
stays inside this VPC
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now imagine:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application

10.0.1.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;sending a request to:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Database

10.0.2.20
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The network checks the routing table.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Destination?

10.0.2.20
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Result:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Inside VPC
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Therefore:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Deliver Locally
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The packet never leaves the cloud network.&lt;/p&gt;
&lt;p&gt;The Internet is never involved.&lt;/p&gt;
&lt;p&gt;The communication happens entirely inside private infrastructure.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-request-s-actual-journey&quot;&gt;The Request's Actual Journey&lt;/h3&gt;
&lt;p&gt;When the application queries PostgreSQL:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT * FROM users;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What really happens is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application
   ↓
Private IP
   ↓
Route Table
   ↓
Database Subnet
   ↓
Database Server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No Internet.&lt;/p&gt;
&lt;p&gt;No DNS lookup to the public Internet.&lt;/p&gt;
&lt;p&gt;No external networking providers.&lt;/p&gt;
&lt;p&gt;Just internal routing.&lt;/p&gt;
&lt;p&gt;This is why internal communication is usually:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Faster&lt;/li&gt;
&lt;li&gt;More secure&lt;/li&gt;
&lt;li&gt;More predictable&lt;/li&gt;
&lt;li&gt;Less exposed to external failures&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-this-matters-to-founders&quot;&gt;Why This Matters To Founders&lt;/h3&gt;
&lt;p&gt;At first glance this sounds like technical trivia.&lt;/p&gt;
&lt;p&gt;It's not.&lt;/p&gt;
&lt;p&gt;Because infrastructure decisions directly affect business outcomes.&lt;/p&gt;
&lt;p&gt;Imagine two architectures.&lt;/p&gt;
&lt;h4 id=&quot;architecture-a&quot;&gt;Architecture A&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application
     ↓
Internet
     ↓
Database
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;architecture-b&quot;&gt;Architecture B&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Application
     ↓
Private Network
     ↓
Database
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The second architecture provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Better security&lt;/li&gt;
&lt;li&gt;Lower attack surface&lt;/li&gt;
&lt;li&gt;Lower latency&lt;/li&gt;
&lt;li&gt;Fewer compliance concerns&lt;/li&gt;
&lt;li&gt;Better scalability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The customer never notices.&lt;/p&gt;
&lt;p&gt;But the company benefits every day.&lt;/p&gt;
&lt;p&gt;This is one of the reasons mature SaaS platforms invest heavily in infrastructure design.&lt;/p&gt;
&lt;p&gt;Not because customers ask for VPCs.&lt;/p&gt;
&lt;p&gt;Because customers expect reliability.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-most-important-lesson&quot;&gt;The Most Important Lesson&lt;/h3&gt;
&lt;p&gt;When most people think about cloud infrastructure, they think about servers.&lt;/p&gt;
&lt;p&gt;Experienced engineers think about networks.&lt;/p&gt;
&lt;p&gt;Because before applications communicate:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Networks must exist.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Before databases respond:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Routes must exist.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Before systems scale:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Infrastructure boundaries must exist.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The Internet is only one network.&lt;/p&gt;
&lt;p&gt;Most production systems spend far more time communicating inside private networks than across the public Internet.&lt;/p&gt;
&lt;p&gt;And understanding that idea is the first step toward understanding modern cloud infrastructure.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;frequently-asked-questions-13&quot;&gt;Frequently Asked Questions&lt;/h3&gt;
&lt;h4 id=&quot;what-is-a-vpc-&quot;&gt;What is a VPC?&lt;/h4&gt;
&lt;p&gt;A Virtual Private Cloud (VPC) is an isolated private network inside a cloud provider where your infrastructure resources can communicate securely.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;what-is-a-subnet-&quot;&gt;What is a subnet?&lt;/h4&gt;
&lt;p&gt;A subnet is a smaller network segment inside a VPC used to organize and isolate infrastructure resources.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;why-do-servers-use-private-ip-addresses-&quot;&gt;Why do servers use private IP addresses?&lt;/h4&gt;
&lt;p&gt;Private IP addresses allow internal communication without exposing systems directly to the public Internet.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;does-traffic-between-servers-always-go-through-the-internet-&quot;&gt;Does traffic between servers always go through the Internet?&lt;/h4&gt;
&lt;p&gt;No.&lt;/p&gt;
&lt;p&gt;In most cloud architectures, communication between internal services stays inside the provider's private network.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;what-is-a-route-table-&quot;&gt;What is a route table?&lt;/h4&gt;
&lt;p&gt;A route table contains rules that determine where network traffic should be sent.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;why-are-databases-usually-placed-in-private-subnets-&quot;&gt;Why are databases usually placed in private subnets?&lt;/h4&gt;
&lt;p&gt;Because databases typically only need to communicate with application servers, not with public users.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;key-takeaways-1&quot;&gt;Key Takeaways&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Most production server-to-server communication never touches the public Internet.&lt;/li&gt;
&lt;li&gt;A VPC creates an isolated private network inside the cloud.&lt;/li&gt;
&lt;li&gt;Subnets divide a network into smaller security and operational boundaries.&lt;/li&gt;
&lt;li&gt;Servers communicate using private IP addresses.&lt;/li&gt;
&lt;li&gt;Route tables determine how packets travel through the network.&lt;/li&gt;
&lt;li&gt;Security starts with network design, not application code.&lt;/li&gt;
&lt;li&gt;Cloud infrastructure is fundamentally a networking problem before it becomes a server problem.&lt;/li&gt;
&lt;li&gt;Understanding VPCs, subnets, private IPs, and routes is the foundation of modern cloud architecture.&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25364/internet-free-infrastructure-how-two-servers-talk-without-using-the-internet</guid>
<pubDate>Tue, 25 Aug 2026 17:21:06 +0000</pubDate>
</item>
<item>
<title>HttpClient Socket Exhaustion</title>
<link>https://coderlegion.com/25280/httpclient-socket-exhaustion</link>
<description>&lt;p&gt; Your .NET API is Slowly Dying (And You Don't Even Know It)&lt;/p&gt;
&lt;p&gt;Last month, our production system started timing out randomly. No errors. No warnings. Just... slow death.&lt;br&gt;
After 3 sleepless nights and diving through 60+ microservices, I found the culprit:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
var client = new HttpClient(); // This single line
&lt;/code&gt;&lt;br&gt;
Here's what was happening:&lt;br&gt;
Every HTTP call was creating a NEW TCP socket. Under load, we exhausted the system's connection pool. Requests started queuing. Response times went from 200ms to 30+ seconds.&lt;/p&gt;
&lt;p&gt;The Silent Killer:&lt;br&gt;
•	✅ Your code compiles fine&lt;br&gt;
•	✅ Your tests pass&lt;br&gt;
•	✅ It works in dev/staging&lt;br&gt;
•	❌ It crashes in production under real load&lt;/p&gt;
&lt;p&gt;The Fix That Saved Our SLA:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;  
// In Startup.cs
&lt;/code&gt;&lt;br&gt;
`services.AddHttpClient(&quot;MyService&quot;, client =&amp;gt; {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;client.Timeout = TimeSpan.FromSeconds(120);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}) &lt;code&gt;
&lt;/code&gt;.ConfigurePrimaryHttpMessageHandler(() =&amp;gt; new SocketsHttpHandler {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PooledConnectionLifetime = TimeSpan.FromMinutes(2),
PooledConnectionIdleTimeout = TimeSpan.FromMinutes(5),
MaxConnectionsPerServer = 20,
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;});`&lt;/p&gt;
&lt;p&gt;`// In your service&lt;br&gt;
public class MyService {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;private readonly IHttpClientFactory _clientFactory;    
public MyService(IHttpClientFactory clientFactory) {
    _clientFactory = clientFactory;
}    
public async Task&amp;lt;string&amp;gt; GetDataAsync() {
    var client = _clientFactory.CreateClient(&quot;MyService&quot;);
    // Use the client
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;br&gt;
`&lt;/p&gt;
&lt;p&gt;The Results: &lt;br&gt;
 95% reduction in connection failures &lt;br&gt;
⚡ 40% improvement in throughput &lt;br&gt;
 Prevented potential revenue loss from timeouts&lt;/p&gt;
&lt;p&gt;The Lesson:&lt;br&gt;
IHttpClientFactory isn't just a &quot;best practice&quot; - it's a production survival tool.&lt;br&gt;
Microsoft documented this in 2018, but I still see this anti-pattern EVERYWHERE.&lt;br&gt;
Have you been bitten by socket exhaustion? &lt;/p&gt;
&lt;p&gt;Share your battle story in comments &lt;/p&gt;
&lt;p&gt; #performance #dotnet #csharp #softwareengineering #productionissues #microservices #debugging #azure #performanceoptimization #lessonslearned #techleadership&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25280/httpclient-socket-exhaustion</guid>
<pubDate>Mon, 24 Aug 2026 10:37:13 +0000</pubDate>
</item>
<item>
<title>Social Networking Website Development: A Complete Guide</title>
<link>https://coderlegion.com/25094/social-networking-website-development-a-complete-guide</link>
<description>&lt;p&gt;Everyone wants to build the next big social platform. But most people who start down that road hit the same wall pretty fast — they don't know where to begin, what features actually matter, or how much the whole thing is going to cost.&lt;/p&gt;
&lt;p&gt;If you've been sitting on an idea for a community platform, a niche network, or even a full-scale social media site, this guide is for you. We're breaking down everything from planning and features to tech choices and launch strategy, so you can move forward with confidence instead of guessing your way through it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What Is a Social Networking Website (and Why Build One)?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A social networking website is an online platform that lets users create profiles, connect with others, share content, and engage within a community. Think beyond just Facebook or Instagram. Niche social networks built around fitness communities, alumni groups, professional industries, or local neighborhoods are thriving right now.&lt;/p&gt;
&lt;p&gt;The demand for focused, community-driven platforms has never been higher. People are tired of noisy, algorithm-heavy mega-platforms and actively looking for spaces where they actually belong. That's a real opportunity for founders and businesses willing to build something intentional.&lt;/p&gt;
&lt;p&gt;Plan Before You Build&lt;/p&gt;
&lt;p&gt;Skipping the planning phase is the single biggest reason social platforms fail before they ever find an audience.&lt;/p&gt;
&lt;p&gt;Before you write a line of code or hire a developer, get clear on these fundamentals:&lt;/p&gt;
&lt;p&gt;Who is your audience? Define exactly who the platform is for and what problem it solves for them. The more specific, the better. &quot;Professionals in renewable energy&quot; beats &quot;anyone interested in green living.&quot;&lt;br&gt;
What is your MVP? Your minimum viable product should include only the features users absolutely need to get value from day one. Resist the urge to build everything at once.&lt;/p&gt;
&lt;p&gt;What is your budget? Factor in development, hosting, marketing, and at least six months of operational costs before you launch.&lt;/p&gt;
&lt;p&gt;What are your legal requirements? Privacy policies, terms of service, GDPR compliance, and content moderation rules need to be in place before users sign up.&lt;/p&gt;
&lt;p&gt;Taking the time here saves you from expensive course corrections later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Core Features Every Social Network Needs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Whether you're building a small niche community or a large-scale platform, certain features are non-negotiable. These are the building blocks of any solid &lt;a rel=&quot;nofollow&quot; href=&quot;https://wpwebinfotech.com/social-networking/&quot;&gt;social networking website development&lt;/a&gt; project.&lt;br&gt;
User Profiles and Onboarding&lt;/p&gt;
&lt;p&gt;Profiles are how people represent themselves on your platform. They should be easy to set up and immediately useful. A good onboarding flow gets new users to value within the first five minutes, which is the window that determines whether they stick around.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;News Feed and Content Posting&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The feed is the heartbeat of any social platform. Users need to be able to post text, images, and video, and they need a feed that surfaces relevant content from people and groups they follow. Get this right and you create a reason to come back every day.&lt;br&gt;
Messaging and Notifications&lt;/p&gt;
&lt;p&gt;Real-time messaging between users is a baseline expectation now. Pair that with smart notifications (in-app, email, and push) and you start building habitual engagement. Nobody checks a platform that never tells them something is happening.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Groups and Communities&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Groups give users a reason to gather around specific topics. They're one of the highest-engagement features on any social platform because they create belonging. Build groups well and your users will do a lot of the community-building work for you.&lt;br&gt;
Search and Discovery&lt;/p&gt;
&lt;p&gt;If users can't find people, content, or communities easily, they leave. A strong search function and smart discovery tools (suggested friends, trending topics, recommended groups) keep the network feeling alive and growing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Choosing Your Development Approach&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is the most consequential decision you'll make. There are three main paths, and each comes with real trade-offs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Custom Development&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Building from scratch gives you maximum control and flexibility. It also costs between $50,000 and $500,000 and takes anywhere from nine to eighteen months. This makes sense for funded startups with complex, unique requirements. For most founders, it's overkill at the start.&lt;br&gt;
White-Label Scripts&lt;/p&gt;
&lt;p&gt;A white-label social network script is a pre-built, fully functional platform you can rebrand, customize, and deploy as your own. Costs typically run between $500 and $5,000 for the license, and you can go from purchase to live platform in a matter of weeks. You get full source code ownership, which means you're not renting someone else's software.&lt;br&gt;
SaaS Platforms&lt;/p&gt;
&lt;p&gt;Software-as-a-service solutions let you launch without touching code at all. They're great for testing an idea quickly, but you give up data ownership, customization depth, and flexibility. If you outgrow the platform, migrating is painful.&lt;/p&gt;
&lt;p&gt;For most people starting out, white-label development hits the sweet spot between speed, cost, and control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Tech Stack Behind a Social Network&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you're going the custom route, your technology choices shape everything about how your platform performs and scales.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt; Laravel (PHP) is the most popular choice for social platforms and what most white-label scripts are built on. Node.js is strong for real-time features. Django works well if your platform leans heavily on data or machine learning.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt; React.js is widely used and has a massive ecosystem. Vue.js pairs particularly well with Laravel and has a gentler learning curve. Next.js adds server-side rendering, which helps with SEO and initial load times.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Database and infrastructure:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.mysql.com/&quot;&gt;MySQL&lt;/a&gt; or &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.postgresql.org/&quot;&gt;PostgreSQL&lt;/a&gt; for structured user data, Redis for caching and real-time data, and Elasticsearch if you need powerful search. For media storage, AWS S3 or DigitalOcean Spaces handle photos and videos at scale. WebSockets (via Pusher or Socket.io) power real-time messaging and live notifications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to Launch Without an Empty Network&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The empty room problem kills more social platforms than bad code ever will. Nobody wants to join a platform where nothing is happening.&lt;/p&gt;
&lt;p&gt;Before you open your doors publicly, spend two to four weeks running a soft launch with a seed community of 50 to 200 founding members you've invited personally. Pre-populate the platform with quality content. Create active discussions. Assign community moderators. Give founding members something special, like exclusive badges or lifetime premium access, to build loyalty from day one.&lt;br&gt;
When you do open publicly, you're launching into a living, breathing community, not a ghost town.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Monetization Models That Actually Work&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Most successful social networks don't rely on a single income stream. Here are the approaches that perform best:&lt;/p&gt;
&lt;p&gt;Premium subscriptions give users access to advanced features in exchange for a monthly fee. Verified badges, ad-free experience, and enhanced analytics are popular premium perks.&lt;/p&gt;
&lt;p&gt;Advertising works well at scale. Sponsored posts and promoted content can generate significant revenue once you have consistent traffic, but it requires a sizable user base to be meaningful.&lt;br&gt;
Marketplace commissions are powerful if your platform facilitates any kind of buying or selling. Taking a percentage on transactions adds up quickly.&lt;/p&gt;
&lt;p&gt;Virtual gifts and in-app currency perform especially well on entertainment and creator-focused platforms where users want to show appreciation for content they love.&lt;/p&gt;
&lt;p&gt;Start with one or two revenue streams and expand as you grow. Overcomplicating monetization too early creates friction for new users.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Common Mistakes to Avoid&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A few pitfalls come up again and again in social platform development, and they're worth knowing about before you're in the middle of one.&lt;/p&gt;
&lt;p&gt;Building too many features before launch is the most common error. Feature creep delays your timeline and burns your budget on things users may not even want. Launch lean and iterate based on real feedback.&lt;/p&gt;
&lt;p&gt;Underestimating content moderation is another costly mistake. Without automated filters, reporting tools, and clear community guidelines, spam and low-quality content will overrun your platform fast.&lt;br&gt;
Finally, don't try to be everything to everyone. The most successful social networks dominate a small, specific audience before they expand. Start narrow, build deep loyalty, then grow from there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Building a social platform is genuinely exciting, and it's more accessible than most people think. You don't need a massive budget or a year-long timeline to get something real in front of users.&lt;/p&gt;
&lt;p&gt;Social networking website development comes down to making smart decisions early: knowing your audience, choosing the right development approach, building the features that actually matter, and exploring technologies such as &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.lyzr.ai/blog/ai-agents-for-social-media&quot;&gt;AI Agents for Social Media&lt;/a&gt; to improve engagement, content management, and user interactions. Get those foundations right and you've got a real shot at building something people keep coming back to. Start with a focused plan, stay close to your users, and don't wait for perfect before you ship.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25094/social-networking-website-development-a-complete-guide</guid>
<pubDate>Fri, 21 Aug 2026 14:30:35 +0000</pubDate>
</item>
<item>
<title>I Had Never Touched a Mobile Core Network. Then I Shipped a PR to Magma's Production Codebase</title>
<link>https://coderlegion.com/24892/i-had-never-touched-a-mobile-core-network-then-i-shipped-a-pr-to-magmas-production-codebase</link>
<description>&lt;p&gt;A few weeks ago I had never touched a mobile core network. I didn't know what an EPC was, what AGW stood for, or why anyone would run a 4G stack on their laptop.&lt;/p&gt;
&lt;p&gt;Today I've deployed one, fixed a production bug in it, and shipped a PR that's now part of the codebase. Here's how that happened.&lt;/p&gt;
&lt;h3 id=&quot;what-is-magma-&quot;&gt;What is Magma?&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://magmacore.org&quot;&gt;Magma&lt;/a&gt; is a Linux Foundation Networking project — an open-source mobile core network platform that lets you deploy 4G and 5G infrastructure without expensive proprietary hardware. Think of it as the software that sits between your phone and the internet when you're on a cellular network.&lt;/p&gt;
&lt;p&gt;I joined as a mentee with basically zero telecom knowledge. What followed was one of the most intense technical learning experiences I've had.&lt;/p&gt;
&lt;h3 id=&quot;deploying-the-stack&quot;&gt;Deploying the stack&lt;/h3&gt;
&lt;p&gt;The first challenge was just getting the thing running. Magma's Access Gateway (AGW) runs inside Docker containers, and the setup involves coordinating a lot of moving parts — orchestration, subscriber databases, the gateway itself. Getting through that process from scratch forced me to actually understand what each component does, not just follow steps.&lt;/p&gt;
&lt;h3 id=&quot;finding-the-ubuntu-24-04-breakage&quot;&gt;Finding the Ubuntu 24.04 breakage&lt;/h3&gt;
&lt;p&gt;Once the environment was running, I started auditing the Dockerfiles. The project had accumulated dependencies that silently broke on newer Ubuntu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;python3-distutils&lt;/code&gt; — removed in Ubuntu 24.04, so installs fail quietly&lt;/li&gt;
&lt;li&gt;&lt;code&gt;libssl1.1&lt;/code&gt; — not available on 24.04, replaced by &lt;code&gt;libssl3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These aren't the kind of errors that scream at you. You have to actually check whether what the Dockerfile is requesting still exists in the target OS.&lt;/p&gt;
&lt;h3 id=&quot;the-fix-14-files-one-pr&quot;&gt;The fix: 14 files, one PR&lt;/h3&gt;
&lt;p&gt;The fix wasn't just swapping package names:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updated the &lt;code&gt;subscriberdb&lt;/code&gt; Dockerfile to use Ubuntu 24.04 as base&lt;/li&gt;
&lt;li&gt;Replaced deprecated packages with their 24.04 equivalents&lt;/li&gt;
&lt;li&gt;Updated the GitHub Actions CI workflow to test against a matrix of &lt;code&gt;ubuntu-20.04&lt;/code&gt; and &lt;code&gt;ubuntu-24.04&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Traced the breakage across 14 files where OS assumptions were baked in&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The CI matrix means future contributors will catch OS-specific breakage before it ships — that felt meaningful. Not just fixing something, but making it harder to break again.&lt;/p&gt;
&lt;h3 id=&quot;what-surprised-me&quot;&gt;What surprised me&lt;/h3&gt;
&lt;p&gt;Open-source maintenance is a lot of archaeology. Code accumulates assumptions — about the OS, about which packages exist, about the Python version installed — and nobody documents them because at the time they were obvious. Finding them means reading carefully and asking what the code &lt;em&gt;expects&lt;/em&gt;, not just what it does.&lt;/p&gt;
&lt;p&gt;The second surprise: telecom infra sounds intimidating, but it's just software running in containers, with logs you can read like anything else.&lt;/p&gt;
&lt;h3 id=&quot;what-s-next&quot;&gt;What's next&lt;/h3&gt;
&lt;p&gt;I recently graduated from the Magma mentorship program (spring 2026 cohort) — &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.credly.com/badges/adad8227-2748-4473-8297-faa8493f1704/public_url&quot;&gt;credential here&lt;/a&gt;. Continuing to contribute to Magma while going deeper on the ML side — agentic AI frameworks, research papers, and projects connecting both worlds.&lt;/p&gt;
&lt;p&gt;Originally posted on &lt;a rel=&quot;nofollow&quot; href=&quot;https://karthik-unni.github.io/posts/magma-experience.html&quot;&gt;my blog&lt;/a&gt; — I write about ML, systems, and open source there.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24892/i-had-never-touched-a-mobile-core-network-then-i-shipped-a-pr-to-magmas-production-codebase</guid>
<pubDate>Wed, 19 Aug 2026 06:26:42 +0000</pubDate>
</item>
<item>
<title>I Had Never Touched a Mobile Core Network. Then I Shipped a PR to Magma's Production Codebase</title>
<link>https://coderlegion.com/24847/i-had-never-touched-a-mobile-core-network-then-i-shipped-a-pr-to-magmas-production-codebase</link>
<description>&lt;p&gt;A few weeks ago, I had never touched a mobile core network.&lt;/p&gt;
&lt;p&gt;I didn't know what an EPC was. I didn't know what AGW stood for. And I definitely didn't understand why someone would want to run a 4G network stack on their laptop.&lt;/p&gt;
&lt;p&gt;Then I joined the Magma mentorship program.&lt;/p&gt;
&lt;p&gt;By the end of it, I had deployed a mobile core network locally, investigated a real compatibility problem, traced the issue across the codebase, updated the affected Dockerfiles and CI configuration, and shipped a pull request that became part of the project.&lt;/p&gt;
&lt;p&gt;This is the story of how I went from knowing almost nothing about telecom infrastructure to contributing to a production open-source codebase.&lt;/p&gt;
&lt;h3 id=&quot;what-is-magma--1&quot;&gt;What Is Magma?&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://magmacore.org/&quot;&gt;Magma&lt;/a&gt; is an open-source mobile core network platform under the Linux Foundation Networking ecosystem.&lt;/p&gt;
&lt;p&gt;At a high level, a mobile core sits behind the radio access network and handles things such as authentication, subscriber management, routing, and connectivity between mobile users and external networks.&lt;/p&gt;
&lt;p&gt;Magma provides software components that allow organizations and developers to build and operate mobile networks using open-source technologies rather than relying entirely on proprietary infrastructure.&lt;/p&gt;
&lt;p&gt;For someone coming from a computer science and AI background, it sounded intimidating.&lt;/p&gt;
&lt;p&gt;I joined the Spring 2026 Magma mentorship cohort with essentially zero telecom experience.&lt;/p&gt;
&lt;p&gt;That turned out to be a good thing.&lt;/p&gt;
&lt;p&gt;Instead of trying to learn everything about telecommunications before touching the code, I learned by getting the system running and then following the problems wherever they led.&lt;/p&gt;
&lt;h3 id=&quot;the-first-challenge-getting-the-stack-running&quot;&gt;The First Challenge: Getting the Stack Running&lt;/h3&gt;
&lt;p&gt;My first goal wasn't to fix anything.&lt;/p&gt;
&lt;p&gt;It was simply:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Get Magma running locally.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Access Gateway (AGW) uses Docker containers, and getting the complete environment working involves multiple components communicating with each other.&lt;/p&gt;
&lt;p&gt;There are services for things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Access Gateway&lt;/li&gt;
&lt;li&gt;Subscriber databases&lt;/li&gt;
&lt;li&gt;Orchestration&lt;/li&gt;
&lt;li&gt;Networking&lt;/li&gt;
&lt;li&gt;Monitoring and supporting services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At first, this looked like a huge collection of unrelated components.&lt;/p&gt;
&lt;p&gt;But getting the system running forced me to understand how they fit together.&lt;/p&gt;
&lt;p&gt;That was probably one of the most valuable parts of the entire experience.&lt;/p&gt;
&lt;p&gt;Instead of reading a definition of a mobile core network and memorizing it, I could actually see the software running.&lt;/p&gt;
&lt;p&gt;I could inspect containers.&lt;/p&gt;
&lt;p&gt;I could read logs.&lt;/p&gt;
&lt;p&gt;I could follow dependencies.&lt;/p&gt;
&lt;p&gt;And whenever something broke, I had a concrete problem to investigate.&lt;/p&gt;
&lt;h3 id=&quot;from-running-the-system-to-reading-the-code&quot;&gt;From Running the System to Reading the Code&lt;/h3&gt;
&lt;p&gt;Once I had the environment working, I started looking through the project's Dockerfiles and build configuration.&lt;/p&gt;
&lt;p&gt;That's where I found something interesting.&lt;/p&gt;
&lt;p&gt;Some of the project's assumptions about the underlying Ubuntu environment were no longer valid on newer versions of Ubuntu.&lt;/p&gt;
&lt;p&gt;The problems weren't necessarily obvious.&lt;/p&gt;
&lt;p&gt;A Dockerfile might request a package that had existed for years.&lt;/p&gt;
&lt;p&gt;That doesn't mean the package still exists in a newer Ubuntu release.&lt;/p&gt;
&lt;p&gt;And that's where software maintenance becomes interesting.&lt;/p&gt;
&lt;p&gt;The code may still look perfectly reasonable.&lt;/p&gt;
&lt;p&gt;The assumption underneath it may simply be outdated.&lt;/p&gt;
&lt;h3 id=&quot;finding-the-ubuntu-24-04-breakage-1&quot;&gt;Finding the Ubuntu 24.04 Breakage&lt;/h3&gt;
&lt;p&gt;Two examples immediately stood out.&lt;/p&gt;
&lt;h4 id=&quot;python3-distutils&quot;&gt;&lt;code&gt;python3-distutils&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;The project depended on &lt;code&gt;python3-distutils&lt;/code&gt;, but &lt;code&gt;distutils&lt;/code&gt; had been removed from newer Python/Ubuntu environments.&lt;/p&gt;
&lt;p&gt;As a result, an installation that worked on an older environment could fail when the same assumptions were applied to Ubuntu 24.04.&lt;/p&gt;
&lt;h4 id=&quot;libssl1-1&quot;&gt;&lt;code&gt;libssl1.1&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Another issue involved:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;libssl1.1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ubuntu 24.04 no longer provides that old OpenSSL package in the same way.&lt;/p&gt;
&lt;p&gt;The newer environment uses the OpenSSL 3 series, including &lt;code&gt;libssl3&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;These aren't spectacular errors.&lt;/p&gt;
&lt;p&gt;There isn't always a giant message saying:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;This Dockerfile is outdated.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Instead, you get an installation failure somewhere in the middle of a much larger build.&lt;/p&gt;
&lt;p&gt;You have to ask:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What exactly is this Dockerfile assuming about the operating system?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That question led me much deeper into the codebase.&lt;/p&gt;
&lt;h3 id=&quot;the-fix-wasn-t-just-changing-two-package-names&quot;&gt;The Fix Wasn't Just Changing Two Package Names&lt;/h3&gt;
&lt;p&gt;At first glance, the solution looked simple.&lt;/p&gt;
&lt;p&gt;Replace the old packages.&lt;/p&gt;
&lt;p&gt;Build again.&lt;/p&gt;
&lt;p&gt;Done.&lt;/p&gt;
&lt;p&gt;It wasn't.&lt;/p&gt;
&lt;p&gt;The same underlying assumptions appeared in multiple places.&lt;/p&gt;
&lt;p&gt;I ended up tracing the issue across &lt;strong&gt;14 files&lt;/strong&gt; where Ubuntu versions, packages, or OS-specific assumptions were involved.&lt;/p&gt;
&lt;p&gt;The changes included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updating the &lt;code&gt;subscriberdb&lt;/code&gt; Dockerfile to use Ubuntu 24.04 as the base.&lt;/li&gt;
&lt;li&gt;Replacing packages that were no longer available with their appropriate 24.04 equivalents.&lt;/li&gt;
&lt;li&gt;Updating the GitHub Actions CI workflow.&lt;/li&gt;
&lt;li&gt;Adding Ubuntu 24.04 alongside Ubuntu 20.04 in the testing matrix.&lt;/li&gt;
&lt;li&gt;Checking the affected Dockerfiles for additional compatibility assumptions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last part was important.&lt;/p&gt;
&lt;p&gt;Fixing the immediate error is one thing.&lt;/p&gt;
&lt;p&gt;Making sure the same problem is less likely to happen again is another.&lt;/p&gt;
&lt;h3 id=&quot;why-the-ci-change-mattered&quot;&gt;Why the CI Change Mattered&lt;/h3&gt;
&lt;p&gt;One of the changes I was particularly happy about was the CI matrix.&lt;/p&gt;
&lt;p&gt;Instead of testing against only one Ubuntu environment, the workflow could test multiple versions:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ubuntu-20.04&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ubuntu-24.04&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This means an OS-specific compatibility issue has a better chance of being detected automatically.&lt;/p&gt;
&lt;p&gt;That changes the contribution from:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;I fixed my environment.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&quot;I helped make the project more resilient to different environments.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That's a much more satisfying kind of open-source contribution.&lt;/p&gt;
&lt;h3 id=&quot;what-open-source-maintenance-actually-feels-like&quot;&gt;What Open-Source Maintenance Actually Feels Like&lt;/h3&gt;
&lt;p&gt;Before this experience, I imagined contributing to a large open-source project mostly meant finding an issue, writing some code, and opening a pull request.&lt;/p&gt;
&lt;p&gt;The reality was different.&lt;/p&gt;
&lt;p&gt;A lot of maintenance is archaeology.&lt;/p&gt;
&lt;p&gt;You encounter code written at a particular point in time.&lt;/p&gt;
&lt;p&gt;At that time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A particular package existed.&lt;/li&gt;
&lt;li&gt;A particular Ubuntu version was common.&lt;/li&gt;
&lt;li&gt;A particular Python version was installed.&lt;/li&gt;
&lt;li&gt;A particular dependency behaved in a particular way.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Years later, those assumptions may no longer hold.&lt;/p&gt;
&lt;p&gt;But the code still contains them.&lt;/p&gt;
&lt;p&gt;Nobody necessarily wrote down why they were there because, when the code was originally written, the reason was obvious.&lt;/p&gt;
&lt;p&gt;As a contributor, you have to reconstruct that history from the code, configuration files, documentation, build logs, and CI failures.&lt;/p&gt;
&lt;p&gt;That was one of the biggest lessons I took away from the project.&lt;/p&gt;
&lt;h3 id=&quot;telecom-infrastructure-wasn-t-as-scary-as-it-sounded&quot;&gt;Telecom Infrastructure Wasn't As Scary As It Sounded&lt;/h3&gt;
&lt;p&gt;The other thing that surprised me was how approachable the underlying debugging process became.&lt;/p&gt;
&lt;p&gt;&quot;Mobile core network&quot; sounds like an enormous specialized field.&lt;/p&gt;
&lt;p&gt;And it is.&lt;/p&gt;
&lt;p&gt;There is a huge amount of telecommunications knowledge behind technologies such as LTE, EPC, 5G, authentication, subscriber management, and network interfaces.&lt;/p&gt;
&lt;p&gt;But I didn't need to become a telecom expert before contributing.&lt;/p&gt;
&lt;p&gt;The debugging process was still familiar.&lt;/p&gt;
&lt;p&gt;Something doesn't work.&lt;/p&gt;
&lt;p&gt;You check the logs.&lt;/p&gt;
&lt;p&gt;You trace the dependency.&lt;/p&gt;
&lt;p&gt;You inspect the configuration.&lt;/p&gt;
&lt;p&gt;You reproduce the problem.&lt;/p&gt;
&lt;p&gt;You look at the relevant code.&lt;/p&gt;
&lt;p&gt;You make a small change.&lt;/p&gt;
&lt;p&gt;You test it.&lt;/p&gt;
&lt;p&gt;Then you discover that your &quot;small change&quot; actually affects five other things.&lt;/p&gt;
&lt;p&gt;That's software engineering.&lt;/p&gt;
&lt;p&gt;The domain was unfamiliar.&lt;/p&gt;
&lt;p&gt;The debugging mindset wasn't.&lt;/p&gt;
&lt;h3 id=&quot;from-beginner-to-contributor&quot;&gt;From Beginner to Contributor&lt;/h3&gt;
&lt;p&gt;The most valuable part of the experience wasn't the specific Ubuntu fix.&lt;/p&gt;
&lt;p&gt;It was realizing that &lt;strong&gt;you don't need to understand an entire codebase before you can contribute to it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You need a sufficiently small problem to start with.&lt;/p&gt;
&lt;p&gt;My starting point was essentially:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;Why isn't this environment building correctly?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That question eventually led me through Docker, Ubuntu packages, CI workflows, networking infrastructure, and parts of the Magma architecture.&lt;/p&gt;
&lt;p&gt;I learned the domain because I needed the knowledge to solve the problem.&lt;/p&gt;
&lt;p&gt;That was much more effective for me than trying to learn telecommunications completely in isolation.&lt;/p&gt;
&lt;h3 id=&quot;what-i-learned&quot;&gt;What I Learned&lt;/h3&gt;
&lt;p&gt;If I had to summarize the experience into a few lessons, they would be these.&lt;/p&gt;
&lt;h4 id=&quot;1-don-t-be-afraid-of-unfamiliar-codebases&quot;&gt;1. Don't be afraid of unfamiliar codebases&lt;/h4&gt;
&lt;p&gt;A repository can look enormous.&lt;/p&gt;
&lt;p&gt;You don't need to understand all of it.&lt;/p&gt;
&lt;p&gt;Find one small problem and follow it.&lt;/p&gt;
&lt;h4 id=&quot;2-read-the-assumptions-not-just-the-code&quot;&gt;2. Read the assumptions, not just the code&lt;/h4&gt;
&lt;p&gt;A Dockerfile isn't just a list of commands.&lt;/p&gt;
&lt;p&gt;It contains assumptions about the operating system, packages, architecture, and runtime environment.&lt;/p&gt;
&lt;p&gt;Those assumptions are often where compatibility problems hide.&lt;/p&gt;
&lt;h4 id=&quot;3-reproducing-a-problem-is-already-progress&quot;&gt;3. Reproducing a problem is already progress&lt;/h4&gt;
&lt;p&gt;Before fixing something, I needed to understand exactly what was failing.&lt;/p&gt;
&lt;p&gt;Being able to reproduce a problem turns a vague bug into something concrete.&lt;/p&gt;
&lt;h4 id=&quot;4-a-good-fix-prevents-future-problems&quot;&gt;4. A good fix prevents future problems&lt;/h4&gt;
&lt;p&gt;Changing one package name might solve today's build.&lt;/p&gt;
&lt;p&gt;Adding compatibility testing can help prevent tomorrow's regression.&lt;/p&gt;
&lt;h4 id=&quot;5-open-source-is-one-of-the-best-ways-to-learn-systems&quot;&gt;5. Open source is one of the best ways to learn systems&lt;/h4&gt;
&lt;p&gt;You get to work with software that other people actually depend on.&lt;/p&gt;
&lt;p&gt;The feedback loop is completely different from building another isolated tutorial project.&lt;/p&gt;
&lt;p&gt;Someone else reviews your changes.&lt;/p&gt;
&lt;p&gt;CI tests them.&lt;/p&gt;
&lt;p&gt;Maintainers question your assumptions.&lt;/p&gt;
&lt;p&gt;And suddenly the code you wrote has to survive outside your laptop.&lt;/p&gt;
&lt;h3 id=&quot;what-s-next-&quot;&gt;What's Next?&lt;/h3&gt;
&lt;p&gt;I recently graduated from the &lt;strong&gt;Spring 2026 Magma mentorship program&lt;/strong&gt;, and I'm continuing to explore open-source systems work.&lt;/p&gt;
&lt;p&gt;At the same time, I'm going deeper into machine learning, agentic AI frameworks, research papers, and projects that connect AI with systems and real-world software.&lt;/p&gt;
&lt;p&gt;The Magma experience reinforced something I want to keep doing:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Go into areas I don't fully understand, find difficult problems, and learn by building.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A few weeks before this project, I didn't know what an AGW was.&lt;/p&gt;
&lt;p&gt;I certainly didn't expect my first serious telecom contribution to involve tracking Ubuntu package compatibility across 14 files.&lt;/p&gt;
&lt;p&gt;But that's exactly what made the experience worth it.&lt;/p&gt;
&lt;p&gt;Sometimes the best way to learn a new field isn't to wait until you're ready.&lt;/p&gt;
&lt;p&gt;It's to find a problem that's slightly beyond your current understanding—and start digging.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Originally published on my &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/karthikunni/i-had-never-touched-a-mobile-core-network-then-i-shipped-a-pr-to-magmas-production-codebase-2b23&quot;&gt;DEV Community&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; href=&quot;https://karthik-unni.github.io/posts/magma-experience.html&quot;&gt;personal blog&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24847/i-had-never-touched-a-mobile-core-network-then-i-shipped-a-pr-to-magmas-production-codebase</guid>
<pubDate>Tue, 18 Aug 2026 17:07:16 +0000</pubDate>
</item>
<item>
<title>DNS Records Explained: A, AAAA, CNAME, MX, TXT, NS, and SRV Records in Modern Internet Infrastructur</title>
<link>https://coderlegion.com/24396/dns-records-explained-aaaa-cname-mx-txt-ns-and-srv-records-modern-internet-infrastructur</link>
<description>&lt;p&gt;In the &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.aniksikder.me/articles/networking/dns-explained-complete-guide&quot;&gt;previous article&lt;/a&gt;, we explored how DNS translates human-friendly domain names into machine-friendly IP addresses and how a request travels through recursive resolvers, root servers, TLD servers, and authoritative nameservers before finally reaching a destination.&lt;/p&gt;
&lt;p&gt;That journey answers how DNS works.&lt;/p&gt;
&lt;p&gt;This article answers a different question:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;What information is DNS actually returning?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When a DNS resolver contacts an authoritative nameserver, it isn’t simply asking for an IP address.&lt;/p&gt;
&lt;p&gt;It is asking for a specific record.&lt;/p&gt;
&lt;p&gt;Those records determine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Where websites live&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Where email should be delivered&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which servers are authoritative&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How domains are verified&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How email is authenticated&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How cloud services are discovered&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How SaaS platforms connect custom domains&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How modern internet infrastructure operates&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;DNS resolution is the process.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;DNS records are the data.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Understanding DNS records is where DNS knowledge becomes practical.&lt;/p&gt;
&lt;p&gt;Whether you’re launching a website, migrating infrastructure, configuring email, deploying applications, implementing custom domains, or troubleshooting production systems, DNS records sit at the center of the operation.&lt;/p&gt;
&lt;h3 id=&quot;why-dns-records-matter-more-than-most-people-realize&quot;&gt;&lt;strong&gt;Why DNS Records Matter More Than Most People Realize&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Many internet outages aren’t caused by application bugs.&lt;/p&gt;
&lt;p&gt;They aren’t caused by database failures.&lt;/p&gt;
&lt;p&gt;They aren’t caused by cloud providers.&lt;/p&gt;
&lt;p&gt;They’re caused by configuration mistakes.&lt;/p&gt;
&lt;p&gt;A misplaced DNS record can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Take an entire website offline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stop customer emails from arriving&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Break API connectivity&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prevent SSL certificate issuance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disrupt SaaS onboarding&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cause search engines to lose access to content&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The irony is that DNS records are often configured once and forgotten until something breaks.&lt;/p&gt;
&lt;p&gt;That’s why understanding them matters.&lt;/p&gt;
&lt;h3 id=&quot;dns-records-the-source-of-truth-behind-every-domain&quot;&gt;&lt;strong&gt;DNS Records: The Source of Truth Behind Every Domain&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Imagine someone enters:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;into a browser.&lt;/p&gt;
&lt;p&gt;Eventually the request reaches the authoritative nameserver.&lt;/p&gt;
&lt;p&gt;The authoritative nameserver responds with records stored inside its DNS zone.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com. IN A 203.0.113.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The response tells the internet:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com
       ↓
203.0.113.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That single record determines where traffic goes.&lt;/p&gt;
&lt;p&gt;Without DNS records, DNS itself would be useless.&lt;/p&gt;
&lt;h3 id=&quot;understanding-dns-record-types&quot;&gt;&lt;strong&gt;Understanding DNS Record Types&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Modern DNS contains dozens of record types.&lt;/p&gt;
&lt;p&gt;However, seven records power the overwhelming majority of websites, applications, email systems, and cloud services.&lt;/p&gt;
&lt;p&gt;Record TypePrimary PurposeAMaps hostname to IPv4AAAAMaps hostname to IPv6CNAMECreates aliasesMXRoutes emailTXTVerification and securityNSDefines authoritative nameserversSRVService discovery&lt;/p&gt;
&lt;p&gt;These records form the foundation of modern internet infrastructure.&lt;/p&gt;
&lt;h3 id=&quot;a-record-explained&quot;&gt;&lt;strong&gt;A Record Explained&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The A Record is the most fundamental DNS record.&lt;/p&gt;
&lt;p&gt;The “A” stands for:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Address&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It maps a hostname directly to an IPv4 address.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com. IN A 203.0.113.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This creates a direct relationship:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com
       ↓
203.0.113.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When someone visits the domain, traffic is sent to that server.&lt;/p&gt;
&lt;h3 id=&quot;why-a-records-are-so-important&quot;&gt;&lt;strong&gt;Why A Records Are So Important&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Every website needs a destination.&lt;/p&gt;
&lt;p&gt;The A Record provides that destination.&lt;/p&gt;
&lt;p&gt;Without it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Browsers cannot locate servers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Applications cannot connect&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;APIs become unreachable&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even the most advanced infrastructure eventually depends on records that resolve to an IP address.&lt;/p&gt;
&lt;h3 id=&quot;where-a-records-are-commonly-used&quot;&gt;&lt;strong&gt;Where A Records Are Commonly Used&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Typical examples include:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;company.com
portfolio.com
store.com
api.company.com
app.company.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Almost every publicly accessible website uses A records somewhere in its architecture.&lt;/p&gt;
&lt;h3 id=&quot;production-reality-a-record-migrations&quot;&gt;&lt;strong&gt;Production Reality: A Record Migrations&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;One of the most common infrastructure projects involves moving applications between servers.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Old Server
203.0.113.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;becomes:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;New Server
203.0.113.50
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Updating the A Record redirects traffic globally without requiring users to change anything.&lt;/p&gt;
&lt;p&gt;This simple capability is one reason DNS remains such a powerful abstraction layer.&lt;/p&gt;
&lt;h3 id=&quot;aaaa-record-explained&quot;&gt;&lt;strong&gt;AAAA Record Explained&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The AAAA Record performs the same role as an A Record.&lt;/p&gt;
&lt;p&gt;The difference is the addressing standard.&lt;/p&gt;
&lt;p&gt;RecordProtocolAIPv4AAAAIPv6&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com. IN AAAA 2001:db8::1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;why-ipv6-exists&quot;&gt;&lt;strong&gt;Why IPv6 Exists&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;IPv4 provides approximately:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;4.3 Billion Addresses
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That seemed enormous in the early days of the internet.&lt;/p&gt;
&lt;p&gt;Today, it isn’t.&lt;/p&gt;
&lt;p&gt;Cloud computing, smartphones, IoT devices, smart vehicles, and connected infrastructure accelerated address consumption dramatically.&lt;/p&gt;
&lt;p&gt;IPv6 was created to solve that limitation.&lt;/p&gt;
&lt;h3 id=&quot;should-every-website-use-aaaa-records-&quot;&gt;&lt;strong&gt;Should Every Website Use AAAA Records?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Not necessarily.&lt;/p&gt;
&lt;p&gt;A common mistake is enabling IPv6 before infrastructure is ready.&lt;/p&gt;
&lt;p&gt;If an application doesn’t properly support IPv6, users may experience connectivity problems despite having perfectly functioning IPv4 infrastructure.&lt;/p&gt;
&lt;p&gt;IPv6 should be enabled deliberately rather than automatically.&lt;/p&gt;
&lt;h3 id=&quot;cname-record-explained&quot;&gt;&lt;strong&gt;CNAME Record Explained&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;CNAME stands for:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Canonical Name&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unlike an A Record, a CNAME does not point to an IP address.&lt;/p&gt;
&lt;p&gt;Instead, it points to another hostname.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;www.example.com IN CNAME example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Which effectively means:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;www.example.com
         ↓
example.com
         ↓
203.0.113.10
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;why-cname-records-exist&quot;&gt;&lt;strong&gt;Why CNAME Records Exist&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Imagine managing:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;www.example.com
blog.example.com
docs.example.com
shop.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If each hostname pointed directly to an IP address, every infrastructure change would require updating multiple records.&lt;/p&gt;
&lt;p&gt;CNAME records eliminate that complexity.&lt;/p&gt;
&lt;p&gt;One change updates every dependent hostname.&lt;/p&gt;
&lt;h3 id=&quot;why-modern-saas-platforms-love-cname-records&quot;&gt;&lt;strong&gt;Why Modern SaaS Platforms Love CNAME Records&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Custom domains have become a standard expectation.&lt;/p&gt;
&lt;p&gt;Instead of:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;customer.platform.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;many organizations prefer:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;app.customer-domain.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The most common implementation relies on CNAME records.&lt;/p&gt;
&lt;p&gt;This approach allows millions of customer domains to connect to shared infrastructure while maintaining branding and flexibility.&lt;/p&gt;
&lt;h3 id=&quot;the-hidden-complexity-of-custom-domains&quot;&gt;&lt;strong&gt;The Hidden Complexity of Custom Domains&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;What appears simple on the surface often requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Domain ownership verification&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS validation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSL certificate provisioning&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Traffic routing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Edge network configuration&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Behind a single CNAME record is often a surprisingly sophisticated platform architecture.&lt;/p&gt;
&lt;h3 id=&quot;cname-vs-a-record&quot;&gt;&lt;strong&gt;CNAME vs A Record&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;One of the most common questions is:&lt;/p&gt;
&lt;h3 id=&quot;when-should-an-a-record-be-used-&quot;&gt;&lt;strong&gt;When should an A Record be used?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;When pointing directly to an IP address.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com IN A 203.0.113.10
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;when-should-a-cname-be-used-&quot;&gt;&lt;strong&gt;When should a CNAME be used?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;When pointing to another hostname.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;www.example.com IN CNAME example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;simple-rule&quot;&gt;&lt;strong&gt;Simple Rule&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Use:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;A Record
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;for servers.&lt;/p&gt;
&lt;p&gt;Use:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;CNAME
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;for aliases.&lt;/p&gt;
&lt;h3 id=&quot;mx-record-explained&quot;&gt;&lt;strong&gt;MX Record Explained&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;MX stands for:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Mail Exchange&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;MX records tell the internet where incoming email should be delivered.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com IN MX 10 mail.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Without MX records:&lt;/p&gt;
&lt;p&gt;Email cannot function.&lt;/p&gt;
&lt;h3 id=&quot;why-mx-records-matter-more-than-most-websites&quot;&gt;&lt;strong&gt;Why MX Records Matter More Than Most Websites&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;A website outage is visible.&lt;/p&gt;
&lt;p&gt;An email outage often isn’t.&lt;/p&gt;
&lt;p&gt;Messages simply disappear.&lt;/p&gt;
&lt;p&gt;Leads go unanswered.&lt;/p&gt;
&lt;p&gt;Support requests never arrive.&lt;/p&gt;
&lt;p&gt;Invoices are missed.&lt;/p&gt;
&lt;p&gt;Customers assume silence means neglect.&lt;/p&gt;
&lt;p&gt;The business impact can be substantial.&lt;/p&gt;
&lt;h3 id=&quot;understanding-mx-priority&quot;&gt;&lt;strong&gt;Understanding MX Priority&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;MX 10 mail-primary.example.com
MX 20 mail-backup.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lower values receive priority.&lt;/p&gt;
&lt;p&gt;If the primary server becomes unavailable, mail automatically flows to the backup system.&lt;/p&gt;
&lt;p&gt;This redundancy improves reliability.&lt;/p&gt;
&lt;h3 id=&quot;txt-record-explained&quot;&gt;&lt;strong&gt;TXT Record Explained&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;TXT records are among the most flexible records in DNS.&lt;/p&gt;
&lt;p&gt;Historically they stored simple text.&lt;/p&gt;
&lt;p&gt;Today they support critical infrastructure functions.&lt;/p&gt;
&lt;h3 id=&quot;txt-records-power-modern-trust-systems&quot;&gt;&lt;strong&gt;TXT Records Power Modern Trust Systems&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Many internet services rely on TXT records to verify ownership.&lt;/p&gt;
&lt;p&gt;Examples include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Google Search Console&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Microsoft 365&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cloud platforms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Email providers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSL certificate services&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;google-site-verification=abc123
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This proves domain ownership without requiring direct server access.&lt;/p&gt;
&lt;h3 id=&quot;txt-records-and-email-security&quot;&gt;&lt;strong&gt;TXT Records and Email Security&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;TXT records are heavily used by:&lt;/p&gt;
&lt;h3 id=&quot;spf&quot;&gt;&lt;strong&gt;SPF&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Defines authorized email senders.&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;v=spf1 include:_spf.google.com ~all
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;dkim&quot;&gt;&lt;strong&gt;DKIM&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Provides cryptographic email signatures.&lt;/p&gt;
&lt;h3 id=&quot;dmarc&quot;&gt;&lt;strong&gt;DMARC&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Defines authentication policies.&lt;/p&gt;
&lt;p&gt;Together these technologies help reduce:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Email spoofing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Phishing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Domain impersonation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In modern environments, email security is largely a DNS problem before it becomes an email problem.&lt;/p&gt;
&lt;h3 id=&quot;ns-record-explained&quot;&gt;&lt;strong&gt;NS Record Explained&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;NS stands for:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Name Server&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;NS records define which nameservers hold authority over a domain.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com IN NS ns1.cloudflare.com
example.com IN NS ns2.cloudflare.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These records tell the internet:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;These servers contain the source of truth.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;why-ns-records-matter&quot;&gt;&lt;strong&gt;Why NS Records Matter&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Without NS records, the DNS hierarchy breaks.&lt;/p&gt;
&lt;p&gt;Resolvers would have no way of discovering where authoritative information lives.&lt;/p&gt;
&lt;p&gt;Every lookup ultimately depends on NS records.&lt;/p&gt;
&lt;p&gt;They form the bridge between domain ownership and DNS management.&lt;/p&gt;
&lt;h3 id=&quot;a-real-infrastructure-example&quot;&gt;&lt;strong&gt;A Real Infrastructure Example&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;A domain may be registered through one provider.&lt;/p&gt;
&lt;p&gt;DNS may be hosted elsewhere.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Registrar:
Namecheap
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;DNS Provider:
Cloudflare
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;NS records connect those two systems.&lt;/p&gt;
&lt;h3 id=&quot;srv-record-explained&quot;&gt;&lt;strong&gt;SRV Record Explained&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;SRV stands for:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Service Record&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;SRV records provide more information than a simple address.&lt;/p&gt;
&lt;p&gt;They specify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Service&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Protocol&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Port&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Priority&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Weight&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;_sip._tcp.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;why-srv-records-exist&quot;&gt;&lt;strong&gt;Why SRV Records Exist&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Many applications need more than an IP address.&lt;/p&gt;
&lt;p&gt;Examples include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SIP systems&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;VoIP platforms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Active Directory&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enterprise applications&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gaming infrastructure&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SRV records allow applications to discover services automatically.&lt;/p&gt;
&lt;p&gt;This reduces manual configuration and improves scalability.&lt;/p&gt;
&lt;h3 id=&quot;dns-records-every-modern-website-typically-uses&quot;&gt;&lt;strong&gt;DNS Records Every Modern Website Typically Uses&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;A standard production setup often includes:&lt;/p&gt;
&lt;h3 id=&quot;website-access&quot;&gt;&lt;strong&gt;Website Access&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;A Record
CNAME Record
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;email-infrastructure&quot;&gt;&lt;strong&gt;Email Infrastructure&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;MX Record
SPF
DKIM
DMARC
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;security-and-verification&quot;&gt;&lt;strong&gt;Security and Verification&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;TXT Record
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;dns-authority&quot;&gt;&lt;strong&gt;DNS Authority&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;NS Record
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;dns-records-during-website-migrations&quot;&gt;&lt;strong&gt;DNS Records During Website Migrations&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Website migrations often fail because DNS planning is treated as an afterthought.&lt;/p&gt;
&lt;p&gt;Common mistakes include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Forgetting MX records&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Removing TXT records&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Incorrect TTL settings&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deleting verification records&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Breaking email authentication&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Successful migrations involve auditing DNS before moving infrastructure.&lt;/p&gt;
&lt;h3 id=&quot;dns-records-and-search-visibility&quot;&gt;&lt;strong&gt;DNS Records and Search Visibility&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;DNS records do not directly improve rankings.&lt;/p&gt;
&lt;p&gt;However, they influence systems that do.&lt;/p&gt;
&lt;p&gt;Reliable DNS supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Website availability&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search engine accessibility&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Email trust&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User experience&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Infrastructure reliability&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Poor DNS management can undermine otherwise excellent websites.&lt;/p&gt;
&lt;h3 id=&quot;quick-reference-table&quot;&gt;&lt;strong&gt;Quick Reference Table&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;GoalRecord TypeHost a WebsiteAEnable IPv6AAAACreate an AliasCNAMEReceive EmailMXVerify Domain OwnershipTXTConfigure SPFTXTConfigure DKIMTXTConfigure DMARCTXTDelegate DNS AuthorityNSDiscover ServicesSRV&lt;/p&gt;
&lt;h3 id=&quot;key-takeaways-2&quot;&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;DNS records are the data layer of DNS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A Records connect hostnames to IPv4 addresses.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AAAA Records connect hostnames to IPv6 addresses.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CNAME Records create aliases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MX Records control email routing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TXT Records power verification and security.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NS Records define authoritative nameservers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SRV Records support service discovery.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modern websites, cloud platforms, SaaS applications, and email systems depend on DNS records.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Understanding DNS records helps prevent outages, improve reliability, and simplify infrastructure management.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24396/dns-records-explained-aaaa-cname-mx-txt-ns-and-srv-records-modern-internet-infrastructur</guid>
<pubDate>Mon, 10 Aug 2026 16:35:02 +0000</pubDate>
</item>
<item>
<title>DNS Explained: The Complete Guide for Founders, Developers, and Modern Businesses</title>
<link>https://coderlegion.com/24303/dns-explained-the-complete-guide-for-founders-developers-and-modern-businesses</link>
<description>&lt;p&gt;Most people don’t think about DNS until something breaks.&lt;/p&gt;
&lt;p&gt;A founder launches a new website and suddenly email stops working.&lt;/p&gt;
&lt;p&gt;A developer migrates infrastructure and traffic starts disappearing.&lt;/p&gt;
&lt;p&gt;A marketing team changes a domain setting and the website becomes unreachable.&lt;/p&gt;
&lt;p&gt;A SaaS company adds custom domains and discovers that domain management is far more complicated than expected.&lt;/p&gt;
&lt;p&gt;The reality is simple:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;DNS is one of the most critical systems on the internet, yet it’s one of the least understood.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Every website, API, SaaS platform, email service, mobile application, cloud platform, and online business depends on DNS.&lt;/p&gt;
&lt;p&gt;Google depends on DNS.&lt;/p&gt;
&lt;p&gt;Cloudflare depends on DNS.&lt;/p&gt;
&lt;p&gt;AWS depends on DNS.&lt;/p&gt;
&lt;p&gt;Your startup depends on DNS.&lt;/p&gt;
&lt;p&gt;And while DNS often appears simple from the outside, there is an incredible amount of engineering hidden beneath a single domain lookup.&lt;/p&gt;
&lt;p&gt;This article is designed for both founders and developers.&lt;/p&gt;
&lt;p&gt;If you’re a founder, you’ll understand how DNS impacts business continuity, SEO, security, email delivery, and customer experience.&lt;/p&gt;
&lt;p&gt;If you’re a developer, you’ll understand how DNS resolution actually works, why DNS records matter, how cloud platforms use DNS internally, and how production-grade systems are built around it.&lt;/p&gt;
&lt;p&gt;Let’s start at the beginning.&lt;/p&gt;
&lt;h3 id=&quot;what-is-dns-&quot;&gt;&lt;strong&gt;What Is DNS?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;DNS stands for:&lt;/p&gt;
&lt;p&gt;Domain Name System&lt;/p&gt;
&lt;p&gt;The easiest explanation is:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;DNS translates human-friendly names into machine-friendly addresses.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Humans prefer:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;openai.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Computers prefer:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;104.18.33.45
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DNS acts as the translation layer between those two worlds.&lt;/p&gt;
&lt;p&gt;Without DNS, every website visit would require memorizing numerical IP addresses.&lt;/p&gt;
&lt;p&gt;Instead of typing:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;google.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;you would need to type something similar to:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;142.250.190.78
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;for every website you wanted to visit.&lt;/p&gt;
&lt;p&gt;Clearly, that wouldn’t scale.&lt;/p&gt;
&lt;p&gt;DNS solves this problem by creating a globally distributed naming system.&lt;/p&gt;
&lt;h3 id=&quot;dns-is-the-internet-s-directory-service&quot;&gt;&lt;strong&gt;DNS Is the Internet’s Directory Service&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Imagine the internet as a massive city.&lt;/p&gt;
&lt;p&gt;Every building has a street address.&lt;/p&gt;
&lt;p&gt;Computers only understand addresses.&lt;/p&gt;
&lt;p&gt;Humans prefer names.&lt;/p&gt;
&lt;p&gt;DNS functions like a directory service that translates:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Company Name
        ↓
Street Address
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Domain Name
        ↓
IP Address
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The idea sounds simple.&lt;/p&gt;
&lt;p&gt;The engineering required to make this work globally, reliably, and within milliseconds is not.&lt;/p&gt;
&lt;h3 id=&quot;why-founders-should-care-about-dns&quot;&gt;&lt;strong&gt;Why Founders Should Care About DNS&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Many founders think DNS is purely a technical concern.&lt;/p&gt;
&lt;p&gt;That’s a mistake.&lt;/p&gt;
&lt;p&gt;DNS directly affects:&lt;/p&gt;
&lt;h3 id=&quot;website-availability&quot;&gt;&lt;strong&gt;Website Availability&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;If DNS fails:&lt;/p&gt;
&lt;p&gt;Your website disappears.&lt;/p&gt;
&lt;p&gt;Not slow.&lt;/p&gt;
&lt;p&gt;Not degraded.&lt;/p&gt;
&lt;p&gt;Gone.&lt;/p&gt;
&lt;p&gt;Users can’t reach it.&lt;/p&gt;
&lt;p&gt;Search engines can’t crawl it.&lt;/p&gt;
&lt;p&gt;Customers can’t buy from it.&lt;/p&gt;
&lt;h3 id=&quot;email-delivery&quot;&gt;&lt;strong&gt;Email Delivery&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Many businesses discover DNS only after email breaks.&lt;/p&gt;
&lt;p&gt;DNS controls:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Google Workspace&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Microsoft 365&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Zoho Mail&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom email servers&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A single DNS mistake can prevent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Sales emails&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Customer support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Password resets&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transactional notifications&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;from reaching users.&lt;/p&gt;
&lt;h3 id=&quot;seo-performance&quot;&gt;&lt;strong&gt;SEO Performance&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;DNS impacts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Availability&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Website speed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Crawlability&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User experience&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Search engines cannot rank websites they cannot consistently access.&lt;/p&gt;
&lt;h3 id=&quot;brand-trust&quot;&gt;&lt;strong&gt;Brand Trust&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Imagine a customer visiting:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;yourbusiness.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and seeing:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;This site can't be reached
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Trust disappears instantly.&lt;/p&gt;
&lt;p&gt;DNS is part of your brand infrastructure.&lt;/p&gt;
&lt;h3 id=&quot;why-developers-must-understand-dns&quot;&gt;&lt;strong&gt;Why Developers Must Understand DNS&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Modern development isn’t just writing code.&lt;/p&gt;
&lt;p&gt;Today developers manage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;APIs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cloud infrastructure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Containers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Load balancers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSL certificates&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SaaS platforms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-region deployments&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DNS sits in the middle of all of them.&lt;/p&gt;
&lt;p&gt;A surprising number of production incidents ultimately trace back to DNS.&lt;/p&gt;
&lt;p&gt;Understanding DNS turns infrastructure troubleshooting from guesswork into engineering.&lt;/p&gt;
&lt;h3 id=&quot;the-dns-resolution-process&quot;&gt;&lt;strong&gt;The DNS Resolution Process&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;When a user enters:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;www.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;inside a browser, what actually happens?&lt;/p&gt;
&lt;p&gt;Most people imagine:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Browser
    ↓
Website
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reality is significantly more complex.&lt;/p&gt;
&lt;h3 id=&quot;step-1-browser-cache&quot;&gt;&lt;strong&gt;Step 1: Browser Cache&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The browser first asks:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Have I looked up this domain recently?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If yes:&lt;/p&gt;
&lt;p&gt;The browser already knows the answer.&lt;/p&gt;
&lt;p&gt;No external DNS request is needed.&lt;/p&gt;
&lt;p&gt;The website loads immediately.&lt;/p&gt;
&lt;p&gt;This is called DNS caching.&lt;/p&gt;
&lt;h3 id=&quot;step-2-operating-system-cache&quot;&gt;&lt;strong&gt;Step 2: Operating System Cache&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;If the browser doesn’t know the answer, it asks the operating system.&lt;/p&gt;
&lt;p&gt;Windows, Linux, macOS, Android, and iOS maintain DNS caches.&lt;/p&gt;
&lt;p&gt;Again:&lt;/p&gt;
&lt;p&gt;If the answer exists locally, the process ends here.&lt;/p&gt;
&lt;h3 id=&quot;step-3-recursive-resolver&quot;&gt;&lt;strong&gt;Step 3: Recursive Resolver&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;If no cached answer exists, the request reaches a recursive DNS resolver.&lt;/p&gt;
&lt;p&gt;Examples include:&lt;/p&gt;
&lt;p&gt;Cloudflare DNS:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;1.1.1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Google DNS:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;8.8.8.8
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Your ISP’s DNS servers.&lt;/p&gt;
&lt;p&gt;The resolver’s job is:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Find the answer on behalf of the user.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;step-4-root-nameservers&quot;&gt;&lt;strong&gt;Step 4: Root Nameservers&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The resolver begins at the top of the DNS hierarchy.&lt;/p&gt;
&lt;p&gt;The internet contains root DNS servers.&lt;/p&gt;
&lt;p&gt;These servers don’t know the IP address of every website.&lt;/p&gt;
&lt;p&gt;Instead they know:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Which servers are responsible for top-level domains.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;.com
.org
.net
.io
.dev
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;step-5-top-level-domain-servers&quot;&gt;&lt;strong&gt;Step 5: Top-Level Domain Servers&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Suppose you’re looking for:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The root server responds:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Ask the .com nameservers.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The resolver now contacts the .com infrastructure.&lt;/p&gt;
&lt;h3 id=&quot;step-6-authoritative-nameservers&quot;&gt;&lt;strong&gt;Step 6: Authoritative Nameservers&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The .com servers respond:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;The authoritative DNS servers for&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://example.com&quot;&gt;&lt;em&gt;example.com&lt;/em&gt;&lt;/a&gt; &lt;em&gt;are located here.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now the resolver knows exactly where to find the truth.&lt;/p&gt;
&lt;h3 id=&quot;step-7-final-answer&quot;&gt;&lt;strong&gt;Step 7: Final Answer&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The authoritative DNS server returns:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;203.0.113.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The resolver caches the answer.&lt;/p&gt;
&lt;p&gt;The browser receives the answer.&lt;/p&gt;
&lt;p&gt;The website loads.&lt;/p&gt;
&lt;p&gt;All of this often happens in less than 100 milliseconds.&lt;/p&gt;
&lt;h3 id=&quot;the-dns-hierarchy&quot;&gt;&lt;strong&gt;The DNS Hierarchy&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;DNS is not a giant database.&lt;/p&gt;
&lt;p&gt;It’s a distributed hierarchy.&lt;/p&gt;
&lt;p&gt;Think of it as:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Root
 ├── .com
 ├── .org
 ├── .net
 ├── .io
 └── .dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Under each TLD:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com
openai.com
github.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Under each domain:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;www.example.com
api.example.com
mail.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This hierarchical design is one reason DNS scales globally.&lt;/p&gt;
&lt;h3 id=&quot;understanding-dns-records&quot;&gt;&lt;strong&gt;Understanding DNS Records&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;DNS records are instructions.&lt;/p&gt;
&lt;p&gt;Different record types solve different problems.&lt;/p&gt;
&lt;p&gt;Understanding them is essential for production systems.&lt;/p&gt;
&lt;h3 id=&quot;a-record&quot;&gt;&lt;strong&gt;A Record&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Maps a hostname to an IPv4 address.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com. IN A 203.0.113.10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is the most common DNS record.&lt;/p&gt;
&lt;h3 id=&quot;aaaa-record&quot;&gt;&lt;strong&gt;AAAA Record&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Maps a hostname to an IPv6 address.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com. IN AAAA 2001:db8::1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;IPv6 adoption continues growing across cloud providers and ISPs.&lt;/p&gt;
&lt;h3 id=&quot;cname-record&quot;&gt;&lt;strong&gt;CNAME Record&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Creates an alias.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;www.example.com IN CNAME example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Useful when multiple hostnames point to the same service.&lt;/p&gt;
&lt;h3 id=&quot;mx-record&quot;&gt;&lt;strong&gt;MX Record&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Controls email routing.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com IN MX 10 mail.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Without MX records:&lt;/p&gt;
&lt;p&gt;Email fails.&lt;/p&gt;
&lt;h3 id=&quot;txt-records&quot;&gt;&lt;strong&gt;TXT Records&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;One of the most versatile DNS record types.&lt;/p&gt;
&lt;p&gt;Used for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Domain verification&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SPF&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DKIM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DMARC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Third-party integrations&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Founders often encounter TXT records when connecting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Google Workspace&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Microsoft 365&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search Console&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cloud providers&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ns-records&quot;&gt;&lt;strong&gt;NS Records&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;NS records define authoritative nameservers.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;example.com IN NS ns1.provider.com
example.com IN NS ns2.provider.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These servers become responsible for your DNS zone.&lt;/p&gt;
&lt;h3 id=&quot;why-dns-propagation-takes-time&quot;&gt;&lt;strong&gt;Why DNS Propagation Takes Time&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;One of the most common questions:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Why isn’t my DNS change working?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Usually because of caching.&lt;/p&gt;
&lt;h3 id=&quot;understanding-ttl&quot;&gt;&lt;strong&gt;Understanding TTL&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;TTL means:&lt;/p&gt;
&lt;p&gt;Time To Live&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;TTL = 3600
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This means:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Cache for 1 hour
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Resolvers keep answers cached until TTL expires.&lt;/p&gt;
&lt;h3 id=&quot;the-truth-about-dns-propagation&quot;&gt;&lt;strong&gt;The Truth About DNS Propagation&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;DNS doesn’t actually “spread” changes.&lt;/p&gt;
&lt;p&gt;Resolvers simply stop trusting cached data and ask again.&lt;/p&gt;
&lt;p&gt;This process creates the appearance of propagation.&lt;/p&gt;
&lt;p&gt;Understanding this distinction helps developers troubleshoot DNS issues more effectively.&lt;/p&gt;
&lt;h3 id=&quot;dns-and-website-performance&quot;&gt;&lt;strong&gt;DNS and Website Performance&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;DNS is the first network request most users make.&lt;/p&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;HTML&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CSS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JavaScript&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;APIs&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DNS must succeed.&lt;/p&gt;
&lt;p&gt;Slow DNS creates slower websites.&lt;/p&gt;
&lt;h3 id=&quot;measuring-dns-performance&quot;&gt;&lt;strong&gt;Measuring DNS Performance&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Common metrics include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;DNS lookup time&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TTFB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Latency&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Availability&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A slow DNS provider adds measurable delays before page rendering begins.&lt;/p&gt;
&lt;h3 id=&quot;dns-and-seo&quot;&gt;&lt;strong&gt;DNS and SEO&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Many SEO guides barely discuss DNS.&lt;/p&gt;
&lt;p&gt;That’s unfortunate because DNS indirectly impacts search performance.&lt;/p&gt;
&lt;h3 id=&quot;availability-matters&quot;&gt;&lt;strong&gt;Availability Matters&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Search engines need consistent access.&lt;/p&gt;
&lt;p&gt;If DNS failures occur:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Crawling suffers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Indexing suffers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rankings may suffer&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;performance-matters&quot;&gt;&lt;strong&gt;Performance Matters&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Google increasingly rewards user experience.&lt;/p&gt;
&lt;p&gt;Fast DNS contributes to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Faster page loads&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Better engagement&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improved performance metrics&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;reliability-matters&quot;&gt;&lt;strong&gt;Reliability Matters&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Enterprise-grade DNS infrastructure improves uptime.&lt;/p&gt;
&lt;p&gt;Uptime improves trust.&lt;/p&gt;
&lt;p&gt;Trust improves long-term search visibility.&lt;/p&gt;
&lt;h3 id=&quot;dns-and-geo-generative-engine-optimization-&quot;&gt;&lt;strong&gt;DNS and GEO (Generative Engine Optimization)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;A new challenge is emerging.&lt;/p&gt;
&lt;p&gt;Users increasingly discover businesses through AI systems.&lt;/p&gt;
&lt;p&gt;Large language models, AI search engines, and answer engines rely heavily on accessible infrastructure.&lt;/p&gt;
&lt;p&gt;Reliable DNS contributes to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Consistent crawling&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Better accessibility&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reliable content retrieval&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As GEO evolves, infrastructure quality becomes increasingly important.&lt;/p&gt;
&lt;h3 id=&quot;dns-security-explained&quot;&gt;&lt;strong&gt;DNS Security Explained&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;DNS is also a major attack surface.&lt;/p&gt;
&lt;h3 id=&quot;dns-spoofing&quot;&gt;&lt;strong&gt;DNS Spoofing&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Attackers attempt to redirect users toward malicious destinations.&lt;/p&gt;
&lt;p&gt;The victim enters:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;bank.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;but reaches:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;attacker-site.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;without realizing it.&lt;/p&gt;
&lt;h3 id=&quot;dns-cache-poisoning&quot;&gt;&lt;strong&gt;DNS Cache Poisoning&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Attackers inject false DNS responses into caches.&lt;/p&gt;
&lt;p&gt;Users receive incorrect answers.&lt;/p&gt;
&lt;p&gt;This can lead to phishing and credential theft.&lt;/p&gt;
&lt;h3 id=&quot;dnssec&quot;&gt;&lt;strong&gt;DNSSEC&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;DNSSEC adds cryptographic signatures.&lt;/p&gt;
&lt;p&gt;Benefits include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Authenticity&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrity&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Protection against spoofing&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DNSSEC doesn’t encrypt DNS.&lt;/p&gt;
&lt;p&gt;It verifies DNS.&lt;/p&gt;
&lt;p&gt;That’s an important distinction.&lt;/p&gt;
&lt;h3 id=&quot;email-authentication-and-dns&quot;&gt;&lt;strong&gt;Email Authentication and DNS&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Email security relies heavily on DNS.&lt;/p&gt;
&lt;p&gt;Three records are especially important.&lt;/p&gt;
&lt;h3 id=&quot;spf-1&quot;&gt;&lt;strong&gt;SPF&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Defines which servers can send email.&lt;/p&gt;
&lt;h3 id=&quot;dkim-1&quot;&gt;&lt;strong&gt;DKIM&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Provides cryptographic email signatures.&lt;/p&gt;
&lt;h3 id=&quot;dmarc-1&quot;&gt;&lt;strong&gt;DMARC&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Defines enforcement policies.&lt;/p&gt;
&lt;p&gt;Together they reduce:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Spoofing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Phishing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Email fraud&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-cloud-providers-use-dns&quot;&gt;&lt;strong&gt;How Cloud Providers Use DNS&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Cloud infrastructure relies heavily on DNS.&lt;/p&gt;
&lt;p&gt;AWS.&lt;/p&gt;
&lt;p&gt;Azure.&lt;/p&gt;
&lt;p&gt;Google Cloud.&lt;/p&gt;
&lt;p&gt;Cloudflare.&lt;/p&gt;
&lt;p&gt;DigitalOcean.&lt;/p&gt;
&lt;p&gt;All use DNS extensively.&lt;/p&gt;
&lt;h3 id=&quot;load-balancing&quot;&gt;&lt;strong&gt;Load Balancing&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;DNS can distribute traffic.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;app.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;might resolve to multiple servers.&lt;/p&gt;
&lt;p&gt;Benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Scalability&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Redundancy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reliability&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;geographic-routing&quot;&gt;&lt;strong&gt;Geographic Routing&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Users in Singapore may reach Asian infrastructure.&lt;/p&gt;
&lt;p&gt;Users in Germany may reach European infrastructure.&lt;/p&gt;
&lt;p&gt;Users in New York may reach US infrastructure.&lt;/p&gt;
&lt;p&gt;DNS can make these routing decisions automatically.&lt;/p&gt;
&lt;h3 id=&quot;dns-for-saas-applications&quot;&gt;&lt;strong&gt;DNS for SaaS Applications&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;This is where things become particularly interesting.&lt;/p&gt;
&lt;p&gt;Suppose you’re building a SaaS platform.&lt;/p&gt;
&lt;p&gt;Your customers want:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;client-company.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;instead of:&lt;/p&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;client.yourapp.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This requires custom domain support.&lt;/p&gt;
&lt;p&gt;Custom domain support requires DNS verification.&lt;/p&gt;
&lt;p&gt;DNS verification requires ownership validation.&lt;/p&gt;
&lt;p&gt;DNS becomes part of your product architecture.&lt;/p&gt;
&lt;p&gt;Many SaaS founders underestimate this complexity.&lt;/p&gt;
&lt;h3 id=&quot;common-dns-mistakes-in-production&quot;&gt;&lt;strong&gt;Common DNS Mistakes in Production&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Over the years, the same mistakes appear repeatedly.&lt;/p&gt;
&lt;h3 id=&quot;deleting-records-accidentally&quot;&gt;&lt;strong&gt;Deleting Records Accidentally&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Migration projects frequently break email because MX records were forgotten.&lt;/p&gt;
&lt;h3 id=&quot;ignoring-ttl&quot;&gt;&lt;strong&gt;Ignoring TTL&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Developers make changes expecting instant results.&lt;/p&gt;
&lt;p&gt;DNS doesn’t work that way.&lt;/p&gt;
&lt;h3 id=&quot;no-dns-monitoring&quot;&gt;&lt;strong&gt;No DNS Monitoring&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Businesses discover outages from customers instead of monitoring systems.&lt;/p&gt;
&lt;h3 id=&quot;no-redundancy&quot;&gt;&lt;strong&gt;No Redundancy&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Single-provider DNS creates unnecessary risk.&lt;/p&gt;
&lt;h3 id=&quot;missing-email-security-records&quot;&gt;&lt;strong&gt;Missing Email Security Records&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;SPF, DKIM, and DMARC are often ignored until deliverability problems appear.&lt;/p&gt;
&lt;h3 id=&quot;practical-dns-tools-every-developer-should-know&quot;&gt;&lt;strong&gt;Practical DNS Tools Every Developer Should Know&lt;/strong&gt;&lt;/h3&gt;
&lt;h3 id=&quot;dig&quot;&gt;&lt;strong&gt;dig&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;dig example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The gold standard for DNS troubleshooting.&lt;/p&gt;
&lt;h3 id=&quot;nslookup&quot;&gt;&lt;strong&gt;nslookup&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;nslookup example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Widely available across operating systems.&lt;/p&gt;
&lt;h3 id=&quot;host&quot;&gt;&lt;strong&gt;host&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;host example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quick and simple DNS lookups.&lt;/p&gt;
&lt;h3 id=&quot;whois&quot;&gt;&lt;strong&gt;whois&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;code&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;whois example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Useful for domain ownership and registration information.&lt;/p&gt;
&lt;h3 id=&quot;key-takeaways-3&quot;&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;DNS is the internet’s naming system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Every website, API, email service, and cloud platform relies on DNS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS translates domain names into IP addresses.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS is hierarchical and globally distributed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS records control websites, email, security, and service routing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS impacts performance, reliability, SEO, and user experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNSSEC improves DNS trust and authenticity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SaaS applications often depend heavily on DNS architecture.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Understanding DNS is valuable for founders and essential for developers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;final-thoughts&quot;&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The best infrastructure is often invisible.&lt;/p&gt;
&lt;p&gt;Users never think about DNS when everything works.&lt;/p&gt;
&lt;p&gt;Yet every successful online business depends on it.&lt;/p&gt;
&lt;p&gt;Founders view DNS as a domain setting.&lt;/p&gt;
&lt;p&gt;Developers eventually realize it’s a foundational internet protocol.&lt;/p&gt;
&lt;p&gt;The deeper you go into cloud architecture, distributed systems, SaaS platforms, cybersecurity, and modern software engineering, the more often you’ll encounter DNS.&lt;/p&gt;
&lt;p&gt;Understanding DNS isn’t just about configuring records.&lt;/p&gt;
&lt;p&gt;It’s about understanding how the internet itself finds, trusts, and connects systems together.&lt;/p&gt;
&lt;p&gt;And once you understand that, you’ll start seeing DNS everywhere.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24303/dns-explained-the-complete-guide-for-founders-developers-and-modern-businesses</guid>
<pubDate>Sat, 08 Aug 2026 17:06:27 +0000</pubDate>
</item>
<item>
<title>Cloud-Based Network Monitoring: How It Works, Key Metrics, and Best Practices</title>
<link>https://coderlegion.com/24217/cloud-based-network-monitoring-how-it-works-key-metrics-and-best-practices</link>
<description>&lt;p&gt;Cloud-based network monitoring enables organizations to monitor, manage, and optimize their network infrastructure remotely through cloud-hosted platforms. It provides real-time visibility into network performance, device health, traffic patterns, and security events, allowing IT teams to quickly identify and resolve issues before they impact business operations. Compared to traditional on-premises monitoring, cloud-based solutions offer greater scalability, flexibility, centralized management, and reduced infrastructure costs, making them well suited for modern hybrid and distributed environments.&lt;/p&gt;
&lt;p&gt;Successful cloud-based network monitoring depends on selecting the right monitoring platform, maintaining comprehensive visibility across cloud and on-premises resources, configuring real-time alerts, and continuously analyzing performance data. By adopting proactive monitoring practices, organizations can improve network reliability, strengthen security, optimize resource utilization, and ensure consistent performance as their infrastructure grows and evolves.&lt;/p&gt;
&lt;p&gt;Source: This summary is based on the blog &quot;Cloud-Based Network Monitoring&quot; by PathSolutions.&lt;/p&gt;
&lt;p&gt;Blog URL: &lt;a rel=&quot;nofollow&quot; href=&quot;http://Cloud-based%20network%20monitoring%20enables%20organizations%20to%20monitor,%20manage,%20and%20optimize%20their%20network%20infrastructure%20remotely%20through%20cloud-hosted%20platforms.%20It%20provides%20real-time%20visibility%20into%20network%20performance,%20device%20health,%20traffic%20patterns,%20and%20security%20events,%20allowing%20IT%20teams%20to%20quickly%20identify%20and%20resolve%20issues%20before%20they%20impact%20business%20operations.%20Compared%20to%20traditional%20on-premises%20monitoring,%20cloud-based%20solutions%20offer%20greater%20scalability,%20flexibility,%20centralized%20management,%20and%20reduced%20infrastructure%20costs,%20making%20them%20well%20suited%20for%20modern%20hybrid%20and%20distributed%20environments.%20%20Successful%20cloud-based%20network%20monitoring%20depends%20on%20selecting%20the%20right%20monitoring%20platform,%20maintaining%20comprehensive%20visibility%20across%20cloud%20and%20on-premises%20resources,%20configuring%20real-time%20alerts,%20and%20continuously%20analyzing%20performance%20data.%20By%20adopting%20proactive%20monitoring%20practices,%20organizations%20can%20improve%20network%20reliability,%20strengthen%20security,%20optimize%20resource%20utilization,%20and%20ensure%20consistent%20performance%20as%20their%20infrastructure%20grows%20and%20evolves.%20%20Source:%20This%20summary%20is%20based%20on%20the%20blog%20%22Cloud-Based%20Network%20Monitoring%22%20by%20PathSolutions.%20%20Blog%20URL:%20https://www.pathsolutions.com/blog/cloud-based-network-monitoring&quot;&gt;https://www.pathsolutions.com/blog/cloud-based-network-monitoring&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24217/cloud-based-network-monitoring-how-it-works-key-metrics-and-best-practices</guid>
<pubDate>Thu, 06 Aug 2026 15:01:53 +0000</pubDate>
</item>
<item>
<title>Airtel 5G ODU vs MTN 5G ODU: My Honest Experience After Weeks of Testing in Nigeria</title>
<link>https://coderlegion.com/24157/airtel-5g-odu-vs-mtn-5g-odu-my-honest-experience-after-weeks-of-testing-in-nigeria</link>
<description>&lt;h2 id=&quot;airtel-5g-odu-vs-mtn-5g-odu-my-honest-experience-after-weeks-of-testing-in-nigeria&quot;&gt;Airtel 5G ODU vs MTN 5G ODU: My Honest Experience After Weeks of Testing in Nigeria&lt;/h2&gt;
&lt;p&gt;The arrival of 5G Fixed Wireless Access (FWA) in Nigeria promised something many Nigerians have waited years for—fiber-like internet without laying cables. Airtel and MTN both launched their Outdoor Units (ODUs), promising fast, reliable internet for homes and businesses.&lt;/p&gt;
&lt;p&gt;On paper, both products look impressive.&lt;/p&gt;
&lt;p&gt;In reality, your experience depends almost entirely on one thing:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Is there actually a 5G tower serving your location?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After spending time with the &lt;strong&gt;Airtel 5G ODU&lt;/strong&gt;, analyzing signal information, checking neighboring cell towers, comparing coverage maps, and monitoring speed tests across different times of the day, here's what I found.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;first-things-first-a-5g-router-doesn-t-mean-you-ll-get-5g&quot;&gt;First Things First: A 5G Router Doesn't Mean You'll Get 5G&lt;/h2&gt;
&lt;p&gt;This is probably the biggest misconception.&lt;/p&gt;
&lt;p&gt;Many people assume:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Buy a 5G router = Get 5G internet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unfortunately, that's not how mobile networks work.&lt;/p&gt;
&lt;p&gt;A 5G router can only connect to a 5G cell if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;there is a nearby 5G tower,&lt;/li&gt;
&lt;li&gt;the tower has available capacity,&lt;/li&gt;
&lt;li&gt;your signal quality is good enough,&lt;/li&gt;
&lt;li&gt;and the operator has actually deployed 5G in your area.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Otherwise...&lt;/p&gt;
&lt;p&gt;The router simply falls back to LTE (4G/4G+).&lt;/p&gt;
&lt;p&gt;That is exactly what happened in my case.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;my-experience-with-the-airtel-5g-odu&quot;&gt;My Experience with the Airtel 5G ODU&lt;/h2&gt;
&lt;p&gt;I live in a very popular part of Port Harcourt.&lt;/p&gt;
&lt;p&gt;Based on how developed the area is, I naturally assumed Airtel would already have 5G coverage.&lt;/p&gt;
&lt;p&gt;So I purchased the Airtel 5G ODU because I urgently needed better internet for work.&lt;/p&gt;
&lt;p&gt;From the very first day...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I have never connected to Airtel 5G.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not once.&lt;/p&gt;
&lt;p&gt;Even after forcing the router to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5G (NSA)&lt;/li&gt;
&lt;li&gt;Automatic 5G&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It still connects as:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4G+&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every single time.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;looking-deeper-into-the-router&quot;&gt;Looking Deeper into the Router&lt;/h3&gt;
&lt;p&gt;After checking the engineering statistics inside the router, several things became obvious.&lt;br&gt;
&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=8503757350855375159&quot; alt=&quot;&quot;&gt;&lt;br&gt;
The router reports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RSRP around &lt;strong&gt;-72 dBm&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;RSRQ around &lt;strong&gt;-4 dB&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;SINR around &lt;strong&gt;12 dB&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are actually respectable LTE signal values.&lt;/p&gt;
&lt;p&gt;The router also reports only &lt;strong&gt;4G neighboring cells&lt;/strong&gt;, while the &lt;strong&gt;5G neighboring cell list remains empty&lt;/strong&gt;, indicating that no usable Airtel 5G cell is available at the installation point.&lt;/p&gt;
&lt;p&gt;The router is healthy.&lt;/p&gt;
&lt;p&gt;The signal is healthy.&lt;/p&gt;
&lt;p&gt;The missing piece is simply:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No Airtel 5G cell to connect to.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That means the router is behaving exactly like a premium 4G router.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-marketing-problem&quot;&gt;The Marketing Problem&lt;/h2&gt;
&lt;p&gt;This is where I believe expectations and reality differ.&lt;/p&gt;
&lt;p&gt;The device is heavily marketed as a &lt;strong&gt;5G router&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Technically, that statement is correct.&lt;/p&gt;
&lt;p&gt;But many buyers interpret it as:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;Buy this router and you'll enjoy 5G.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is not guaranteed.&lt;/p&gt;
&lt;p&gt;If Airtel has not deployed 5G where you live, then what you've purchased is effectively an expensive LTE router.&lt;/p&gt;
&lt;p&gt;That doesn't necessarily make the product bad.&lt;/p&gt;
&lt;p&gt;It just means coverage matters far more than the hardware.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-esim-surprise&quot;&gt;The eSIM Surprise&lt;/h2&gt;
&lt;p&gt;One interesting discovery was that the ODU internally uses an &lt;strong&gt;embedded SIM (eSIM)&lt;/strong&gt; to communicate with Airtel's network.&lt;/p&gt;
&lt;p&gt;However, after opening the device and inspecting it carefully, it also appears capable of accepting a physical SIM card from the supported operator.&lt;/p&gt;
&lt;p&gt;Testing with a physical SIM produced essentially the same result.&lt;/p&gt;
&lt;p&gt;The limitation wasn't the SIM.&lt;/p&gt;
&lt;p&gt;It was simply the lack of an available Airtel 5G signal.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;real-world-performance&quot;&gt;Real World Performance&lt;/h2&gt;
&lt;p&gt;This is where things became frustrating.&lt;/p&gt;
&lt;p&gt;During quiet periods of the day:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;browsing is fine&lt;/li&gt;
&lt;li&gt;YouTube works&lt;/li&gt;
&lt;li&gt;video calls are usable&lt;/li&gt;
&lt;li&gt;normal office work is okay&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once daytime traffic increases...&lt;/p&gt;
&lt;p&gt;everything changes.&lt;/p&gt;
&lt;p&gt;Uploading documents becomes noticeably slower.&lt;/p&gt;
&lt;p&gt;Cloud backups take much longer.&lt;/p&gt;
&lt;p&gt;Large software downloads become inconsistent.&lt;/p&gt;
&lt;p&gt;Remote desktop sessions start feeling sluggish.&lt;/p&gt;
&lt;p&gt;If your work depends heavily on the internet software development, cloud infrastructure, media uploads, or large file transfers you'll quickly notice the limitations.&lt;/p&gt;
&lt;p&gt;The network isn't unusable.&lt;/p&gt;
&lt;p&gt;It's just not delivering what most people expect from a product carrying the &quot;5G&quot; label.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;then-i-compared-it-with-mtn&quot;&gt;Then I Compared It with MTN&lt;/h2&gt;
&lt;p&gt;This is where things became interesting.&lt;/p&gt;
&lt;p&gt;Using the official coverage maps from both operators, one thing becomes immediately noticeable.&lt;br&gt;
&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=12222356815534782578&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;MTN's 5G footprint appears significantly broader across many urban locations than Airtel's.&lt;/p&gt;
&lt;p&gt;In several cities including parts of Port Harcourt MTN has deployed more visible 5G coverage than Airtel.&lt;/p&gt;
&lt;p&gt;That doesn't mean MTN has perfect coverage.&lt;/p&gt;
&lt;p&gt;It simply means your chances of actually connecting to 5G are generally higher.&lt;/p&gt;
&lt;p&gt;If your location falls within MTN's active 5G coverage, the experience is much closer to what people expect from fixed wireless broadband.&lt;/p&gt;
&lt;p&gt;Users typically report:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;higher download speeds&lt;/li&gt;
&lt;li&gt;lower latency&lt;/li&gt;
&lt;li&gt;better upload performance&lt;/li&gt;
&lt;li&gt;more consistent remote work experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Night &lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=18184334751110821019&quot; alt=&quot;&quot;&gt;time performance is usually even better because fewer users are competing for bandwidth.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;why-time-of-day-matters&quot;&gt;Why Time of Day Matters&lt;/h2&gt;
&lt;p&gt;One thing many reviews fail to mention is network congestion.&lt;/p&gt;
&lt;p&gt;Mobile towers have finite capacity.&lt;/p&gt;
&lt;p&gt;At around:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;8 AM&lt;/li&gt;
&lt;li&gt;lunchtime&lt;/li&gt;
&lt;li&gt;evening&lt;/li&gt;
&lt;li&gt;weekends&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;everyone is online.&lt;/p&gt;
&lt;p&gt;People are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;watching YouTube&lt;/li&gt;
&lt;li&gt;attending meetings&lt;/li&gt;
&lt;li&gt;gaming&lt;/li&gt;
&lt;li&gt;downloading updates&lt;/li&gt;
&lt;li&gt;streaming Netflix&lt;/li&gt;
&lt;li&gt;using TikTok&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everyone is competing for the same radio resources.&lt;/p&gt;
&lt;p&gt;This explains why a speed test at 2 AM can look incredible while the exact same location performs much worse at 2 PM.&lt;br&gt;
&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=6716260798094603179&quot; alt=&quot;&quot;&gt;&lt;br&gt;
When reviewing any mobile broadband service, always ask:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What time was the speed test performed?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Without that context, speed tests can be misleading.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;mounting-the-odu-correctly&quot;&gt;Mounting the ODU Correctly&lt;/h2&gt;
&lt;p&gt;Most people install these devices on a wall because it's easy.&lt;/p&gt;
&lt;p&gt;Personally, I think that's leaving performance on the table.&lt;/p&gt;
&lt;p&gt;Since these outdoor units rely on omnidirectional antennas to receive radio signals, they perform best when they have the clearest possible line of sight to nearby towers.&lt;/p&gt;
&lt;p&gt;A better installation would be similar to how people install:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GOtv antennas&lt;/li&gt;
&lt;li&gt;StarTimes antennas&lt;/li&gt;
&lt;li&gt;TV aerials&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mounting the ODU higher on a pole or mast can reduce obstructions from buildings and trees and often improves signal quality.&lt;/p&gt;
&lt;p&gt;Even small improvements in RSRP and SINR can translate into noticeably better throughput.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;before-buying-any-5g-odu&quot;&gt;Before Buying Any 5G ODU&lt;/h2&gt;
&lt;p&gt;Don't buy based on advertising alone.&lt;/p&gt;
&lt;p&gt;Instead, ask these questions first:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does my area actually have 5G coverage?&lt;/li&gt;
&lt;li&gt;Which operator has deployed more towers nearby?&lt;/li&gt;
&lt;li&gt;Can someone nearby confirm they're getting a genuine 5G connection?&lt;/li&gt;
&lt;li&gt;What are the speeds during peak hours not just at midnight?&lt;/li&gt;
&lt;li&gt;Is the router connecting to NR (5G), or is it staying on LTE?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Doing this homework can save you a lot of disappointment.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;my-verdict&quot;&gt;My Verdict&lt;/h2&gt;
&lt;p&gt;The Airtel 5G ODU isn't a bad device.&lt;/p&gt;
&lt;p&gt;In fact, the hardware appears capable.&lt;/p&gt;
&lt;p&gt;The problem is that hardware alone cannot create a 5G connection.&lt;/p&gt;
&lt;p&gt;Without sufficient Airtel 5G deployment in your location, the router behaves much like a high-end 4G+ router. That was my experience in Port Harcourt, and the signal information from the router supported that conclusion.&lt;/p&gt;
&lt;p&gt;MTN currently seems to have a stronger 5G rollout in many urban areas, giving its ODU a better chance of delivering the performance buyers expect. However, this doesn't mean MTN will outperform Airtel everywhere coverage varies by neighborhood, and the only reliable predictor is the availability of a nearby 5G cell.&lt;/p&gt;
&lt;p&gt;My advice is simple:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don't buy a 5G router because it says &quot;5G&quot; on the box. Buy it because your location actually has usable 5G coverage.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A few minutes spent checking the official coverage maps and talking to people who already use the service in your neighborhood can save you money, frustration, and unrealistic expectations.&lt;/p&gt;
&lt;p&gt;If you're fortunate enough to be within a well-served 5G area, these ODUs can be an excellent alternative to fiber. If not, you're likely paying a premium for what will effectively be a 4G+ experience until more 5G sites are deployed.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24157/airtel-5g-odu-vs-mtn-5g-odu-my-honest-experience-after-weeks-of-testing-in-nigeria</guid>
<pubDate>Wed, 05 Aug 2026 09:57:21 +0000</pubDate>
</item>
<item>
<title>The Invisible Journey: Tracing Packets Through the Linux Kernel with eBPF and `pwru`</title>
<link>https://coderlegion.com/23470/the-invisible-journey-tracing-packets-through-the-linux-kernel-with-ebpf-and-pwru</link>
<description>&lt;p&gt;The modern developer's landscape is a complex tapestry of microservices, containers, and cloud infrastructure. When an application slows down, or a connection drops, the immediate culprits are often assumed to be the application code itself or the external network. But what about the invisible journey a packet takes &lt;em&gt;inside&lt;/em&gt; the operating system? That often-opaque realm, the Linux kernel, holds the true story of network performance, packet drops, and elusive latency spikes.&lt;/p&gt;
&lt;p&gt;For many developers, the kernel remains a mysterious black box. We interact with it daily through syscalls and network interfaces, but rarely peer into its inner workings. Traditional tools like &lt;code&gt;tcpdump&lt;/code&gt; and &lt;code&gt;netstat&lt;/code&gt; offer glimpses – what leaves our machine, what arrives, and what ports are open – but they often fall short when we need to understand &lt;em&gt;why&lt;/em&gt; a packet was dropped, &lt;em&gt;where&lt;/em&gt; it spent its time, or &lt;em&gt;how&lt;/em&gt; it was processed before it ever reached the application. This is the gap that kernel-level observability tools, powered by eBPF, are rapidly filling.&lt;/p&gt;
&lt;p&gt;Inspired by the journey of a fellow developer learning to navigate the kernel's network stack, this article aims to demystify the process of tracking a packet. We'll explore why deep kernel insight is crucial for modern debugging, introduce the revolutionary technology of eBPF, and then dive hands-on into &lt;code&gt;pwru&lt;/code&gt; – an eBPF-based tool that makes the invisible journey of a packet through the Linux kernel visible and understandable. You don't need to be a kernel developer to unlock these insights; you just need the right tools and a guide to interpret their output.&lt;/p&gt;
&lt;h3 id=&quot;the-invisible-journey-why-deep-packet-tracing-matters&quot;&gt;The Invisible Journey: Why Deep Packet Tracing Matters&lt;/h3&gt;
&lt;p&gt;Imagine a web request taking too long. Your application logs show the request was received, but the response was delayed. Is it the database? The application logic? Or something happening deep within the network stack of your server, or even the client? Without kernel-level visibility, you're often left guessing.&lt;/p&gt;
&lt;h4 id=&quot;beyond-the-wire-the-limitations-of-userspace-tools&quot;&gt;Beyond the Wire: The Limitations of Userspace Tools&lt;/h4&gt;
&lt;p&gt;Tools like &lt;code&gt;tcpdump&lt;/code&gt; are invaluable. They capture packets as they hit or leave a network interface, showing you what's on the wire. &lt;code&gt;netstat&lt;/code&gt; or &lt;code&gt;ss&lt;/code&gt; show you active connections, listening ports, and basic statistics. These are the frontline tools for network debugging, and they serve a critical purpose.&lt;/p&gt;
&lt;p&gt;However, they have inherent limitations when you need to understand the &lt;em&gt;internal processing&lt;/em&gt; of a packet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Black Box Kernel:&lt;/strong&gt; &lt;code&gt;tcpdump&lt;/code&gt; sees packets &lt;em&gt;before&lt;/em&gt; the kernel processes them on ingress and &lt;em&gt;after&lt;/em&gt; the kernel has finished processing them on egress. What happens in between – routing decisions, firewall rules, socket buffer management, TCP stack processing – remains a mystery.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Packet Drops:&lt;/strong&gt; If &lt;code&gt;tcpdump&lt;/code&gt; doesn't show a packet leaving your machine, you know it never made it to the wire. But &lt;em&gt;why&lt;/em&gt;? Was it dropped by a firewall? A full transmit queue? A routing error? &lt;code&gt;tcpdump&lt;/code&gt; can't tell you the precise point of failure within the kernel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latency Attribution:&lt;/strong&gt; A high round-trip time could be due to network latency, but it could also be due to significant processing delays within the kernel's network stack or the application's inability to read from the socket quickly enough. Isolating these factors is hard with userspace tools alone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context:&lt;/strong&gt; Userspace tools often lack the rich context available inside the kernel, such as the specific kernel function being executed, the CPU core involved, or the network namespace.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;common-scenarios-demanding-kernel-level-insight&quot;&gt;Common Scenarios Demanding Kernel-Level Insight&lt;/h4&gt;
&lt;p&gt;Developers frequently encounter scenarios where kernel-level packet tracing becomes indispensable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mysterious Packet Drops:&lt;/strong&gt; &quot;My service isn't receiving all the packets it expects, but &lt;code&gt;tcpdump&lt;/code&gt; on the interface shows them arriving.&quot; This suggests an internal kernel drop.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unexplained Latency:&lt;/strong&gt; &quot;My application is slow, but CPU and memory usage are fine, and network latency to other services seems normal.&quot; Could it be contention within the kernel's network buffers or inefficient processing?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firewall Troubleshooting:&lt;/strong&gt; &quot;I've configured &lt;code&gt;iptables&lt;/code&gt;, but traffic still isn't flowing as expected, or is being unexpectedly blocked.&quot; Pinpointing the exact &lt;code&gt;netfilter&lt;/code&gt; hook where a packet is dropped or modified is crucial.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Routing and Forwarding Issues:&lt;/strong&gt; &quot;Why isn't this packet being forwarded to the correct destination, even though my routing table looks correct?&quot; Tracing the packet's path through the routing decision points can reveal the answer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complex Network Stacks:&lt;/strong&gt; In environments using technologies like IPVS, BPF-based load balancers, or advanced container networking (e.g., Cilium, Calico), understanding the kernel's internal packet flow becomes paramount.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These challenges highlight the need for a deeper level of observability – one that allows us to peek &lt;em&gt;inside&lt;/em&gt; the kernel and follow a packet's every step.&lt;/p&gt;
&lt;h3 id=&quot;enter-ebpf-programmable-kernel-observability&quot;&gt;Enter eBPF: Programmable Kernel Observability&lt;/h3&gt;
&lt;p&gt;For decades, getting insight into the Linux kernel involved recompiling it, using &lt;code&gt;ftrace&lt;/code&gt;, or relying on limited &lt;code&gt;procfs&lt;/code&gt; entries. These methods were often cumbersome, risky, or lacked the necessary detail. The advent of eBPF (extended Berkeley Packet Filter) changed everything.&lt;/p&gt;
&lt;h4 id=&quot;what-is-ebpf-a-high-level-overview-&quot;&gt;What is eBPF? (A High-Level Overview)&lt;/h4&gt;
&lt;p&gt;At its core, eBPF is a revolutionary technology that allows programs to run safely within the Linux kernel. Think of it as a highly efficient, event-driven virtual machine embedded directly in the kernel. Unlike traditional kernel modules, eBPF programs are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Safe:&lt;/strong&gt; All eBPF programs must pass a rigorous kernel verifier before execution, ensuring they don't crash the kernel, loop indefinitely, or access unauthorized memory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event-Driven:&lt;/strong&gt; eBPF programs are attached to various &quot;hook points&quot; within the kernel. These can be:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kprobes/Kretprobes:&lt;/strong&gt; Attach to the entry or exit of almost any kernel function.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uprobes/Uretprobes:&lt;/strong&gt; Attach to the entry or exit of userspace functions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tracepoints:&lt;/strong&gt; Stable, well-defined points intentionally added by kernel developers for tracing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network Hooks:&lt;/strong&gt; For filtering and processing network packets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Syscall Hooks:&lt;/strong&gt; Intercepting system calls.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Efficient:&lt;/strong&gt; They execute in-kernel, avoiding costly context switches between userspace and kernel space. They are typically JIT-compiled to native machine code for maximum performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Programmable:&lt;/strong&gt; Developers write eBPF programs (often in C, then compiled to eBPF bytecode using &lt;code&gt;clang&lt;/code&gt; and &lt;code&gt;llvm&lt;/code&gt;) to perform specific tasks: filter events, collect statistics, modify data, or redirect packets. These programs can then communicate results back to userspace via shared maps or ring buffers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In essence, eBPF provides a powerful, flexible, and safe way to extend kernel functionality and gain unprecedented visibility into its operations without modifying kernel source code or rebooting.&lt;/p&gt;
&lt;h4 id=&quot;the-power-of-ebpf-for-networking&quot;&gt;The Power of eBPF for Networking&lt;/h4&gt;
&lt;p&gt;eBPF's origins are deeply rooted in networking (the original BPF was for packet filtering). Today, its capabilities for network observability and control are immense:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advanced Packet Filtering:&lt;/strong&gt; Beyond what &lt;code&gt;iptables&lt;/code&gt; can do, eBPF programs can filter packets based on arbitrary criteria, even deep into application-layer protocols.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traffic Control:&lt;/strong&gt; Shaping, policing, and load balancing traffic directly in the kernel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security:&lt;/strong&gt; Implementing fine-grained network policies and intrusion detection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability:&lt;/strong&gt; This is where &lt;code&gt;pwru&lt;/code&gt; shines. By attaching eBPF programs to key network functions and tracepoints, we can collect detailed information about every packet as it traverses the kernel's network stack. This allows us to see &lt;em&gt;exactly&lt;/em&gt; what the kernel is doing with each packet, providing unparalleled debugging capabilities.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;pwru-your-guide-through-the-kernel-network-stack&quot;&gt;&lt;code&gt;pwru&lt;/code&gt;: Your Guide Through the Kernel Network Stack&lt;/h3&gt;
&lt;p&gt;While you &lt;em&gt;could&lt;/em&gt; write your own eBPF programs to trace packets, tools like &lt;code&gt;pwru&lt;/code&gt; (Packet Walk Ruler) abstract away the complexity, providing a ready-to-use solution for deep network stack inspection. &lt;code&gt;pwru&lt;/code&gt; leverages eBPF to dynamically attach to numerous kernel functions and tracepoints, giving you a real-time, step-by-step view of a packet's journey.&lt;/p&gt;
&lt;h4 id=&quot;introducing-pwru&quot;&gt;Introducing &lt;code&gt;pwru&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;pwru&lt;/code&gt; isn't just another &lt;code&gt;tcpdump&lt;/code&gt;. It's a specialized tool designed to show you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hook Point:&lt;/strong&gt; The specific kernel function or tracepoint the packet is currently passing through.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action:&lt;/strong&gt; What the kernel did with the packet at that point (e.g., &lt;code&gt;PASS&lt;/code&gt;, &lt;code&gt;CONSUMED&lt;/code&gt;, &lt;code&gt;DROP&lt;/code&gt;, &lt;code&gt;QUEUE&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Packet Metadata:&lt;/strong&gt; Crucial details like source/destination IP/port, protocol, packet length (&lt;code&gt;skb_len&lt;/code&gt;), network namespace, CPU, and more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Context:&lt;/strong&gt; Which &lt;code&gt;netfilter&lt;/code&gt; hook, if any, was involved, and the return code.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This level of detail allows you to precisely identify where packets are being handled, modified, or dropped within the kernel, making it an indispensable tool for debugging complex network issues.&lt;/p&gt;
&lt;h4 id=&quot;setting-up-pwru-practical-steps-&quot;&gt;Setting Up &lt;code&gt;pwru&lt;/code&gt; (Practical Steps)&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;pwru&lt;/code&gt; requires a relatively recent Linux kernel (4.9+ for basic eBPF, 5.x+ for full features and stability) and a few development tools to compile its eBPF programs.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux Kernel: Version 4.9+ (5.x or newer recommended).&lt;/li&gt;
&lt;li&gt;Build Tools: &lt;code&gt;clang&lt;/code&gt;, &lt;code&gt;llvm&lt;/code&gt;, &lt;code&gt;make&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Kernel Headers: Ensure your kernel headers match your running kernel version. On Debian/Ubuntu, &lt;code&gt;sudo apt install linux-headers-$(uname -r)&lt;/code&gt;. On Fedora/CentOS/RHEL, &lt;code&gt;sudo yum install kernel-devel&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;pwru&lt;/code&gt; is typically installed by cloning its GitHub repository and building it.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Ensure you have git, clang, llvm, and make installed
sudo apt update &amp;amp;&amp;amp; sudo apt install git clang llvm make   # For Debian/Ubuntu
# sudo yum install git clang llvm make                   # For Fedora/CentOS/RHEL

git clone https://github.com/cilium/pwru.git
cd pwru
make
sudo make install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If &lt;code&gt;make install&lt;/code&gt; fails or you prefer not to install globally, you can run &lt;code&gt;pwru&lt;/code&gt; directly from the &lt;code&gt;pwru/bin&lt;/code&gt; directory.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;your-first-packet-trace-with-pwru&quot;&gt;Your First Packet Trace with &lt;code&gt;pwru&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Let's start with a simple example: tracing an HTTP request to a local web server (or any external website).&lt;/p&gt;
&lt;p&gt;Open two terminal windows. In the first, start &lt;code&gt;pwru&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Terminal 1: Start pwru
# Trace TCP packets on port 80 (HTTP) or 443 (HTTPS)
# We'll customize output fields for clarity
sudo pwru --output-fields=src_ip,dst_ip,proto,port,func,action,skb_len \
          --filter &quot;proto == IPPROTO_TCP &amp;amp;&amp;amp; (dst_port == 80 || dst_port == 443)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the second terminal, make an HTTP request:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Terminal 2: Make an HTTP request
curl -v http://example.com
# Or, if you have a local web server:
# curl -v http://localhost
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Back in Terminal 1, you'll see a flood of output. Let's break down a typical line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src_ip=192.168.1.100 dst_ip=93.184.216.34 proto=TCP port=51234-&amp;gt;80 func=ip_rcv action=PASS skb_len=60
src_ip=192.168.1.100 dst_ip=93.184.216.34 proto=TCP port=51234-&amp;gt;80 func=ip_local_deliver_finish action=PASS skb_len=60
src_ip=192.168.1.100 dst_ip=93.184.216.34 proto=TCP port=51234-&amp;gt;80 func=tcp_v4_rcv action=PASS skb_len=60
... (many more lines) ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What are we seeing? Each line represents a &quot;hook point&quot; – a specific kernel function or tracepoint – that the packet traversed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;src_ip&lt;/code&gt;, &lt;code&gt;dst_ip&lt;/code&gt;, &lt;code&gt;proto&lt;/code&gt;, &lt;code&gt;port&lt;/code&gt;: Basic network tuple identifying the packet.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;func&lt;/code&gt;: The kernel function name (&lt;code&gt;ip_rcv&lt;/code&gt;, &lt;code&gt;tcp_v4_rcv&lt;/code&gt;, etc.). This is the heart of &lt;code&gt;pwru&lt;/code&gt;'s insight.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;action&lt;/code&gt;: What happened at that function. &lt;code&gt;PASS&lt;/code&gt; means it continued its journey. &lt;code&gt;DROP&lt;/code&gt; would indicate it was discarded. &lt;code&gt;CONSUMED&lt;/code&gt; often means it was processed and removed from the general network path (e.g., by the TCP stack).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skb_len&lt;/code&gt;: The size of the &lt;code&gt;sk_buff&lt;/code&gt; (socket buffer) structure carrying the packet data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This output shows the packet moving through different layers and processing stages within the kernel. For an outgoing packet, you'd see functions like &lt;code&gt;ip_output&lt;/code&gt;, &lt;code&gt;dev_queue_xmit&lt;/code&gt;, etc. For an incoming packet destined for a local socket, you'd see &lt;code&gt;ip_rcv&lt;/code&gt;, &lt;code&gt;ip_local_deliver&lt;/code&gt;, &lt;code&gt;tcp_v4_rcv&lt;/code&gt;, and eventually &lt;code&gt;sock_queue_rcv_skb&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;deeper-dives-understanding-the-kernel-network-path&quot;&gt;Deeper Dives: Understanding the Kernel Network Path&lt;/h3&gt;
&lt;p&gt;Interpreting &lt;code&gt;pwru&lt;/code&gt;'s output requires a basic understanding of how the Linux kernel processes network packets. While the full network stack is incredibly complex, we can identify key functions and their roles.&lt;/p&gt;
&lt;h4 id=&quot;key-kernel-hook-points-and-their-significance&quot;&gt;Key Kernel Hook Points and Their Significance&lt;/h4&gt;
&lt;p&gt;The kernel network stack can be broadly divided into ingress (receiving) and egress (transmitting) paths.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ingress Path (Receiving a Packet):&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;__netif_receive_skb_core&lt;/code&gt;: The initial entry point for a packet received from the network driver.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip_rcv&lt;/code&gt;: The entry point for IPv4 packets after &lt;code&gt;__netif_receive_skb_core&lt;/code&gt;. It performs basic validation and determines if the packet is for the local host or needs forwarding.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip_local_deliver_finish&lt;/code&gt;: If the packet is for the local host, this function is called. It passes the packet to the appropriate transport layer (TCP, UDP, ICMP).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tcp_v4_rcv&lt;/code&gt; / &lt;code&gt;udp_rcv&lt;/code&gt;: Entry points for TCP and UDP packets, respectively, after &lt;code&gt;ip_local_deliver_finish&lt;/code&gt;. These functions handle protocol-specific processing (e.g., TCP sequence number checks, ACK generation).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sock_queue_rcv_skb&lt;/code&gt;: The packet is finally queued to the receiving socket's buffer, making it available for a userspace application to read via &lt;code&gt;recvmsg&lt;/code&gt;, &lt;code&gt;read&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Egress Path (Transmitting a Packet):&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;tcp_sendmsg&lt;/code&gt; / &lt;code&gt;udp_sendmsg&lt;/code&gt;: Initiated by a userspace application's &lt;code&gt;sendmsg&lt;/code&gt; or &lt;code&gt;write&lt;/code&gt; call. These prepare the packet for transmission at the transport layer.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip_output&lt;/code&gt;: Handles the IPv4 header creation and prepares the packet for sending.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip_finish_output&lt;/code&gt;: Finalizes IP output, including routing decisions.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dev_queue_xmit&lt;/code&gt;: Queues the packet to the appropriate network device's transmit queue.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;__dev_xmit_skb&lt;/code&gt;: The packet is handed off to the network driver for physical transmission.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;pwru&lt;/code&gt; shows you the packet traversing many of these functions (and many more in between), along with &lt;code&gt;netfilter&lt;/code&gt; hooks (&lt;code&gt;NF_HOOK&lt;/code&gt; points) and other processing stages.&lt;/p&gt;
&lt;h4 id=&quot;common-scenarios-amp-pwru-insights&quot;&gt;Common Scenarios &amp;amp; &lt;code&gt;pwru&lt;/code&gt; Insights&lt;/h4&gt;
&lt;p&gt;Let's look at how &lt;code&gt;pwru&lt;/code&gt; can help diagnose specific problems.&lt;/p&gt;
&lt;h5 id=&quot;1-pinpointing-packet-drops&quot;&gt;1. Pinpointing Packet Drops&lt;/h5&gt;
&lt;p&gt;One of the most powerful uses of &lt;code&gt;pwru&lt;/code&gt; is identifying &lt;em&gt;where&lt;/em&gt; and &lt;em&gt;why&lt;/em&gt; a packet is dropped. If you suspect packet loss:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Terminal 1: Watch for dropped packets
sudo pwru --output-fields=func,action,src_ip,dst_ip,proto,port,skb_len --filter &quot;action == DROP&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, try to reproduce the packet loss (e.g., attempt a connection to a non-existent port on your machine, or trigger a firewall rule). You might see output like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;func=ip_rcv_finish action=DROP src_ip=192.168.1.1 dst_ip=192.168.1.100 proto=ICMP port=0-&amp;gt;0 skb_len=84
func=nf_hook_slow action=DROP src_ip=192.168.1.1 dst_ip=192.168.1.100 proto=TCP port=12345-&amp;gt;80 skb_len=60
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ip_rcv_finish&lt;/code&gt; with &lt;code&gt;DROP&lt;/code&gt; might indicate issues like a full receive queue or an invalid packet.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nf_hook_slow&lt;/code&gt; with &lt;code&gt;DROP&lt;/code&gt; is a strong indicator that a &lt;code&gt;netfilter&lt;/code&gt; (iptables) rule is dropping the packet. This immediately tells you to inspect your firewall configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&quot;2-analyzing-latency-attribution&quot;&gt;2. Analyzing Latency Attribution&lt;/h5&gt;
&lt;p&gt;If &lt;code&gt;curl&lt;/code&gt; to &lt;code&gt;localhost&lt;/code&gt; is slow, where is the time spent? &lt;code&gt;pwru&lt;/code&gt; can show the timestamps for each hook point, though interpreting the exact delta requires careful analysis and often correlation with other tools. For a quick check, you can add &lt;code&gt;ktime&lt;/code&gt; (kernel time in nanoseconds) to your output:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Terminal 1: Trace a local request with timestamps
sudo pwru --output-fields=ktime,func,action,src_ip,dst_ip,proto,port,skb_len \
          --filter &quot;proto == IPPROTO_TCP &amp;amp;&amp;amp; (src_ip == 127.0.0.1 || dst_ip == 127.0.0.1) &amp;amp;&amp;amp; (dst_port == 80 || src_port == 80)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, in Terminal 2: &lt;code&gt;curl http://localhost&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;By examining the &lt;code&gt;ktime&lt;/code&gt; values, you can see if there are unusually large gaps between consecutive &lt;code&gt;func&lt;/code&gt; calls for the same packet. A long gap between &lt;code&gt;ip_rcv&lt;/code&gt; and &lt;code&gt;ip_local_deliver&lt;/code&gt; could suggest CPU contention or heavy processing before the packet reaches the transport layer. A delay between &lt;code&gt;sock_queue_rcv_skb&lt;/code&gt; and the application's actual read might point to application-level slowness.&lt;/p&gt;
&lt;h5 id=&quot;3-understanding-firewall-netfilter-interaction&quot;&gt;3. Understanding Firewall/Netfilter Interaction&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;pwru&lt;/code&gt; can explicitly show &lt;code&gt;netfilter&lt;/code&gt; processing. &lt;code&gt;netfilter&lt;/code&gt; hooks are points where &lt;code&gt;iptables&lt;/code&gt; rules operate.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Terminal 1: Trace packets, specifically looking for netfilter hooks
sudo pwru --output-fields=func,action,src_ip,dst_ip,proto,port,skb_len,hook_name,nf_verdict \
          --filter &quot;proto == IPPROTO_TCP &amp;amp;&amp;amp; (dst_port == 22 || src_port == 22)&quot; # e.g., SSH traffic
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You'll see lines like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;func=nf_hook_slow action=PASS hook_name=NF_INET_PRE_ROUTING nf_verdict=NF_ACCEPT src_ip=...
func=nf_hook_slow action=PASS hook_name=NF_INET_LOCAL_IN nf_verdict=NF_ACCEPT src_ip=...
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hook_name&lt;/code&gt;: Specifies the &lt;code&gt;netfilter&lt;/code&gt; hook (e.g., &lt;code&gt;NF_INET_PRE_ROUTING&lt;/code&gt;, &lt;code&gt;NF_INET_LOCAL_IN&lt;/code&gt;, &lt;code&gt;NF_INET_FORWARD&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nf_verdict&lt;/code&gt;: The verdict of the &lt;code&gt;netfilter&lt;/code&gt; chain (&lt;code&gt;NF_ACCEPT&lt;/code&gt;, &lt;code&gt;NF_DROP&lt;/code&gt;, &lt;code&gt;NF_STOLEN&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a packet is dropped by &lt;code&gt;netfilter&lt;/code&gt;, you'll see an &lt;code&gt;action=DROP&lt;/code&gt; along with &lt;code&gt;nf_verdict=NF_DROP&lt;/code&gt; at a specific &lt;code&gt;hook_name&lt;/code&gt;, telling you exactly which &lt;code&gt;iptables&lt;/code&gt; chain is responsible.&lt;/p&gt;
&lt;h5 id=&quot;4-tracing-specific-connections&quot;&gt;4. Tracing Specific Connections&lt;/h5&gt;
&lt;p&gt;To focus on a single problematic connection, use detailed filters:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Terminal 1: Trace a specific source IP and destination port
sudo pwru --output-fields=func,action,src_ip,dst_ip,proto,port,skb_len \
          --filter &quot;src_ip == 10.0.0.5 &amp;amp;&amp;amp; dst_port == 8080&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This ensures you only see the relevant packets, reducing noise and making analysis much easier. You can combine filters with &lt;code&gt;AND&lt;/code&gt;, &lt;code&gt;OR&lt;/code&gt;, &lt;code&gt;NOT&lt;/code&gt; for very precise targeting.&lt;/p&gt;
&lt;h3 id=&quot;advanced-pwru-techniques-and-trade-offs&quot;&gt;Advanced &lt;code&gt;pwru&lt;/code&gt; Techniques and Trade-offs&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;pwru&lt;/code&gt; is a powerful tool, and mastering its capabilities involves more than just basic tracing.&lt;/p&gt;
&lt;h4 id=&quot;filtering-and-output-customization&quot;&gt;Filtering and Output Customization&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complex Filters:&lt;/strong&gt; &lt;code&gt;pwru&lt;/code&gt; supports complex logical expressions in its &lt;code&gt;--filter&lt;/code&gt; argument.&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Trace HTTP and HTTPS traffic, but only from a specific source IP, and not if it's an ICMP packet
sudo pwru --filter &quot;proto == IPPROTO_TCP &amp;amp;&amp;amp; (dst_port == 80 || dst_port == 443) &amp;amp;&amp;amp; src_ip == 192.168.1.10 AND NOT proto == IPPROTO_ICMP&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom Output Fields:&lt;/strong&gt; The &lt;code&gt;--output-fields&lt;/code&gt; argument is crucial. You can add fields like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cpu&lt;/code&gt;: Which CPU core processed the packet. Useful for identifying CPU affinity issues.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ktime&lt;/code&gt;: Kernel timestamp (nanoseconds).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;netns&lt;/code&gt;: Network namespace ID. Essential in containerized environments.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ifindex&lt;/code&gt;: Network interface index.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mark&lt;/code&gt;: &lt;code&gt;skb-&amp;gt;mark&lt;/code&gt; value, often used for policy routing or firewall marking.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tstamp&lt;/code&gt;: Hardware timestamp.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ingress_ifindex&lt;/code&gt;, &lt;code&gt;egress_ifindex&lt;/code&gt;: The interface the packet entered/exited.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reason&lt;/code&gt;: Provides more context for drops.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consult &lt;code&gt;pwru --help&lt;/code&gt; for a full list of available fields.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saving Output:&lt;/strong&gt; Redirect &lt;code&gt;pwru&lt;/code&gt;'s output to a file for later analysis, especially for long-running traces.&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo pwru --output-fields=... --filter &quot;...&quot; &amp;gt; pwru_trace.log
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;performance-considerations&quot;&gt;Performance Considerations&lt;/h4&gt;
&lt;p&gt;eBPF is designed for low overhead, but &lt;code&gt;pwru&lt;/code&gt; attaches to &lt;em&gt;many&lt;/em&gt; kernel hook points. On a very busy system with high packet rates, tracing every packet can still generate a substantial amount of data and consume CPU cycles.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Precision is Key:&lt;/strong&gt; Always use the most precise filters possible. Instead of &lt;code&gt;--filter &quot;proto == IPPROTO_TCP&quot;&lt;/code&gt;, use &lt;code&gt;proto == IPPROTO_TCP &amp;amp;&amp;amp; (src_port == 12345 || dst_port == 8080)&lt;/code&gt; to focus on relevant traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output Fields:&lt;/strong&gt; Only request the output fields you truly need. Each field adds a small amount of overhead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Short Bursts:&lt;/strong&gt; For initial diagnosis, run &lt;code&gt;pwru&lt;/code&gt; for short bursts (e.g., 5-10 seconds) to capture a representative sample of traffic during a problem occurrence, rather than letting it run indefinitely.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Production Caution:&lt;/strong&gt; While generally safe, running &lt;code&gt;pwru&lt;/code&gt; on highly loaded production systems without careful filtering and monitoring should be approached with caution. Test your filters in a staging environment first.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;limitations-and-alternatives&quot;&gt;Limitations and Alternatives&lt;/h4&gt;
&lt;p&gt;While &lt;code&gt;pwru&lt;/code&gt; is incredibly powerful, it's not a silver bullet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kernel Knowledge Still Required:&lt;/strong&gt; Interpreting the output, especially the &lt;code&gt;func&lt;/code&gt; names, still requires some understanding of the kernel's network stack. You won't become a kernel expert overnight, but you'll learn key functions relevant to your debugging tasks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Root Privileges:&lt;/strong&gt; &lt;code&gt;pwru&lt;/code&gt; requires root privileges to attach eBPF programs to the kernel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kernel Version Dependency:&lt;/strong&gt; While &lt;code&gt;pwru&lt;/code&gt; tries to be compatible, specific hook points or data structures can vary slightly between kernel versions, potentially affecting output or functionality.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not a Packet Capture Tool:&lt;/strong&gt; &lt;code&gt;pwru&lt;/code&gt; shows kernel events, not the full packet payload. For payload inspection, &lt;code&gt;tcpdump&lt;/code&gt; or Wireshark are still necessary.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Alternatives and Complementary Tools:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BCC Tools:&lt;/strong&gt; The BPF Compiler Collection (BCC) provides a rich set of eBPF-based tools for various aspects of kernel observability, including networking (e.g., &lt;code&gt;tcplife&lt;/code&gt;, &lt;code&gt;dropwatch&lt;/code&gt;, &lt;code&gt;sockstat&lt;/code&gt;). They are often more specialized than &lt;code&gt;pwru&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;bpftrace&lt;/code&gt;:&lt;/strong&gt; If &lt;code&gt;pwru&lt;/code&gt;'s predefined tracing isn't enough, &lt;code&gt;bpftrace&lt;/code&gt; allows you to write custom eBPF one-liners or scripts with a simpler syntax than raw C. This is for when you need to combine specific kernel events or perform custom aggregations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;tracepoint-analyzer&lt;/code&gt;:&lt;/strong&gt; Another tool specifically designed to help understand kernel tracepoints.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;pwru&lt;/code&gt; serves as an excellent starting point and often provides enough detail for most network debugging scenarios. When you hit its limits, &lt;code&gt;bpftrace&lt;/code&gt; or specialized BCC tools are the next logical step.&lt;/p&gt;
&lt;h3 id=&quot;conclusion-1&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;The journey of a packet through the Linux kernel is often an invisible one, a black box that can hide the root causes of frustrating network performance issues, mysterious packet drops, and elusive latency. For too long, developers have been forced to debug these problems with limited visibility, relying on guesswork and external network tools that only show part of the picture.&lt;/p&gt;
&lt;p&gt;eBPF has fundamentally changed this landscape, empowering us to safely and efficiently peer into the kernel's inner workings. Tools like &lt;code&gt;pwru&lt;/code&gt; democratize this power, translating complex kernel events into actionable insights that even developers &quot;who barely know the kernel&quot; can understand and leverage.&lt;/p&gt;
&lt;p&gt;By embracing &lt;code&gt;pwru&lt;/code&gt; and its eBPF underpinnings, you gain a superpower: the ability to trace a packet's every step, understand its fate, and pinpoint precisely where things go wrong within the operating system. This deeper understanding&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/23470/the-invisible-journey-tracing-packets-through-the-linux-kernel-with-ebpf-and-pwru</guid>
<pubDate>Sun, 26 Jul 2026 04:00:42 +0000</pubDate>
</item>
<item>
<title>Router Configuration Theft: How Far Should Credential Rotation Go?</title>
<link>https://coderlegion.com/22975/router-configuration-theft-how-far-should-credential-rotation-go</link>
<description>&lt;p&gt;A copied router configuration creates two response problems. One is the compromised device. The other is every credential, trusted source, and management path described inside the file.&lt;/p&gt;
&lt;p&gt;Rebuilding the router addresses the first problem. It does not automatically contain the second.&lt;/p&gt;
&lt;p&gt;That distinction matters in the activity described by the &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.nsa.gov/Press-Room/Press-Releases-Statements/Press-Release-View/Article/4541059/nsa-and-partners-release-guidance-on-improving-router-hygiene-to-protect-agains/&quot;&gt;joint router-security advisory released July 13, 2026&lt;/a&gt;. The participating agencies attributed the campaign to actors associated with Center 16 of Russia's Federal Security Service.&lt;/p&gt;
&lt;p&gt;The reported technique is not especially exotic. The actors scan for routers that accept legacy SNMP, try weak or default community strings, and issue SNMP Set requests that invoke supported configuration-copy functions. The router then transfers its own configuration, typically over TFTP, to external infrastructure.&lt;/p&gt;
&lt;p&gt;There may be no implant or suspicious process chain to find. A legitimate management function performs the export.&lt;/p&gt;
&lt;h3 id=&quot;the-file-changes-the-containment-boundary&quot;&gt;The file changes the containment boundary&lt;/h3&gt;
&lt;p&gt;A router configuration can contain local credentials, SNMP community strings, management addresses, access-control rules, routes, interface descriptions, neighboring systems, and trusted source addresses.&lt;/p&gt;
&lt;p&gt;Not every item is a reusable secret. The collection still has operational value.&lt;/p&gt;
&lt;p&gt;Routes and interface descriptions help map the environment. Access-control rules identify permitted sources. Management settings point toward monitoring, authentication, and administrative systems. Even strongly protected passwords do not hide those relationships.&lt;/p&gt;
&lt;p&gt;The FBI has documented both configuration collection and further activity in this campaign. In an &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.ic3.gov/PSA/2025/PSA250820&quot;&gt;August 2025 warning&lt;/a&gt;, it reported that Center 16 actors had collected configurations from thousands of networking devices associated with US critical-infrastructure entities during the preceding year.&lt;/p&gt;
&lt;p&gt;On some vulnerable devices, the actors modified configurations to enable unauthorized access. They used that access for reconnaissance that revealed interest in protocols and applications associated with industrial control systems.&lt;/p&gt;
&lt;p&gt;The FBI did not say that every collected configuration contained reusable credentials. It also did not establish that each collection event led to deeper access. It did document configuration collection, device modification, and downstream reconnaissance within the same campaign.&lt;/p&gt;
&lt;p&gt;That is enough to make a router rebuild an incomplete containment decision.&lt;/p&gt;
&lt;h3 id=&quot;rotation-is-a-dependency-problem&quot;&gt;Rotation is a dependency problem&lt;/h3&gt;
&lt;p&gt;The difficult question is not whether a credential exposed in the file should be changed. It is how far that change must extend.&lt;/p&gt;
&lt;p&gt;A shared SNMP community string may be accepted by an entire device class. A reused local administrator credential may work across sites. A management server address may appear in many allowlists. The &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.ncsc.gov.uk/information/uk-internet-edge-router-devices-advisory&quot;&gt;NCSC's router guidance&lt;/a&gt; pairs management-source allowlists with boundary anti-spoofing so a trusted source cannot simply be impersonated from outside the network.&lt;/p&gt;
&lt;p&gt;Rotating everything immediately can disrupt monitoring, automation, backups, and emergency access. Rotating only the affected router can leave the attacker with valid access elsewhere.&lt;/p&gt;
&lt;p&gt;A practical response starts by separating four questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Was a configuration exported, and where was it sent?&lt;/li&gt;
&lt;li&gt;Which credentials or shared secrets were present in that version of the configuration?&lt;/li&gt;
&lt;li&gt;Where else were those credentials or trust relationships accepted?&lt;/li&gt;
&lt;li&gt;What changed on the router or adjacent management systems?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The third question is where inventory quality becomes incident-response capability. If the team cannot identify every device that accepts a community string or local account, it cannot confidently describe the remaining exposure.&lt;/p&gt;
&lt;h3 id=&quot;detection-has-the-same-dependency-issue&quot;&gt;Detection has the same dependency issue&lt;/h3&gt;
&lt;p&gt;The advisory supplies example Cisco object identifiers for configuration-copy monitoring. One identifies the &lt;code&gt;ccCopy&lt;/code&gt; subtree. Another identifies a destination server address.&lt;/p&gt;
&lt;p&gt;The cited destination-address object, &lt;code&gt;ccCopyServerAddress&lt;/code&gt;, is deprecated and limited to IPv4. Newer implementations can use &lt;code&gt;ccCopyServerAddressType&lt;/code&gt; and &lt;code&gt;ccCopyServerAddressRev1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;An exact-match detector built only from the two examples can therefore miss a valid transaction using the replacement address object. Prefix matching on the &lt;code&gt;ccCopy&lt;/code&gt; subtree, combined with monitoring for SNMP Set requests, covers that case.&lt;/p&gt;
&lt;p&gt;Outbound controls are part of the same detection model. If a router can initiate arbitrary TFTP transfers, the configuration-copy function already has an exit path. External TFTP should be blocked unless it is operationally required, then closely monitored where it cannot be blocked.&lt;/p&gt;
&lt;p&gt;Device logs also need to exist somewhere other than the device. A compromised router should not be the only custodian of evidence about its own management activity.&lt;/p&gt;
&lt;h3 id=&quot;snmpv3-is-necessary-but-scope-still-matters&quot;&gt;SNMPv3 is necessary, but scope still matters&lt;/h3&gt;
&lt;p&gt;The joint advisory and the NSA's &lt;a rel=&quot;nofollow&quot; href=&quot;https://media.defense.gov/2026/Jul/09/2003959459/-1/-1/0/CSI_REDUCING_RISK_OF_SNMP_ABUSE.PDF&quot;&gt;guidance on reducing SNMP abuse&lt;/a&gt; recommend SNMPv3 with &lt;code&gt;authPriv&lt;/code&gt;, which adds authentication and encryption.&lt;/p&gt;
&lt;p&gt;NSA also states that SNMPv3 alone is insufficient. A compromised or over-privileged SNMPv3 credential can still reach sensitive objects unless its permissions are constrained.&lt;/p&gt;
&lt;p&gt;The stronger design separates read and write authority, limits accessible objects through MIB views, restricts management traffic to approved systems, separates the management network where practical, monitors configuration-copy operations, and blocks unnecessary outbound management protocols.&lt;/p&gt;
&lt;p&gt;Where older equipment or management software cannot support &lt;code&gt;authPriv&lt;/code&gt;, NSA identifies &lt;code&gt;authNoPriv&lt;/code&gt; as the fallback but still directs operators to upgrade.&lt;/p&gt;
&lt;p&gt;The immediate inventory is therefore broader than a list of legacy SNMP versions. It also needs to show where management credentials are reused, which systems can issue write operations, and which destinations the infrastructure itself can reach.&lt;/p&gt;
&lt;p&gt;For teams supporting mixed generations of network equipment, the unresolved tradeoff is sequencing. If configuration history is uncertain and the credential inventory is incomplete, do you rotate shared credentials across the reachable device class immediately and accept the outage risk, or contain management traffic first while building the reuse map?&lt;/p&gt;
&lt;p&gt;That decision belongs in the incident runbook before a router exports its own configuration.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/22975/router-configuration-theft-how-far-should-credential-rotation-go</guid>
<pubDate>Sat, 18 Jul 2026 18:32:19 +0000</pubDate>
</item>
<item>
<title>HTTP Status Codes Explained with a Resturant Analogy</title>
<link>https://coderlegion.com/22713/http-status-codes-explained-with-a-resturant-analogy</link>
<description>&lt;p&gt;You order food.The kitchen responds.That's literally what HTTP is - and once you get this, servers will never feel mysterious again.&lt;/p&gt;
&lt;p&gt;A little backstory&lt;/p&gt;
&lt;p&gt;I'm a newcomer to web development, and for the longest time, servers and HTTP felt like some dark magic I wasn't supposed to understand yet. That changed when I started working on my ASCII-ART-WEB project at Zone01.&lt;/p&gt;
&lt;p&gt;The project required me to build an actual HTTP server from scratch — handling requests, sending responses, setting the right status codes. Suddenly all of this wasn't theoretical anymore. I had to understand it. And when it clicked, it clicked hard.&lt;/p&gt;
&lt;p&gt;This article is me passing that click on to you, using the analogy that finally made it stick.&lt;/p&gt;
&lt;p&gt;The internet is a restaurant&lt;/p&gt;
&lt;p&gt;Seriously. Every time you type a URL into your browser, you're basically sitting at a table and calling a waiter over.&lt;/p&gt;
&lt;p&gt;HTTP stands for HyperText Transfer Protocol. It's just the agreed-upon language that lets your browser and the server talk to each other. Nothing more mysterious than that.&lt;/p&gt;
&lt;p&gt;Every page load is a tiny round-trip conversation:&lt;/p&gt;
&lt;p&gt;Browser → [HTTP request] → Server → [HTTP response + status code] → Browser renders the page&lt;/p&gt;
&lt;p&gt;Step by step:&lt;/p&gt;
&lt;p&gt;You type a URL and hit Enter&lt;br&gt;
Your browser sends an HTTP request to the server at that address&lt;br&gt;
The server receives the request and processes it&lt;br&gt;
The server sends back an HTTP response — which includes the data (a webpage, an image, JSON, etc.) and a status code&lt;br&gt;
Your browser reads the status code, then renders the page&lt;/p&gt;
&lt;p&gt;That status code is the kitchen's way of telling the waiter how the order went before the food even leaves the counter.&lt;/p&gt;
&lt;p&gt;What an HTTP request actually looks like&lt;/p&gt;
&lt;p&gt;When your browser asks for a page, it sends something like this under the hood:&lt;/p&gt;
&lt;p&gt;GET /menu HTTP/1.1&lt;br&gt;
Host: restaurant.com&lt;br&gt;
Accept: text/html&lt;/p&gt;
&lt;p&gt;And the server replies:&lt;/p&gt;
&lt;p&gt;HTTP/1.1 200 OK&lt;br&gt;
Content-Type: text/html&lt;br&gt;
Content-Length: 3456&lt;/p&gt;
&lt;p&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br&gt;
...&lt;/p&gt;
&lt;p&gt;That 200 at the top? That's the status code. It's the first thing the browser checks.&lt;/p&gt;
&lt;p&gt;The four status codes every dev must know&lt;/p&gt;
&lt;p&gt;There are over 60 official HTTP status codes, but these four will cover 90% of what you encounter day-to-day.&lt;/p&gt;
&lt;p&gt;200 — OK&lt;/p&gt;
&lt;p&gt;&quot;The food arrived hot and exactly as ordered.&quot;&lt;/p&gt;
&lt;p&gt;The happy path. The server found what you asked for, processed everything correctly, and sent it back. This is what you want to see on every request.&lt;/p&gt;
&lt;p&gt; 400 — Bad Request&lt;/p&gt;
&lt;p&gt;&quot;You ordered in a language the kitchen doesn't understand.&quot;&lt;/p&gt;
&lt;p&gt;This means the request itself was broken — maybe it was missing required data, had invalid formatting, or sent something the server just can't parse. It's a client-side error, meaning the problem is in the request you sent, not the server.&lt;/p&gt;
&lt;p&gt; 404 — Not Found&lt;/p&gt;
&lt;p&gt;&quot;We checked the whole fridge. That dish doesn't exist here.&quot;&lt;/p&gt;
&lt;p&gt;The server is working fine, but the specific thing you asked for — that URL, that file, that route — simply doesn't exist. Classic example: you mistype a URL, or someone deleted a page that used to exist.&lt;/p&gt;
&lt;p&gt;500 — Internal Server Error&lt;/p&gt;
&lt;p&gt;&quot;The oven exploded. It's not your fault — something broke inside the kitchen.&quot;&lt;/p&gt;
&lt;p&gt;The server tried to handle your request but something went wrong in its own code. This is a server-side error. As the user, you did nothing wrong. As the developer, this is where you open your logs and start debugging.&lt;/p&gt;
&lt;p&gt;The golden rule of status codes&lt;/p&gt;
&lt;p&gt;4xx = The customer's fault&lt;br&gt;
5xx = The kitchen's fault&lt;/p&gt;
&lt;p&gt;Memorise this. When you're debugging and you see a 4xx, look at what you're sending. When you see a 5xx, look at what the server is doing with it.&lt;/p&gt;
&lt;p&gt;The full status code family tree&lt;br&gt;
Status codes are grouped by their first digit:&lt;br&gt;
1xx-Informational-&quot;Hold on,still cooking..&quot;&lt;br&gt;
2xx-Success-&quot;Here's your food,enjoy&quot;&lt;br&gt;
3xx-Redirection-&quot;Wrong table-they're at table 7 now&quot;&lt;br&gt;
4xx-Client error-&quot;Your order is the problem&quot;&lt;br&gt;
5xx-Server error-&quot;The kitchen is having a moment&quot;&lt;/p&gt;
&lt;p&gt;A few other useful ones you'll bump into:&lt;/p&gt;
&lt;p&gt;201 Created — used in APIs when something new was successfully created (like a new user account)&lt;br&gt;
301 Moved Permanently — the URL has changed forever, the server redirects you&lt;br&gt;
401 Unauthorized — you need to log in first&lt;br&gt;
403 Forbidden — you're logged in but you're not allowed to access this&lt;br&gt;
422 Unprocessable Entity — the server understood your request but couldn't process it (common in form validation)&lt;/p&gt;
&lt;p&gt;How ASCII-ART-WEB helped me understand all of this&lt;/p&gt;
&lt;p&gt;When I was working on the ASCII-ART-WEB project at Zone01, I had to build an HTTP server in Go that:&lt;/p&gt;
&lt;p&gt;Received a POST request with text from a web form&lt;br&gt;
Converted that text into ASCII art using a banner file&lt;br&gt;
Sent back the result as an HTTP response&lt;/p&gt;
&lt;p&gt;At first, I was just copying status codes without understanding them. Then I hit a bug: my server was sending 200 OK even when the input was invalid.&lt;/p&gt;
&lt;p&gt;A user would send an empty form — technically a bad request — and my server was responding like everything was fine. That's when the restaurant analogy hit me: if a customer orders nothing, the kitchen shouldn't just send back an empty plate with a smile. It should say &quot;400 — your order doesn't make sense.&quot;&lt;/p&gt;
&lt;p&gt;Once I fixed that, my server started behaving like a real server:&lt;/p&gt;
&lt;p&gt;go// If the form input is empty, respond with 400&lt;br&gt;
if userText == &quot;&quot; {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http.Error(w, &quot;400 - Bad Request: input cannot be empty&quot;, http.StatusBadRequest)
return
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;// If the banner file doesn't exist, respond with 404&lt;br&gt;
if _, err := os.Stat(bannerFile); os.IsNotExist(err) {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http.Error(w, &quot;404 - Banner file not found&quot;, http.StatusNotFound)
return
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;// If something unexpected breaks, respond with 500&lt;br&gt;
http.Error(w, &quot;500 - Internal Server Error&quot;, http.StatusInternalServerError)&lt;/p&gt;
&lt;p&gt;Suddenly HTTP wasn't abstract theory. Every status code had a job. Every response had a reason. The restaurant wasn't just an analogy anymore — it was the mental model I used every time I wrote a handler.&lt;/p&gt;
&lt;p&gt;Try it yourself right now&lt;/p&gt;
&lt;p&gt;Open your browser, press F12, and go to the Network tab. Reload any webpage.&lt;/p&gt;
&lt;p&gt;Every single row you see is an HTTP request, with its status code right there in the Status column. Watch the 200s flood in as the page loads. Try visiting a broken URL and watch the 404 appear. This is how real developers debug every single day — and seeing it live is the fastest way to make everything in this article click.&lt;/p&gt;
&lt;p&gt;Wrapping up&lt;/p&gt;
&lt;p&gt;HTTP is just two sides talking to each other — a customer and a kitchen. Status codes are how the kitchen reports back. Once you stop thinking of them as mysterious numbers and start thinking of them as kitchen updates, the whole web starts making more sense.&lt;/p&gt;
&lt;p&gt;If you're working on any project that touches a server — even a small one like ASCII-ART-WEB — I'd genuinely encourage you to try building a basic HTTP handler yourself. Reading about status codes is one thing. Returning the wrong one and watching your app break in a confusing way is what actually teaches you.&lt;/p&gt;
&lt;p&gt;Thanks for reading! If you found this helpful or you're also a newcomer grinding through your first server project, drop a comment — I'd love to hear what you're building.Alsoo don't forget to fllow and connect with me on linked in @mayan okul &lt;/p&gt;
&lt;p&gt;Status:200 OK.This article:served&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/22713/http-status-codes-explained-with-a-resturant-analogy</guid>
<pubDate>Wed, 15 Jul 2026 05:29:10 +0000</pubDate>
</item>
<item>
<title>I built a dependency-free Remote Exec Server in Python using BusyBox-style symlinks</title>
<link>https://coderlegion.com/21085/i-built-a-dependency-free-remote-exec-server-in-python-using-busybox-style-symlinks</link>
<description>&lt;p&gt;I wanted to see how minimal a remote command execution system could be when restricted entirely to the Python standard library. No external dependencies. No frameworks. Just clean, standard networking primitives.&lt;/p&gt;
&lt;p&gt;The result: &lt;strong&gt;Remote Exec Server &amp;amp; Client&lt;/strong&gt; — a two-file system (&lt;code&gt;server.py&lt;/code&gt; + &lt;code&gt;client.py&lt;/code&gt;) with a BusyBox-style symlink architecture.&lt;/p&gt;
&lt;p&gt;👉 &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/foxhackerzdevs/remote-exec-server&quot;&gt;github.com/foxhackerzdevs/remote-exec-server&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-problem&quot;&gt;The Problem&lt;/h3&gt;
&lt;p&gt;I run PARI/GP on a remote machine and wanted to pipe expressions to it from my local terminal — without SSH overhead, without installing PARI/GP locally, and without a heavyweight RPC framework.&lt;/p&gt;
&lt;p&gt;The simplest possible solution: an HTTP server that accepts a command + stdin, runs it, and returns stdout.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-busybox-idea&quot;&gt;The BusyBox Idea&lt;/h3&gt;
&lt;p&gt;BusyBox is a single binary that behaves differently depending on the name it's invoked under. &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;cp&lt;/code&gt;, &lt;code&gt;mv&lt;/code&gt; — all the same binary, different symlinks.&lt;/p&gt;
&lt;p&gt;I applied the same pattern to &lt;code&gt;client.py&lt;/code&gt;. You create symlinks named after tools installed on the server:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ln -s client.py gp
ln -s client.py python
ln -s client.py node
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you invoke a symlink, &lt;code&gt;client.py&lt;/code&gt; reads &lt;code&gt;sys.argv[0]&lt;/code&gt; to determine which command to forward. That command, plus any arguments and stdin, gets packed into an HTTP POST request.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How It Works&lt;/h3&gt;
&lt;h4 id=&quot;server-py-streams-stdout-and-stderr-live-concurrently-optional-whitelist-and-tls-&quot;&gt;server.py (streams stdout AND stderr live, concurrently; optional whitelist and TLS)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;#!/usr/bin/env python3
from http.server import BaseHTTPRequestHandler, HTTPServer
import subprocess, urllib.parse, shlex, os, sys, threading, queue, ssl

VERSION = &quot;1.5.0&quot;

# Comma-separated allowed commands via REMOTE_EXEC_ALLOWED env var.
# Empty/unset = allow everything (original default behavior).
_allowed_env = os.environ.get(&quot;REMOTE_EXEC_ALLOWED&quot;, &quot;&quot;)
ALLOWED = {c.strip() for c in _allowed_env.split(&quot;,&quot;) if c.strip()}

# TLS cert/key paths via env vars. Unset = plain HTTP (original default).
TLS_CERT = os.environ.get(&quot;REMOTE_EXEC_TLS_CERT&quot;, &quot;&quot;)
TLS_KEY  = os.environ.get(&quot;REMOTE_EXEC_TLS_KEY&quot;, &quot;&quot;)

class MyHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        content_length = int(self.headers.get('Content-Length', 0))
        body = self.rfile.read(content_length)

        raw_path = urllib.parse.unquote(self.path.lstrip(&quot;/&quot;))
        try:
            cmd_parts = shlex.split(raw_path)
        except ValueError as e:
            self.send_response(400)
            self.end_headers()
            self.wfile.write(f&quot;Error: could not parse command: {e}\n&quot;.encode())
            return

        if not cmd_parts:
            # e.g. a bare POST to &quot;/&quot; -- used to crash with an uncaught
            # IndexError on the next line instead of failing cleanly.
            self.send_response(400)
            self.end_headers()
            self.wfile.write(b&quot;Error: no command specified.\n&quot;)
            return

        cmd_parts[0] = os.path.basename(cmd_parts[0])

        if ALLOWED and cmd_parts[0] not in ALLOWED:
            self.send_response(403)
            self.send_header(&quot;Content-Type&quot;, &quot;text/plain; charset=utf-8&quot;)
            self.end_headers()
            self.wfile.write(f&quot;Error: command '{cmd_parts[0]}' is not allowed.\n&quot;.encode())
            return

        try:
            process = subprocess.Popen(
                cmd_parts,
                stdin=subprocess.PIPE,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE
            )

            self.send_response(200)
            self.send_header(&quot;Content-Type&quot;, &quot;text/plain; charset=utf-8&quot;)
            self.send_header(&quot;Transfer-Encoding&quot;, &quot;chunked&quot;)
            self.end_headers()

            # stdin is written, and stdout/stderr are read, by THREE
            # concurrent threads -- not sequentially. Writing all of
            # stdin first (as a single blocking call, before anything
            # drains stdout/stderr) deadlocks for any command whose
            # input exceeds the OS pipe buffer (~64KB on Linux): the
            # child fills its stdout pipe and blocks since nobody's
            # reading yet, stops consuming stdin, and the write then
            # blocks too. Same deadlock subprocess.communicate() avoids
            # internally by handling all streams at once.
            line_queue = queue.Queue()

            def reader(stream, prefix):
                for line in stream:
                    line_queue.put(prefix + line if prefix else line)
                line_queue.put(None)

            def stdin_writer(proc, data):
                try:
                    if data:
                        proc.stdin.write(data)
                except BrokenPipeError:
                    pass  # process exited without reading all of stdin
                finally:
                    try:
                        proc.stdin.close()
                    except OSError:
                        pass

            t_in = threading.Thread(target=stdin_writer, args=(process, body))
            t_out = threading.Thread(target=reader, args=(process.stdout, b&quot;&quot;))
            t_err = threading.Thread(target=reader, args=(process.stderr, b&quot;[stderr] &quot;))
            t_in.start(); t_out.start(); t_err.start()

            done = 0
            while done &amp;lt; 2:
                chunk = line_queue.get()
                if chunk is None:
                    done += 1
                    continue
                self.wfile.write(f&quot;{len(chunk):X}\r\n&quot;.encode())
                self.wfile.write(chunk)
                self.wfile.write(b&quot;\r\n&quot;)
                self.wfile.flush()

            t_in.join(); t_out.join(); t_err.join()
            process.wait()
            self.wfile.write(b&quot;0\r\n\r\n&quot;)
        except FileNotFoundError:
            self.send_response(200)
            self.end_headers()
            self.wfile.write(f&quot;Error: command not found: {cmd_parts[0]}\n&quot;.encode())

if __name__ == &quot;__main__&quot;:
    if &quot;--version&quot; in sys.argv or &quot;-V&quot; in sys.argv:
        print(f&quot;remote-exec-server {VERSION}&quot;)
        sys.exit(0)

    server = HTTPServer((&quot;0.0.0.0&quot;, 8000), MyHandler)

    if TLS_CERT and TLS_KEY:
        ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
        ctx.load_cert_chain(certfile=TLS_CERT, keyfile=TLS_KEY)
        server.socket = ctx.wrap_socket(server.socket, server_side=True)
        print(f&quot;Serving HTTPS on 0.0.0.0:8000 (cert: {TLS_CERT})&quot;)
    else:
        print(&quot;Serving HTTP on 0.0.0.0:8000&quot;)

    server.serve_forever()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first streaming version only read stdout live and grabbed stderr after the fact — which meant stderr output on a &lt;em&gt;successful&lt;/em&gt; exit was silently dropped, and a subprocess that filled its stderr pipe buffer while only stdout was being drained could deadlock entirely. Two reader threads plus a shared queue fixed both: stdout and stderr now interleave live, with stderr lines prefixed &lt;code&gt;[stderr] &lt;/code&gt; so they're distinguishable in the client's terminal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (v1.5.0):&lt;/strong&gt; that fix covered stdout/stderr, but missed a related deadlock on the &lt;em&gt;stdin&lt;/em&gt; side — writing the entire request body to the subprocess in one blocking call, before the reader threads even started, hangs the whole server (it's single-threaded) for any command whose stdin exceeds the OS pipe buffer, roughly 64KB on Linux. A third thread now writes stdin concurrently with the stdout/stderr readers, the same way &lt;code&gt;subprocess.communicate()&lt;/code&gt; avoids this internally. v1.5.0 also fixes an uncaught crash on an empty command path (a bare &lt;code&gt;POST /&lt;/code&gt; used to throw an &lt;code&gt;IndexError&lt;/code&gt; instead of failing cleanly) and adds &lt;code&gt;--version&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;client-py-streams-the-response-line-by-line-optional-tls-&quot;&gt;client.py (streams the response line by line; optional TLS)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;#!/usr/bin/env python3
import http.client, sys, urllib.parse, os, ssl

VERSION = &quot;1.5.0&quot;

# Can't be a --version flag: this script forwards everything it's
# invoked with -- symlink name and all arguments -- to the server as
# the remote command. A local --version flag would be indistinguishable
# from someone legitimately checking a *remote* command's version (e.g.
# `python --version` via a `python` symlink), so it's an env var instead.
if os.environ.get(&quot;REMOTE_EXEC_CLIENT_VERSION&quot;, &quot;&quot;) == &quot;1&quot;:
    print(f&quot;remote-exec-client {VERSION}&quot;)
    sys.exit(0)

host = &quot;192.168.56.1:8000&quot;

# TLS via env vars. REMOTE_EXEC_TLS_INSECURE skips cert verification —
# only for self-signed certs during local testing.
use_tls = os.environ.get(&quot;REMOTE_EXEC_TLS&quot;, &quot;&quot;) == &quot;1&quot;
insecure = os.environ.get(&quot;REMOTE_EXEC_TLS_INSECURE&quot;, &quot;&quot;) == &quot;1&quot;

if use_tls:
    ctx = ssl.create_default_context()
    if insecure:
        ctx.check_hostname = False
        ctx.verify_mode = ssl.CERT_NONE
    conn = http.client.HTTPSConnection(host, context=ctx)
else:
    conn = http.client.HTTPConnection(host)

# Avoid a trailing %20 in the path when no arguments are given
cmd_str = sys.argv[0]
if len(sys.argv) &amp;gt; 1:
    cmd_str += &quot; &quot; + &quot; &quot;.join(sys.argv[1:])
path = &quot;/&quot; + urllib.parse.quote(cmd_str)

body = sys.stdin.buffer.read()
conn.request(&quot;POST&quot;, path, body=body, headers={&quot;Content-Type&quot;: &quot;text/plain; charset=utf-8&quot;})

response = conn.getresponse()
for line in response:
    sys.stdout.buffer.write(line)
    sys.stdout.buffer.flush()
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;the-protocol&quot;&gt;The protocol&lt;/h4&gt;
&lt;p&gt;The command and arguments travel in the URL path. Stdin travels in the request body. Stdout comes back in the response body. That's the entire protocol.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-http&quot;&gt;POST /gp%20-q HTTP/1.1
Host: 192.168.56.1:8000
Content-Type: text/plain

print(nextprime(100))
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;in-action&quot;&gt;In Action&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Start the server on the remote machine
python server.py

# On the client machine
ln -s client.py gp
echo &quot;print(nextprime(100))&quot; | ./gp -q
# → 101
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-elephant-in-the-room-security&quot;&gt;The Elephant in the Room: Security&lt;/h3&gt;
&lt;p&gt;This maps HTTP payloads directly to a subprocess call. That's RCE by design. The baseline implementation has no authentication, no rate limiting, and TLS is opt-in rather than default.&lt;/p&gt;
&lt;p&gt;I built it this way intentionally — as a minimal blueprint that forces the operator to consciously design their own security layer rather than rely on defaults that provide a false sense of security.&lt;/p&gt;
&lt;p&gt;Before any real deployment, the README covers:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Command whitelisting:&lt;/strong&gt; Built in as of v1.3.0 — set an environment variable before starting the server:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;REMOTE_EXEC_ALLOWED=&quot;gp,python,node&quot; python server.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Unset or empty allows everything (the original default). Disallowed commands get a &lt;code&gt;403&lt;/code&gt; before the subprocess is even spawned.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Encryption:&lt;/strong&gt; Built in as of v1.4.0 — set cert/key paths on the server and a flag on the client:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Server
REMOTE_EXEC_TLS_CERT=cert.pem REMOTE_EXEC_TLS_KEY=key.pem python server.py

# Client (add REMOTE_EXEC_TLS_INSECURE=1 for self-signed certs during local testing)
REMOTE_EXEC_TLS=1 python client.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Unset means plain HTTP, same as before. For local testing, generate a throwaway cert with &lt;code&gt;openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes -subj &quot;/CN=localhost&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Network isolation:&lt;/strong&gt; Bind to &lt;code&gt;127.0.0.1&lt;/code&gt; and route through an SSH tunnel or VPN.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sandboxing:&lt;/strong&gt; Run the server inside a Docker container with restricted permissions.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-s-next-1&quot;&gt;What's Next&lt;/h3&gt;
&lt;p&gt;The core engine is solid. Real-time output streaming shipped in v1.2.0, command whitelisting in v1.3.0, TLS in v1.4.0, and a couple of real bugs — a server-wide stdin deadlock and a crash on malformed requests — got fixed in v1.5.0. The roadmap includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Native API-key and mTLS authentication&lt;/li&gt;
&lt;li&gt;Async request handling&lt;/li&gt;
&lt;li&gt;Pre-configured Docker deployment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Contributions welcome — especially on the security and async fronts.&lt;/p&gt;
&lt;p&gt;👉 &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/foxhackerzdevs/remote-exec-server&quot;&gt;github.com/foxhackerzdevs/remote-exec-server&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/21085/i-built-a-dependency-free-remote-exec-server-in-python-using-busybox-style-symlinks</guid>
<pubDate>Sun, 21 Jun 2026 16:27:42 +0000</pubDate>
</item>
</channel>
</rss>