防火壁日記



いちおう我が家では常時接続環境ですから、ファイアウォールの仕掛けや、ウィルス対策には気を配っている(つもり)です。まあ、とくにパケットフィルタリングはわりと一生懸命やってます。

しかし、家庭内のLANというのはちゃんとしたユーザーばかりではありません(企業でもそうか...(^^;)。つまり管理者(私ね)の思いもよらないことをやったりするので、場合によってはもっとも構築が難しいともいえるかもしれません。

私が自宅の環境でやることといったらたかが知れてます。メールの読み書き、テキスト中心のWEB閲覧、LAN整備(スクリプト書き、ログ読みetc)くらいです。まあ、ふつうのみなさんもそれくらいなんでしょうが(あ、オレはね、クラッキングとか....とか言うヒトは出てって(笑))、意外な注文が出てくるもんです。たとえば利用するサービスがさっき書いたようなものだけならば、外からやってくるパケットの識別は容易です。80(web),110(pop),25(smtp),53(DNS)とかのポートに対応して穴をを空けとけばいいのです。しかし、SSLとか使ってたり、こっちの身元を要求したりするサイトもあります。まあ、それはいいでしょう。それらは「よく知られた」番号を使用することがほとんどですので、必要とあらばファイアウォールに穴をあけて待ち構えることができます。しかし、それ以外のでかい番号のポートを使ったりされることもあります(調べれば番号はわかるが...)。ストリーミングとかがそうです。また、不定(!)のでかい番号を使われることだってあります。FTPのパッシブモードとかです。困ったことにこのパッシブモードは多くのユーザーが使いたがるIEのFTPクライアントの標準モードです(変更はできない)。お仕事環境なら「よい子はストリーミングなんか必要ありません!」とか「Windows なんか使ってると金の亡者の思うツボだ!」とかいってゴマカせるでしょうけど、嫁さんには頭の上がらないヒトが多いことでしょう。

とか何とかいちいち対応してると、構築当時は

「よっしゃぁー、完璧だぜー!」

とか言ってたファイアウォールも穴だらけ、何で空いてんのか忘れてしまったような穴もちらほら...。

ここでは、そのファイアウォール設定の苦闘の過程を書いていこうかなと思ってるのですね。



■基本的なこと■

◎クライアント的にみたFTP
「パッシブモード」という言葉がよく聞かれます。その前にFTPのごくごく簡単な説明。
通常のFTPではサーバー側は20, 21の2つのポートを使います。で、パッシブモードとは何なのかとゆーと、サーバー側では21ともう一つは20でなくて、でかい番号(1024以上で不定・・・※1、向こうが決めて通知してくる)の番号を使うのです。不定の番号を相手のサーバーに使われるとこちらのファイアウォールでは困ります。可能性のあるポートを全部空けとく(一般的なクライアントスタイルのものはデフォルトではIPマスカレードだけしてこうなってるでしょう)、というのは豪快な技ですが、あまり安全ではありませんね、できればフェイルセーフの手法をとりたいものです。しかし、パッシブモードを使うのに簡単な方法は私にはこれしか見当たりません。私はあっさりとあきらめて、パッシブモードをオフにして・・・※2 lynxのFTPクライアントとかncftpやらを使用しております。

ちなみに、はじめにも触れましたが、IE組み込みのFTPクライアントはパッシブモードでしか使用できません。ですので、ユーザーにはその道は諦めてもらいます。

※passive モードを無効にするのに必要な設定メモ
* ncftp では ~/.ncftp/firewall において passive=off にします。
* ncftpput ncftpget では -E をつけて実行します。

あと、ごく基本ですけど、ルーターでは ip_masc_ftp.o モジュールを使用します。


◎身元を要求してくるページ
Linux では auth と呼ばれているものです。クライアントに対してサーバーから要求してくるようです。クライアントのポート 113 番を使うので、この場合はここに穴を空けとかないといけません。ipchains においては

ipchains -A input ! -y --destination-port 113 -j ACCEPT

とかなんとか。とはいっても、identd は動いてなくてもいいのかもしれません(私、動かしてませんが困ったことありません、でも、もしかするとそういったページをみていないだけかもしれません)。通信が滞らなければいいのではないでしょうか。でも、動かしとけよ!と主張しているヒトもいます。動かすんだったら output も ACCEPT してね。(追記)動かさないんだったら REJECT でいいのかな(不確)?


◎SSLを使用するページ
WEB でセキュアに情報をやり取りするのにSSLが使われる場面は多いです。ショッピング、プロバイダの会員情報とか.....。サーバーはポート 443 番を使用しているようですので、空けておきましょう。

ipchains -A output --destination-port 443 -j ACCEPT
ipchains -A input --source-port 443 -j ACCEPT
ipchains -A forward --source-port 443 -j MASQ

とかですね。


※注意
ipchains の例はあくまで簡単な例です。ipchains については豊富なドキュメントがありますのでそちらを参考にしてください。例では input, output などの組み込みチェインしか使ってませんが、実際には自分で定義していくとわかりやすく、しかも細かい設定が出来ますので挑戦してみてください。


■追記■

久々に見直してみました。現在のシステムで考えると「あり?」みたいな記述もありますが、それはそれです(笑)。

さて、いまだに悩んでいるのは FTP です。やはりパッシブモードが使えないのはツライ所なのですね。パッシブオフにできる FTP クライアントを使えば云々、というのは前にも書きましたが、パッケージを取ってくるコマンドとかはそういったオプションがないモノもあるため、いちいちローカルに取ってきてからコマンド打ち直しなんてことになって、コマンドの便利さがなくなってしまいます。少し整理してみます。


ipchains -A input -i ppp0 ! -y --source-port 21

のように21番ポート発の SYN 以外のパケットは通しているとして(output, forward も同様に)、


★パッシブモード利用不可だが、とりあえず FTP クライアントが使えるようにするには、まずは境界で

ipchains -A input -i ppp0 --source-port 20

のようなのが必要。で、あとはフォワードの設定とか。これはクラッカーからすればパケット発信元を20に偽装すれば SYN パケットでも(ここが大事)ここは通過できるということに注意。サービスのないポートへの内向き接続は落とす、というのが世間一般の一つの考え方なので、あまりいい気持ちはしない。


★パッシブモード利用可にするには

デカイポート番号同士のコネクションを許す。これもまずは境界で

ipchains -A input -i ppp0 ! -y --sorce-port 1024:65535 --destination-port 1024:65535 -j ACCEPT

とかいう風になるんでしょう(デカイ番号には X プロトコルとかで使うのも入ってるので、ホントはそれを除いた方が望ましいが、話を簡単にするため省略)。トロイの木馬などアングラ系のサーバークライアントツールはこの範囲で通信するものがほとんどなので(たいそう立派な某データベースも使ったりするが)、それらに対して無防備となる。まあ、そういったものが仕掛けられなければよい話だが.....。

どっちがセキュアかという議論は「好みの問題」「環境の問題」でしょう。重要なのはその穴をふさぐ次の手です。ユーザー教育が行き届いていたり、自分しかユーザーがいなかったり、というなら後者もよいと思う(そうとは思えない企業の多くが後者を採用しているのは?という話もある)。私の場合20番ポート発内向きパケットに対してはスニッファ等で特別の監視をしているから、問題はないし。何が起こっているかを完全に把握したいならこれもなかなか、と思っている。私の場合、とにかくなんでもかんでもできるだけ正確にログっておきたいので(趣味)、何の通信が行われてるかはっきりしないのは困るのです。

妥協案としてよく使うFTPサイトだけ許可、というのもあるでしょうが、いまいちすっきりしない。なかなかいい手が見つかりません。皆さんはどう考えているのでしょう?

(2002/3/15 追記)お、お、お、おー、こんな古い記述を見つけてしまった。こんなん iptables + connection tracking でとっくに解決してるです!



トップページ