自宅サーバーを外部公開する方法とセキュリティ対策|v6プラスでもVPS経由で公開できる

Created on:November 30, 2025 at 2:25 PMReading time: 12 min
thumbnail Image

This article contains affiliate links.

ルーターでポートを開放したのに自宅のサーバーに外から接続できない場合は、回線の接続方式が原因になっていることがあります。最近の光回線で使われることが多い「v6プラス」などの IPoE 接続では IPv4 のアドレスを他の利用者と共有しているため、80 番や 443 番を自宅のサーバーへ転送する従来の方法では公開できません。

私はこのサイト(ryusei.io)と「X Space Downloader」などのツールを、2025 年 11 月から自宅に置いた小型 PC で運用しています。回線は「So-net 光 10ギガ」の v6プラスで IPv4 のポート開放ができないため、「ConoHa VPS」を IPv4 の入口にして、自宅のサーバーへは IPv6 で転送しています。運用を始めてから、サーバーが止まったことは一度もありません。

この記事では、自宅サーバーを外部に公開する方法を回線の接続方式ごとに整理したうえで、私が使っている VPS 経由の構成と設定を説明します。公開前に入れておくセキュリティ対策と、Web サイトとして公開せずに、外部から自宅サーバーへ安全に SSH でアクセスする方法も扱います。

この記事でわかること 

  • v6プラスなどの IPoE の回線で、IPv4 のポート開放ができない理由
  • 自宅サーバーを外部に公開する 4 つの方法(ポート開放・IPv6・VPS 経由・Cloudflare Tunnel)との違い
  • VPS を IPv4 の入口にして、自宅へ IPv6 で転送する構成と nginx の設定
  • 公開前に入れておくセキュリティ対策
  • 外部から安全に SSH 接続する方法

Linux のサーバーで Web サイトやサービスを運用している人を対象にしています。VPS 経由の方法に必要なのは、IPv6 で通信できる IPoE の回線と独自ドメイン、月数百円から借りられる VPS で、固定 IP のオプション契約とルーターでの IPv4 のポート開放は必要ありません。

自宅サーバーを外部に公開する 4 つの方法 

自宅サーバーを外部に公開する方法としては、次の 4 つに分けられます。どれを使えるかは、回線でグローバル IPv4 アドレス(インターネット上でその回線だけが使う IPv4 のアドレス)を使えるかどうかで、ほぼ決まります。

方法

グローバル IPv4

v6プラス・DS-Lite の回線

追加の費用

外部の事業者を経由するか

ルーターでポート開放

必要

固定 IP のオプションが必要

PPPoE ならなし。固定 IP のオプションは有料

しない

IPv6 で直接公開

不要

使える

なし

しない

VPS を入口にする

不要

使える

VPS の月額(私は約 700 円)

する(VPS の事業者)

Cloudflare Tunnel

不要

使える

無料で使える

する(Cloudflare)

2 番目の IPv6 だけで公開する方法は設定が最も少なく済みますが、IPv6 で通信できない環境の閲覧者からは見られません。私は IPv6 を自宅までの経路にだけ使い、閲覧者が IPv4 と IPv6 のどちらでも接続できる入口を VPS に置いています。

1 番目のポート開放は、私の回線では使えませんでした。v6プラスでは IPv4 のポートを自由に選んで開けられず、PPPoE でグローバル IPv4 を受ける方法も試しましたが、PPPoE ブリッジ(PPPoE の接続をルーターの内側の機器へそのまま通す機能)が使えなかったため、サーバーから PPPoE のセッションを張れませんでした。

残る 2 つのうち「Cloudflare Tunnel」は、サーバーから Cloudflare へ外向きに接続するだけで公開でき、ポート開放も VPS も必要ありません。それでも私が VPS を選んだのは、外部のサービスにはできるだけ頼りたくなかったのと、VPS と自宅をつなぐ構成を自分で組んでみたかったからです。

Cloudflare Tunnel を使う場合は、ドメインを Cloudflare に登録する必要があります。また、「Stream」や「R2」などの有料サービスを使わずに動画や大きなファイルを多く配信することは Cloudflare の規約で制限されているので、配信する内容によっては向きません。

Web サイトとして公開せず、外部から SSH で接続するだけの場合の方法は、後半の「外部から自宅サーバーへ安全に SSH でアクセスする方法」で説明しています。

