Tailnet内の仲間にだけ特定のポートを公開する方法

2023年3月31日

Tailscale(実際にはHeadscale)の内の仲間にだけ、特定サービスの特定ポートを公開する方法をまとめておく。

tailscale0をtrustedにしておく

サーバにTailscaleクライアントをインストールすると、tailscale0という仮想NICが作成されるが、このNICをfirewalldのtrustedゾーンに入れておく。すると、ここに到着したリクエストは何もしなくてもサーバ内のポートに受け渡される。

firewall-cmd --add-interface=tailscale0 --zone=trusted
firewall-cmd --runtime-to-permanent

trustedゾーンに個別のサービスを追加する必要はない。例えば、以下のような操作は不要。

firewall-cmd --add-service=ssh --zone=trusted

cockpitの場合

cockpitを利用したい場合に、通常は、publicゾーンに9090ポートを公開して、「どこからでも」アクセスできるようにするが、そんな必要は無くなる。全く何もしなくともtailnet内からは、tailscale0を経由してcockpitの9090番ポートにアクセスできる。したがって、もしpublicゾーンに公開設定のある場合は削除しておく。

firewall-cmd --remove-service=cockpit --zone=public
firewall-cmd --runtime-to-permanent

dockerコンテナの場合

Traefikを経由して80, 443番を公開している場合の対処方法は難しいかもしれない。つまり、80番、443番のポートはデフォルトではTraefik側がpublicに公開してしまうため、特定のウェブサイトのみをTailnet内に公開することは難しいと思われる(後述)。

しかし、それ以外の独自のポートを利用している場合は簡単だ。

TailnetでのこのサーバのIPアドレスは固定しているため、そのIPアドレスでのみ接続を受け付ければよい。この方法は、Docker-composeにおける.envファイルの無意味さに書いた通りで、env.file(名前は何でもよい)にTailnet上のIPアドレスを書いておき、各コンテナはそのアドレスをリッスンするようにする。

Tailnet内でのみ閲覧可能なウェブサイトを作る

この一つの方法としては、Tailscaleの提供するDNSを用いることだ。例えば、100.64.0.3というアドレスにwp-intという名前を付けておき、「http://wp-int」でアクセスする。このURLは外からはアクセスできないし、SSLも不要だ。

仮にTraefikにリクエスト側のIPアドレス制限機能があったとしても(有無を調べていないが)無駄である。なぜなら、あるドメインexample.comをこのサーバのIPに向けてそのドメインでアクセスした場合、TailnetのIPからではなく、一般のIPからアクセスしてしまうからだ。

未分類

Posted by ysugimura