iptablesの最近のブログ記事

RH-Firewall-1-INPUTにkrfilter

|

こちらを参考にしました。
krfilter - deny accesses from .kr

"KRFILTER"というChainをつくり、
# iptables -N KRFILTER
そのルールに当てはまると、"KRFILTERD"というChainを適用するしくみです。
# iptables -N KRFILTERED
# iptables -A KRFILTER -s xxx.xxx.xxx.xxx/xx -j KRFILTERED
それで、"KRFILTERD"は"Drop"とか"REJECT"とか、 ログをとってRejectするように作ったChainである"LOG_REJECT"を適用させます。
# iptables -A KRFILTERED -j LOG_REJECT
で、この"KRFILTER"を"RH-Firewall-1-INPUT"のここらへんに足しておけば良いでしょう。 ○/etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -j KRFILTER
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptablesのログをsyslogに出力させる

|
■AcceptのChainをつくる
# iptables -N LOG_ACCEPT
# iptables -A LOG_ACCEPT -j LOG --log-prefix "accepted " --log-level 3
# iptables -A LOG_ACCEPT -j ACCEPT
■RejectのChainをつくる
# iptables -N LOG_REJECT
# iptables -A LOG_REJECT -j LOG --log-prefix "rejected " --log-level 3
# iptables -A LOG_REJECT -j REJECT --reject-with icmp-host-prohibited
■フィルタのChainに適用させる
-A RH -p tcp -m state --state NEW -m tcp --dport 80 -j LOG_ACCEPT
-A RH -p tcp -m state --state NEW -m tcp --dport 443 -j LOG_ACCEPT
-A RH -j LOG_REJECT


■ログはfacility "kern"に出力される。
--log-levelは最近のものだと文字列でも指定できる。

○/etc/syslog.confに以下の行を足し、syslogdを再起動する
# iptables
kern.warning  /var/log/iptables

○/etc/logrotate.d/syslogの1行目に、/var/log/iptablesを足す。

TCPのフィルタ

|

■-m tcp (-p tcp との併用)

--sport
--source-port [!] port[:port] ともかける

--dport --destination-port [!] port[:port] ともかける

--tcp-flags [!] mask comp 指定できるフラグは SYN ACK FIN RST URG PSH ALL NONE。 ', '区切りで羅列できる。 例: # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN SYN フラグが設定され ACK, FIN, RST フラグが設定されていないパケットにのみマッチする。

--syn このようなパケットは TCP 接続の開始要求に使われる。 これは --tcp-flags SYN,RST,ACK SYN と等しい。

[!] --syn "--syn" の前に "!" フラグを置くと、 SYN ビットがクリアされ ACK と RST ビットが設定されているTCP パケッ トにのみマッチする。

--tcp-option [!] number TCP オプションが設定されている場合にマッチする。

--mss value[:value] 指定された MSS 値 (の範囲) を持つTCPのSYN または SYN/ACK パケットにマッチする。

ステートフルなパケットフィルタ

|
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 23 -j ACCEPT
-m [モジュール] であり、
"state"や"tcp"はモジュールである

■-m state

--state [STATE名]で指定する

INVALID: このパケットは既知の接続と関係 していない。

ESTABLISHED: このパケットは、過去双方向にパケットがやり取りされた接続に属するパケット

NEW: 新しい接続を開始したか、 双方向にはパケットがやり取りされていない接続に属するパケット

RELATED: このパケットが新しい接続を開始しているが、 FTP データ転送やICMP エラーのように、既存の接続に関係している。

iptablesの設定の行番号を出力させる

|
# iptables -L -n --line-number
いつもこれをうつのが面倒な場合、 /root/.bashrcなどに
alias iptables-config='iptables -L -n --line-number'
と書いてしまう。

Chainの名前を変更する

|
# iptables -E RH-Firewall-1-INPUT RH
# iptable-save > /etc/sysconfig/iptables

iptableのルールを削除、復旧させる

|

■Chainがまるごと吹っ飛んでしまった場合。

