さて、実際にファイアウォールスクリプトを走らせてみたのですが、一つだけ困った問題が発生していました。
メインスクリプトからIPアドレスリスト(cidr.txt)をダウンロードする外部関数を呼び出しているのですが、この外部関数を呼び出したところでエラーが発生してしまうのです。
そのエラーは、cidr.txt.gzが無いためgunzip cidr.txt.gzが実行できない、というもの。
つまり、cidr.txt.gzのダウンロードに失敗しているのです。
いくつか原因が考えられたので、一つずつ潰してみることに。
wgetコマンドでダウンロードを行うように記述していますが、そもそもwgetコマンドがインストールされていない可能性。
→インストールされていることを確認。
コマンドの記述が間違っている可能性。
→仮想端末で実際に叩いてみてコマンド記述にミスがないことを確認。
パスが通っていない可能性。
→フルパスで記述しても状況がかわらないことを確認。
iptablesで止められているかもしれない可能性。
→仮想端末でダウンロードできることを確認。
・・・打つ手なしです・・・orz
なお、手動でダウンロードしたcidr.txt.gzを配置してスクリプトを走らせると、問題なく終了することが分かりました。
また、wgetだけを行うスクリプトにして実行して見たところ、これも問題なくダウンロードできることを確認しました。
ということは、やっぱり外部関数で行っているwgetでのダウンロードの際だけに問題が発生している(スクリプトそのものや外部関数それ自体に問題があるのではない)ということがはっきりしました。
そもそも、仮想端末でwgetが通っているのですから、iptablesで遮断されているとも思えない・・・と考えたその時。
デフォルトポリシーではOUTPUTはすべてACCEPTしているのだからwgetは問題ない・・・けれども、wgetでこちらに持ってくるときはどうなんだ??
で、よくよくスクリプトを確認すると、iptablesのデフォルトポリシーをリセットした直後に先の関数(とユーザチェイン定義)を行っていました。
で、デフォルトポリシーはINPUTはすべてDROPさせるものでした。
なるほど、そりゃ確かにwgetできないわけだ。
なお、スクリプトを走らせたあとであれば、仮想端末からwgetできたのは、スクリプトが走り終わったあとならば、ステートフルパケットを許可するようにしていたから。
そう、つまり、デフォルトポリシーを設定した後に、ステートフルパケットを穴をまず開けて、それから関数を実行させなければならなかったのです。
これに気づくまでに3~4日かかってしまった・・・orz
よくよくみれば、参考にさせてもらっているBLOGで公開されているスクリプトだって、関数定義の前にステートフルパケットを通す穴を開けているじゃありませんか・・・。
きちんと確認してから実験しないと、ダメですなぁ・・・。反省!