enchanter.one - 自作サーバーができるまで。

一般的な家庭用回線とWindows PCでできる、かんたんな自宅サーバーを作成する。

構成

Internet → Router → PC → Bridge → WSL

設定

WSLのネットワークをbridgedモードにすることで、WSLがネットワーク上は独立したPCとして見えるように設定する。
この設定で、外部(インターネット)からはWSLのIPアドレスでアクセスできるようになり、ホストPCのネットワークから分離する。

サーバーPC

Windowsの機能の有効化または無効化から以下のものを有効にする

WSLのMACアドレスを固定

Hyper‑V マネージャー → WSL の VM → 設定 → ネットワークアダプター → MAC アドレス → 静的に設定

WSLのIPアドレスを固定する

WSLにあるネットワークのMACアドレスを調べる。

$ ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 5e:bb:f6:9e:ee:fa brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.10/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever

ルーターに、このMACアドレスに設定する固定IPアドレスを割り当てる。

WSLの設定

ネットワークモードの設定を変更する。

.wslconfig

networkingMode=bridged
vmSwitch=WSL-Bridge
dnsTunneling=true
autoProxy=true

ブリッジの作成

Hyper‑V マネージャー → 仮想スイッチマネージャー 新規作成 → 外部ネットワーク(物理 NIC選択)

「管理 OS にこのネットワークアダプターの共有を許可する」をチェック

ルーター

HTTP, HTTPSの通信を自宅サーバー上に設定したWSLのIPアドレスへ向くように設定する。

ドメインの設定

Route53で適当なドメインを取得しておくこと。

ドメインを取得したら、Route53のホストゾーンからドメインが参照するIPアドレスをAレコードに設定する。
必要なら、サブドメイン(www.yourdomain など)もここに設定すること。

ここで設定するIPアドレスは、WSLのものではなく、ルーターに設定されているグローバルIPアドレスです。

一般的な家庭用の回線は、IPアドレスが変更される可能性があります。定期的にIPアドレスを更新しておく必要があります。
変更の有無にかかわらず、10分(更新時間は調整してください)おきに設定すればいいと思います。

IPアドレスを自動的に取得し、設定ファイルを作成、更新するスクリプト。

#!/bin/bash
HOSTED_ZONE_ID="<Route53ゾーンID>"
RECORD_NAME="変更したいドメイン名"

# 現在のグローバルIPアドレスを取得
GLOBAL_IP=$(curl -s ifconfig.me)

if [ -z "$GLOBAL_IP" ]; then
  echo "Failed to get global IP"
  exit 1
fi

# JSONの作成
cat << EOF > /tmp/record.json
{
  "Changes": [{
    "Action": "UPSERT",
    "ResourceRecordSet": {
      "Name": "$RECORD_NAME",
      "Type": "A",
      "TTL": 60,
      "ResourceRecords": [{"Value": "$GLOBAL_IP"}]
    }
  }]
}
EOF

# Route 53の更新
aws route53 change-resource-record-sets \
    --hosted-zone-id "$HOSTED_ZONE_ID" \
    --change-batch file:///tmp/record.json

echo "Route 53 updated with IP: $GLOBAL_IP"

このスクリプトを、cronなどで定期的に実行するように設定しておく。

Caddyをインストール

# 必要なパッケージのインストール
$ sudo apt update
$ sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl

# GPGキーのダウンロードと配置
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

# リポジトリの追加
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list

# caddyのインストール
$ sudo apt update
$ sudo apt install -y caddy

# caddyの起動
$ sudo systemctl start caddy

# systemdで有効にする。
$ sudo systemctl enable --now caddy

caddyの設定のサンプル。
現在稼働中の enchanter.one の設定です。

/etc/caddy/Caddyfile

chat.enchanter.one {
    reverse_proxy localhost:3080
}

www.enchanter.one {
    handle / {
        root * /var/www
        file_server
    }

    handle_path /chat/uranau* {
        root * /var/www/chat/uranau
        file_server
    }

    handle /api/chat/uranau* {
        reverse_proxy localhost:3001
    }

    log {
        output file /var/log/caddy/access.log {
            roll_size 10mb
            roll_keep 5
        }
    }
}

enchanter.one {
    redir https://www.enchanter.one
}

Caddyの設定にドメイン名が書いてあれば、自動的にLet's Encryptで証明書発行を行い、設定が行われます。
ポート80, 443でインターネットからアクセスできるようになっていること。

確認

外部ネットワークから、ルーターのIPアドレスや取得したドメイン名でアクセスする。
ルーター内のネットワークからIPアドレスやドメインにアクセスしても、接続できない場合があります。
その場合、スマートフォンなどの別なネットワークからアクセスすること(スマートフォンのWiFiをOFFにしておくこと)。

内部から接続する場合、hosts ファイルに以下の行を追加。
C:\Windows\System32\drivers\etc\hosts

<WSLのIPアドレス> <取得したドメイン>

サブドメインがある場合、それらのドメインについても設定すること。

トップページ