食堂にモバイルオーダーシステムの構築を考えている先生がいて、レンタルサーバ上での運用を検討していたのですが、校内ポリシーの関係で学校内でのサーバー設置を考えているようで実際運用する際の設計を考えてみました。
前提条件
- フレッツ光を契約
- 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内に設置します。
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サーバー両方でファイアウォールを設定します。
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 * * * * *
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)の例:
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分ごとに実行:
Copy*/5 * * * * /path/to/monitor_nginx_logs.sh
- 定期的なバックアップの実施
重要なデータと設定ファイルを定期的にバックアップします。
バックアップスクリプト(backup_system.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時に実行:
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の活用、リバースプロキシの導入により、セキュリティを強化しながらも、追加コストを最小限に抑えることが可能です。
また定期的なログ監視やバックアップなど、運用面での対策も忘れずに実施することで、より安全で安定したシステム運用を実現できます。
ただしそれなりの経験と技術・知識が無いと運用は難しいなとも思います。
何より頭の中では動いていても実際に設定すると、これがうまくいかないんですよね。
私はエンジニアではありませんので、本職の方々を本当に尊敬します!