防御ですよ

防御ですよ

試み1

指定した通信のみ許可、その他すべてを拒否
(ワールドワイドではなくなる、多くのわるい人たちは排除できる、一般の人たちは見られない)

試み2

指定した通信のみ拒否、その他すべてを許可
(世界中にいるわるい人たちから狙われる、一般の人たちは見られる)

1つ目の試みは検証を終えました。管理が楽でよいです。変なヤカラも少ない。
現在は2つ目の試みをしています。まぁログファイルが騒がしいことになっています。毎日見ています。いちいちブロック対応していては手間がかかるので自動で拒否する機能を設けて拒否しまくっています。頼もしい限りです。どんなアクセスをされているのかを解析することで勉強にもなります。流行りも分かります。

市販のセキュリティ機器は高額な本体の他に、さらに高額なライセンスを購入しなければならず、ワタクシのような収入では購入は不可能です。そこで自分の身は自分で守る必要があります。



#!/bin/bash

set -euo pipefail

# constant
URL="https://ipv4.fetus.jp/cn.nginx.txt"
DEST="/etc/nginx/deny/cn.nginx.txt"
WORKDIR="$(dirname "$DEST")"
TMPFILE="$(mktemp "${WORKDIR}/.cn.nginx.txt.tmp")"

LOGFILE="/var/log/cn-deny.log"

# If no log file exists, create one
if [ ! -f "$LOGFILE" ]; then
    touch "$LOGFILE"
    chmod 644 "$LOGFILE"
fi

# Write all output to a log file(stdout, stderr)
exec >>"$LOGFILE" 2>&1

echo "----------------------------------------"
echo "[`date '+%F %T'`] Start updating CN deny list"

# clean up temp file on exit/error
trap 'rm -f "$TMPFILE"' EXIT


# download to temp file (quiet)
if ! wget -qO "$TMPFILE" --timeout=15 --tries=2 "$URL"; then
    echo "[ERROR] Failed to download new deny list from $URL" >&2
    exit 1
fi

# update file (overwrite old)
mv -f "$TMPFILE" "$DEST"
# after mv, TMPFILE no longer exists; prevent trap from trying to remove it
trap - EXIT
echo "[INFO] Updated $DEST"

# set permission before restarting nginx
chmod 644 "$DEST"
echo "[INFO] Set permission 644 for $DEST"

# nginx settings check and apply
if /usr/sbin/nginx -t; then
    echo "[INFO] nginx config test passed"
    systemctl restart nginx
    echo "[INFO] nginx restarted successfully"
else
    echo "[ERROR] nginx config test failed, not restarting" >&2
    exit 2
fi


このシェルスクリプトは1日1回実行され、denyとするIPアドレスの一覧ファイルをサイトから取得する。古い一覧ファイルは上書きされる形になる。上書きができれば次の処理に移り、できなければ終わる。
上書きができればアクセス権を644に設定する。それをnginxに読み込ませる。といった流れになっている。各工程での実行結果をログファイルに書き込むようにしている。


実行結果:
----------------------------------------
[2025-10-25 17:45:01] Start updating CN deny list
[INFO] Updated /etc/nginx/deny/cn.nginx.txt
[INFO] Set permission 644 for /etc/nginx/deny/cn.nginx.txt
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[INFO] nginx config test passed
[INFO] nginx restarted successfully

ただ、国ごとのIPアドレス(Geoブロック)の拒否というのは効果が限定的で、VPNやプロキシ、クラウドなど利用されたアクセスは普通に届くため、多層防御の1部に過ぎない。
次の段階として、より高速に処理できるnftablesに拒否を任せるようにし、nginxのリソースを使わないようにする。