校内独自ネットワークにモバイルオーダーシステムを導入する際のネットワーク設計

食堂にモバイルオーダーシステムの構築を考えている先生がいて、レンタルサーバ上での運用を検討していたのですが、校内ポリシーの関係で学校内でのサーバー設置を考えているようで実際運用する際の設計を考えてみました。

## 前提条件

- フレッツ光を契約
- YAMAHAのRTX1200ルーターを使用
- 校内に多数のAPを設置済み
- 個人情報は扱わない
- 追加の機器設置は不可（予算的に）
- Next.jsとCloudflareを使用したモバイルオーダーシステムを導入予定

## ネットワーク設計のポイント

### 1. VLANによるセグメンテーション

既存のネットワークを活用しつつ、モバイルオーダーシステム用のトラフィックを分離するためにVLANを使用します。

- VLAN ID 20をモバイルオーダーシステム用に設定
- VLAN ID 10は既存のネットワーク

### 2. DMZの設定

YAMAHAのRTX1200にDMZ機能があるため、これを活用してモバイルオーダーシステムのサーバーを配置します。

- DMZにLinuxサーバーを配置（例：192.168.30.10）
- 外部からのアクセスは特定のポート（HTTP/HTTPS）のみ許可
- DMZから内部ネットワークへの直接アクセスを制限（VLAN10も安全）

### 3. リバースプロキシの導入

追加コストを抑えつつセキュリティを強化するため、NginxをリバースプロキシとしてDMZ内に設置します。

```nginx
server {
    listen 80;
    server_name hogehoge.com;

    location / {
        proxy_pass http://192.168.30.10:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```
リバースプロキシはNginxでもApache2でもいいけれど、個人的にはNginxの方が高性能で新しいからNginxがいいかな。
設定は
hogehoge.comへのリクエストを192.168.30.10:3000に転送してくれる。
セキュリティは勿論上がります。



### 4. セキュリティ強化

- Cloudflareを利用したSSL/TLS設定
Cloudflareを使用することで、追加のSSL証明書を購入せずにHTTPS通信を実現できます。
Cloudflareにドメインを追加
ネームサーバーをCloudflareのものに変更
Cloudflareダッシュボードで「SSL/TLS」設定を「Flexible」または「Full」に設定
ページルールを作成し、常時HTTPS化を強制:
URL: http://hogehoge.com/*
設定: Always Use HTTPS

- ファイアウォールの最適化（不要なポートを閉じる）
YAMAHAのRTX1200ルーターとLinuxサーバー両方でファイアウォールを設定します。
```RTX1200の設定例:
ip filter 1 reject 192.168.0.0/16 * * * *
ip filter 2 reject * 192.168.0.0/16 * * *
ip filter 3 pass * 192.168.30.20 tcp * 80 in
ip filter 4 pass * 192.168.30.20 tcp * 443 in
ip filter 5 pass 192.168.30.20 * tcp * * out
ip filter 100 reject * * * * *
```
```Linuxサーバー（UFW使用時）の設定例:
bashCopysudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow from 192.168.30.20 to any port 3000
sudo ufw enable
```
- Nginxのアクセスログとエラーログの定期監視
ログ監視を自動化するために、簡単なシェルスクリプトを作成し、crontabで定期実行します。
監視スクリプト（monitor_nginx_logs.sh）の例:

```monitor.sh
bashCopy#!/bin/bash

LOG_DIR="/var/log/nginx"
ALERT_EMAIL="admin@yourdomain.com"

# アクセスログの監視（例：5分間に100回以上のアクセスがあった場合にアラート）
ACCESS_COUNT=$(tail -n 1000 ${LOG_DIR}/access.log | wc -l)
if [ $ACCESS_COUNT -gt 100 ]; then
    echo "警告: 直近5分間に${ACCESS_COUNT}回のアクセスがありました。" | mail -s "Nginx高負荷アラート" $ALERT_EMAIL
fi
# エラーログの監視（例：エラーが発生した場合にアラート）
ERROR_COUNT=$(grep -c "error" ${LOG_DIR}/error.log)
if [ $ERROR_COUNT -gt 0 ]; then
    echo "警告: Nginxエラーログに${ERROR_COUNT}件のエラーが検出されました。" | mail -s "Nginxエラーアラート" $ALERT_EMAIL
fi
```
crontabに以下を追加して5分ごとに実行:
```cron.sh
Copy*/5 * * * * /path/to/monitor_nginx_logs.sh
```
- 定期的なバックアップの実施
重要なデータと設定ファイルを定期的にバックアップします。
バックアップスクリプト（backup_system.sh）の例:
```backup.sh
!/bin/bash

BACKUP_DIR="/path/to/backups"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/backup_${DATE}.tar.gz"

# Nginxの設定ファイルをバックアップ
tar -czf $BACKUP_FILE /etc/nginx

# アプリケーションのデータをバックアップ（例：Next.jsアプリ）
tar -rf $BACKUP_FILE /path/to/nextjs/app

# データベースのバックアップ（例：PostgreSQL）
pg_dump -U username -d database_name | gzip >> $BACKUP_FILE

# 古いバックアップの削除（30日以上前のものを削除）
find $BACKUP_DIR -type f -name "backup_*" -mtime +30 -delete
```

crontabに以下を追加して毎日深夜3時に実行:
```cron.sh
Copy0 3 * * * /path/to/backup_system.sh
```

## ネットワークトポロジー

```
フレッツ光
     |
[ RTX1200 ルーター ]
     |
[ VLAN 10: 教職員用 ]
     |
[ VLAN 20: 食堂用 ]
     |
[ DMZ: モバイルオーダーシステム用 ]
     |
[ Nginxリバースプロキシ - 192.168.30.20 ]
     |
[ Linuxサーバ (Next.js) - 192.168.30.10 ]
```

## まとめ

この設計により、既存のネットワークインフラを活用しつつ、セキュアなモバイルオーダーシステムを構築することが出来そうです。
VLANによるセグメンテーション、DMZの活用、リバースプロキシの導入により、セキュリティを強化しながらも、追加コストを最小限に抑えることが可能です。

また定期的なログ監視やバックアップなど、運用面での対策も忘れずに実施することで、より安全で安定したシステム運用を実現できます。

ただしそれなりの経験と技術・知識が無いと運用は難しいなとも思います。
何より頭の中では動いていても実際に設定すると、これがうまくいかないんですよね。

私はエンジニアではありませんので、本職の方々を本当に尊敬します！