# iptables -F RH-Firewall-1-INPUT
-Fオプションは"Flush Chain"であり、チェイン内のルールをすべて吹っ飛ばす設定です。

# iptables -L -n --line-number
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0

Chain OUTPUT (policy ACCEPT) num target prot opt source destination

Chain RH-Firewall-1-INPUT (2 references) num target prot opt source destination

でも、大丈夫。
# iptables-restore
の出番です。
# iptables-restore < iptables
# iptables -L RH-Firewall-1-INPUT -n --line-number
Chain RH-Firewall-1-INPUT (2 references)
num  target     prot opt source   destination
1    ACCEPT     all  --  0.0.0.0/0  0.0.0.0/0
2    ACCEPT     all  --  0.0.0.0/0  0.0.0.0/0
3    ACCEPT     icmp --  0.0.0.0/0 0.0.0.0/0 icmp type 255
4    ACCEPT     esp  --  0.0.0.0/0 0.0.0.0/0
5    ACCEPT     ah   --  0.0.0.0/0  0.0.0.0/0
6    ACCEPT     udp  --  0.0.0.0/0  224.0.0.251 udp dpt:5353
7    ACCEPT     udp  --  0.0.0.0/0  0.0.0.0/0   udp dpt:631
8    ACCEPT     all  --  0.0.0.0/0   0.0.0.0/0  state RELATED,ESTABLISHED
9    ACCEPT     tcp  --  0.0.0.0/0  0.0.0.0/0   state NEW tcp dpt:53
10   ACCEPT     tcp  --  0.0.0.0/0  0.0.0.0/0   state NEW tcp dpt:22
11   ACCEPT     tcp  --  0.0.0.0/0  0.0.0.0/0   state NEW tcp dpt:25
12   ACCEPT     tcp  --  0.0.0.0/0  0.0.0.0/0   state NEW tcp dpt:80
13   ACCEPT     tcp  --  0.0.0.0/0  0.0.0.0/0   state NEW tcp dpt:443
14   REJECT     all  --  0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
■ルールを一本間違えて消してしまった場合。 ※ルールを一本だけ消すには、-Dオプションを使います。
# iptables -D RH-Firewall-1-INPUT 12
これも
# iptables-restore < /etc/sysconfig/iptables
で元通りです。

iptableのルールを追加する

|
■まずは設定を見る。
# iptables -L RH-Firewall-1-INPUT -n --line-number
Chain RH-Firewall-1-INPUT (2 references)
num  target     prot opt source    destination
1    ACCEPT     all  --  0.0.0.0/0 0.0.0.0/0
2    ACCEPT     all  --  0.0.0.0/0 0.0.0.0/0
3    ACCEPT     icmp --  0.0.0.0/0 0.0.0.0/0 icmp type 255
4    ACCEPT     esp  --  0.0.0.0/0 0.0.0.0/0
5    ACCEPT     ah   --  0.0.0.0/0 0.0.0.0/0
6    ACCEPT     udp  --  0.0.0.0/0 224.0.0.251         udp dpt:5353
7    ACCEPT     udp  --  0.0.0.0/0 0.0.0.0/0 udp dpt:631
8    ACCEPT     all  --  0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
9    ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:53
10   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
11   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25
12   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
13   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
14   REJECT     all  --  0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
■RH-Firewall-1-INPUTの9と10の間にUDP53はACCEPTとしてやりたい。
# iptables -I RH-Firewall-1-INPUT 9 -p udp --dport 53 -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
※ちなみに順番を無視して設定を後ろに追加するなら、-Iオプションでな、-Aオプションでよいです。
# iptables -A RH-Firewall-1-INPUT -p udp ...
 しかしRH-Firewall-1-INPUTでは一番最後の行はall Rejectになっているので、途中の行に足さなければなりません。 ※また、すでにある行を編集するには、
