raspberry piでお手軽自家サーバー webサーバー編

ラズベリーパイでサーバー運用はすでに多くの方がやられていて今更感がありますが、現行の環境で今までラズパイやサーバーを触ってこなかった人が、勉強を兼ねてお手軽にラズパイサーバーを立ち上げるにはどうするのがベストかまとめてみました。

自家サーバーなのでこの記事ではインターネット側からのHTTPやSSHによる接続を可能にすることを目指します。



# ラズベリーパイをセットアップする

ラズパイ、サーバー初心者の人がいきなり自家サーバーを立ち上げる体で話を進めます。もうわかっているという人はここは読み飛ばしてください。

今回検証用に使用したのはraspberry pi 3 B+ですが、すでに同じ手順でraspberry pi 4 Bでもサーバー化できます。

本体：Raspberry Pi 3 B+
イメージ書き込みツール：Raspberry Pi Imager v1.2

[追記]Raspberry Pi 3 B+でspring+mysqlの構成でかなり小さいwebアプリを運用していますが、レスポンスが遅いと苦情が来ています。500NBのメモリーでは複数のアプリケーションを同時に立ち上げるのはやっぱり役不足です（Dockerなどはもってのほか）。今からラズパイを買ってwebサーバー(アプリケーションサーバー)を構築しようとしている人はraspberry pi 4 Bの8GBのやつを購入することをお勧めします。

## 起動メディアを作成

ラズパイを使うにあたって、まずやることはsdカードにラズパイ上で使用するOSの情報を書き込んで起動メディアを作成することです。普通のPCは内臓のHDDかSSDからブートしますが、ラズパイは外部で起動メディアを作成してsdカードスロット差し込むことでOSを起動させます。

公式からイメージ書き込みツールがリリースされたようなので使ってみます。OSはraspbianの他にubuntuとラズパイをメディアセンター化するLibreELECが選択可能で、あらかじめisoファイルをダウンロードしておく必要はありませんでした。

https://www.raspberrypi.org/downloads/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635454/a07ac46f-a6fa-497c-07e4-586145eb1a39.png)


インストールを完了させると次のような画面が、OSとインストールメディアを選択しWRITEから起動メディアを作成できます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635454/e0427ed9-f5f0-4e44-1555-6ae838479c8c.png)

## 初期設定をしてネットワークに接続

インストールが完了したら、初期設定を行います。

初期設定は記録を取り忘れてたんですが、特段つまずくところはないと思います。インターネットにつなげるところまでやってください。

「Welcome to Raspberry Pi」という画面が表示されたら「NEXT」を押して、

Country:(JP)Japan
Language:Japanese
Timezone:Tokyo

入力したら「NEXT」。

次のChange PasswordはデフォルトのPiというユーザーのパスワードを”raspberry”変更するかどうか聞かれるのですが、Piはすぐに消去するので設定しなくても大丈夫です。

「Select WiFiNetwork」でサーバーを運用したいルーターのSSIDを選択します。

「Enter WiFi Password」でパスワードを入力します。

初期設定でネットにつなげなくても、画面の右上にあるアイコンからネットワークにつなげることができます。このほかにもアップデートしろとかいろいろ言われるかもしれませんが、この後でもできるので適当で大丈夫です。


![スクリーンショット (39).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635454/4c9c7bb9-e231-a300-bfdb-ac7b6b951291.png)

## アップデートを実行

ラズパイのセットアップの仕上げとしてターミナルから以下のコマンドを実行してください。


### 最新のパッケージをインストール
```
& sudo apt-get update
& sudo apt-get upgrade
```

### OSのアップデート
```
$ sudo apt-get dist-upgrade
```

### ラズベリーパイのファームウェアのアップデート
```
$ sudo rpi-update
```

再起動したらとりあえずセットアップは終了です。


# セキュリティ対策

ここからはサーバーとしてラズベリーパイを公開する前に行う設定を主にやっていきます。

