システムリブートでのiptables/ipset自動復旧
停電や再起動のあと、PPPoEが自動接続されてもiptablesがデフォルトのままではセキュリティレベルが低い状態でサーバが公開されます。
そこで、リブート時にipsetによる制限などを自動復旧する内容を実装しました。
overlayfs環境などで設定復元を安定させるには工夫が必要です。
そこで、PPPoE確立後に自動でiptables/ipsetを初期化し、ブート後一度だけ外部リストをDL更新する構成を組みました。
結果として、停電やリブートが起きても、何もしなくても通信制御が完全に復元されます。
背景
PPPoEは起動時に自動接続されるよう設定済み(/etc/network/interfaces)
iptables・ipsetの設定は /mnt/data/sh/restore_iptable.sh にまとめてある
外部サイトから更新リストをDLする重い処理(update_ipset.sh)は再接続のたびに実行したくない
/etc/ppp/ip-up.d/ は overlayfsで直接編集できない
解決策の方針
/etc/ppp/ip-up.d/ にラッパースクリプトを1本だけ置く
まず軽量な restore_iptable.sh を即実行して通信ルールを復元
(restore_iptable.sh で空のipsetを作成し、iptables のチェインに組み込んでおく)
ブート後の最初の接続時だけ update_ipset.sh をバックグラウンドで走らせる
(restore_iptable.sh で作成した空のipsetの中身を更新)
/run/update_ipset_done で再実行を防止(再起動時に自動リセット)
実際のスクリプト
/etc/ppp/ip-up.d/ppp_up_wrapper
#!/bin/bash
# Run restore_iptable.sh immediately and update_ipset.sh only once after boot
FLAG_FILE="/run/update_ipset_done"
LOGFILE="/tmp/update_ipset.log"
echo "$(date '+%Y-%m-%d %H:%M:%S') [ip-up] PPPoE connected" >> "$LOGFILE"
# OverlayFSでなければ無効
if ! mount | grep -q overlay; then
echo "OverlayFS not active, skip ppp_up_wrapper" >> "$LOGFILE"
exit 0
fi
# 処理を一つの関数にまとめ、全体をバックグラウンドへ送る
run_initialization() {
# ブート後初回のみ ipset の枠と iptables を復元
if [ ! -f "$FLAG_FILE" ]; then
echo "Step 1: Running restore_iptable.sh..." >> "$LOGFILE"
bash /mnt/data/sh/restore_iptable.sh >> "$LOGFILE" 2>&1
echo "Step 2: Running update_ipset.sh..." >> "$LOGFILE"
bash /mnt/data/sh/update_ipset.sh >> "$LOGFILE" 2>&1
touch "$FLAG_FILE"
echo "All steps completed successfully." >> "$LOGFILE"
else
echo "Already executed, skipping iptables update step." >> "$LOGFILE"
fi
}
# 関数全体をバックグラウンドで実行(pppdを待たせない)
run_initialization &
動作の流れ
起動後最初の接続時
→ restore_iptable.sh 実行
→ update_ipset.sh がバックグラウンドで起動
→ /run/update_ipset_done が作成される
その後の手動再接続(poff/pon)
→ restore_iptable.sh だけ実行
→ update_ipset.sh はスキップ
再起動後
→ /run/ は揮発領域のため、再び初回接続で update_ipset.sh が実行される
補足と工夫
/mnt/data/sh/ (USBメモリー上)に実体を置くことで overlayfs 環境でも編集自由
長時間DLやipset投入処理はバックグラウンドで処理するため、PPPoE接続の遅延を防止
ログは /var/log/update_ipset.log に時系列で記録
restore_iptable.sh の中で logger を使えば syslog にも出力できる
所感
この仕組みを入れておくと、
停電でのリブートやネット障害復旧後でも 自動で完全復旧 します。
iptables/ipsetが空のままになることもなく、再接続時の不要な再DLも避けられます。
シンプルですが、PPPoE運用での安心感が大きく変わります。
「何もしなくても元通り動く」──それが一番の快適さです。