現状の衝突
Rocky Linux(DMZ)は既存のWeb・メールサービスのため、外部公開ポート :80/:443 を変更できません。一方でHeadscale(SERVER内・192.168.2.13)を外部公開するにも、同じ:443ポートが必要になり、正面から衝突します。
インターネット
解決策は3つあります。優先度順に評価します。
3つの解決策
別ポート(8443)を使う(最も簡単)
推奨Headscale を WAN:8443 → コンテナ:8080 にマッピングします。FortiGate に VIP を1行追加するだけです。
注意:クライアントの --login-server URLに :8443 を明記する必要があります。
SNIルーティング(同じ443を使い分ける)
Nginx/HAProxy で TLS の SNI ヘッダーを見て振り分けます(web.* → Rocky Linux/hs.* → Headscale:8080)。
Let's Encrypt の DNS-01 チャレンジを使う
推奨TCP:80 を使わずにドメイン所有を証明する方法に切り替えます。Headscale の config.yaml を変更します。
# 変更前
tls_letsencrypt_challenge_type: HTTP-01
# 変更後
tls_letsencrypt_challenge_type: TLS-ALPN-01
ただし TLS-ALPN-01 は TCP:443 が必要なため、これも Rocky Linux と衝突します。そのため DNS-01 が最適ですが、Headscale単体ではDNS-01に対応していないという制約があります。その場合の現実的な対処法として、certbotを別途使って証明書を取得し、Headscaleに読み込ませる方法があります。
# config.yaml:Let's Encrypt自動取得をやめ、手動証明書を指定
tls_cert_path: /var/lib/headscale/certs/fullchain.pem
tls_key_path: /var/lib/headscale/certs/privkey.pem
certbot(DNS-01)で証明書を取得し、更新フックでHeadscaleをリロードする形にします。
推奨:解決策 ① + ③ の組み合わせ
config.yaml を2箇所変更します:
server_url: https://hs.yourdomain.mydns.jp:8443 # ← ポート番号を追加
listen_addr: 0.0.0.0:8080
クライアント接続時も同様です:
sudo tailscale up --login-server https://hs.yourdomain.mydns.jp:8443
結論:最もシンプルな解決策
既存環境を一切変えたくない場合の最短手順です。
| 変更箇所 | 内容 |
|---|---|
| FortiGate VIP | WAN:8443 → 192.168.2.13:8080 を追加(既存の :80/:443 はそのまま) |
| config.yaml | server_url と tls_cert_path を手動証明書方式に変更 |
| certbot | Rocky Linux 上で --dns オプションでDNS-01証明書を取得し共有 |
| クライアント | --login-server に :8443 を追記するだけ |
Rocky Linux側は無変更
Rocky Linux側のWeb・メールの設定は一切触らずに済みます。実際の構築手順は「ゼロトラスト基盤構築ガイド(v5決定版)」のPhase 4(Caddyリバースプロキシ)にまとめてあります。v5では本ページの検討を踏まえ、Caddyを使ってさらにシンプルな形(ポート追加ではなくホスト名ベースの振り分け)に発展させています。