連載第33回
2014年3月30日
iptables をどうにかしたいよホントにもう(3)

 第30回のイントロで紹介したカネノナルキは今、このような状態にまでなりました。元気に成長を続けているようで嬉しい限りなのですが、しかしこのカネノナルキ、僕としてはもっと茎も太くてデカい状態にまで育てたいのだけれど、どうしても途中で何かの病気に罹ったりして枯れてしまう。でも、落ちた葉っぱから根が生えてきて再び復活…というのを3回くらい繰り返して現在に至っています。今度はしっかり大人にまで育て、花の一つでも咲かせてみたいものです。
 さて。前回は特に進展の無いまま「自分がしたい事」を列挙して終えてしまったのですが、未だ全てを正確に理解していない段階ではあるものの、とりあえず「何か打ち込んでみる」と少しずつ動き始めそうな気もします。そこで今回はiptablesの持つfilterテーブル内の「INPUT」チェインをちょっといじってみたいと思います。

影響の小さそうなものからやってみる!

 ちょっと弄ってみる、とは言ってもしかしここは「失敗するとかなりダメージを食らう」といわれる勘所のフィルター設定。ここはまず、失敗しても作業への影響が小さそうなものをチョイスしようということで、「webminの通るポートに接続しようとするパケットを許可」してみます。しかし、現状では全パケットの通過を許可してるのだから、その上にわざわざポート番号を狭義に指定する必要は無いのですが、ここはあえて許可してみて「iptables -L」を打ち込んだ時の表示の変化を見てみたいのです。では早速、次のコマンドを「su -」で昇格してから打ち込んでみます。zzzzzは第27回で任意の数値に変更したポート番号です。

iptablesを設定してみる

# iptables -A INPUT -p tcp --dport zzzzz -j ACCEPT

↑上記コマンドの、文節毎の何とな〜くの意味は次のようになるのかな?と解釈してみた↓

iptables: iptablesの、
-A INPUT: INPUTチェインに次のルールを追加(-A)します。
-p tcp: プロトコル(-p)がTCPであり、かつ
–dport zzzzz: 外部から当サーバー内のポート番号「zzzzz」に接続しようとしている(–dport)パケット。
-j ACCEPT: 以上のルールに合致したパケットを「ACCEPT(許可)」とターゲット(-j)する。

 入力したら、その状態を次の設定ファイルに保存し、iptablesを再起動。

設定&再起動

# /etc/init.d/iptables save
# /etc/init.d/iptables restart

 早速コマンドを実行し、続けて「iptables -L」を打ち込んでみると…おお、設定したルールが追加されたようです(↓)。

感動した。

 さて、上ではwebminのポート番号への接続を許可してみたのですが、この影響を受けてwebminの「ネットワーク設定」>「Linux ファイヤウォール」がどうなっているか確認しておきたい。早速webminにログインしてみると…。
 おおお、新しいルールが微妙な日本語訳で追加されているではありませんか。ただ、これを書いている時点では右端にある「移動」「追加」の使い方がよく分からない。なので、まだしばらくCoda 2から作業します。

iptablesの初期化

 お試しが巧くいったので若干気分が調子づいてきました。この勢いに乗っかっていこうと思います。さて、参考記事にはどれも「チェインをDROPするのは、全部の設定を終えた最後に行う事!」と警告しています。今のところ僕も今回のサーバーの基本ポリシーは3つのチェインどれも「DROP(破棄)」で、必要な極少数のパケットのみ「ACCEPT(接続許可)」にしようと思っているのですが、その設定作業の冒頭でうっかり全部DROPしてしまうと自分がサーバーにアクセス出来なくなってしまうのです。ああ怖い。

 というわけで引き続き、3チェインはまだ「ACCEPT」させたまま、必要な条件のパケットの許可設定を進めて行こうと思うのですが「ルールをいじる時はiptablesの設定ファイルを初期化すべし」とどの参考記事にも書いてあります。ちょうど今はwebminにログインしている状態なので、webminを使って初期化してみます。何故かそこだけ英語表記なままのリセットボタンをクリック。

 「全てのトラフィックを許可」を選択し「ファイアウォールを設定する」を押します。これでiptablesは初期化されます。ちなみに「# iptables -F」や「# /etc/init.d/iptables stop」でもリセット出来るみたいです。

