システムリブートでの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運用での安心感が大きく変わります。
「何もしなくても元通り動く」──それが一番の快適さです。