もくろみ
- 自宅内Webサイトの環境を構築する
- Ubuntu Serverを使う
- Window共有をマウントしてDNSサーバーとWebサーバーで使う(LinuxCIFS utils)
- DNSサーバー(BIND9)を動かす
- Webサーバー(Apache2)を動かす
事情
- 自宅内にWebサイトを作りたい
- WebサイトにはIPアドレスでなくURLでアクセスしたい
- データはメインマシンに保存したい
- メインマシンはWindows
- DNSサーバーとWebサーバーの設定ファイルも重要なのでデータとしてメインマシンに保存したい
目次
Ubuntu Serverの準備
-
インストールメディアの作成
- Get Ubuntu Serverのページからインストールイメージをダウンロードする。
- 起動可能なUSBドライブを簡単に作成できるRufusをダウンロードする。
- RufusでUSBドライブにUbuntu Serverのインストールイメージを書き込む。
-
インストール
- USBドライブをパソコンに挿してパソコンを起動し、BIOS/UEFIを表示するためのキーを連打する。MSIはDeleteだった。
- BIOS/UEFIで起動ドライブとしてUSBドライブを先頭にするか起動ドライブとして選択するかする。
- Ubuntu Serverのインストーラーに従ってインストールを進める。このときIPアドレスの設定で手動を選択し下のようにすると記述が間違っていると言われてインストールできない。仕方ないのでDHCPを選択してインストールする。ここは後で変更する。
- Netmusk: 255.255.255.0/24
- IP address: 192.168.100.151
-
ファイアウォールの起動
sudo ufw enableとしてファイアウォールを有効にする。- 僕はインストールした時点で有効になっていると思っていたけど諸トラブルの解決過程で
sudo ufw statusとしたときinactiveとなっていて気づいた次第。
-
ドメイン名
sudo domainname cなどとしてドメイン名を変更する。うちではTLDがcamelliaの「c」。
-
IPアドレスの設定
ls /etc/netplanとすると「50-cloud-init.yaml」などのファイルが表示されるのでVimやnanoなどでsudo vim /etc/netplan/50-cloud-init.yamlとかして開き下のように編集して保存する。sudo netplan tryとして問題ないようならEnterして有効にする。- ここでインストール時にDHCPを選択せざるを得なかった部分を修正した。
network: version: 2 ethernets: eno1: dhcp4: false addresses: [192.168.100.151/24] routes: - to: default via: 192.168.100.1 metric: 0 nameservers: addresses: - 8.8.8.8 - 8.8.4.4 -
sshの有効化
sudo ssh enableとしてsshサーバの起動設定をして起動する。- ssh接続がファイアウォールを通過できるよう
sudo ufw allow sshとする。 - ここからは便利のため普段使っているWindowsパソコンからssh接続して作業した。Windowsの端末から
ssh camellia@192.168.100.151などとする。
Windows共有のマウント
-
インストール
sudo apt-get install cifs-utilsとする。
-
マウントポイント
sudo mnt google-driveなどとしてマウントポイントを作る。
-
認証
- Vimやnanoなどで
sudo vim /etc/credentials.saffronとかしてWindows共有にアクセスするユーザーとパスワードを下のように記載する。saffronはWindowsマシンの名前だ。 - ファイルのパーミッションは
sudo chmod 600 /etc/credentials.saffronなどとしておく。
username=camellia@live.com password=ゴニョゴニョ - Vimやnanoなどで
-
ファイルシステム
- /etc/fstabをVimやnanoなどで
sudo vim /etc/fstabとかして開く。最下行に1行で//192.168.100.111/google-drive /mnt/google-drive cifs credentials=/etc/credentials.saffron,defaults 0 1などと書き加える。 - 有効にするため
sudo mount -aとする。 - ここで気になるのがWindowsをシャットダウンすると共有で不具合が出る可能性だ。再起動して確かめたところ、Ubuntuがエラーを吐いていたけど再接続に問題はないようだった。
- /etc/fstabをVimやnanoなどで
DNSサーバーの構築
-
インストール
sudo apt-get install bind9とする。
-
設定ファイル
sudo cp -r /etc/bind /mnt/google-drive/conf/としてBINDの設定ファイルを丸ごと取得する。このうちnamed.conf.default-zonesを下のように変更した。- aclでは自宅内のTLDである「c」を定義している。
- viewは使わなくても設定できるようだけど昔の僕が書いていたので踏襲した。
- 元からあったzoneは不要とも思うけど面倒なので残し、zoneはviewのなかに置くように、とのことなので移動した。
// prime the server with knowledge of the root servers acl c { fe80::/10; 192.168.100.0/24; }; view internal { match-clients { c; }; allow-query { c; }; empty-zones-enable no; zone . { type hint; file "/usr/share/dns/root.hints"; }; // be authoritative for the localhost forward and reverse zones, and for // broadcast zones as per RFC 1912 zone localhost { type master; file "/etc/bind/db.local"; }; zone 127.in-addr.arpa { type master; file "/etc/bind/db.127"; }; zone 0.in-addr.arpa { type master; file "/etc/bind/db.0"; }; zone 255.in-addr.arpa { type master; file "/etc/bind/db.255"; }; // my domain c zone c IN { type master; file "/etc/bind/c.zone"; }; zone 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa IN { type master; file "/etc/bind/c.rev.zone"; }; zone 100.168.192.in-addr.arpa IN { type master; file "/etc/bind/c.rev.zone"; }; }; view external { match-clients { c; }; allow-query { c; }; empty-zones-enable no; zone . IN { type hint; file "/etc/bind/root.zone"; }; }; -
ルートDNS
- 前述named.conf.default-zonesの最下部で記述しているroot.zoneはルートDNSが書かれたゾーンファイルだ。
dig +bufsize=1200 +norec @a.root-servers.net > root.zoneなどとして取得できる。 sudo cp root.zone /mnt/google-drive/conf/bind/として移動する。- よく分からないけどnamedがインターネット上のアドレスを解決するときのヒントになるのだろう。
- 前述named.conf.default-zonesの最下部で記述しているroot.zoneはルートDNSが書かれたゾーンファイルだ。
-
正引きゾーンファイル
$TTL 3600 @ IN SOA nutmeg.c. camellia.xxx.com. ( 2025122600 ; serial 3600 ; refresh (a hour) 900 ; retry (15 minutes) 604800 ; expire (1 week) 86400 ; negative (1 day) ) IN AAAA ::ffff:192.168.100.151 IN A 192.168.100.151 IN NS nutmeg.c. satsuki IN CNAME nutmeg studio IN CNAME nutmeg rooter IN A 192.168.100.1 -
逆引きゾーンファイル
$TTL 3600 @ IN SOA nutmeg.c. camellia.xxx.com. ( 2025122501 ; serial 3600 ; refresh (1 hour) 900 ; retry (15 minutes) 604800 ; expire (1 week) 86400 ; negative (1 day) ) IN NS nutmeg.c. 1 IN PTR rooter.c. 111 IN PTR saffron.c. 121 IN PTR asuna.c. 151 IN PTR nutmeg.c. -
設定ファイルをマウント
- Vimやnanoなどで
sudo vim /etc/fstabとかして、次の1行を追加した。//192.168.100.111/google-drive/conf/bind /etc/bind cifs credentials=/etc/credentials.saffron,defaults 0 1それからsudo mount -aして適用する。 - 同じgoogle-driveなのでシンボリックリンクを張ればいいのかと思っていたけどnamedは嫌がった。
- Vimやnanoなどで
-
DNSサーバーの登録と起動
sudo systemctl enable namedとする。- 僕は設定ファイルのシンボリックリンクの問題や設定ファル自体の書き方の問題でエラーが出て苦労した。
-
自分を信じる
- Vimやnanoなどで
sudo vim /etc/netplan/50-cloud-init.yamlとかして次のように編集する。sudo netplan tryで確認して問題なければEnterなどで反映させる。
network: version: 2 ethernets: eno1: dhcp4: false addresses: [192.168.100.151/24] routes: - to: default via: 192.168.100.1 metric: 0 nameservers: addresses: - 192.168.100.151 <= ここ! - Vimやnanoなどで
-
動作確認
- LAN内向けに
ping -c 4 rooter.cとかインターネット向けにping -c 4 google.comなどとしてDNSサーバーが正常動作していることを確かめる。
- LAN内向けに
-
ポートを開ける
sudo ufw allow 53としてポートを開けsudo ufw reloadとしてファイアウォールに設定を反映させる。
-
動作確認
- 外部からDNSサーバーを利用できるか確認するためWindowsのネットワーク設定でDNSサーバーを変更してpingなどする。
- 僕はWindowsクライアント側でDNSサーバーのアドレスを変更するのと、他の操作が必要だった。DNSサーバーのアドレスの変更だけでは名前解決ができず、他の設定をいじったり元に戻したりし、そうしているうちに名前解決ができるようになっていた。時間が必要だったのかもしれない。または端末で
ipconfig /flushdnsとかするとすぐ反映されたかもしれない。ネットワークはよく分からない。
Webサーバーの構築
-
インストール
sudo apt-get install apache2とする。
-
設定ファイルのコピー
- シンボリックリンクはWindowsで扱えないので、シンボリックリンクを実態に変換してコピーするために
sudo cp -rL /mnt/google-drive/conf/apache2/mods-available/* /mnt/google-drive/conf/apache2/mods-enabled/とする。 - Apache2ではディレクトリの「-available」から「-enabled」へシンボリックリンクを張ることで読み込むかどうかを制御している。で、httpsのサイトを作りたいのでssl.confとssl.loadをmods-availableからmods-enabledへコピーする。また僕はヘッダー情報でキャッシュの管理をするのでsochache_shmcb.load、headers.loadもコピーした。
- シンボリックリンクはWindowsで扱えないので、シンボリックリンクを実態に変換してコピーするために
-
偽証明書
- httpsのサイトにするため偽証明書を作る。Windowsパソコンの端末で次のコマンドを実行してchocolateyというのをインストールするらしい。これはmkcertをインストールするのに必要なツールのようだ。さっぱり分からないのでコピペしてやった。
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('<https://community.chocolatey.org/install.ps1>')) - mkcertをインストールするため
choco install mkcertとする。 - まず偽CA証明書をインストールするため
mkcert -installとする。 - サイトの証明書を
mkcert satsuki.cなどとして作る。カレントフォルダにsatsuki.c.pemとsatsuki.c-key.pemができる。 - apache2以下にcertなど適当な名前のフォルダを作ってそこに両方を入れる。
- httpsのサイトにするため偽証明書を作る。Windowsパソコンの端末で次のコマンドを実行してchocolateyというのをインストールするらしい。これはmkcertをインストールするのに必要なツールのようだ。さっぱり分からないのでコピペしてやった。
-
Apache2の設定ファイル
- sites-enabledに拡張子を.confにしてテキストファイルを作り次のようにした。
<VirtualHost *:443> DocumentRoot "/mnt/google-drive/www/satsuki" ServerName satsuki.c SSLEngine on SSLCertificateFile "cert/satsuki.c.pem" SSLCertificateKeyFile "cert/satsuki.c-key.pem" <Directory "/mnt/google-drive/www/satsuki"> AllowOverride all Require all granted </Directory> <Files ~ .*> Header set Pragma no-cache Header set Cache-Control no-cache </Files> </VirtualHost> -
マウント
- WindowsフォルダをUbuntuにマウントするためVimやnanoなどで
sudo vim /etc/fstabとかして、1行//192.168.100.111/google-drive/conf/apache2 /etc/apache2 cifs credentials=/etc/credentials.saffron,defaults 0 1を追加した。sudo mount -aで反映させる。
- WindowsフォルダをUbuntuにマウントするためVimやnanoなどで
-
Webサーバーの登録と起動
sudo systemctl enable apache2とする。
-
ポートを開ける
- hpptsのサイトなので
sudo ufw allow httpsとする。 - 僕は、トラブルでサイトが見られないときApache2のデフォルトページを表示できるかどうかで問題の切り分けができるのでhttpsでないhttpのポートも開けておいた。
sudo ufw http
- hpptsのサイトなので
-
動作確認
- Windows側のブラウザからアドレスを入力して表示されることを確認する。このときのTLDがインターネット上に存在しないものの場合、ブラウザはキーワード検索をする。これを防ぐには
https://satsuki.c/のようにプロトコルから記述する。
- Windows側のブラウザからアドレスを入力して表示されることを確認する。このときのTLDがインターネット上に存在しないものの場合、ブラウザはキーワード検索をする。これを防ぐには