- 1. 概要
- 2. 構想
- 3. スクリプト
- 4. 再起動
- 5. 参考サイト
1. 概要
以前、メールサーバへ「spam」メールの送信アクセスが、大量にありまして・・・。
国外のアドレスをのきなみ拒否していたのですが、大量にあるため、コンフィグレーションファイルの行数がとんでもないことになりまして、運用方法を変えた経緯があります。
ですが、このテーブルを使えば、内部のアドレス定義はともかく、コンフィグレーションファイルでは、1行に対して、1テーブルですませることができますので、それをやってみようと思います。
2. 構想
テーブルを「11」「12」と作成しまして。
「11」に、「smtp」で接続させてもよいアドレス、「12」に「smtp」接続を拒否するアドレスを記述します。
その上で、コンフィグレーションファイルに(前後は省略しますが)。
add 10011 allow tcp from table(11) to me smtp,smtps
add 10012 deny log tcp from table(12) to me smtp,smtps
てな感じで記述するつもりであります。
準備として、テーブルだけ作成しておきますか。
「root」ユーザ権限で。
ipfw table 11 create
ipfw table 12 create
3. スクリプト
許可アドレス、拒否アドレスをいちいち手動で追加したり、削除するのは、身が持ちません。
11.txt
12.txt
てなテキストファイルを作成しておいて、それぞれ。
157.7.106.0/24
158.198.0.0/15
158.200.0.0/13
158.208.0.0/13
103.23.152.0/22
139.59.0.0/16
157.12.0.0/15
と「CIDR」形式で、許可/拒否「IP」アドレスを記述しておきます。
下記でシェルスクリプトを作成します。
vi update_tables.sh
下記を記述します。
#!/bin/sh
# スクリプトが置かれているディレクトリを取得
DIR=$(cd "$(dirname "$0")"; pwd)
FILE11="${DIR}/11.txt"
FILE12="${DIR}/12.txt"
# 更新処理を関数化してスッキリさせます
update_table() {
local table_num=$1
local file_path=$2
if [ -f "$file_path" ]; then
echo "Updating table(${table_num}) from ${file_path}..."
ipfw table ${table_num} flush >/dev/null 2>&1 || true
while read -r line; do
case "$line" in
""|"#"*) continue ;;
# エラー出力を捨て、異常な終了コードを無視する
*) ipfw table ${table_num} add $line >/dev/null 2>&1 || true ;;
esac
done < "$file_path"
# 最後に何件登録されたかだけ表示して安心感を出します
echo "Successfully updated table(${table_num}). Current count: $(ipfw table ${table_num} list | wc -l)"
else
echo "Warning: ${file_path} not found."
fi
}
# 実行
update_table 11 "$FILE11"
update_table 12 "$FILE12"
echo "All updates finished."
スクリプトに実行権限を与えて。
chmod +x update_tables.sh
「11.txt」「12.txt」とスクリプトを同じディレクトリに配置して、そのディレクトリで。
./update_tables.sh
することで、テーブルへのアドレス追加を行います。
4. 再起動
「ipfw」のコンフィグレーションファイルの更新は終わっているものとして。
再起動して、設定を反映させます。
service ipfw restart
今後は、許可/拒否のアドレスの増減ごとに、「11.txt」「12.txt」を更新して。
スクリプトを実行、「ipfw」を再起動することで、設定を反映できます。
5. 参考サイト
本ページは、「Gemini」伍長を参考にさせていただきました。
|
|