# iptables -R RH-Firewall-1-INPUT 9 ...
とします。 そして、また設定をみてみよう。
# iptables -L RH-Firewall-1-INPUT -n --line-number
Chain RH-Firewall-1-INPUT (2 references)
num  target     prot opt source    destination
1    ACCEPT     all  --  0.0.0.0/0 0.0.0.0/0
2    ACCEPT     all  --  0.0.0.0/0 0.0.0.0/0
3    ACCEPT     icmp --  0.0.0.0/0 0.0.0.0/0 icmp type 255
4    ACCEPT     esp  --  0.0.0.0/0 0.0.0.0/0
5    ACCEPT     ah   --  0.0.0.0/0 0.0.0.0/0
6    ACCEPT     udp  --  0.0.0.0/0 224.0.0.251         udp dpt:5353
7    ACCEPT     udp  --  0.0.0.0/0 0.0.0.0/0 udp dpt:631
8    ACCEPT     all  --  0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
9    ACCEPT     udp  --  0.0.0.0/0 0.0.0.0/0 udp dpt:53
10   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:53
11   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
12   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25
13   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
14   ACCEPT     tcp  --  0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
15   REJECT     all  --  0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
しかし、設定ファイルのほうはまだ反映されていない。
# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -i eth0 -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
■設定ファイルに保存する。
# iptables-save > /etc/sysconfig/iptables
となります。

iptablesのChainとTarget

|

■"Chain"とはルールをグループ化したものです。

■最初から組み込んであるChain
INPUT・・・interfaceから、ローカルプロセスにパケットが流れるときに適用される
OUTPUT・・・ローカルプロセスから、interfaceにパケットが流れるときに適用される
FORWARD・・・interfaceから、パケットを転送するときに適用される
の3種類があります。
そのほか、IPマスカレードに使う"POSTROUTING"があります。

■ユーザー定義でもChainは作れます。 RedHat系のOSの場合、インストールのときにファイアウォールを構成すると、 RH-Firewall-1-INPUT というChainが作られます。 そして、組み込みのINPUTとFORWARDのChainに、TargetとしてRH-Firewall-1-INPUTを適用しています。 そのほかに自分でchainを新しく作るには
# iptables -N mychain
とします。


■"Target"とはルールにマッチしたときのファイアウォールの動作です。
基本的にはACCEPTとREJECT(か、DROP)を使います。

ACCEPT   パケットを通過させる
DROP   パケットを破棄し、相手にはなにも返答しない
REJECT  パケットを破棄し、相手にはICMPを使って破棄したことを通知する
REDIRECT port   パケットを指定したポートにリダイレクトする
RETURN  チェイン内のルール評価を終了させる
そのほか、POSTROUTINGチェインで使う、"SNAT"や"MASQUERADE"があります。


■RH-Firewall-1-INPUTがある場合
RH-Firewall-1-INPUTがある場合は、
あまりINPUT、OUTPUT、FORWARDに手を加えると混乱の元になるので、

・デフォルトの設定を活用して、Chain"RH-Firewall-1-INPUT"にルールを足し引きする
 CUIの# setupコマンドからはいる「ファイアウォールの設定」から設定すると自然とこうなります。

# iptables -F RH-Firewall-1-INPUT
# iptables -X RH-Firewall-1-INPUT
とやって、RH-Firewall-1-INPUTを削除してから新しいチェインやルールを足していく

という方針がいいでしょう。

iptablesの設定を確認する

|
# iptables -L -n --line-numbers
を使います。 -nオプションをつけると名前解決せずにアドレスで表示します。 --line-numbersオプションをつけると、ルール番号を表示してくれます。

# iptables -L -n --line-numbers
# INPUTのChain
# interfaceからローカルプロセスにパケットが流れるときに適用される
Chain INPUT (policy ACCEPT)
num  target            prot opt source  destination
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0 0.0.0.0/0

# ForwardのChain # interfaceから渡されたパケットを転送するときに適用されます Chain FORWARD (policy ACCEPT) num target prot opt source  destination 1 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0

# OUTPUTのChain # ローカルプロセスからinterfaceにパケットを送信するときに適用されます。 # 下記の場合、とくに何も設定されていません。 Chain OUTPUT (policy ACCEPT) num target prot opt source destination