回線の接続方式でポート開放できるかが決まる 

ポート開放で公開できるかどうかは、契約している回線が IPv4 の通信をどの方式で運んでいるかで決まります。

PPPoE と IPoE の違い 

「PPPoE」は、ルーターに接続 ID とパスワードを設定してつなぐ以前からの方式で、契約ごとにグローバル IPv4 アドレスが 1 つ割り当てられます。このアドレスに届いた通信を、ルーターのポート開放(ポート転送)で自宅のサーバーへ渡せるので、80 番や 443 番をそのまま使えます。

「IPoE」は IPv6 でインターネットにつなぐ方式で、IPv4 の通信は IPv6 の中に入れて運ばれます(IPv4 over IPv6)。このとき IPv4 のアドレスは複数の利用者で共有されるため、自宅のルーターだけでは外からの IPv4 の通信を自分のサーバーへ振り分けられません。

DS-Lite と MAP-E の違い 

IPv4 over IPv6 の主な方式には「DS-Lite」と「MAP-E」の 2 つがあり、ポートの扱いが違います。

方式

主なサービス

IPv4 のポート開放

DS-Lite

transix など

できない。プロバイダ側の設備がアドレスとポートを変換する(NAPT)

MAP-E

v6プラス、OCN バーチャルコネクトなど

割り当てられた範囲のポートだけ使える。v6プラスは 240 個

v6プラスで使えるポートは、回線ごとに割り当てられた 240 個(16 個ずつ 15 組)だけです。使いたい番号を選ぶことはできません。BIGLOBE は v6プラスの注意事項 で「外部へサーバ公開をお考えの方はご利用できません」と案内しています。

自分の回線の方式は、プロバイダの会員ページや契約書類に「v6プラス」「transix」などのサービス名で書かれています。

固定 IP のオプションで IPv4 を確保する 

IPoE の回線でも、プロバイダの固定 IP のオプションを契約すれば、グローバル IPv4 アドレスを 1 つ自分だけで使えるようになり、ポート開放で公開できます。たとえばインターリンクの「ZOOT NATIVE」の固定 IP は、2026 年 9 月時点で月額 2,200 円(税込)です。IPIP 方式(IPv4 over IPv6 の方式の一つ)に対応したルーターが必要です。NTT のホームゲートウェイでは使えないと案内されているため、ルーターを別に用意することになります。

PPPoE でグローバル IPv4 を受ける方法は、次の記事に書いています。私の今の回線では使えませんでしたが、PPPoE でつなげる回線であれば、サーバーや仮想マシンに直接グローバル IPv4 アドレスを割り当てられます。

【簡単】自宅サーバーや仮想マシンに気軽にグローバルIPアドレスを割り当てる方法 | Ryusei.IO

自宅で稼働させているローカルサーバーや仮想マシン上のLinux OSのコンテナなどを直接PPPoE接続してIPv4の固定グローバルIPアドレスを割り当てる手順を解説します。

faviconryusei.io

VPS を IPv4 の入口にして自宅へ IPv6 で転送する 

ここからは、私が使っている構成を説明します。IPoE の回線でも、IPv6 では自宅のサーバーにグローバルなアドレスが直接割り当てられていて、外から届きます。足りないのは IPv4 の入口だけなので、そこに VPS を置いています。

VPS を IPv4 の入口にして、自宅サーバーへ IPv6 で転送する構成図

通信の流れ 

閲覧者のリクエストは、次の順で自宅のサーバーまで届きます。

  1. ドメインの DNS(A レコードと AAAA レコード)は VPS のアドレスを指しておく
  2. 閲覧者は IPv4 か IPv6 で VPS の「nginx」に接続する。HTTPS の暗号化はここで一度解かれる
  3. VPS の nginx が、自宅サーバーの IPv6 アドレスの 443 番へ HTTPS で転送する
  4. 自宅サーバーの nginx が VPS 以外からの接続を拒否し、Docker で動かしている各サイトへ渡す

DNS には VPS のアドレスしか載せていないので、閲覧者が自宅のサーバーへ直接接続することはありません。証明書は「Let's Encrypt」のワイルドカード証明書を DNS 認証で取得し、同じものを VPS と自宅の両方に置いています。

VPS 側の nginx の設定 

VPS には nginx を直接インストールし、サイトごとに次のような設定を置いています。アドレスとドメインは例示用のものに置き換えました。

