はじめに
東北ずん子「テザリング回線って、場所や時間帯によって速度や安定性がブレますよね。
そこで今回は、Vultrの5USDインスタンス(Ubuntu)を TailscaleのExit Node にして、テザリング端末からの通信を一度Vultr経由に逃がす構成を試しました。
この記事では、その手順を ずんだもんと東北ずん子の会話形式 で、IPフォワーディングやUFW設定まで含めて解説します。」
1. 導入:なぜVultr Exit Node構成が効くのか
![]() |
![]() |
ずんだもん
「ずん子〜、ぼく、格安SIMのテザリング回線がぷつぷつ切れて、僕のメンタルもぷつぷつしてるのだ😭」
東北ずん子
「メンタルまでパケットロスしないで…。
じゃあ、テザリングは“ただのトンネル入口”にして、ちゃんとした出口をVultrに置こうよ。」
ずんだもん
「出口をVultrに? どういう魔法なのだ?」
東北ずん子
「魔法じゃなくてTailscaleのExit Nodeだよ。
今はこうなってるでしょ?」
- 端末 → テザリング → キャリアのよくわからないNAT → インターネット
「ここをこうするの。」
- 端末 → テザリング → Tailscaleトンネル → VultrのUbuntu VM → インターネット
ずんだもん
「おお、出口がキャリアじゃなくてVultrのデータセンタになるのだ!」
東北ずん子
「そうそう。ポイントは3つだよ。」
-
ラストワンマイル以外を“クラウド固定化”
「不安定なのは“端末〜Vultr間”だけにして、その先はVultrの安定したバックボーンとDNSを使う。
キャリアごとの変なDNSや謎ルーティングの影響を減らせるんだ。」 -
Vultr VMを“ルータ化”する
「Ubuntuでnet.ipv4.ip_forward=1にして、TailscaleがiptablesでNATしてくれるから、
Exit Node VMが“クラウド側ルータ”になる。
クライアントは全部、VultrのIPから出ていく1つの集約トラフィックになるよ。」 -
UFWでPublic IP側をほぼ密閉
「UFWでdefault deny incomingにして、-
Tailscale用UDP(41641)
-
tailscale0経由のSSH(22)
だけ許可すれば、Public IPにはポートを一切開けなくて済む。
“外からはほぼ見えないけど、Tailnet民にはフルでサービス”な状態だね。」
-
ずんだもん
「なるほど、テザリング回線は“入口係”だけやってもらって、
出口はVultr様にお願いする構成なのだ?」
東北ずん子
「そう。
-
経路とDNSはVultr側で統一
-
クライアントは全部Tailscaleで暗号化されて流れる
-
Exit Node VM自体はUFWでガチガチ
っていう三段構え。
テザリングの気分に振り回される部分を、できるだけクラウド側に寄せてるイメージだね。」
ずんだもん
「しかも5ドルVM1台でできるのだ。
“5ドルでメンタルの安定を買えるなら安い”構成なのだ。」
東北ずん子
「それはちょっと盛りすぎだけど、
“モバイル回線が心もとない状況でも、エンジニアとしてできるだけのことをやって、なるべく安定した出口を作りたい”
っていうニーズにはかなり刺さる構成だと思うよ。」
2. 前提:Vultr側のVM
![]() |
![]() |
東北ずん子
「まずはVultrで、Ubuntu 24.04 LTSの5 最安プランを1台作るよ。ポイントはこんな感じだよ。」
-
Location: TokyoまたはOsaka
-
Public IP: あり(テスト中は全接続許可されてOK。のちほどUFWでガチガチに絞る)
-
VPC: 任意(今回はシンプルにPublic IP付きでも動く)
ずんだもん
「ストレージ25GB、メモリ1GBでも、Exit Node用途なら十分なのだ。」
3. Ubuntuへログインして更新
# VultrのPublic IPに対してSSH
ssh root@<VultrのPublic IP>
# パッケージ更新
apt update && apt upgrade -y
東北ずん子
「ここは普通のUbuntuメンテ。特にひねりなしだよ。」
4. Tailscaleのインストール
curl -fsSL https://tailscale.com/install.sh | sh
ずんだもん
「これ1行でTailscaleが入るのだ。らくちん。」
5. Tailscaleにログイン
tailscale up
- ターミナルに表示されるURLをブラウザで開き、Tailscaleアカウントでログイン
東北ずん子
「ここで ‘Success.’ が出たら、このVMが Tailnet に参加できたことになるよ。」
6. Exit Nodeとして広告する(IPフォワーディング込み)
![]() |
![]() |
6-1. IPフォワーディングの永続化
echo 'net.ipv4.ip_forward = 1' | tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.conf sysctl -p
sudo sysctl -p /etc/sysctl.conf
ずんだもん
「ここ大事なのだ。Exit Nodeは“ルータ役”だから、Linuxがパケットを中継できるように ip_forward をオンにするのだ。」
東北ずん子
「適用後に確認すると安心だよ。」
sysctl net.ipv4.ip_forward
sysctl net.ipv6.conf.all.forwarding
# どちらも = 1 になっていればOK`
6-2. Exit Nodeとして起動し直す
tailscale down
tailscale up --advertise-exit-node
東北ずん子
「--advertise-exit-node を付けると、『このVMをExit Nodeとして使えるよ』ってTailnetに宣言するんだよ。」
7. 管理コンソールでExit Nodeを承認
東北ずん子
「ブラウザでTailscaleのAdmin Consoleを開いて、今のVMを選んで、『Use as exit node』にチェックを入れてね。」
ずんだもん
「ここを忘れると、クライアント側からExit Nodeとして選べないのだ。チェック忘れは“あるある”なのだ。」
UFWでがっちり絞る
8. UFWインストール
apt install -y ufw
ずんだもん
「Windowsで apt 叩いて怒られたのは内緒なのだ……。」
東北ずん子
「それはただの“PowerShellでUbuntuコマンドを打っただけ事件”だね。」
9. Tailscale用の許可ルール
# TailscaleデーモンのUDPポート
ufw allow 41641/udp
# Tailscaleインターフェイスからの流入を許可
ufw allow in on tailscale0
# Tailscale経由SSHを許可(root/22の例)
ufw allow in on tailscale0 to any port 22 proto tcp
# 既存SSH許可を消去
ufw delete allow 22/tcp
東北ずん子
「Exit NodeとSSHは、基本的にTailscale経由だけで使う構成にするよ。
なので、tailscale0からのトラフィックと22番を許可しておけばOK。」
10. デフォルトポリシーと有効化
![]() |
![]() |
ufw default deny incoming
ufw default allow outgoing
ufw enable ufw status verbose
ずんだもん
「Command may disrupt existing ssh connections ってビビらせてくるけど、事前にtailscale0からの22を許可しているので大丈夫なのだ。」
東北ずん子
「どうしても怖いときは、別セッションからSSHをもう1本張ってから ufw enable すると精神的に安心だよ。」
11. 完成形のルール例
ufw status のイメージ:
Status: active
To Action From
-- ------ ----
41641/udp ALLOW Anywhere
Anywhere on tailscale0 ALLOW Anywhere
22/tcp on tailscale0 ALLOW Anywhere
41641/udp (v6) ALLOW Anywhere (v6)
Anywhere (v6) on tailscale0 ALLOW Anywhere (v6)
22/tcp (v6) on tailscale0 ALLOW Anywhere (v6)
東北ずん子
「ポイントは、グローバル側の22/tcpを開けていないこと。
SSHはtailscale0からだけ通る=Tailscaleユーザー以外は入れない構成だよ。」
ずんだもん
「Public IPはpingには応答するけど、TCP/UDPポートは全部閉じてるのだ。
“話しかけると返事はするけど家の鍵は開かない”みたいな状態なのだ。」
12. クライアント側でExit Nodeを選択
ずんだもん
「テザリングしているノートPC側で、Tailscaleクライアントから Exit Node をこのVMに設定するのだ。」
-
クライアントPCで Tailscale を接続
-
設定画面 or CLI で、このVMを Exit Node として選択
CLI例(Linux/Macクライアント):
tailscale up --exit-node=<VMのTailscale IP or 名前>
東北ずん子
「これで、その端末の全トラフィックがVultrのVM経由でインターネットに出るようになるよ。」
13. テザリング回線がどう“マシ“になるのか
![]() |
![]() |
ずんだもん
「テザリング回線は不安定でも、Vultrの出口はデータセンタ品質なので、
『ラストワンマイルはちょっと不安定だけど、それ以外はかなり安定』みたいな構成にできるのだ。」
東北ずん子
「もちろん、テザリング自体が完全に落ちたらどうにもならないけど、
・DNSの安定性
・一部サイトとの経路
なんかはVultr側に寄せられるので、体感がだいぶマシになることが多いね。」
まとめ用のコマンド一覧(コピペ用)
########################################
# 1. 初回ログイン & 基本アップデート
########################################
# Vultr の Public IP に root で SSH(初回ログイン)
ssh root@<Vultr_Public_IP>
# パッケージ情報更新 & 既存パッケージを最新化
apt update && apt upgrade -y
########################################
# 2. Tailscale インストール & Tailnet 参加
########################################
# Tailscale をインストール
curl -fsSL https://tailscale.com/install.sh | sh
# Tailnet に参加(ブラウザでログインして 'Success.' を確認)
tailscale up
########################################
# 3. IP フォワーディング永続化(Exit Node 用)
########################################
# IPv4 の IP フォワーディングを有効化(永続)
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
# IPv6 の IP フォワーディングを有効化(永続)
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
# 設定をカーネルに反映
sudo sysctl -p /etc/sysctl.conf
# 適用状態を確認(どちらも = 1 になっていればOK)
sysctl net.ipv4.ip_forward
sysctl net.ipv6.conf.all.forwarding
########################################
# 4. Exit Node として再起動 & 管理コンソール側の承認
########################################
# 一度 Tailscale を停止
tailscale down
# Exit Node としてこのサーバをアドバタイズ
tailscale up --advertise-exit-node
# → ブラウザで Tailscale Admin Console を開き
# 対象ノードで「Use as exit node」にチェック
########################################
# 5. UFW 導入
########################################
# Vultr の Tailnet IP に root で SSH
ssh root@<TailScale_IP>
# UFW(ファイアウォール)をインストール
apt install -y ufw
########################################
# 6. Tailscale 用 UFW ルール(SSH を Tailscale 限定)
########################################
# Tailscale デーモン用 UDP ポートを許可
ufw allow 41641/udp
# Tailscale インターフェース(tailscale0)からの全入力を許可
ufw allow in on tailscale0
# Tailscale 経由の SSH (22/tcp) を明示的に許可
ufw allow in on tailscale0 to any port 22 proto tcp
# 既存のグローバル SSH 許可を削除(22/tcp ALLOW Anywhere を消す)
ufw delete allow 22/tcp || true
########################################
# 7. UFW デフォルトポリシー & 有効化
########################################
# 受信はデフォルト拒否(明示許可のみ通す)
ufw default deny incoming
# 送信はデフォルト許可
ufw default allow outgoing
# UFW を有効化
ufw enable
# 状態確認(SSH は tailscale0 のみ許可か、22/tcp ALLOW Anywhere がないか見る)
ufw status verbose
コメダ珈琲にて
![]() |
![]() |
東北ずん子
「これで5ドルExit Nodeの完成ね。
格安SIMのテザリングの不安定さに期限切れのずんだ餅を投げたい人は、ぜひ試してみてね。
実際に投げるのはずんだもんくらいだけど…。」
ずんだもん
「でもこれで、カフェのWi‑Fiが不安定でも、テザリングが気分屋さんでも、
Vultrという“真面目な出口担当”が守ってくれるのだ。」
東北ずん子
「その代わり、Vultrがメンテに入ったら、ずんだもんも一緒に落ちるけどね。」
ずんだもん
「ぐぬぬ……。 😭
じゃあ、もしものとき用に予備のExit Nodeも立てるのだ!」
東北ずん子
「え、5ドル×2台? ずんだもんのお小遣い、大丈夫?」
ずんだもん
「へーきなのだ! ずんだもんは計算が得意なのだ!」
東北ずん子
「めたんちゃんから貰ってる月のお小遣い、いくらだっけ?」
ずんだもん
「2000円なのだ!」
東北ずん子
「……5ドルVMを2台と、ずんだ餅を買うには、ちょっと厳しくない?」
ずんだもん
「だいじょうぶなのだ!
足りなかったら、お年玉と夏休みの自由研究ポイントも足すのだ!」
東北ずん子
「その“自由研究ポイント”はどこに換金されるの…?」
ずんだもん
「Qiitaにこの記事を書いて“えらいねポイント”をもらうのだ。
えらいねポイントが増えたら、きっとExit Nodeも増やしていいのだ!」
東北ずん子
「そのポイントまさか、めたんちゃんから“よくできましたシールが1枚もらえる”とかじゃないわよね?」
ずんだもん
「そうなのだ! シールが10枚たまったら、1台おねだりできるのだ!😤」
東北ずん子
「完全に子ども銀行の経済圏だわね…。」
利用キャラクター
- ずんだもん:VOICEVOX:ずんだもん
本記事で使用しているキャラクター画像の著作権は、それぞれの権利者に帰属します。
非商用目的での利用に基づき掲載しています。
リンク集



