cdnjsjsDeliverunpkgSelf hosted

カメリアの記事

意味があることやないことを綴ります

Ubuntu 24.04.3 Serverをサバにした

もくろみ

  • 自宅内Webサイトの環境を構築する
    • Ubuntu Serverを使う
    • Window共有をマウントしてDNSサーバーとWebサーバーで使う(LinuxCIFS utils)
    • DNSサーバー(BIND9)を動かす
    • Webサーバー(Apache2)を動かす

事情

  • 自宅内にWebサイトを作りたい
  • WebサイトにはIPアドレスでなくURLでアクセスしたい
  • データはメインマシンに保存したい
  • メインマシンはWindows
  • DNSサーバーとWebサーバーの設定ファイルも重要なのでデータとしてメインマシンに保存したい

目次

Ubuntu Serverの準備

  1. インストールメディアの作成

    • Get Ubuntu Serverのページからインストールイメージをダウンロードする。
    • 起動可能なUSBドライブを簡単に作成できるRufusをダウンロードする。
    • RufusでUSBドライブにUbuntu Serverのインストールイメージを書き込む。
  2. インストール

    • USBドライブをパソコンに挿してパソコンを起動し、BIOS/UEFIを表示するためのキーを連打する。MSIはDeleteだった。
    • BIOS/UEFIで起動ドライブとしてUSBドライブを先頭にするか起動ドライブとして選択するかする。
    • Ubuntu Serverのインストーラーに従ってインストールを進める。このときIPアドレスの設定で手動を選択し下のようにすると記述が間違っていると言われてインストールできない。仕方ないのでDHCPを選択してインストールする。ここは後で変更する。
      • Netmusk: 255.255.255.0/24
      • IP address: 192.168.100.151
  3. ファイアウォールの起動

    • sudo ufw enableとしてファイアウォールを有効にする。
    • 僕はインストールした時点で有効になっていると思っていたけど諸トラブルの解決過程でsudo ufw statusとしたときinactiveとなっていて気づいた次第。
  4. ドメイン名

    • sudo domainname cなどとしてドメイン名を変更する。うちではTLDがcamelliaの「c」。
  5. 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
    
  6. sshの有効化

    • sudo ssh enableとしてsshサーバの起動設定をして起動する。
    • ssh接続がファイアウォールを通過できるようsudo ufw allow sshとする。
    • ここからは便利のため普段使っているWindowsパソコンからssh接続して作業した。Windowsの端末からssh camellia@192.168.100.151などとする。

Windows共有のマウント

  1. インストール

    • sudo apt-get install cifs-utilsとする。
  2. マウントポイント

    • sudo mnt google-driveなどとしてマウントポイントを作る。
  3. 認証

    • Vimやnanoなどでsudo vim /etc/credentials.saffronとかしてWindows共有にアクセスするユーザーとパスワードを下のように記載する。saffronはWindowsマシンの名前だ。
    • ファイルのパーミッションはsudo chmod 600 /etc/credentials.saffronなどとしておく。
    username=camellia@live.com
    password=ゴニョゴニョ
    
  4. ファイルシステム

    • /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がエラーを吐いていたけど再接続に問題はないようだった。

DNSサーバーの構築

  1. インストール

    • sudo apt-get install bind9とする。
  2. 設定ファイル

    • 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";
      };
    
    };
    
  3. ルート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がインターネット上のアドレスを解決するときのヒントになるのだろう。
  4. 正引きゾーンファイル

    $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
    
  5. 逆引きゾーンファイル

    $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.
    
  6. 設定ファイルをマウント

    • 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は嫌がった。
  7. DNSサーバーの登録と起動

    • sudo systemctl enable namedとする。
    • 僕は設定ファイルのシンボリックリンクの問題や設定ファル自体の書き方の問題でエラーが出て苦労した。
  8. 自分を信じる

    • 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 <= ここ!
    
  9. 動作確認

    • LAN内向けにping -c 4 rooter.cとかインターネット向けにping -c 4 google.comなどとしてDNSサーバーが正常動作していることを確かめる。
  10. ポートを開ける

    • sudo ufw allow 53としてポートを開けsudo ufw reloadとしてファイアウォールに設定を反映させる。
  11. 動作確認

    • 外部からDNSサーバーを利用できるか確認するためWindowsのネットワーク設定でDNSサーバーを変更してpingなどする。
    • 僕はWindowsクライアント側でDNSサーバーのアドレスを変更するのと、他の操作が必要だった。DNSサーバーのアドレスの変更だけでは名前解決ができず、他の設定をいじったり元に戻したりし、そうしているうちに名前解決ができるようになっていた。時間が必要だったのかもしれない。または端末でipconfig /flushdnsとかするとすぐ反映されたかもしれない。ネットワークはよく分からない。

Webサーバーの構築

  1. インストール

    • sudo apt-get install apache2とする。
  2. 設定ファイルのコピー

    • シンボリックリンクは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もコピーした。
  3. 偽証明書

    • 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など適当な名前のフォルダを作ってそこに両方を入れる。
  4. 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>
    
  5. マウント

    • 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で反映させる。
  6. Webサーバーの登録と起動

    • sudo systemctl enable apache2とする。
  7. ポートを開ける

    • hpptsのサイトなのでsudo ufw allow httpsとする。
    • 僕は、トラブルでサイトが見られないときApache2のデフォルトページを表示できるかどうかで問題の切り分けができるのでhttpsでないhttpのポートも開けておいた。sudo ufw http
  8. 動作確認

    • Windows側のブラウザからアドレスを入力して表示されることを確認する。このときのTLDがインターネット上に存在しないものの場合、ブラウザはキーワード検索をする。これを防ぐにはhttps://satsuki.c/のようにプロトコルから記述する。