## rootのパスワード設定とデフォルトユーザーpiの削除※重要度大

[追記]デフォルトユーザーのpiは2022年4月から廃止されたようです。それ以降に購入したラズパイを使用する場合はデフォルトユーザーの削除は不要です。

いろいろやってますが、ラズパイのサーバー運用で一番大切なのがこの部分です（他はおまけです）。

新品のラズパイで最初から存在するユーザーはrootとデフォルトユーザーのpiになります。

初期パスワードも全機種共通ですし、パスワードが変更されていてもユーザー名は知られているので、不正にログインする側からするとラズベリーパイはパスワードだけあてればログインできるってことになります（自分の知る限りでラズパイが乗っ取られたって話はだいたいpiを削除していなかったのが原因でした）。

### まずrootのパスワードを設定

```
$ sudo passwd root
```

新しいパスワードを要求されるので打ち込んでください（次回以降suを使う際はそのパスワードを使用）。

### 新規ユーザー作成後デフォルトユーザーpiを削除
これからメインで使っていくユーザーを作成します。

```
$ sudo adduser [ユーザー名]
```
コマンドを打つと新しいパスワードが要求されるのでパスワードを設定します。その後、いろいろ言われますが空白でいいと思います。

sudo権限を与えて新規ユーザーの作成は終了

```
$ sudo gpasswd -a [ユーザー名] sudo
```

あとは、新しいユーザーでログインしてpiを削除します。「メニュー」（ラズベリーのマーク）→「設定」→「raspberry piの設定」→「現在のユーザーとしてログインする」のチェックを外してから再起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635454/61130fed-b3c9-24a6-2e6e-e9109bd50d9d.png)

新しいユーザーにログインした後

```
$ sudo userdel -r pi
```

ユーザーpiを削除します。

#ファイヤーウォール(ufw)のインストールとポートの設定

WANから許可するportはとりあえずufwを導入していらないものは閉じてしまいましょう（必要になったら随時開ければいいんです）。

今回空けるポートはSSH:22とHTTP:80だけです。尚、SSHも一般的なポートではないポートを使ったほうが安全ですが、ルーター側でポート変換を行うので大丈夫かと・・・（正直わかってないです）。

ufwのインストール

```
$ sudo apt-get install ufw
```

22番と80番の解放

```
$ sudo ufw allow 22
$ sudo ufw allow 80
$ sudo ufw reload
```

ファイヤーウォールの有効化

```
$ sudo ufw enable
```

確認

```
$ sudo ufw status
```

22と80だけ空いてればOKです。

### SSHの設定

さっきデフォルトユーザーのpiを削除しました。でももう一つユーザー名が分かってしまっているrootの対策をしていないです。
rootは削除できないので、設定ファイルのsshd_configからsshのrootでのログインを禁止します。

```
$ sudo mousepad /etc/ssh/sshd_config
```

mousepadのところは使いたいエディターにしてくださいnanoでもviでもいいです。mousepadならguiで編集できます。

中段（15行目くらいだった）に```#PermitRootLogin prohibit-password```とあるので#を取ってprohibit-passwordをnoに変更してください。
これでrootでログインできなくなります。一般ユーザーからログインした後にsuやsudoを使うことはできます。

```
# Authentication:

#LoginGraceTime 2m
PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
# MaxSessions 10
```

ちなみに、同じファイルの```#Port 22```という記述を#を取って数字を変えれば任意のポートに設定できます。



### SSHを許可する

これでセキュリティー対策は終了したのでSSHを有効にして、とりあえずLAN内から操作可能にします。

「メニュー」→「設定」→「Raspberry Piの設定」→「インターフェース」→「SSH」を有効にして再起動します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635454/6a79ec04-36f5-3b32-cc6f-3a0200a39e09.png)

```$  ip a```コマンドでLAN内のipアドレスを調べます。わかりにくいんですが有線の人はeth0の後のinetに続くアドレスを、無線の人はwlan0の後に来るアドレスをメモってください。```inet 192.168.11.6/24```

