プライベートWebサーバーに「プロキシサーバー+P2Pトンネル」で安全にアクセスする
August 18, 2026
社内や自宅にある「プライベートWebサーバー」に対して、外部からPCでアクセスするためにVPN環境などを利用されていると思います。 特に、社内のプライベートWebサーバーへアクセスする場合は、専用のサーバー機器とソフトによるVPN環境を構築していると思います。 ただ、一般的なVPN環境においては、その脆弱性を付かれて攻撃を受けるといったセキュリティ課題が顕在化しています。 そこで、「プロキシサーバー+P2Pトンネル」による外部から安全にプライベートWebサーバーへアクセスする環境の構築を提案したいと思います。
なぜ、「プロキシサーバー+P2Pトンネル」なのか
社内の一般的なVPN環境では、専用のサーバー機器+ソフトによって「社内(安全)と社外(危険)」の境界をネットワーク的に作る仕組となっており、 社内LANへの入口となるVPNサーバー機器は、インターネットに公開されています。
そのため、VPNサーバー機器は攻撃対象になりやすく、その脆弱性を付かれて突破された場合は、社内ネットワーク全体に不正アクセスされるリスクがあります。
また、自宅のインターネット環境においては、ブロードバンドルーターのポート開放+DDNS(ダイナミックDNS)による外部からのアクセス方法がありますが、 これも宅内LANへの入口となるルーターがインターネットに公開されることになるため、ルーターに脆弱性があると不正アクセスされるリスクがあります。
そこで、プライベートWebサーバーとクライアントの間に「プロキシサーバー+P2Pトンネル」による完全NAT越えの独立したプライベートアクセス環境を構築し、 社内や宅内のLANへの入口となるインターネット公開そのものを排除することで不正アクセスに対する安全性を担保できると考えました。
アクセス環境の概要
アクセス環境は、プライベートWebサーバーにアクセスできるネットワーク内にフォワードプロキシサーバー「Squid」を設置し、 外部からアクセスするPCには、HTTPプロキシー設定を行います。 そして、プロキシサーバーと外部PCの間を繋ぐネットワーク環境として「トンネルアプリ」を使用します。 (当方がアプリ開発を行い無料で提供しているP2Pアプリです)
トンネルアプリは、2つの端末にインストールして使用し、一方のアプリでクライアントアプリからのアクセスを代理ポートで受け付け、 一方のアプリでサーバーアプリへのアクセスを行います。 端末アプリ間の通信データはEnd-to-Endで暗号化しますので、その内容を第三者に見られることなく安全にアクセスすることができるようになっています。
squidのフォワードプロキシサーバーは、「LAN内からインターネットWebサーバーへの出口」として利用することが通常ですが、「P2PトンネルからプライベートWebサーバーへの出口」として利用することがアイデアです。
トンネルアプリは、PC側に代理ポートとサーバー側のP2Pトンネル設定を一件づつ登録することが基本ですが、それだと特にPC側の設定作業と管理が手間になるので、HTTPプロキシーをP2Pトンネル化することで運用を効率化できると考えました。
プロキシサーバー側のセットアップ
プロキシサーバー側のOS環境はLinuxを使用し「Squid」のインストールとセットアップを行います。
「Squid」の詳細については、公式サイト(https://www.squid-cache.org/)などで確認してください。 この記事では、デフォルトの待ち受けポートである「3128」を使用するものとします。
この記事では、プロキシサーバー側と同じネットワーク内からURL「http://private.example.com」でアクセス可能なプライベートWebサーバーが存在するものとします。![]()
- プライベートWebサーバーへのアクセスは、ID・パスワード等によるログイン認証が必要です。
- 社内サーバーの場合は、LAN内のみのアクセスであってもセキュリティやブラウザ仕様上の理由から、HTTPS(SSL/TLS)通信の導入が推奨されます。
- HTTPS通信で使用するサーバー証明書については、ルート証明書が広く配布されており、無料で発行できる「Let's Encrypt」や「Google Trust Services(GTS)」があります。
そして、「トンネルアプリ(Linux版)」をインストールして起動します。 すると、コンソール上で以下のメッセージが表示されます。なお、これでLinux側のトンネルアプリの設定は完了で、会社や自宅のネットワーク環境の設定変更は不要です。 この例では、トンネルアプリの端末番号(先頭6桁)が「000001」となっています。
PC側のセットアップ
PC側のOS環境はWindowsを使用し「トンネルアプリ(Windows版)」をインストールして起動します。 すると、以下のコマンドプロンプトとブラウザ画面が表示されます。 この例では、トンネルアプリの端末番号が「000002」となっています。
Windows版トンネルアプリについて、Microsoft Storeからダウンロードできます(推奨)。信頼されたアプリとしてインストールされますので、以下に示す警告メッセージは表示されません。
ZIPファイルをダウンロードしてアプリを起動した時に「WindowsによってPCが保護されました。」のメッセージが表示された場合は、初回のみ「詳細情報」を押下してから実行してください。「このファイルを開きますか?」のメッセージが表示された場合は、「開く」を押下してください。![]()
次に、プロキシサーバー側のトンネルアプリで、この端末をサーバー側端末として登録するためのURLを以下のコマンド「./TunnelApp_Linux.sh setting」で発行し、PC側のブラウザでアクセスします。 なお、発行されたURLの有効期限は10分で、使用可能回数は1回です。
オプションのパラメータで、発行したURLの設定キーにメモ(例:123456 対象PCのユーザーIDなど)を追加しておくことができます。
すると、プロキシサーバー側のトンネルアプリがサーバー側端末として登録されます。
なお、プロキシサーバー側で、紐付けられたPC側のトンネルアプリの端末番号は、以下のコマンド「./TunnelApp_Linux.sh devices」で確認することができます。
プロキシサーバー側へのアクセスを無効化する場合は、以下のコマンド「./TunnelApp_Linux.sh disable_device <端末番号>」で変更できます。
プロキシサーバー側へのアクセスを有効化する場合は、以下のコマンド「./TunnelApp_Linux.sh enable_device <端末番号>」で変更できます。
プロキシサーバー側へのアクセスを削除する場合は、以下のコマンド「./TunnelApp_Linux.sh delete_device <端末番号>」で変更できます。
発行したURLの設定キーにメモを追加・変更する場合は、以下のコマンド「./TunnelApp_Linux.sh setting_memo <設定キー> <メモ>」で変更できます。
続いて、PC側のトンネルアプリでトンネル通信設定を登録します。
「クライアント側端末」では、「端末内のアプリのみ」を選択して「127.0.0.1(ローカルホスト)」からのアクセスに制限し、 Webブラウザーからアクセスを受け付けるための代理ポートとして「23128」を設定します。
「サーバー側端末」には、プロキシサーバー側のトンネルアプリ「000001」を選択し、そこからのアクセス先として「127.0.0.1」とポート「3128」を設定して保存します。
続いて、WebブラウザーのHTTPプロキシー設定で「セットアップスクリプトを使う」をオンにしてセットアップスクリプトを使用するようにします。 セットアップスクリプトの元ファイルの配信にはsquidのエラー画面出力を使用し、PC側のトンネルアプリのPROXYサーバーアクセス機能(「localhost」のポート番号「10000」)を利用して取得するため以下のURLをセットします。
http://localhost:10000/proxy?url=http://localhost:23128/proxy.pac
次に、プロキシサーバー側で以下のセットアップスクリプトを作成して保存します。
保存先: /usr/share/squid/errors/templates/PROXY_PAC
function FindProxyForURL(url, host) {
// Use a proxy for specific hostnames.
if (host == "private.example.com") {
return "PROXY 127.0.0.1:23128";
}
// All other traffic connects directly.
return "DIRECT";
}
squidの設定ファイルに以下の設定を追加します。
設定ファイル: /etc/squid/squid.conf
acl proxy_pac url_regex -i /proxy.pac deny_info PROXY_PAC proxy_pac http_access deny proxy_pac
※既存の「http_access deny all」よりも前に記述する必要があります。
※設定変更後は、squidの設定再読込または再起動が必要です。
セットアップスクリプトの配信をsquidのエラー画面出力で行う方法は少しトリッキーですが、別途Webサーバーを立てる必要が無く、サーバー側の1か所で管理できます。
最後に、PC側のWebブラウザーから「http://private.example.com」でアクセスすると、サンプルのプライベートWebサーバーの画面が表示されます!
- PC側(アクセス元)のトンネルアプリへの同時接続は、最大5件まで可能となっています。
- プロキシサーバー側(アクセス先)のトンネルアプリへの同時接続は、最大200件まで可能となっています。
おわりに
最近、生成AIやAIエージェントを利用したと思われる不正アクセスによって、情報漏洩やサービス停止などの被害が相次いでいますが、企業はもとより個人でも対策が急務となっていると思います。
ネットワーク機器やアプリの脆弱性対策として、随時バージョンアップを行っていくことが重要であることに変わりは無いのですが、現実的には作業漏れやゼロデイ攻撃は防ぎようがないと感じます。
そのため、プライベートなサーバーを「絶体に外部から不正アクセスできないネットワーク環境」に構築したうえで、それでも侵入の恐れがある箇所に対策をとっていく消去法的なアプローチが望ましいと思いました。
本記事での提案が、そのような検討の一助になれば幸いです。
最後までお読みいただきありがとうございました!ご意見などございましたらメッセージをお寄せいただけると幸いです。
P2P · Web · Security

