Palm84 某所の日記

死のうは一定、しのびクマには何しよぞ...

IPTABLESの設定に挑戦(というほどのものではないけど...汗)。

※環境は、Vine Linux 3.2 でした。

【5/5参考リンク追記】

本格的に設定するなら下記ページが参考になりそう

【5/4追記】IPTABLES って何?

脳内老化が顕著化している私には(要するにアホってことですねw)難しすぎますけど、なんか面白いです。まぁ、普段は「パケット・フィルタリング」なんて言葉を簡単に使ってますけど、実際の構造はかくも複雑なものであったのだ!ということで。(何

ぶりかまさんの俺でも解るIPTABLESがかなりわかりやすいです。

  • iptables
    • filter テーブル
      • INPUT チェイン(入力)
      • OUTPUT チェイン(出力)
      • FORWARD チェイン(転送?)
    • nat テーブル
      • PREROUTING チェイン(送信時に変換)
      • POSTROUTING チェイン(受信時を変換)
      • OUTPUT チェイン(出力)

もう一つmangleという特殊なパケット変換に使われるテーブルがあるのですが難しくて理解できません(汗汗)。ヘッダ(内のフィールド)を書き換えたりするみたいです。

クライアント機として使う(ルーターとして使わない)場合は、filterテーブルのINPUTチェインとOUTPUTチェインのみが関係するということですね。換言すると、この2点はローカルへのパケットに適用する設定であると。

デフォルトのチェイン以外に新しいチェインを作り、-j new_chain として処理(ターゲット)を指定することも可能。

え?と、FORWARDがよくわかりません。NAT(ルーターとして)を使う場合には設定が必須となるようです。最終的な宛先が自分自身ではない場合に、natテーブルに処理を送るってことでしょうか?う?ん、きちんと理解するには下記のチュートリアルを頭に叩き込む必要がありそうです。

確認

# iptables -L 設定リスト表示
# iptables -L -v 詳細リスト表示
# iptables -F ルールのクリア
  • 起動設定確認 - $ chkconfig --list iptables
  • 状態確認 - # service iptables status
  • 設定の保存 - # /etc/init.d/iptables save
  • サービス再起動 - # service iptables restart

初期設定ではすべてACCEPT(通過)となっています。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

まず、INPUT(受信)をすべてDROP(破棄)にして確認しつつ設定することにしました。FORWARDはルーターとして使う場合の設定なんだそうですので、これもDROP(破棄)にします。OUTPUT(送信)は設定しません。(許可のまま)

基本設定

# iptables -P INPUT DROP
# iptables -P FORWARD DROP
-P デフォルトのポリシーを設定

一旦ここで設定を保存してサービスを再起動させます。設定を保存しないと再起動時に初期設定に戻されてしまいますので。

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

確認してみます。PINGに応答しません。外部からSamba(SMB)共有への接続がブロックされます。送信は許可されてますが、応答パケットが破棄されるのでWEBも繋がりません。

  • [1]ローカルループバックアダプタ(lo)を通るものを許可
# iptables -A INPUT -i lo -j ACCEPT
-A,--append ルールを追加
-i,--in-interface 受信インターフェイスを指定※
-j,--jump 処理を指定

※(この設定は-i loのみでいいですけど)NIC(LANアダプタとか)が複数ある場合は、-i eth0とか指定できますね。(OUTPUTなら-o eth0とか)

  • [2]応答パケットを許可
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

設定を保存してサービスを再起動。

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

いわゆるoutbound(の応答)を許可する設定ですね。

-m または --matchについて。複数の条件からマッチしたらってことかな?

iptables は拡張されたパケットマッチングモジュールを使うことができる。 これらのモジュールは 2 種類の方法でロードされる: モジュールは、 -p または --protocol で暗黙のうちに指定されるか、 -m または --match の後にモジュール名を続けて指定される。 これらのモジュールの後ろには、モジュールに応じて 他のいろいろなコマンドラインオプションを指定することができる。 複数の拡張マッチングモジュールを一行で指定することができる。 また、モジュールに特有のヘルプを表示させるためには、 モジュールを指定した後で -h または --help を指定すればよい。

--stateについては・・・

--state state
state は、マッチングを行うための、コンマで区切られた接続状態のリストである。 指定可能な state は以下の通り。 INVALID: このパケットは既知の接続と関係していない。 ESTABLISHED: このパケットは、過去双方向にパケットがやり取りされた接続に属するパケットである。 NEW: このパケットが新しい接続を開始したか、 双方向にはパケットがやり取りされていない接続に属するパケットである。 RELATED: このパケットが新しい接続を開始しているが、 FTP データ転送や ICMP エラーのように、既存の接続に関係している。

ESTABLISHEDは既に接続済み(outbound)、RELATEDはアクティブモードでのFTPとか?(20/tcpへのinbound)、ICMPエラーのUDPパケットとかのことかな?

ここでまた設定保存して再起動。IPアドレス直打ちならWEBは繋がりますが、ドメインでは繋がりません。DNSサーバからの応答パケット(DNSリゾルバ)を許可しないといけないですね。もう一度確認したら繋がりました...すみません。

ここまでで、いわゆるoutboundを許可、inboundはすべて遮断という簡易的ファイアウォール設定ができたことになりますね。別機からのPING(Echo Request)も破棄されます。送信はOKでした。

共有とICMP

このマシンはLAN内で使ってますのでSamba(SMB)共有とICMPを許可設定します。

# iptables -A INPUT -p icmp -j ACCEPT
# iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 445 -j ACCEPT
# iptables -A INPUT -s 192.168.0.0/24 -p udp --dport 445 -j ACCEPT
# iptables -A INPUT -s 192.168.0.0/24 -p udp --dport 137 -j ACCEPT
# iptables -A INPUT -s 192.168.0.0/24 -p udp --dport 138 -j ACCEPT
# iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 139 -j ACCEPT
-p, --protocol プロトコル
-s, --source 送信元(ホスト名/IPアドレス/ネットワークアドレス)
dport,--destination-ports 宛先ポート

【追記】すみません・・・名前解決(ホスト名での接続)とブラウジング(一覧表示)には以下2点も必要な筈ですね。(滝汗

# iptables -A INPUT -s 192.168.0.0/24 -p udp --sport 137 -j ACCEPT
# iptables -A INPUT -s 192.168.0.0/24 -p udp --sport 138 -j ACCEPT

設定を保存してサービスを再起動。

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

ログを記録

LAN内では要らない気もしますが、やっぱりログを記録したいのでFantasic Nightscapeさんのiptablesのページを参考に、というかそのままですが以下を追加で設定しました。

# iptables -A INPUT -j LOG --log-prefix "Bad packet: "

設定を保存してサービスを再起動。

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

ポートスキャンをかけてみるとこんなログが記録されます。

# cat /var/log/messages
---抜粋---
Apr 30 16:37:12 localhost kernel: Bad packet: IN=eth0 OUT= MAC=<--省略--> SRC=192.168.0.2 DST=192.168.0.3 LEN=48 TOS=0x00 PREC=0x00 TTL=128 ID=60731 DF PROTO=TCP SPT=2026 DPT=325 WINDOW=29200 RES=0x00 SYN URGP=0
------

全くの基本だけですけど、とりあえず終了です。

# iptables -L -v
Chain INPUT (policy DROP 573 packets, 55522 bytes)
 pkts bytes target     prot opt in     out     source               destination
  132  6792 ACCEPT     all  --  lo     any     anywhere             anywhere
 1788 1605K ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  any    any     192.168.0.0/24       anywhere            tcp dpt:microsoft-ds
    0     0 ACCEPT     udp  --  any    any     192.168.0.0/24       anywhere            udp dpt:microsoft-ds
    5   426 ACCEPT     udp  --  any    any     192.168.0.0/24       anywhere            udp dpt:netbios-ns
    9  2004 ACCEPT     udp  --  any    any     192.168.0.0/24       anywhere            udp dpt:netbios-dgm
    0     0 ACCEPT     tcp  --  any    any     192.168.0.0/24       anywhere            tcp dpt:netbios-ssn
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere
    0     0 LOG        all  --  any    any     anywhere             anywhere            LOG level warning prefix `Bad packet: '

/etc/sysconfig/iptablesに初期設定も含めたすべての設定が保存されるようです。