きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

RHEL6.6でWASのファイアウォール設定

正直、悪戦苦闘している。


とりあえず分かったこと。
iptablesコマンドではなく、lokkitコマンドを使うことにした。正直これでいいのか自信はない。


iptablesコマンドでは、/etc/sysconfig/system-config-firewallファイルまでは書き換わらないようだ。
そのせいでGUIで見ると反映されておらず、首を傾げてばかりいた。


WASは腐るほどポートがある。
それにサーバーが増えるとそれだけ穴を開けないといけなくなる。
困った。


仕方ない。
jythonスクリプトを書いてみる。
serverindex.xmlを舐めればいい。
注意しないといけないことは、そのホストに関するポートか、UDPか、IPv6かの最低3点は押さえておく。

ノード内の全てのサーバーの情報をマージするのは諦めた。
サーバー単位でファイルを作る。


それらのファイルを次のコマンドで組み込む。
sudo lokkit --update --custom-rules=ipv4:filter:ファイルパス
今回はIPv6は開けないつもりだ。


ファイル名は、次のようにする
ipv4_filter_addon_was_サーバー名
あとでループで回して、上記のコマンドを流すのには、前方一致しやすい名前がいい。


個々のファイルでは、まずユーザー定義チェインを作成して、最後にRETURNという構成にした。
無駄が多いが、ガチ性能を求めてないので、これでいく。


おっと、一つ盲点があった。
デバッグポートを開けてない。
7777だけ開けてあげるか。
あとは、HealthCenterの探索ポートはどこからだっけかな。
後回しにしとくー。


socket.gethostname()を使って、別ホストを弾くことができるだろう。今回は別ホストはないトポロジーなので組み込まない。


作り出すファイルには、エンドポイント名をコメントで残しておく。
サーバー名も分かり、エンドポイントも分かり、ポート番号も分かるようになる。


あと、WASをLinuxサービスにすることも試してみたが、諦めた。
プロファイル作成時にサービス登録するオプションをつけると、/etc/init.dにファイルができる。
ただし、chkconfig --addしたところで、ポート番号が分かる代物ではないように見えた。
一般的なサービスは/etc/servicesにポート番号があるからいいけど、そこは書き換わってないんだから。


jythonスクリプトでどんなことを書いていたかを日本語で書いてみる。
サーバーエントリをリストして、
その文字列を改行コードでスプリット。
個々のサーバーエントリの構成IDから、サーバー名を取り出してお取り置き。サーバー名を元にファイルオープンして、中身にユーザー定義チェインのところを書き込み。
サーバーエントリからスペシャルエンドポインツ属性を取ってくると、[]付きで返ってきてたはずなんで、先頭末尾を除外したのちにスペースでスプリット。
スペシャルエンドポイントからエンドポイント名を取ってくる。
スペシャルエンドポイントのエンドポイント属性を取ってきて、そこのポート属性からポート番号を拾う。
エンドポイント名にUDPIPV6が含まれていたら、ファイルへの書き方を変えるか、書かないようにする。
最後に-j RETURNする行を追加してクローズ。
ごめんなさい、例外処理は書いてない。

日本語で書くと酷いなw


本番環境で使える代物じゃない。
開発環境だけど、ファイアウォールをオフにしない人たち向けだ。


これ、RHEL7ではやれないだろうな。
その代わりに叩かないといけないコマンドを作成してあげるか。