リモートワーク用の固定IPを月880円で作る — さくらのVPS + Tailscale

村井 謙太

代表取締役

村井 謙太

リモートワーク用の固定IPを月880円で作る — さくらのVPS + Tailscale

リモートワークをしていると、接続元IPアドレスで制限されたシステムに当たることがあります。クライアント環境の管理画面、社内システム、データベースの踏み台などです。

リモートワークだと、働く場所は自宅やオフィス、コワーキングスペースと日によって変わります。場所が変わるたびに接続元IPも変わるため、その都度許可リストの更新を依頼するのは現実的ではありません。どこで働いても「同じIPを名乗れる」固定IPが欲しくなりました。

結論を先に書くと、さくらのVPS(月880円)とTailscaleのexit node機能で、Macのメニューバーからワンタップで切り替えられる固定IPが正味1時間ほどで作れました。手順と、途中で踏んだハマりどころ4つを書きます。

方式の比較

固定IPを用意する方法は大きく4つあります。

方式月額の目安備考
固定IP付きVPNサービス(InterlinkのマイIPなど)1,000円強契約するだけで構築不要
自宅回線の固定IPオプションISPによる自宅でしか使えない
クラウドVM(GCPなど)でVPNを自作約1,900円+転送従量egress課金が構造的に不利
国内VPS + Tailscale880円定額・転送量無制限(採用)

GCPが不利なのは、egress(下り転送)の従量課金($0.12/GiB〜)です。後述するexit nodeは全通信を中継する構成なので、手元のPCがダウンロードした分もすべてVM→PCへの再送、つまりegressとして課金されます。Web会議や日常のブラウジングまで通すと、転送量に比例して費用が伸びていきます。

その点、国内VPSは転送量無制限の定額で、固定IPv4が標準で付いてきます。今回は老舗で料金体系が分かりやすいさくらのVPSを選びました。

さくらのVPSの料金プラン(石狩)。表示は年額一括の月額換算で、1GBプランは月払いだと880円

構成: Tailscaleのexit node

Tailscaleは、VPNプロトコルのWireGuardをベースにしたメッシュVPNサービスです。手持ちのデバイス同士を暗号化されたプライベートネットワーク(Tailnet)でつなぎます。無料プランで6ユーザー・デバイス数無制限まで使えます。

exit nodeは、Tailnet内の特定のマシンを「インターネットへの出口」にする機能です。手元のMacでexit nodeをONにすると全通信がVPS経由になり、外から見た接続元IPはVPSの固定IPになります。

Mac(自宅・オフィス・コワーキング)
  │ Tailscale(WireGuardで暗号化)

VPS(固定IPv4) ← このIPを許可リストに登録


IP制限のあるシステム

ONにした間だけ経由し、普段はOFFにしておけます。この「必要なときだけワンタップ」という体験が、この構成を選んだ決め手です。

Tailscale公式ドキュメントのexit nodes解説

構築手順

1. VPSを契約する

さくらのVPSの1GBプラン(石狩リージョン、月880円)を、OSはUbuntu 24.04 LTSで契約しました。最安の512MBプラン(643円)にしなかった理由はハマりどころの節で書きます。リージョンはどこでも用は足りるので、最安の石狩です。

コントロールパネルのパケットフィルターは「利用しない」にしました。ファイアウォールはOS側で設定するためです。

2. サーバーをセットアップする

やることはTailscaleのインストール、IPフォワーディングの有効化、ファイアウォール、自動セキュリティ更新の4つです。1本のスクリプトにまとめました。Ubuntu/Debian(apt)とAlmaLinux/Rocky(dnf)の両方で動きます。

#!/usr/bin/env bash
# VPS を Tailscale exit node(固定IPの出口)にするセットアップスクリプト
# 実行: sudo bash setup-exit-node.sh
set -euxo pipefail

if [ "$(id -u)" -ne 0 ]; then
  echo "root で実行してください: sudo bash $0" >&2
  exit 1
fi

if command -v apt-get >/dev/null 2>&1; then PKG=apt; else PKG=dnf; fi

# 1. パッケージ更新 + 自動セキュリティ更新
if [ "$PKG" = apt ]; then
  export DEBIAN_FRONTEND=noninteractive
  apt-get update
  apt-get upgrade -y
  apt-get install -y unattended-upgrades ufw curl ethtool
  dpkg-reconfigure -f noninteractive unattended-upgrades
else
  dnf -y upgrade
  dnf -y install dnf-automatic curl ethtool firewalld
  sed -i 's/^apply_updates.*/apply_updates = yes/' /etc/dnf/automatic.conf
  systemctl enable --now dnf-automatic.timer
fi

# 2. Tailscale インストール
curl -fsSL https://tailscale.com/install.sh | sh

# 3. IPフォワーディング有効化(exit node の必須要件)
cat > /etc/sysctl.d/99-tailscale.conf <<'EOF'
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
EOF
sysctl -p /etc/sysctl.d/99-tailscale.conf

# 4. exit node 向けの転送性能チューニング(Tailscale 推奨。起動毎に適用)
NETDEV=$(ip -o route get 1.1.1.1 | awk '{for(i=1;i<=NF;i++) if($i=="dev") print $(i+1)}')
ETHTOOL_BIN=$(command -v ethtool)
cat > /etc/systemd/system/tailscale-gro.service <<EOF
[Unit]
Description=Enable UDP GRO forwarding for Tailscale exit node
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=${ETHTOOL_BIN} -K ${NETDEV} rx-udp-gro-forwarding on rx-gro-list off

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now tailscale-gro.service || true  # NICが非対応でも続行

