Raspberry Pi でサーバーを立ち上げる

この記事は Raspberry Pi 4 で、OS は Bullseye を使って動作確認しました。Raspberry Pi へのOSのインストールは こちら を参照してください。

システムの更新

Raspberry Pi OS が起動したらシステムを更新しておきます。

ユーザー管理

ラズパイでサーバーを構築するということは、他者によってそのラズパイがハッキングされる可能性が生じます。実験のために一時的に使うだけなら必ずしも必要ではありませんが、WEBサーバーを常時公開するような場合には最低限のセキュリティ対策は必須です。

root のパスワードを設定します。

新しいパスワードを2回入力してください。以降、sudo コマンドを使うときにはこのパスワードが必要になります。

デフォルトで存在する pi ユーザーを使い続けるのは危険なので、別のユーザーに変更して、pi ユーザーは削除しましょう。まず新しいユーザーを作成します。

パスワードを2回入力します。その後いろいろ聞かれますが、Enter を入力すれば先に進みます。新しいユーザーで sudo コマンドが使えるように権限を設定します。

これで新しいユーザーが出来ましたが、これだけでは次回の起動時も pi でログインしてしまいますので設定を変更します。タスクバーのメニューから [設定] > [Raspberry Pi の設定] を選択します。[システム] タブの [自動ログイン] の項目を [無効] に設定して、システムを再起動してください。ログイン画面で新しいユーザーとパスワードでログインします。そして、pi ユーザーを削除します。

今後、あなただけが知っているユーザー名とパスワードで、このラズパイを操作します。

pi ユーザーを削除しましたが、実は root ユーザーがまだ残っています。root ユーザーは削除できませんので、SSHでのリモートログインができない設定にしておきます。(SSHの設定は後で行います)

#PermitRootLogin prohibited-password と書かれた行を探して、これを次のように変更します。

これで本当にあなたが作ったユーザー名でしかラズパイにログインできなくなりました。

Raspberry Pi の設定

もう一度タスクバーのメニューから [設定] > [Raspberry Pi の設定] を選択します。今度はパスワードを聞かれるかもしれません。ログイン中のユーザーのパスワードを入力してください。確認・設定すべき項目を順に説明します。

  • [システム] > [ホスト名]

ネットワーク上でサーバーを識別するための名前です。初期値は raspberrypi となっていて他のラズパイと区別ができません。分かり易い名前に変更してください。

  • [システム] > [自動ログイン]

先程、新しいユーザーを登録した時に [無効] に設定しました。起動する度にログイン操作をするのが面倒であれば [現在のユーザとしてログインする] に設定を戻してください。ただし、自分以外の人がラズパイを操作できる環境にある場合は、セキュリティの観点から [無効] にしておくほうが安全です。

  • [インターフェイス] > [SSH]

ラズパイをサーバーとして使う際には、リモートでログインしてメンテナンスできたほうが便利です。そうすればディスプレイなどの周辺機器を外した状態で運用することも可能です。[有効] に設定してください。

  • [インターフェイス] > [VNC]

VNC Viewer というソフトウエアを使うことで、Windowsのリモートデスクトップのように、ネットワーク経由でラズパイのGUI操作が出来ます。VNC機能を使うなら [有効] に設定してください。

必要な設定が終わったら [OK] ボタンを押してください。再起動が必要な場合は再起動します。

IPアドレスをつかってSSHでログインする

次のコマンドでラズパイに割り当てられたIPアドレスがわかります。ip a というコマンドでも良いのですが、表示される情報が多すぎてわかりにくいかもしれません。

例えば 192.168.11.10 のように表示されたら、それが今ラズパイが動作しているIPアドレスです。

SSHを有効にしていれば、同じネットワーク上のパソコン(同じWiFiアクセスポイントを使っているパソコン)等から、ターミナルで次のコマンドを実行してください。SSHコマンドがない場合はOpenSSHなどをインストールしてください。

ラズパイの場合は数分以上放置すると接続が切れてしまうので、-o “ServerAliveInterval 15” というオプションで15秒ごとに信号を送って接続を継続するようにしています。接続に成功したら、パソコンのターミナルがラズパイのリモートターミナルとして動作します。