nginx
# http ブロックに置く(WebSocket のときだけ Connection を upgrade にする)
map $http_upgrade $connection_keepalive {
    default upgrade;
    ''      '';
}

upstream example_backend {
    # 自宅サーバーの IPv6 アドレス
    server [2001:db8:1234:5678::10]:443;
    keepalive 32;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name example.com;

    ssl_certificate     /etc/ssl-certificates/fullchain.pem;
    ssl_certificate_key /etc/ssl-certificates/privkey.pem;

    location / {
        proxy_pass https://example_backend;
        proxy_ssl_server_name on;
        proxy_ssl_name $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_keepalive;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

転送先を upstream ブロックにしているのは、VPS と自宅の間の接続を再利用するためです。最初は proxy_pass https://[IPv6アドレス]:443; と直接書いていたため、リクエストのたびに TCP と TLS の接続を張り直していました。VPS と自宅の間の往復時間は 30 ms で、接続を張り直すだけで記事ページの応答が 100 ms 前後遅れていました。

もう 1 つ見落としていたのが Connection ヘッダーです。WebSocket のためによく使われる $connection_upgrade の map は、Upgrade ヘッダーが無いときに close を返すので、upstream に keepalive を書いても接続は再利用されません。上の設定のように Upgrade ヘッダーが無いときは空を返す map に替えてから、VPS から測った記事の HTML の TTFB(最初の 1 バイトが届くまでの時間)は 172〜210 ms から 70〜77 ms に短縮されました。

自宅側の設定(ルーターと nginx) 

自宅側では、ルーターの IPv6 のフィルタでサーバー宛ての通信を通し、サーバーの nginx で VPS 以外からの接続を拒否しています。ルーターは NTT のホームゲートウェイ(XG-100NE)で、「ルータ設定」の「IPv6パケットフィルタ設定(IPoE)」でサーバーの IPv6 アドレスを開放しました。

ホームゲートウェイの「IPv6パケットフィルタ設定(IPoE)」で、宛先をサーバーの IPv6 アドレス(/128)にした許可のエントリを有効にした画面。アドレスとファームウェアの版は塗りつぶしている

「IPv6ファイアウォール機能」は「有効」、「IPv6セキュリティのレベル」は「標準」のままにしています。「標準」では、インターネット側から始まる IPv6 の通信は拒否されます。その例外として、宛先をサーバーのアドレスにした「許可」のエントリを追加しました(画像の 2 行目で、アドレスは塗りつぶしています)。プロトコルとポートは「*」のままなので、サーバー宛ての通信はすべて通ります。

「宛先IPv6プレフィックス/プレフィックス長」のプレフィックス長は IPv4 のサブネットマスクにあたる値で、「128」にしたときだけアドレス 1 つを指します。私は最初ここを 128 にしていなかったため、サーバーのアドレスだけでなく、同じ範囲に入る家の中のほかの機器のアドレス宛ての通信まで通していました。

IPv6 には、IPv4 のように 1 つのアドレスを家の中の機器で共有する仕組み(NAT)がありません。ルーターでサーバーのアドレスごと開放すると、そのサーバーで待ち受けているポートにはすべて外から届くようになるので、接続元を絞る設定をサーバー側に入れます。

私は次のように、nginx の http ブロックで VPS の IPv4 と IPv6 のアドレスだけを許可しています。http ブロックに書くと、この nginx で受けているすべてのサイトに適用されます。

nginx
# http ブロックに置く。VPS のアドレスだけを許可し、それ以外は 403 で拒否する
allow 203.0.113.10;
allow 2001:db8:abcd::10;
deny all;

VPS を前に置いても、自宅のサーバーのアドレスに外から届かなくなるわけではありません。DNS に載せていないので見つかりにくいだけで、外からの接続を止めているのはサーバー側のこうした設定です。

費用と運用の実績 

私の構成の費用と運用の実績は次のとおりです。

項目

内容

VPS

ConoHa VPS(メモリ 1 GB・2 コア)月 約 700 円

自宅サーバー

Minisforum UM870 Slim(Ryzen 7 8745H・メモリ 32 GB)

電気代

月 220〜340 円ほど(推定)

回線

So-net 光 10ギガ(v6プラス)

運用期間

2025 年 11 月から

サーバーが止まった回数

0 回

月々の費用は、本体の購入費と回線の料金を除くと、VPS と電気代を合わせて 1,000 円ほどです。このサイトの VPS 比較記事で調べた 2026 年 9 月時点の料金では、同じメモリ 32 GB の VPS は最も安いもので月 13,530 円(36 か月契約)だったので、私の使い方では自宅に置く方が費用を抑えられています。

一方で、閲覧者との通信はすべて VPS を通ります。自宅の回線が 10 ギガでも、外から見た速さは VPS の帯域が上限になります。私の構成では約 130 Mbps です。入口が VPS 1 台なので、VPS が止まれば自宅のサーバーが動いていてもサイトには接続できなくなります。

公開前にやっておくセキュリティ対策 

公開したサーバーには、自動化されたプログラムによるログインの試行が届きます。次は、グローバル IPv4 で SSH を受けているサーバーでログインに失敗した記録(lastb)の例で、知らないアドレスから admin や oracle といったユーザー名で何度も試されています。

commandline
$ sudo lastb -n 10
zaire    ssh:notty    62.60.xxx.157    Sun Nov 30 14:24 - 14:24  (00:00)
admin    ssh:notty    2.57.xxx.112     Sun Nov 30 13:55 - 13:55  (00:00)
admin    ssh:notty    161.xxx.155.71    Sun Nov 30 13:51 - 13:51  (00:00)
admin    ssh:notty    161.xxx.155.71    Sun Nov 30 13:50 - 13:50  (00:00)
admin    ssh:notty    161.xxx.155.71    Sun Nov 30 13:49 - 13:49  (00:00)
admin    ssh:notty    161.xxx.155.71    Sun Nov 30 13:48 - 13:48  (00:00)
admin    ssh:notty    161.xxx.155.71    Sun Nov 30 13:48 - 13:48  (00:00)
admin    ssh:notty    2.xxx.121.112     Sun Nov 30 13:48 - 13:48  (00:00)
user     ssh:notty    2.xxx.121.25      Sun Nov 30 13:42 - 13:42  (00:00)
oracle   ssh:notty    206.xxx.119.98   Sun Nov 30 13:26 - 13:26  (00:00)

btmp begins Fri Nov  7 17:06:31 2025

どの構成を選んでも、公開する前に次の設定を入れておきます。

ファイアウォールで待ち受けるポートを絞る 

外から届いてよいポートだけを開け、それ以外は閉じます。Ubuntu なら「ufw」で次のように設定できます。VPS 経由にする場合は、443 番を VPS のアドレスからの接続だけに絞れます。

bash
sudo ufw default deny incoming
sudo ufw default allow outgoing
# VPS のアドレスからの HTTPS だけを許可する
sudo ufw allow from 2001:db8:abcd::10 to any port 443 proto tcp
# SSH は短時間に繰り返す接続を制限したうえで許可する
sudo ufw limit 22/tcp
sudo ufw enable

ただし、Docker でポートを公開しているコンテナへの通信は、ufw の設定より先に Docker のルールで振り分けられます。Docker の公式ドキュメント も、この場合は ufw の設定が実質的に無視されると説明しています。私は nginx を Docker で動かしているので、接続元は前の節のとおり nginx の設定で制限しています。

SSH は鍵認証だけにする 

SSH はパスワードでのログインを止め、鍵認証だけを受け付けるようにします。/etc/ssh/sshd_config に次の 2 行を書き、sudo systemctl restart ssh で反映します。

plaintext
PasswordAuthentication no
PermitRootLogin no

Ubuntu では /etc/ssh/sshd_config.d/ の中の設定ファイルが先に読み込まれ、同じ項目は先に読んだ値が使われます。書き換えたのに反映されないときは、sudo sshd -T | grep -i passwordauthentication で実際に使われている値を確認します。

ログインの失敗を繰り返すアドレスを一定時間遮断する「fail2ban」を入れておくと、鍵認証にした後もログに残り続ける試行を減らせます。

セキュリティ更新を自動で入れる 

OS のセキュリティ更新は、Ubuntu なら「unattended-upgrades」で自動的に適用できます。Docker で動かしているソフトウェアはこの対象に含まれないので、使っているイメージの更新は別に確認します。

外部から自宅サーバーへ安全に SSH でアクセスする方法 

Web サイトとして公開せず、外部から SSH で接続するだけであれば、IPv4 のポート開放も VPS も必要ありません。IPv6 で SSH を受けるか、VPN で入る経路を 1 本用意すれば十分です。Web サイトを公開しているサーバーでも、管理用の接続はこの経路に分けておきます。

私は、IPv6 が使える場所からは自宅のサーバーへ IPv6 で直接 SSH 接続しています。IPv6 が使えない場所からは、別に管理している VPN サーバー(グローバル IPv4 でインターネットにつながっている機械)へ先に接続し、そこから自宅のサーバーへもう一段 SSH でつないでいます。

2 段の SSH は、手元の ~/.ssh/config に ProxyJump を書いておくと、1 回の ssh コマンドでつながります。

plaintext
# 自宅サーバー(IPv6 で直接つなぐ)
Host home
    HostName 2001:db8:1234:5678::10
    User user

# 踏み台にする VPN サーバー(グローバル IPv4)
Host gateway
    HostName 198.51.100.20
    User user

# IPv6 が使えない場所では踏み台を経由する
# HostName には、踏み台から自宅サーバーに届くアドレスを書く
Host home-via-gateway
    HostName 2001:db8:1234:5678::10
    User user
    ProxyJump gateway

IPv6 が使える場所では ssh home、使えない場所では ssh home-via-gateway と打つだけで接続できます。

私は、踏み台にしている VPN サーバーのグローバル IPv4 アドレスを、インターリンクの「マイIP ソフトイーサ版」で取得しています。マイIP は、同社の VPN サーバーに接続した機械に固定のグローバル IPv4 アドレスを割り当てるサービスです。ソフトイーサ版の料金は 2026 年 9 月時点で固定 IP 1 個あたり月額 1,320 円(税込)で、最大 2 か月の無料体験があります。

同じインターリンクの「セカイVPN」は、海外から日本の IP アドレスでインターネットに接続したいときなどに使うサービスで、各国に置かれた VPN サーバーの IP アドレスをほかの利用者と共有して使います。固定 IP は割り当てられないので、踏み台のアドレスには使えません。

VPN サーバーを自分で用意しない場合は、「Tailscale」や「WireGuard」で手元の端末と自宅のサーバーをつなぐ方法があります。Tailscale には、2026 年 9 月時点で個人向けの無料プラン(Personal)があります。

まとめ 

IPoE の回線で IPv4 のポート開放ができないのは、IPv4 のアドレスを他の利用者と共有しているためです。IPv6 では自宅のサーバーに外から届くので、IPv4 の入口だけを VPS に置けば、固定 IP のオプションを契約しなくても IPv4 と IPv6 の両方で公開できます。私はこの構成で、VPS と電気代を合わせて月 1,000 円ほどの費用で、2025 年 11 月から止まらずに運用しています。

  • PPPoE でグローバル IPv4 を使える回線なら、ルーターのポート開放で公開できる
  • v6プラス(MAP-E)や DS-Lite の回線では、固定 IP のオプションか VPS 経由か Cloudflare Tunnel を使う
  • VPS 経由では、upstream の keepalive と Connection ヘッダーで VPS と自宅の間の接続を再利用する
  • 自宅側は、ルーターでサーバーのアドレスだけをプレフィックス長 128 で開放し、nginx の許可の設定で接続元を VPS だけに絞る
  • 管理用の SSH は Web の経路と分けておく

関連記事とツール 

VPS料金比較【2026年9月最新】国内おすすめ8社の月額・回線速度・Windows対応 | Ryusei.IO

2026年9月28日時点の国内VPS8社の料金を公式情報で比較。XServer VPSの新規受付停止やシンVPSの値上げを反映し、回線速度(帯域)とWindows Serverの料金、ConoHa VPSで測った実測値、用途別の選び方まで解説します。

faviconryusei.io
複数のNext.js製アプリをポート番号を分けて同じサーバーで運用する方法の解説 | Ryusei.IO

Next.js製のWebアプリをセルフホストする場合に、同じサーバー内でリバースプロキシを使って複数のアプリを運用する方法を解説していきます。リバースプロキシにはOpen Lite Speedを使用します。

faviconryusei.io
certbotコマンドで「Let's Encrypt」のSSL証明書を取得する時の覚書 | Ryusei.IO

certbotコマンドで「Let's Encrypt」のSSL証明書を取得する時の覚書

faviconryusei.io

Latest Tips