<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Vscode on Lessons learned</title><link>https://eghuro.cz/tags/vscode/</link><description>Recent content in Vscode on Lessons learned</description><generator>Hugo</generator><language>en-us</language><copyright>© Alexandr Mansurov · Licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)</copyright><lastBuildDate>Sat, 17 Oct 2026 22:30:00 +0200</lastBuildDate><atom:link href="https://eghuro.cz/tags/vscode/index.xml" rel="self" type="application/rss+xml"/><item><title>"No route to host" only for the AI agent: macOS Local Network privacy</title><link>https://eghuro.cz/posts/macos-local-network-privacy-agent-no-route-to-host/</link><pubDate>Sat, 17 Oct 2026 22:30:00 +0200</pubDate><guid>https://eghuro.cz/posts/macos-local-network-privacy-agent-no-route-to-host/</guid><description>&lt;p&gt;My coding agent couldn&amp;rsquo;t reach anything on my home network:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nc: connectx to 192.168.0.2 port 22 (tcp) failed: No route to host&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ping: sendto: No route to host&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The router answered, and &lt;code&gt;arp -an&lt;/code&gt; listed the server&amp;rsquo;s MAC address. In my own Terminal, the same &lt;code&gt;ssh&lt;/code&gt; command connected. If you see this on a Mac and only your agent sees it, your network is fine. macOS is blocking the app the agent runs in because that app doesn&amp;rsquo;t have the Local Network permission.&lt;/p&gt;&#10;&#10;&lt;h2 id="the-setup"&gt;The setup &lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS 27 on Wi-Fi&lt;/li&gt;&#10;&lt;li&gt;Claude Code in its VS Code extension, so every command the agent runs is a child process of VS Code&lt;/li&gt;&#10;&lt;li&gt;Targets on the Mac&amp;rsquo;s own subnet: a Linux server, a NAS, a second router&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 id="what-went-wrong"&gt;What went wrong &lt;/h2&gt;&#10;&lt;p&gt;The agent was helping me with a server that really was down (&lt;a&#10; href="https://eghuro.cz/posts/systemd-run-rollback-killed-dhclient"&#10; &#10; data-rel="prefetch"&#10; &#10; &#10;&gt;that story is here&lt;/a&gt;&#10;). It probed the subnet from the Mac, found that only the router answered, and reported with confidence that &amp;ldquo;the Mac reaching only [the router] looks like client isolation on the Wi-Fi. That&amp;rsquo;s usually a guest network.&amp;rdquo; It told me to join a different network.&lt;/p&gt;&#10;&lt;p&gt;I wasn&amp;rsquo;t on a guest network, and I said so. The agent looked again and noticed what rules the network out: &lt;code&gt;ping&lt;/code&gt; itself failed with &lt;code&gt;sendto: No route to host&lt;/code&gt;. That message comes from the local &lt;code&gt;sendto()&lt;/code&gt; call, so the Mac refused to send the packet at all. Client isolation drops packets in the access point, and then &lt;code&gt;ping&lt;/code&gt; reports &lt;code&gt;Request timeout&lt;/code&gt;, not a send error. The target&amp;rsquo;s MAC was already in the ARP table, so the kernel knew exactly where to send it.&lt;/p&gt;&#10;&lt;p&gt;So the block was at the MAC, and every TCP test the agent ran from there was worthless.&lt;/p&gt;&#10;&lt;p&gt;Later that evening, in a new session, it happened again with a different host on the same subnet. This time the agent suspected its own sandbox and retried with the sandbox off. Same error. What settled it was my reply: the same &lt;code&gt;ssh&lt;/code&gt; command works in my Terminal.&lt;/p&gt;&#10;&#10;&lt;h2 id="fix"&gt;Fix &lt;/h2&gt;&#10;&lt;p&gt;Open System Settings → Privacy &amp;amp; Security → Local Network and turn on Visual Studio Code (or whichever app hosts your agent). The agent&amp;rsquo;s next &lt;code&gt;ssh&lt;/code&gt; went through. If yours still fails, restart the app.&lt;/p&gt;&#10;&lt;p&gt;The app can be missing from the list if macOS never showed it the permission prompt. Apple&amp;rsquo;s &lt;a&#10; href="https://developer.apple.com/documentation/technotes/tn3179-understanding-local-network-privacy"&#10; &#10; target="_blank" rel="noopener"&#10; &#10; &#10;&gt;TN3179&lt;/a&gt;&#10; notes that the prompt doesn&amp;rsquo;t appear when a very short-lived process makes the request, and most agent commands exit right after they fail. Since macOS 27.2, the list includes a + button to add an app yourself.&lt;/p&gt;&#10;&#10;&lt;h2 id="why-only-the-agent"&gt;Why only the agent &lt;/h2&gt;&#10;&lt;p&gt;Local Network privacy covers traffic to addresses on a Wi-Fi or Ethernet network that goes directly to the host, not through a router. TN3179 lists who gets access without asking:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;daemons started by &lt;code&gt;launchd&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;programs running as root&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;command-line tools run from Terminal or over SSH, including any child processes they spawn&amp;rdquo;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Everything else is charged to its &amp;ldquo;responsible code&amp;rdquo;. If an app spawns a helper and the helper connects to a local address, macOS checks the app&amp;rsquo;s permission. The agent&amp;rsquo;s shell is a child of VS Code, so &lt;code&gt;ssh&lt;/code&gt;, &lt;code&gt;nc&lt;/code&gt;, and &lt;code&gt;ping&lt;/code&gt; run there under VS Code&amp;rsquo;s permission. The same binary, run by the same user from Terminal, is allowed.&lt;/p&gt;&#10;&lt;p&gt;That explains the other half of the symptom. Internet traffic goes through the router, so it isn&amp;rsquo;t local and works fine. TN3179 also exempts the device&amp;rsquo;s DNS server when it sits on the local network, and a home router is usually the DNS server it hands out by DHCP. That is probably why the router was the one host still reachable, and it is exactly how client isolation looks from the inside.&lt;/p&gt;&#10;&lt;p&gt;The same trap waits for any agent or tool that an app such as an IDE starts on macOS.&lt;/p&gt;&#10;&#10;&lt;h2 id="check-before-you-blame-the-network"&gt;Check before you blame the network &lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Run &lt;code&gt;ping&lt;/code&gt; from the agent&amp;rsquo;s shell. &lt;code&gt;sendto: No route to host&lt;/code&gt; for a host on your subnet whose MAC is in &lt;code&gt;arp -an&lt;/code&gt; means the Mac refused to send it.&lt;/li&gt;&#10;&lt;li&gt;Run the same command in Terminal. If it works there, check the app&amp;rsquo;s Local Network permission.&lt;/li&gt;&#10;&lt;li&gt;If it fails in Terminal too, the cause is the network or the routing table. Later that same evening, another VPN came up as &lt;code&gt;utun6&lt;/code&gt; and took the default route, which cut the whole Mac off from the subnet. This time the agent caught it in &lt;code&gt;netstat -rn -f inet&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&#10;&lt;h2 id="takeaway"&gt;Takeaway &lt;/h2&gt;&#10;&lt;p&gt;On macOS, an app without the Local Network permission gets &lt;code&gt;No route to host&lt;/code&gt; for hosts on your subnet, and so does every tool it spawns. An agent running inside that app will diagnose a working network as broken.&lt;/p&gt;&#10;&lt;p&gt;If your agent runs inside an app on macOS, open Privacy &amp;amp; Security → Local Network now and check that the app is on the list and switched on.&lt;/p&gt;&#10;</description></item></channel></rss>