# 5. ファイアウォール
#    - UDP 41641 はTailscaleの直接接続用(無くてもリレー経由で動くが、速度のため開ける)
#    - SSH(22)は閉め出し防止のため開けておき、運用が安定してから方針を決める
if [ "$PKG" = apt ]; then
  ufw default deny incoming
  ufw default allow outgoing
  ufw allow 41641/udp comment 'tailscale direct'
  ufw allow in on tailscale0
  ufw allow 22/tcp
  ufw --force enable
else
  systemctl enable --now firewalld
  firewall-cmd --permanent --zone=public --add-port=41641/udp
  firewall-cmd --permanent --zone=public --add-service=ssh
  firewall-cmd --permanent --zone=trusted --add-interface=tailscale0
  firewall-cmd --permanent --add-masquerade  # firewalld環境でのTailscale要件
  firewall-cmd --reload
fi

# 6. Tailscale 起動(exit node 広告 + Tailscale SSH 有効)
tailscale up --advertise-exit-node --ssh --timeout=15s || true

echo "認証URL(上に表示)をブラウザで開いて Tailnet に参加させてください"

実行すると最後にTailscaleの認証URLが表示されます。ブラウザで開いてログインすると、VPSが自分のTailnetに参加します。

3. exit nodeを承認する

Tailscaleの管理画面で対象マシンの「Edit route settings」を開き、「Use as exit node」をONにします。exit nodeは管理者が明示的に承認しないと使えない設計になっています。

4. Macから切り替えて確認する

メニューバーのTailscaleアイコン → Exit Nodes → VPSのマシン名を選ぶだけです。

$ curl -4 ifconfig.me
203.0.113.8   # VPSの固定IP(実際の値は伏せています)

OFFに戻すと通常の回線に戻ります。あとはこのIPを許可リストに登録してもらえば完成です。

ハマりどころ

512MBプランではUbuntuを選べない

さくらのVPSの512MBプランでは、OSにUbuntu 22.04/24.04を選択できません。メモリ不足で正常に起動しない事例があるための制限です(公式のお知らせ)。契約画面で初めて知りました。

512MBのままAlmaLinuxやRocky Linuxを選ぶ手もありますが、差額237円で運用情報の多いUbuntuを取り、1GBプランにしました。あとから512MB→1GBへ、IPを維持したままスケールアップすることもできます。

tailscale upが認証待ちでブロックする

tailscale upは、未認証だと認証URLを表示したまま完了を待ち続けます。セットアップスクリプトに素で書くと、そこでスクリプト全体が止まってしまいます。

--timeout=15sを付けると、URLを表示して15秒で先に進んでくれます。認証URLはあとからtailscale statusでも再表示できるので、スクリプトを止めない作りにできます。

exit nodeを「広告している」デバイスはexit nodeを「使えない」

MacからVPSのexit nodeを指定したら、次のエラーが出ました。

Cannot advertise an exit node and use an exit node at the same time.

このMacは過去の検証で自分自身をexit nodeとして広告する設定になっていて、その状態では他のexit nodeを利用できない仕様でした。tailscale set --advertise-exit-node=falseで広告を止めたら解決しました。

Tailscale SSHはデフォルトでcheckモード

TailscaleにはSSH機能があり、公開SSHポートを完全に閉じてTailnet経由だけでSSHする構成も組めます。ただしデフォルトのACLでは「check」モードになっていて、一定時間ごとにブラウザでの再認証を求められます。

再認証の手間と天秤にかけて、今回は公開SSH(22番)を鍵認証限定で開けたままにしました。パスワード認証を無効化しておけば、標準的な安全水準です。

セキュリティ面の補足

この構成は、固定IP付きVPNサービスが商用で提供しているものを自前で建てたものです。手元の端末からVPSまでの通信はWireGuardで暗号化されるので、経路の安全性はむしろ高まります。

サーバー側は、ファイアウォールと自動セキュリティ更新をセットアップスクリプトでカバーし、SSHはパスワード認証を無効化して鍵認証のみにしました。残るリスクはVPS自体が侵害された場合に通信経路を握られることですが、その場合でもHTTPSの中身までは見えません。

複数人で使う場合

チームで同じ固定IPを共有することもできます。Tailscaleの無料プランは6ユーザーまで同じTailnetに招待でき、それ以上の人数でもnode sharingでexit nodeだけを他アカウントに配布できます(共有リンクは最大1,000回再利用可)。

全員が同一IPになるので、接続先のログで個人を区別できなくなる点だけ注意してください。

所感

月880円で「どこで働いても同じIPを名乗れる」環境ができました。構築は正味1時間ほどで、日々の操作はメニューバーのトグル1つです。

VPSは常時起動しているので、固定IPのほかに検証用サーバーや軽いジョブの実行環境としても使い回せます。リモートワークでIP制限に悩んでいる方には、まず勧めたい構成です。

記事を書いた人

村井 謙太

代表取締役

村井 謙太

Twitter

東京大学在学中にプログラミング学習サービスのProgateを立ち上げ、CTOとしてプロダクト開発に従事。 Progate退任後に株式会社Anycloudを立ち上げ、現在は多数のクライアントの技術支援を行っている。