tailscaleとexpressjsで無料・IPアドレス匿名(リバースプロキシ)・自宅サーバーで動的サイトを構築する

人々の趣味のホームページ作りの流れは、次の3つの段階があると思われる

*静的サイト: サーバーにあるファイルを読み取り専用で閲覧するタイプのサイト、サーバー側は変化せず、サイトをリロードするとユーザーの操作はリセットされる

*動的サイト: サーバー側でも処理が行われ、サイトに変化が蓄積されるもの、掲示板、絵などのアップロードサイト、ログイン可能なサイト

ここでは第三段階の動的ホームページ作りについて、無料かつIPアドレスが秘匿されるという点に着目して、tailscaleによるリバースプロキシ付きDDNSを用いた、自宅サーバーによる動的サイト構築について述べる。サーバー構築は、windows上のnodejs環境でexpressjsを用いて行った。これはこの組み合わせが一番簡単に感じたからで、他の方法でもサーバーを立てればtailscaleでinternet上に公開できる。

背景(重要でない)

自宅サーバーについて

 自宅サーバーは、多くのサイトでおすすめされていない。火災の危険、セキュリティーの危険があるからで、レンタルサーバー(賃貸雑居ビルのようなもの)やVPS(賃貸ビルのようなもの)を借りた方が、結局良いですよ、ということがネットに書かれているけれど、私は向上心がないため、開発を半年くらいほっぽってしまいそうで、サブスクの何かを使うと自動的にお金がでていくという緊迫感が我慢ならず、また家にサーバーがあり世界につながっている、という状況に愛くるしさを感じるため、あえて自宅サーバーをインターネットに公開する点にこだわった。しかも、サブスクが嫌であるため、ただの名前代であるドメインも、年額で契約することが我慢ならず、なんとか無料で済ます方法はないかと一年程度調べていた。

無料で動的サイトを作りたい

 どうしてサイトを作るのにお金がいるのか?もっとも原始的なサイトは無料でだれでも作ることができる。windowsにnodejs等をインストールしてexpressなどのライブラリを用いて、自分の決めたポート番号(例えば3000)でlocalhostでサーバーを立ち上げると、ブラウザにhttp://localhost:3000などと入力することで自分の今いるデバイスの3000番のポートに立ち上がっているwebサーバーを眺めることができる。この状態で、windowsのfirewall設定の3000番を開放すれば、サーバーはLAN内に公開され自宅のwifiに接続しているスマホなどからローカルIPアドレスの192.168.11.2:3000などとブラウザに入力すると自宅内でwebサイトを見ることができる。更に、自宅のルーターのポート開放設定で3000番を開放すれば、サーバーはインターネットに公開され、自宅のIPアドレス(例えば123.456.789.123)を用いて、http://123.456.789.123:3000などとブラウザに入力すれば、全世界から自宅のサーバーを見ることができる。本来、webはネット回線さえあれば無料なのだ。
 IPアドレスは無骨すぎるため、namako.netのようなドメインが欲しくなる。IPアドレスを直接入力するのではなく、IPアドレスに紐づいたドメインを入力するとIPアドレスに変換(名前解決という)してサイトにアクセスできる仕組みをDNSという。レジストラと呼ばれる機関(の請負業者)でドメインを契約するとDNSできるようになるが、こだわりの問題であり、実用上IPアドレスでも何も問題ない。

(普通webサイトはポート番号を80に開設するものであり、123.456.789.123とだけ入力すると、ブラウザは123.456.789.123:80にアクセスし、ポート番号を入力する必要がなくなる。私たちは普段ポート80番を使っているため、url欄にわざわざポート番号を入力しないが、本来、google.comなどはgoogle.com:80の略である)

しかし、一般的な世帯でIPアドレスでサイトを公開すると以下の二つの問題が生じる。

動的IPアドレスを固定ドメインに紐づける(DDNS)

 一つの問題としては、IPアドレスが固定できないことである。現代の基本的なインターネット回線は動的IPアドレスであり、一定期間で自宅のルーターに割り振られるIPアドレスが変わる。これは現在使われているIPV4のIPアドレスが枯渇しているため、回線業者が手持ちのIPアドレス(契約者数より少ない)を今回線を使っている人に割り振るためである。ネットを見る分にはIPアドレスが変わっても問題ないが、ネットにコンテンツを公開するのでは、IPアドレスが変わると困る、そこで、固定IPアドレスの回線(高い)を契約するか、DDNSを用いて動的IPアドレスでも固定したドメインでサイトにアクセスできるようにしたい。DDNSとは、動的IPアドレスを割り振られた回線から、定期的に決められたサーバーに通信を送ることで、自分の現在のIPアドレスを登録し、自分の現在のIPアドレスに対してurlを割り振る仕組みである。無料のddnsには、登大遊さんの作ったsoftetherなどがある。softetherを使うと、自分の自宅のIPアドレスはnamako.softether.netなどの固定の文字列であるドメインに登録される。

中間にサーバーを挟んで自宅のIPアドレスを秘匿する(リバースプロキシ)

 もう一つの問題として、おおよその住所がばれることがある。DNSやDDNSを用いても、ブラウザからは表面的には見えないが、ドメインを利用者側がIPアドレスに変換してサイトにアクセスするため、専用のサイト
[https://www.cman.jp/network/support/go_access.cgi]

やツールを使えばIPアドレスはわかる。IPアドレスは事業者の回線の情報があるため、おおよそ県や区単位で自宅はばれる。しかし匿名でインターネットをやりたい。そのためには、リバースプロキシを契約し、一旦中間のサーバーを経由してDNSやDDNSをすれば、ドメインを逆引きして出てくるIPアドレスは中間のサーバーのものになるので、自宅のIPアドレスを秘匿することができる。

 したがって、一般的なネット回線で、匿名で自宅サーバーを運用するには、動的IPアドレスをDDNSによってドメインに紐づけ、中間にリバースプロキシサーバーを挟んで自宅のIPアドレスを秘匿しなければならない。softetherは、無料のDDNSであるが、リバースプロキシは別途契約する必要がある。tailscaleは、無料のDDNSであり、最初からリバースプロキシが挟まっている。よってここではtailscaleを用いた。

方法

tailscale funnelの使い方

[https://tailscale.com/:title]

この状態では、まだurlが不格好((デバイス名).(ランダム文字列).ts.netのような感じ)なので、デバイス名とtailnet名を変更して、格好良くするといい。以下に方法を示す。

サーバーの建て方

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000, () => {
  console.log('Server listening on port 3000');
});

このコードでは、expressを読み込んで、サイトにアクセスが来たら”Hello World!”と返している。

実行

参考