さらに幾つかルールを追加してみる

 前回書き出した運用に必要な接続は上述のwebminを含めて下記になります。さらにどの参考記事にも「icmp」「ループバック(lo)」も許可しておくように書かれてあるので、素直に従っておきます。ループバックについては「OUTPUT」チェインの方でも許可するように書いてあるので、ここで追加しておきます。これでサーバからサーバ自身へのローカル接続をすべて許可することになるようです。

○http(80)
○https(443)
○ssh(yyyyy)
○MySQL(3306:デフォルト)
○webmin(zzzzz)
○domain(53:DNS接続用)

ターミナルでの打ち込み

# iptables -A INPUT -p icmp -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT

2行目:INPUTでは「-i」
3行目:OUTPUTでは「-o」

さらにコチラも打ち込む

# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# iptables -A INPUT -p tcp --dport yyyyy -j ACCEPT
# iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
# iptables -A INPUT -p tcp --dport zzzzz -j ACCEPT
# iptables -A INPUT -p tcp --dport 53 -j ACCEPT

 Coda 2での実画面はコチラ。

 設定ファイルを保存し、iptablesをrestartさせてから、webminのファイアウォールを見てみると…無事反映されていました。発信パケット(OUTPUT)の方にもループバック許可が追加されています。

 ここで改めて「iptables -L」で確認してみます。一旦ターミナルをログアウトし、再度sshでログイン出来るかチェックしてみて大丈夫だったので、次は「FORWARD」チェインの設定をしてみたいと思います。まだ「DROP」はしません。つづく。

外部サイト参考記事
Port Number(ネットワークエンジニアとして)
iptablesの設定(サーバの実験室 Redhat/Fedora)
iptablesテンプレート集 改訂版(1):スタティックなパケットフィルタリング (3/4)(@IT)

追記:ミス発見(あるいは真夜中のラブレター問題)

 昨晩、明け方近くにアップした上述の記事ですが、凡ミスを発見しました。DNSと接続する際のプロトコルはTCPではなく、UDPでした。記事を更新する直前までチェックを繰り返し、よしこれで問題ナシと思ったのだけれど、翌日起きて何となく自分が書いたばかりの記事本文をiPadで読んでいてすぐミスに気付くという、これぞまさに真夜中のラブレター状態。

 よい機会なので「ポート番号TCP53番にTCPで接続するパケットを許可」とした昨晩の設定を、「TCPではなくUDPと修正する」その作業をwebminで行う、というレポートを追記しておこうと思います。

 まず現状の「ミスしている状態」のルール設定内容を表示させてみます。INPUTチェインのリスト最下にあるのが、ミスしているルールなのですが、その設定を削除して新規で追加するのかな、と思ったのだけれど、グリーンで表示されている「許可」という文字をクリックしたら、設定内容のウィンドウが開きました。


 縮小しているのでちょっと見づらいですが、凡ミスしている時点での設定内容が分かり易く表示されています。上から順に「パケットの接続許可」「プロトコルはTCP」「ポート番号は53」という諸条件が組み合わされていて、その他の判定条件は「無視する」となっており、考慮されないようになっています。なるほど!

 これはとても管理しやすいツールだ!と思いました。つまり、間違えたルールは削除しなくても、内容を修正して保存しなおせば良いだけです。ここではTCPをUDPと入れ替えるだけ、ですね。

 設定を修正したら、保存してルールリストに戻り、ウィンドウ下部にある「設定を適用する」ボタンをクリックします。

 Coda 2のターミナルから「iptables -L」を打ち込んでみると、ちゃんと「UDP」に変更されていました(↓)。

 この「ルールの編集」ウィンドウは、下にもまだ多くの設定項目が並んでいて、今ここで全部は紹介しきれませんが、既にiptablesの扱い方を詳しく知っているのであれば、すごく便利なツールです。今回の凡ミスが無ければこの編集ウィンドウの存在にも気付かなかったワケで、とてもラッキーでした。ただ、変更が簡単に出来てしまうだけに、今の僕の付け焼き刃的な知識では迂闊にいじらない方が良いな、という感じはありますね。つづく。