ちなみに、SSHは標準では22番ポートを使いますが変更することも出来ます。/etc/ssh/sshd_config (rootユーザーのSSHログインを禁止した時のファイル)の中に #Port 22 と書かれた行があるので、コメントを外して有効にし、番号を書き換えれば、SSHに使用するポート番号が変わります。ポート番号を変更した場合は ssh コマンド実行に -p [ポート番号] というオプションが必要です。

Apache をインストール

これからサーバーの設定を作り込んでいきますが、実際に動くものがあったほうがテストしやすいので、Apache をインストールして HTTP が動作するようにします。

インストールが終わったらラズパイ標準のブラウザで http://localhost/ を参照してください。次のような画面が表示されれば Apache は正常にインストールされています。

このページのHTMLは /var/www/html/index.html です。このままでは面白くないので、元のファイルをバックアップして独自のページを作ってみましょう。このファイルは所有者が root になっているので sudo コマンドが必要です。

このファイルの内容を、何でも構わないのですが、例えば下のような HTML に差し替えてください。

ファイルを保存して、もう一度 http://localhost/ を参照すると「こんにちは!」と表示されます。

IPアドレスを使って、ラズパイの外部からアクセスすることも可能です。ラズパイが動作しているのと同じネットワーク上のパソコンのブラウザから、先程調べたIPアドレスを使って http://192.168.11.10/ のようにアクセスしてください。ラズパイ内部から行ったのと同じように、パソコン上に「こんにちは!」と表示されるはずです。

ファイヤーウォールの設定

ここまでの設定では、ラズパイはどんな通信でも通してしまう状態になっています。必要な通信だけを許可するように、ファイヤーウォールを設定します。ufw をインストールします。

SSHの22番と、HTTPの80番だけを許可します。SSHのポート番号を変更している場合はその番号に読み替えてください。

ファイヤーウォールを有効化します。

状態を確認します。

22番と80番だけが許可されていればOKです。

サーバーをインターネットに公開する

ここまでの手順で、サーバーとしての設定は一通り終わりました。閉鎖されたネットワーク環境で使うだけならこれで作業は完了です。つまり、家庭内のWiFi環境でパソコンやスマホからラズパイにアクセスするとか、会社や学校のネットワークの中でラズパイにアクセスするなら問題ありません。

しかし多くの場合、サーバーを立てたなら、それを公共のインターネットに公開したいというケースが多いでしょう。これを実現するには、家庭や会社・学校のネットワークと外部のインターネットを繋ぐゲートウエイを介して通信ができるように設定する必要があります。普通の家庭の環境ならWiFiルーターがゲートウエイの機能を兼ねているので、ルーターの設定によってSSHやHTTPの通信を開放することが可能です。例えば この記事 を参考にしてください。

学校や会社で、情報センター等の専門部署がゲートウエイを管理している場合は、その担当者に依頼することになります。が、その交渉は簡単には行かないのが世の常です。

ngrok(エングロック)

別の記事 でも紹介しましたが、ngrok はローカルで動作しているWEBアプリをインターネット上に公開するためのツールです。

ngrok | API Gateway, IoT Device Gateway, Secure Tunnels for Containers, Apps & APIs
ngrok is a secure ingress platform that enables developers to add global server load balancing, reverse proxy, firewall,...

(1)ngrokのページにアクセスしてアカウントを作り、ログインします。

(2)自分のアカウントのダッシュボードの Setup & Installation から対応OSのngrokアプリをダウンロードします。ラズパイの場合、Download for Linux(ARM) からダウンロードします。

(3)ファイルを展開したらすぐに実行できます。トークンはダッシュボードの Your Authtoken の画面からコピペします。

(4)次のコマンドでローカルサーバーを公開します。

(5)次のような内容が表示されるので、”Forwarding” に表示されたURLにアクセスできるようになります。ローカルサーバーがトンネルされて、外部インターネットからもアクセス可能です。しかも https までサポートされています。

(6)外部のインターネット(例えばスマホのモバイル通信)から上記に表示されたURLにアクセスすると「こんにちは!」と表示されます。

注意事項は以下のとおりです。

  • ngrokに登録しなくても連続8時間まで利用できます。無料プランでも登録すれば時間制限はなくなります。
  • 公開されるURL(上の例では https://xxxxxxxx.ngrok.io 等)はngrokを実行するたびに変わってしまいます。$60/年からの有料プランにするとサブドメインを指定できるようになるのでURLを固定できます。