<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Industry on network-notes</title><link>https://network-notes.com/tags/industry/</link><description>Recent content in Industry on network-notes</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>brett@network-notes.com (Brett Lykins)</managingEditor><webMaster>brett@network-notes.com (Brett Lykins)</webMaster><copyright>© 2015-2026 Brett Lykins</copyright><lastBuildDate>Thu, 07 May 2026 09:00:00 +0000</lastBuildDate><atom:link href="https://network-notes.com/tags/industry/feed.xml" rel="self" type="application/rss+xml"/><item><title>CLI Over HTTPS Part 4: Where Do We Go from Here?</title><link>https://network-notes.com/posts/2026/cli-over-https-4/</link><pubDate>Thu, 07 May 2026 09:00:00 +0000</pubDate><author>brett@network-notes.com (Brett Lykins)</author><dc:creator>Brett Lykins</dc:creator><guid>https://network-notes.com/posts/2026/cli-over-https-4/</guid><description>&lt;p&gt;This is the last post in the series. &lt;a href="https://network-notes.com/posts/2026/cli-over-https-1/"&gt;Part 1&lt;/a&gt; explained why SSH is slow for automation. &lt;a href="https://network-notes.com/posts/2026/cli-over-https-2/"&gt;Part 2&lt;/a&gt; measured it. HTTPS batch is up to 17x faster at real-world latencies. &lt;a href="https://network-notes.com/posts/2026/cli-over-https-3/"&gt;Part 3&lt;/a&gt; showed that an edge proxy and a transparent tunnel capture most of that improvement even when devices don&amp;rsquo;t speak HTTPS natively.&lt;/p&gt;
&lt;p&gt;This post is the practical takeaway: when to use what, how to deploy it, and what the industry should build next.&lt;/p&gt;
&lt;h2 id="the-decision-framework"&gt;The Decision Framework&lt;/h2&gt;
&lt;p&gt;Not every network needs a proxy. Not every automation run is latency-sensitive. Here&amp;rsquo;s how to think about it:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://network-notes.com/img/2026/cli-over-https-decision-framework.58aab159b9be4b27cc56cdae4b50f2416b19c9bb2a7f7a86026a080df6ecefcb.svg" alt="Decision framework: choose SSH direct for under 5ms RTT, a proxy or tunnel for WAN latency, or native HTTPS when the vendor supports it" loading="lazy" /&gt;&lt;/p&gt;
&lt;h3 id="ssh-direct-is-fine-when"&gt;SSH Direct Is Fine When&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Your automation server is co-located with the devices (same DC, same site)&lt;/li&gt;
&lt;li&gt;Round-trip time to the devices is under ~5ms&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re managing fewer than a few hundred devices&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re already using SSH multiplexing (ControlMaster) or persistent connections&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At local latency, SSH overhead is measured in single-digit milliseconds. The protocol tax from &lt;a href="https://network-notes.com/posts/2026/cli-over-https-1/"&gt;Part 1&lt;/a&gt; is real but negligible. Don&amp;rsquo;t add architectural complexity to save 3ms per device.&lt;/p&gt;
&lt;h3 id="deploy-a-proxy-when"&gt;Deploy a Proxy When&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Your automation runs over a WAN (30ms+ RTT to the devices)&lt;/li&gt;
&lt;li&gt;You manage devices across multiple sites, regions, or continents&lt;/li&gt;
&lt;li&gt;Automation run time is operationally painful (the Rackspace problem from Part 1)&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re already running regional infrastructure (jump hosts, bastion servers, Ansible Tower nodes)&lt;/li&gt;
&lt;li&gt;You can modify your automation to speak HTTPS instead of SSH&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The proxy pattern from &lt;a href="https://network-notes.com/posts/2026/cli-over-https-3/"&gt;Part 3&lt;/a&gt; showed 5.3-14.7x improvement at real WAN latencies (14.7x with connection reuse at 150ms RTT). If you already have bastion hosts in each region, you&amp;rsquo;re halfway there. The proxy is a bastion that speaks HTTPS instead of (or in addition to) SSH.&lt;/p&gt;
&lt;h3 id="deploy-a-tunnel-when"&gt;Deploy a Tunnel When&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;You need WAN optimization but can&amp;rsquo;t change your automation tooling&lt;/li&gt;
&lt;li&gt;Your team has years of Ansible playbooks, Nornir scripts, or Netmiko wrappers that must speak SSH&lt;/li&gt;
&lt;li&gt;You want a migration path: tunnel first, proxy later&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The tunnel from &lt;a href="https://network-notes.com/posts/2026/cli-over-https-3/"&gt;Part 3&lt;/a&gt; is transparent to both sides: automation speaks SSH to the headend, the device sees SSH from the site proxy. With command batching, it hits 12.7x speedup at intercontinental latency. Without batching, it&amp;rsquo;s still 3.0x faster than SSH direct.&lt;/p&gt;
&lt;h3 id="deploy-naas-when"&gt;Deploy NAAS When&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;You want a production-ready proxy with multi-vendor support out of the box&lt;/li&gt;
&lt;li&gt;You need connection pooling, async jobs, and circuit breakers&lt;/li&gt;
&lt;li&gt;You manage devices across 100+ platforms (everything Netmiko supports)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://github.com/lykinsbd/naas"&gt;NAAS (Netmiko as a Service)&lt;/a&gt; implements the proxy pattern with production concerns handled. Deploy an instance per region, point your automation at it, and the SSH stays local. More on NAAS below.&lt;/p&gt;
&lt;h3 id="push-for-native-https-when"&gt;Push for Native HTTPS When&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;You&amp;rsquo;re evaluating new platforms or vendors&lt;/li&gt;
&lt;li&gt;You have influence over vendor roadmaps (large deployments, design partners)&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re building internal tooling that could expose CLI over HTTPS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Native HTTPS eliminates the proxy entirely. The ~17x batch improvement from &lt;a href="https://network-notes.com/posts/2026/cli-over-https-2/"&gt;Part 2&lt;/a&gt; is the ceiling. No intermediate hop, no backend SSH overhead. If a vendor offers it, use it.&lt;/p&gt;
&lt;h2 id="naas-the-production-proxy"&gt;NAAS: The Production Proxy&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/lykinsbd/naas"&gt;NAAS (Netmiko as a Service)&lt;/a&gt; is what the proxy pattern looks like when you build it for production. Written in Python, it wraps &lt;a href="https://github.com/ktbyers/netmiko"&gt;Netmiko&lt;/a&gt; behind a REST API, which means it supports &lt;a href="https://github.com/ktbyers/netmiko/blob/develop/PLATFORMS.md"&gt;100+ device platforms&lt;/a&gt;: Cisco IOS, NX-OS, ASA, Juniper Junos, Arista EOS, Palo Alto, and everything else Netmiko handles.&lt;/p&gt;
&lt;p&gt;You POST a JSON payload with the device address, platform, credentials, and commands. NAAS opens the SSH session, runs the commands, and returns the output in the HTTP response:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -k -X POST https://naas.dc1.example.com:8443/v1/send_command &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -u &lt;span class="s2"&gt;&amp;#34;automation:token&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;#34;host&amp;#34;: &amp;#34;10.1.1.1&amp;#34;, &amp;#34;platform&amp;#34;: &amp;#34;cisco_ios&amp;#34;, &amp;#34;commands&amp;#34;: [&amp;#34;show version&amp;#34;, &amp;#34;show ip route&amp;#34;]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;What NAAS handles that a minimal proxy doesn&amp;rsquo;t:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-vendor connection pooling.&lt;/strong&gt; Persistent SSH connections with health checks and automatic reconnection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Async job queue.&lt;/strong&gt; Long-running commands (&lt;code&gt;show tech-support&lt;/code&gt;, bulk config pushes) run in a Redis-backed queue. Your automation gets a job ID back immediately and polls for results.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Circuit breaker and observability.&lt;/strong&gt; Stops hammering unreachable devices, exposes Prometheus metrics for connection pool health and per-device latency.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Deploy a NAAS instance in each data center or region, and your automation talks HTTPS to the nearest one. The SSH sessions stay local. The architecture is the same as what the benchmarks in &lt;a href="https://network-notes.com/posts/2026/cli-over-https-3/"&gt;Part 3&lt;/a&gt; measured: HTTPS over the WAN, SSH on the last hop.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/lykinsbd/naas.git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; naas
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -k -X POST https://localhost:8443/v1/send_command &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -u &lt;span class="s2"&gt;&amp;#34;username:password&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;#34;host&amp;#34;: &amp;#34;10.1.1.1&amp;#34;, &amp;#34;platform&amp;#34;: &amp;#34;cisco_ios&amp;#34;, &amp;#34;commands&amp;#34;: [&amp;#34;show version&amp;#34;]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;See the &lt;a href="https://naas.readthedocs.io/en/latest/installation/"&gt;NAAS getting started guide&lt;/a&gt; for full setup and configuration.&lt;/p&gt;
&lt;h2 id="what-exists-and-whats-missing"&gt;What Exists and What&amp;rsquo;s Missing&lt;/h2&gt;
&lt;p&gt;Some of the pieces are already in place.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aristanetworks.github.io/EosSdk/docs/2.22.1.5/ref/eapi.html"&gt;Arista&amp;rsquo;s eAPI&lt;/a&gt; accepts CLI commands via JSON-RPC over HTTPS. It wraps everything in JSON, but the core pattern is there: send commands over HTTPS, get output back. The ASA interface and eAPI have been in production for years. NAAS (described above) brings the proxy pattern to the 100+ platforms Netmiko supports. The &lt;a href="https://github.com/lykinsbd/clibench"&gt;clibench&lt;/a&gt; tunnel mode demonstrates the transparent SSH-to-HTTP approach for teams that can&amp;rsquo;t change their automation tooling.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s missing:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A standard CLI-over-HTTPS interface.&lt;/strong&gt; Not RESTCONF, not gNMI. Those are structured data interfaces for a different use case. A simple, standardized way to send CLI commands over HTTPS and get text output back. The ASA pattern is a reasonable starting point: &lt;code&gt;GET /cli/exec/{command}&lt;/code&gt; for show commands, &lt;code&gt;POST /cli/config&lt;/code&gt; for configuration. Basic auth or token auth over TLS. &lt;code&gt;Content-Type: text/plain&lt;/code&gt;. No JSON wrapping unless the client asks for it. Arista&amp;rsquo;s eAPI is the closest thing to this, but it&amp;rsquo;s vendor-specific and JSON-only.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Proxy support in the automation ecosystem.&lt;/strong&gt; Ansible could ship a connection plugin that talks HTTPS to a proxy like NAAS instead of SSH to the device. Nornir could support an HTTP transport alongside Paramiko and Netmiko. NAAS works today as a standalone API, and a native connection plugin would make adoption even easier: a configuration option instead of a code change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Broader vendor adoption.&lt;/strong&gt; Every network OS already has an HTTPS server for its web UI. Exposing the CLI through that same server is not a large engineering effort. The ASA proves the concept. A plain-text CLI endpoint alongside the structured API would cover both use cases.&lt;/p&gt;
&lt;p&gt;None of this requires abandoning SSH. SSH remains the right tool for interactive sessions, for out-of-band recovery, for environments where HTTPS infrastructure doesn&amp;rsquo;t exist. The argument isn&amp;rsquo;t &amp;ldquo;replace SSH.&amp;rdquo; It&amp;rsquo;s &amp;ldquo;stop using SSH for the thing it&amp;rsquo;s worst at.&amp;rdquo;&lt;/p&gt;
&lt;h2 id="the-numbers-one-more-time"&gt;The Numbers, One More Time&lt;/h2&gt;
&lt;p&gt;For reference, here&amp;rsquo;s the speedup picture from the series. Most automation tools (Netmiko, Ansible, Scrapli) use PTY mode, so SSH PTY is the realistic baseline:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Speedup vs SSH PTY&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS batch (native)&lt;/td&gt;
&lt;td&gt;~17x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proxy (reused connection)&lt;/td&gt;
&lt;td&gt;~14.7x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tunnel batch&lt;/td&gt;
&lt;td&gt;~12.7x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proxy (new connection)&lt;/td&gt;
&lt;td&gt;~5.3x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS keep-alive (native)&lt;/td&gt;
&lt;td&gt;~3.4x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tunnel per-command&lt;/td&gt;
&lt;td&gt;~3.0x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH with ControlMaster&lt;/td&gt;
&lt;td&gt;~1.7x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src="https://network-notes.com/img/2026/cli-over-https-speedup-comparison.02343e29dd2272328fcd4e01b59870866db2b5d661afd35e764b5a7f221c1b6d.svg" alt="Bar chart comparing speedup vs SSH PTY: ControlMaster 1.7x, tunnel per-cmd 3.0x, HTTPS keep-alive 3.4x, proxy new conn 5.3x, tunnel batch 12.7x, proxy reused conn 14.7x, HTTPS batch 17x" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;The proxy with connection reuse gets you most of the native HTTPS improvement without requiring any changes to the devices. The tunnel with batching is close behind, and requires zero changes to your automation tooling either.&lt;/p&gt;
&lt;h2 id="try-it-yourself"&gt;Try It Yourself&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://github.com/lykinsbd/clibench"&gt;benchmark tool&lt;/a&gt; supports all scenarios:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# All transports (SSH, HTTPS, HTTP/3, proxy, tunnel)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ./bin/clibench bench --latency regional --iterations &lt;span class="m"&gt;20&lt;/span&gt; --commands &lt;span class="m"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Proxy pattern (HTTPS + HTTP/3 variants)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ./bin/clibench bench --latency regional --iterations &lt;span class="m"&gt;20&lt;/span&gt; --commands &lt;span class="m"&gt;5&lt;/span&gt; --transport proxy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Tunnel (transparent SSH-to-HTTP WAN optimization)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ./bin/clibench bench --latency intercontinental --iterations &lt;span class="m"&gt;20&lt;/span&gt; --commands &lt;span class="m"&gt;5&lt;/span&gt; --transport tunnel-https
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The code is MIT licensed. Run it on your own infrastructure, with your own latency profiles, and see what the numbers look like for your network.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My take:&lt;/strong&gt; The network automation community has treated SSH as a given for fifteen years. It was the right default when automation meant one engineer scripting against a handful of devices. At the scale most organizations operate today, SSH&amp;rsquo;s protocol overhead is a measurable, avoidable cost. Native HTTPS CLI is the right long-term direction. The proxy and tunnel patterns are deployable today. I built &lt;a href="https://github.com/lykinsbd/naas"&gt;NAAS&lt;/a&gt; so you can start today. Contributions welcome.&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>