LAN内の他のPC、WindowsでmacでもなんでもいいんでSSHを打ちます。

```
$ ssh [ユーザー名]@[ipアドレス] -o "ServerAliveInterval 15"
```

さっきポートを変えた方は```-p [ポート番号]```というオプションを追加します。ServerAliveIntervalを設定している理由はラズパイのデフォルト設定だと数分放置すると接続が解除されるために15秒おきに信号を送るようにしています。

※ServerAliveIntervalオプションが使えないという報告を受けましたが`-o`以降はなくても接続はできます（ただ、ちょっとトイレに行ってるだけで接続が切れるので不便です）。

WindowsでSSHが使えなかった人はOpenSSHをインストールしてください。

パスワードを入力してログイン出来たらとりあえずLAN内ではOKです。次は外部から接続できるようにします。

# ルーターの設定により外部からのアクセスをraspberry piにルーティングする

いよいよ大詰めです。

ここからはルーターの設定をいじります。メーカーによって設定方法が違うので自分のルーターにあったやり方でお願いします。

通常家庭用のルーターは外から来た通信は全部弾きますが、特定のポートを解放することで外部から家のLAN内にアクセスすることができます。

それって大丈夫なの？って不安になりますよね。いままでのめんどくさい設定はそのためのものでした。

## HTMLとSSHのためにポートを二つ解放する


```
$ route
```

によってゲートウェイ（ルーター）のipアドレスを表示させます。結果のゲートウェイの下に表示されているアドレスがそれです。

ラズパイでなくてもいいので同じネットワーク内のPCからブラウザにルーターのipを入力してルーターの設定画面を表示します。

ユーザー名とパスワードを要求されると思いますが、おそらくユーザー名はroot（かadmin）です。パスワードはバッファローだと空白とかpasswordなんですけど他のメーカーは知りません。

ここにメーカー別の初期パスワードがまとめられています。https://0017.org/1491.html#toc3


ここからもメーカー、機種によって違うのですがポート開放の設定を行います。わからない場合は「ポート開放＋ルーター品番」で検索してください。



WAN側のポートはTCPポートで80（HTTP）と任意のポート（SSH）でそれぞれ設定します。ラズベリーパイ側のSSHのポートを変更した方はそのポートをお願いします。

写真はちょっと古めのバッファロールータの画面で適当なポート（34567）からラズパイ（LAN内のプライベートIP192.168.11.3）の22ポートにSSHのために変換するように設定しています。

### 設定項目

|項目|記入事項|
|---|---|
|インターネット(WAN)側のアドレス|デフォルトのまま|
|インターネット(WAN)側のポート|49152~65535の任意の番号|
|プロトコル|TCP|
|返還後のLAN側のアドレス|ラズベリーパイのipアドレス|
|返還後のLAN側のポート|22（変更したらその番号）|

ブラウザでHTTPプロトコルで通信する場合は80番ポート(HTTPSなら443)を使います。LAN外(80)→ラズパイip(80)という風に設定して下さい。※2021 1月　追記分

HTTPSで通信する場合は証明書の登録をする必要があります。


|項目|記入事項|
|---|--|
|インターネット(WAN)側のアドレス|デフォルトのまま|
|インターネット(WAN)側のポート|80|
|プロトコル|TCP|
|返還後のLAN側のアドレス|ラズベリーパイのipアドレス|
|返還後のLAN側のポート|80|


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635454/b6e7475e-b084-d2f9-85ac-ec6689647f9d.png)


任意のポートは余っている49152~65535を使うといいみたいです（例が間違ってる笑）。こうすることによって適当なポートへのアクセスがラズパイの22番ポートに行ってそれ以外は弾かれます。攻撃する人は65536個のポートの中から正しいポートを選ばなきゃいけないのですが、時間を書ければどれが開いているのかわるそうです。まぁ時間稼ぎですね。

