リモートワーク用の固定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 + Tailscale | 880円 | 定額・転送量無制限(採用) |
GCPが不利なのは、egress(下り転送)の従量課金($0.12/GiB〜)です。後述するexit nodeは全通信を中継する構成なので、手元のPCがダウンロードした分もすべてVM→PCへの再送、つまりegressとして課金されます。Web会議や日常のブラウジングまで通すと、転送量に比例して費用が伸びていきます。
その点、国内VPSは転送量無制限の定額で、固定IPv4が標準で付いてきます。今回は老舗で料金体系が分かりやすいさくらのVPSを選びました。

構成: 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にしておけます。この「必要なときだけワンタップ」という体験が、この構成を選んだ決め手です。

構築手順
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制限に悩んでいる方には、まず勧めたい構成です。
Anycloudでは一緒に働くメンバーを募集しています!
Anycloudは、ユーザーの心を動かす体験を届けることを大切にしています。フルリモート・フルフレックスの環境のもと、ライフスタイルに合わせた働き方を実現しながら挑戦したい方を歓迎します。詳細はこちらをご覧ください。