システムリブートでのiptables/ipset自動復旧

停電や再起動のあと、PPPoEが自動接続されてもiptablesがデフォルトのままではセキュリティレベルが低い状態でサーバが公開されます。

そこで、リブート時にipsetによる制限などを自動復旧する内容を実装しました。

overlayfs環境などで設定復元を安定させるには工夫が必要です。

そこで、PPPoE確立後に自動でiptables/ipsetを初期化し、ブート後一度だけ外部リストをDL更新する構成を組みました。
結果として、停電やリブートが起きても、何もしなくても通信制御が完全に復元されます。

?? 背景

PPPoEは起動時に自動接続されるよう設定済み(/etc/network/interfaces)

iptables・ipsetの設定は /mnt/data/sh/restore_japan_only.sh にまとめてある

外部サイトから更新リストをDLする重い処理(update_ipset.sh)は再接続のたびに実行したくない

/etc/ppp/ip-up.d/ は overlayfsで直接編集できない

解決策の方針

/etc/ppp/ip-up.d/ にラッパースクリプトを1本だけ置く

まず軽量な restore_japan_only.sh を即実行して通信ルールを復元

ブート後の最初の接続時だけ update_ipset.sh をバックグラウンドで走らせる

/run/update_ipset_done で再実行を防止(再起動時に自動リセット)

実際のスクリプト

/etc/ppp/ip-up.d/99boot_update_ipset

#!/bin/bash

Run restore_japan_only.sh immediately and update_ipset.sh only once after boot

FLAG_FILE="/run/update_ipset_done"
LOGFILE="/var/log/update_ipset.log"

echo “$(date ‘+%Y-%m-%d %H:%M:%S’) [ip-up] PPPoE connected” » “$LOGFILE”

軽量な初期化スクリプト(iptables/ipsetの空構築)

echo “Running restore_japan_only.sh…” » “$LOGFILE”
bash /mnt/data/sh/restore_japan_only.sh » “$LOGFILE” 2>&1

ブート後初回のみ、ipset更新処理をバックグラウンドで実行

if [ ! -f “$FLAG_FILE” ]; then
echo “First PPPoE connection detected ? running update_ipset.sh…” » “$LOGFILE”
/mnt/data/sh/update_ipset.sh » “$LOGFILE” 2>&1 &
touch “$FLAG_FILE”
else
echo “update_ipset.sh already executed, skipping.” » “$LOGFILE”
fi

? 動作の流れ

起動後最初の接続時
→ restore_japan_only.sh 実行
→ update_ipset.sh がバックグラウンドで起動
→ /run/update_ipset_done が作成される

その後の手動再接続(poff/pon)
→ restore_japan_only.sh だけ実行
→ update_ipset.sh はスキップ

再起動後
→ /run/ は揮発領域のため、再び初回接続で update_ipset.sh が実行される

補足と工夫

/mnt/data/sh/ (USBメモリー上)に実体を置くことで overlayfs 環境でも編集自由

長時間DLやipset投入処理はバックグラウンドで処理するため、PPPoE接続の遅延を防止

ログは /var/log/update_ipset.log に時系列で記録

restore_japan_only.sh の中で logger を使えば syslog にも出力できる

所感

この仕組みを入れておくと、
停電でのリブートやネット障害復旧後でも 自動で完全復旧 します。
iptables/ipsetが空のままになることもなく、再接続時の不要な再DLも避けられます。

シンプルですが、PPPoE運用での安心感が大きく変わります。
「何もしなくても元通り動く」──それが一番の快適さです。