# Chain RH-Firewall-1-INPUT # RedHatが最初にこしらえてくれるChain # 名前"RH-Firewall-1-INPUT"のとおり、 # INPUT時に適用することを想定してあります。 # 一通り、サービスを提供するためのACCEPTを設定したあと、 # 一番最後の行の"REJECT"で、それ以外を撥ねてます。 Chain RH-Firewall-1-INPUT (2 references) num target prot opt source  destination 1 ACCEPT all -- 0.0.0.0/0  0.0.0.0/0 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255 3 ACCEPT esp -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT ah -- 0.0.0.0/0 0.0.0.0/0 5 ACCEPT udp -- 0.0.0.0/0 224.0.0.251 udp dpt:5353 6 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:631 7 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 8 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 9 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 10 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:21 11 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25 12 REJECT all -- 0.0.0.0/0 0.0.0.0/0  reject-with icmp-host-prohibited

■設定ファイルで確認したい場合。 RedHatの場合は ○/etc/sysconfig/iptables   ルールやチェインの設定が書かれている ○/etc/sysconfig/iptables-config   なんかよくわからない大人の設定が書いてある。
IPTABLES_MODULES=""
IPTABLES_MODULES_UNLOAD="yes"
IPTABLES_SAVE_ON_STOP="no"
IPTABLES_SAVE_ON_RESTART="no"
IPTABLES_SAVE_COUNTER="no"
IPTABLES_STATUS_NUMERIC="yes"

○Debianの場合はさらにたちが悪い。 まず、なにもない。

# iptables -L -n
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

○しょうがないから起動スクリプトを作った。

# cd /usr/share/doc/iptables/examples/
# zcat oldinitdscript.gz > /etc/init.d/iptables
# cd /etc/init.d
# chmod 755 iptables
# update-rc.d iptables defaults
 Adding system startup for /etc/init.d/iptables ...
   /etc/rc0.d/K20iptables -> ../init.d/iptables
   /etc/rc1.d/K20iptables -> ../init.d/iptables
   /etc/rc6.d/K20iptables -> ../init.d/iptables
   /etc/rc2.d/S20iptables -> ../init.d/iptables
   /etc/rc3.d/S20iptables -> ../init.d/iptables
   /etc/rc4.d/S20iptables -> ../init.d/iptables
   /etc/rc5.d/S20iptables -> ../init.d/iptables
# /etc/init.d/iptables start
Aborting iptables load: unknown ruleset, "active".

/etc/init.d/iptables options: start|restart|reload|force-reload load the "active" ruleset save save the current ruleset load load a ruleset stop load the "inactive" ruleset clear remove all rules and user-defined chains, set default policy to ACCEPT halt remove all rules and user-defined chains, set default policy to DROP

Saved ruleset locations: /var/lib/iptables/ and /var/lib/ip6tables/

Please read: /etc/init.d/iptables

どうやら設定ファイルは/var/lib/iptables/の中にあるらしい。 しかし、そんなとこにはなにもなかった。 しょうがないので、自分でiptablesというディレクトリを作って、iptablesというファイルをおいた。 中身はRedHatの丸写しだ。
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -i eth0 -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
のだが、動かなかった。 (以下、続く)

(続き)
というのは、上記の方法でdebianの/etc/init.d/iptablesをつくると、
/var/lib/iptables/にあるactiveとinactiveのファイルしかよみこまなくなる。

そこで、まずはこのデフォルトの何も書いていない奴を

# iptables -L -n
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

inactiveに登録しよう。

最初にまずは/var/lib/iptables/active と inactive をtouchコマンドでつくっておく
# cd /var/lib/iptables
# touch active
# touch inactive
そしたら現在のルールをinactiveに登録する
# /etc/init.d/iptables save inactive

avtiveのほうには、RedHatなどで動いている生きのいいフィルターを
そのままactiveに書き写して、手直しすればよいだろう。

そして、
# /etc/init.d/iptables start
# /etc/init.d/iptables stop
が正しく動作するようになる。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちiptablesカテゴリに属しているものが含まれています。

前のカテゴリはIPSecです。

次のカテゴリは暗号技術です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

iptables: 月別アーカイブ

Powered by Movable Type 4.1