理解してしまえば小ネタですが幾分動揺した事件でしたので共有します。
iptablesの設定を永続化する iptables-persistent/netfilter-persistent
- Ubuntuでiptablesの設定をiptables-persistentで永続化する
- 【Debian 8 Jessie】iptablesの設定をこれだけはやっておく
- Ubuntuでiptablesを再起動後にも保持する方法
- Where does netfilter-persistent save the iptables rules?
パッケージを入れておけば良いというだけのお話、に見えます。
というわけで、パッケージを入れて/etc/iptables/rules.v4などに設定を保存させておけばOK……と思いきや
「さくら」でだけ再起動時にiptablesの設定が初期化される挙動に遭遇!
systemdのログとか見る限りnetfilter-persistentはちゃんと起動しているのに、なぜかiptablesのフィルタリング設定がインストール時のもの(ssh22番だけ開いている状態)に戻ってしまうのです。
https等が空いていなかったり、あるいはsshのポートをずらすと再起動後VPSコンソールからいちいちreloadかまさないといけなくて辛い、という事態に繋がりました。
発生した環境はさくらのVPSの2GくらいでUbuntu 16.04 LTSのさくら純正のもの。他の環境(クラウド、ベアメタル)では見たことがないのでさくら-specificと推測されました。
※ そもそもは「設定が消える」と認識してパニくってました。ただ、22番ポートが明示的に開くという初期設定はiptablesではしないはずなので、そこから「これは……さくらspecificな問題なのでは」と予想しなおすに至ったのです。
/etc/iptables/iptables.rules
良く見なおしますと、 netfilter-persistent の /etc/iptables/rules.v4
等はもちろんあるわけですが、同時に同じフォルダに /etc/iptables/iptables.rules
というファイルもあり
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
と、記述されていました。ふむふむ。確かにさくらのUbuntu環境ってインストール時のiptablesのフィルタリング設定は「こう」ですよね。としますと、この設定が netfilter-persistent の類よりあとに読み込まれている可能性が疑われます。
ただ、journalctl等で見たりする限り、そういうことをやってそうなサービスはないのでした。ネットで調べても関連する症状に悩まされる方はパット見ではいません。
そこで、ふと上記のファイル名を書き換えて再起動してみましたところ、……syslogに出てまいりました!!
Dec 6 17:14:31 dev sh[531]: /etc/network/if-pre-up.d/iptables: 2: /etc/network/if-pre-up.d/iptables: cannot open /etc/iptables/iptables.rules: No such file
そしてiptablesの設定はnetfilter-persistentのものがキープされ、とりあえずはホッと一息です。
/etc/network/if-pre-up.d/iptables !
#!/bin/sh
iptables-restore < /etc/iptables/iptables.rules
exit 0
ちゃちゃっとEC2のUbuntu 16.04 LTSインスタンスでこのあたりを見たところ、たしかに /etc/network/if-pre-up.d/ 下に独自のスクリプトを入れる、というのは今でもやられているようです。EC2環境下ではiptablesはいじってないのでこの現象は発生しなそうでしたが、他のスクリプトはありました(本件と無関係なので中身は確認してません)。
軽く考えられるところとしては、さくらの側でセキュリティ強化を目的に /etc/iptables/iptables.rules
と /etc/network/if-pre-up.d/iptables
を独自に設置するようにカスタマイズしたものの、それが運悪くnetfilter-persistentパッケージの動作とは反りが合わない、という状況ではないかな、といったところ。
問い合わせてみた
憶測だけで結論を出すのも不適切なので、以上を問い合わせてみたところどうやらその通り、という回答でした。ワークアラウンドとして
# iptables-save > /etc/iptables/iptables.rules
してくださいとのことです。うーん?
/etc/network/if-pre-up.d/iptables 消すとあとで何かまずいことがあるのかしら……
Ubuntuの標準パッケージと衝突する独自設定が埋め込まれている、というのはあんまり筋がよくなさそうではあるので将来的には直してくれるのではないかな、と思いますが、とりあえず現状では本件は認知しておかないと「ハマる」感じがしますね。ごく基本的なところだけに、ハマったときの「あるぇー(・ε・)」感は結構な感じでした。
まとめ
さくらのVPS(クラウドも含む可能性があります)のUbuntu 16.04 LTS環境では、2017-12-07現在、netfilter-persistentパッケージをインストールした状態でも設定が上書きされてiptablesのフィルタリング設定が元に戻ってしまう可能性があるようです。
もしそのような状況に気づいたらとりあえず上記に書かれている通り /etc/network/if-pre-up.d/iptables
等に関連するスクリプトがないかを確認してみてください。そして、さくら環境下では /etc/iptables/iptables.rules もちゃんと見てあげてください。