HTTPの80番はブラウザからのアクセスはみんな80番って決まているので80→80というふうに設定してください。HTTPはSSHよりは安全なので大丈夫かと。

### SSHが通るか確認

外部のネットワーク（WAN側）からSSHが通るか試します。

そのためにまず今あなたの部屋のグローバルipが何なのか調べましょう。

確認する方法はいろいろありますが、

```
$ curl inet-ip.info
```

で確認できます。

そしあと、ラズパイとは別のPCをラズパイのあるLANとは別のネットワークに接続させてSSHでラズパイに接続します。家の中で別のネットワークに接続するってどうすんの？ってなると思うんですけど、僕はスマホのモバイル回線にテザリングしてやってます。どうしても、今LAN外からアクセスできないんだがって人はスマホのSSHクライアントになるアプリをインストールしてやってもいいかもです。後はVPNに接続するとか？

```
$ ssh -p [上で決めたポート番号] [ラズパイのアカウント名]@[グローバルip] -o "ServerAliveInterval 15"
```
アカウントのパスワードを打つと、```Are you sure you want to continue connecting (yes/no)?```と聞かれますがyesでOKです。

```
$ [アカウント名]@raspberrypi:~ $
```

と表示されたらとりあえず外部からアクセス可能になりました。お疲れ様です。

ラズパイサーバーを使って何をしたいのかによりますが、SSHでログイン出来れば最低限サーバーに必要機能は入ったと思います（そのあとのことはSSHでログインして追加すればいいんで）。



### Apacheをインストールしてwebサーバー化

仕上げとして、Apacheをインストールしてwebサーバーとして使ってみます。

### apache2のインストール

```
$ sudo apt-get install apache2
```

この後にラズパイ内のブラウザでhttp://localhost/を見てください。

次のような画面が表示されたらインストールは完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635454/57361caf-ac07-73af-f580-c2901fc685c6.png)

このページのhtmlファイルは/var/www/html/にあります。せっかくなので変更してみましょう。

```bash
$ sudo mousepad /var/www/html/index.html
```

で中身を開いて、中身を適当に書き換えてださい（下みたいに適当に・・・）。

```html
<!DOCTYPE html>
<html>
<head>
<title>ラズパイサーバーテストページ</title>
<meta charset="utf-8">
</head>
<body>
<h1>[あなたが今一番言いたいことを書いてください]</h1>
</body>
</html>
```

LAN外のネットワークに切り替えて```http://[グローバルip]```をブラウザで表示してみると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635454/7b9467a9-89b9-5c4f-d9be-f5b8bf0f9614.png)


僕の今の気持ちが表示されました。

LAN内、つまりラズパイが接続してあるルーターに接続している場合はグローバルipからラズパイ上で公開しているサイトは見れないので注意してください（その場合はプライベートip:192.168.xxx.xxxから見れます）。スマホのテザリング使えば簡単に外部からアクセスすることが可能です。

自分の家のグローバルipが分からないという人は、[こちらのサイト](https://www.cman.jp/network/support/go_access.cgi)で簡単に調べられます。

以上でraspberry piのサーバー化は終了です。

ただのwebサーバーですがwebサーバーで借りたら毎月1000円以上かかるということを考えるとなかなかすごいことだと思いませんか？そうでもないですか・・・。

これは完全にあなたが所有しているサーバーですので今後何しても大丈夫です。webサーバーらしくwordpressでブログを運営してもいいですし、webアプリケーションを運用してもいいかもしれません。←今はまってます！

あとはラズベリーパイにはi/o出力があるのでIoT的なことをやってもいいかもですね。

せっかくだからドメインと紐づけて、セキュリティも強化したいという人のためにDDNSサーバーにグローバルipを紐づけて、ルーターを２重に設置することでLANを切り分ける方法も今後書きたいと思います（書きました）。

[自宅のLANを切り分けて、DDNSでドメインを自家サーバーに紐づける](https://qiita.com/picker/items/cd0510c31498ad6c1e4b)