<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ネットワーク on シップの航海日誌</title>
    <link>https://life.shipweb.jp/tags/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF/</link>
    <description>Recent content in ネットワーク on シップの航海日誌</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja</language>
    <copyright>Copyright © 2008–2018, Steve Francia and the Hugo Authors; all rights reserved.</copyright>
    <lastBuildDate>Mon, 20 Jul 2026 23:44:49 +0900</lastBuildDate><atom:link href="https://life.shipweb.jp/tags/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Tailscaleでサービスをサブドメインでネットワーク内アクセスできるようにする</title>
      <link>https://life.shipweb.jp/post/tailscalenetwork-service-subdomain/</link>
      <pubDate>Mon, 20 Jul 2026 23:44:49 +0900</pubDate>
      
      <guid>https://life.shipweb.jp/post/tailscalenetwork-service-subdomain/</guid>
      <description>
        
          &lt;h1 id=&#34;tailscale-servicesで自宅サーバーを公開しようとしてハマった話&#34;&gt;Tailscale Servicesで自宅サーバーを公開しようとしてハマった話&lt;/h1&gt;
&lt;p&gt;自宅LANで動かしている個人開発のAPIサーバー（FastAPI製、&lt;code&gt;127.0.0.1&lt;/code&gt;固定バインド）を、Tailscale経由でiPhone/iPadからも見られるようにしたいと思い立った。単純に&lt;code&gt;--host 0.0.0.0&lt;/code&gt;でLAN全体に公開するのは平文HTTPの盗聴リスクがあるといってCodexにもSonnetにも止められたので、代わりにTailscaleの&lt;code&gt;tailscale serve&lt;/code&gt;機能を使って安全にTailscaleネットワーク内に公開する方法を調べた。&lt;/p&gt;
&lt;h2 id=&#34;背景-なぜ0000でhttp公開しないのか&#34;&gt;背景: なぜ&lt;code&gt;0.0.0.0&lt;/code&gt;でHTTP公開しないのか&lt;/h2&gt;
&lt;p&gt;家庭内LANで、インターネットに公開しないなら別に良くない？と私は思ったのだけど、AI曰く「トークン認証を実装していても、平文HTTPだと同一LAN上でパケットを覗ける第三者にトークンごと盗聴されるリスクが残る」そう。思ったより、AIコーディングエージェントってセキュリティ意識高いんだよね。一昔前のバイブコーディングされたアプリで、脆弱性がたくさんあるっていう話は何なんだろうね。&lt;/p&gt;
&lt;p&gt;まぁ確かにコマンド実行藻できるような仕組みなので、セキュリティはちゃんとしておいたほうがいいかなと思い、Tailscaleの暗号化トンネル内で公開する方法をこの際調査して、iPadやiPhoneから見れるようにした。&lt;/p&gt;
&lt;h2 id=&#34;tailscale-serveで公開&#34;&gt;&lt;code&gt;tailscale serve&lt;/code&gt;で公開&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;tailscale serve&lt;/code&gt;を使うと、Tailscale側がHTTPSリバースプロキシとして動作する。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;tailscale serve https / http://127.0.0.1:8765
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでTailscaleのMagicDNS名に対して自動発行されたHTTPS証明書でアクセスできるようになる。&lt;/p&gt;
&lt;h2 id=&#34;複数サービスを同時公開したい----serviceを使う&#34;&gt;複数サービスを同時公開したい → &lt;code&gt;--service&lt;/code&gt;を使う&lt;/h2&gt;
&lt;p&gt;Macbookでは他にOpen WebUIなど別のWebサービスも動かしていて、これらを同時にTailscale経由で公開したい。単純なポート分けやパス分けでも実現できるが、サービスごとに独立したホスト名（サブドメイン風）を使いたかったので、そういうことができないか聞いてみると&lt;code&gt;--service&lt;/code&gt;フラグというものがあるようだ。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;tailscale serve --service&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;svc:aihub --https&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;443&lt;/span&gt; 127.0.0.1:8765
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こんな感じで、aihub.がサブドメイン風に機能して、aihub.(magicDNS)でアクセスできる。&lt;/p&gt;
&lt;h3 id=&#34;タグの設定&#34;&gt;タグの設定&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;service hosts must be tagged nodes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tailscale ServicesはTagged Node（用途ベースのアクセス制御に使うタグを持つノード）でないとホストできない仕様になっている。Admin ConsoleのACLポリシーで、タグの定義・自動承認・アクセス許可を追加する必要があった。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;tagOwners&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;tag:aihub-host&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;autogroup:member&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;autoApprovers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;services&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;svc:aihub&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;tag:aihub-host&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;tagOwners&lt;/code&gt;で自分自身にタグ付与権限を与え、&lt;code&gt;autoApprovers&lt;/code&gt;でそのタグを持つノードがこのServiceをホストすることを自動承認する設定を追加。既存の&lt;code&gt;grants&lt;/code&gt;にワイルドカード許可（&lt;code&gt;{&amp;quot;src&amp;quot;: [&amp;quot;*&amp;quot;], &amp;quot;dst&amp;quot;: [&amp;quot;*&amp;quot;], &amp;quot;ip&amp;quot;: [&amp;quot;*&amp;quot;]}&lt;/code&gt;）がすでにあったため、アクセス許可自体は追加不要だった。&lt;/p&gt;
&lt;p&gt;タグの付与は下記コマンドでもできるようだけど、Tailscaleの管理パネルからも追加できた。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;sudo tailscale &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; --advertise-tags&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;tag:aihub-host
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;admin-approval待ち&#34;&gt;Admin approval待ち&lt;/h2&gt;
&lt;p&gt;タグ付けとACL設定を終えて再度コマンドを実行すると、今度は承認待ちの状態になった。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;This machine is configured as a service proxy for svc:aihub, but approval from an admin is required.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これはAdmin Console → Machinesの該当デバイスから手動承認するか、&lt;code&gt;autoApprovers&lt;/code&gt;の設定を先に反映させた上でコマンドを再実行すれば自動承認される。今回は設定の設定した直後でまだ反映されていなかっただけで、一度Serveを停止し、クリアしてから再実行したらできた。&lt;/p&gt;
&lt;h2 id=&#34;iphoneipadから繋がらない&#34;&gt;iPhone/iPadから繋がらない&lt;/h2&gt;
&lt;p&gt;iPhone/iPadから繋がらないのでおかしいなと思って管理パネルを見ると、警告がでている。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;Services HOSTS: 1 needs configuration
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;m1mbp: Advertising the service, but some required ports are missing
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原因はAdmin Console側で設定する待ち受けポート設定を&lt;strong&gt;アプリの内部公開ポート（8765）&lt;/strong&gt; を指定してしまっていた。正しくは、TailscaleがHTTPSとして外側に公開するポート、つまり&lt;strong&gt;443番&lt;/strong&gt;を指定するべきだった。&lt;/p&gt;
&lt;p&gt;Admin Console側のServices設定でPortsを&lt;code&gt;443&lt;/code&gt;に修正したところ、設定エラーが消え、iPhone/iPadからも問題なく接続できるようになった。&lt;/p&gt;

        
      </description>
    </item>
    
  </channel>
</rss>
