iptables setup


Fedora Core 5 になってから、「セキュリティレベルの設定」に信頼できるデバイスとマスカレードの設定がなくなってしまって、戸惑ってしまった人も多かったでしょう。 便利だったのにね。

ということで、その設定をしましょう。

その前に、これ以降「セキュリティレベルの設定」をするとせっかく設定したものが消されてしまうので、セキュリティレベルの設定を固めてしまい、以後は「セキュリティレベルの設定」は使わないようにしましょう。

まず、いつものごとく/etc/sysctl.conf ファイルの net.ipv4.ip_forward = 0 net.ipv4.ip_forward = 1 に変更します。 次にroot

iptables -I INPUT -i eth1 -j ACCEPT
iptables -I FORWARD -i eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables


eth1
Lan側の、eth0Wan側のアダプタです。

20061112



Fedora Core4 になってまったく簡単になりました。 インストール時にファイヤーウォールを使う設定にしておき、デスクトップ→システム設定→セキュリティレベルを選択すると、セキュリティレベルの設定が出てくるので外部からのアクセスをしたいものにチェックを入れ、足りなければ他のポート:(1029:tcp)のところに imap:tcp, pop3:tcp と追加します。 さらにルータとして使用しているなら、内部LANのデバイス(私の場合は eth1)の信頼できるにチェックを入れれば内部のファイヤーウォールはなくなります。 さらにマスカレードにチェックを入れて OK とします。 忘れてはいけないのが /etc/sysctl.conf ファイルの net.ipv4.ip_forward = 0 net.ipv4.ip_forward = 1 に変更することです。 ここまで自動でやってくれればいいのにね。

ついでですが、SELinux はしばらくは無効にしておいた方がいいみたいです。 いろいろと悪さをしてくれます。

2005628



Red Hat 7.2 及び 7.3 でもインストール時にファイアーウォールの設定を選択することができ、基本的な設定はされますが、残念ながらこの設定は ipchains を使っており、せっかくインストールされている iptables は使われていません。 さらに、Masquerade の設定がされていないため、自分で設定をする必要がありますが ipchains の勉強をしなければなりません。 インストール時に ethernet カードが2枚検出されたりモデムと ethernet があったときには、Masquerade の設定までしてくれれば何も触らなくてもいいのでありがたいところなのですが。 どうせ自分で設定するなら、iptables を使って設定しましょう。 ということで、iptables manual を読んだり、web をいろいろ探してみたのですが、最初の説明から外部インターネットとLANがどうのこうのとか、いきなり大規模なオフィスのファイアーウォールの構築から説明されていたりで、どうもいまいちピンとこなくて設定ができないでいましたが、ある日ひとつの事実に気が付きそれで目からうろこが落ちたように理解できました。 そこを説明しながら設定していきましょう。

Fedora はデフォルトでiptables を使っていますが、まだ自分の思う通りには自動設定はできないですね。

基本的に iptables の説明では、外部インターネットとかLANの設定とかは最初は一切関係ありません。 そこを理解しないと私のように外部インターネットにつながっているところが INPUT でLAN側が OUTPUT とかわけのわからない理解につながってしまいます。 忘れてしまいましょう。 肝心なことは iptables を走らせるマシンが中心にあるということです。 このマシンには、いろいろなインターフェイスがついています。 例えば localloopback loeth0eth1ppp0 などがあります。 これらのインターフェイスから入ってきてこのマシンにアクセスするのを制御するのが INPUT チェーンです。 その逆にこのマシンからそれぞれのインターフェイスに行くパケットを制御するのが OUTPUT チェーンになります。 それ以外の eth0 から eth1 とか、lo から eth1 とかのように各インターフェイス間のパケットのやり取りを制御するのが FORWARD チェーンということになります。 あとは、そのインターフェイスが何につながっているかによってその制御を変えていけばいいということになります。 では、実際に設定してみましょう。

まず、動いている ipchains を止めましょう。 コントロールパネルのサービス設定で ipchains についているチェックを外し、iptables にチェックがついていることを確認して save したら、マシンをリブートします。 ルートでログインして

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

と返ってくれば、iptables は動いています。 デフォルトの状態では全てのパケットが ACCEPT されるようになっています。

ここで、eth0 に外部インターネットが、eth1 にLANがつながっているものとします。 最初に全ての入力パケットが捨てられる設定にします。

iptables -P INPUT DROP
iptables -P FORWARD DROP



これで、どこからもパケットは入ってこれません。 自分自身からのパケットのみが出力可となります。 ファイアーウォールとしては完璧ですが、これではまったく通信ができませんのでLAN側からの入力と localloopback からの入力は無条件に通すようにします。

iptables -A INPUT -i eth1 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT



さらに、必要であれば ping に応答するようにします。

iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j ACCEPT



これで、LAN側からこのマシンに対しての FTP SSH はできるようになっているはずです。 次に、eth0 の外部からのアクセスに対しての許可の設定をします。 INPUT チェーンと FORWARD チェーンの両方に同じ設定を書いてもいいのですが、同じ事を2度書くのはいやですし、何よりもメンテがしにくくなりますのでプログラムで言うサブルーチンと同じ働きをするユーザーチェーンを作ってそこに処理を書いていきます。

iptables -N eth-in



外部からのアクセスを許可するポートを設定します。

iptables -A eth-in -p tcp --dport ssh -j ACCEPT
iptables -A eth-in -p tcp --dport www -j ACCEPT



これで ssh www のアクセスが可能になります。 その他にも通したいポートがあれば追加します。 次に、その他のパケットでもこちらから発信したものに対する返信であれば通すようにします。

iptables -A eth-in -m state --state ESTABLISHED,RELATED -j ACCEPT



これで基本的なルールは設定できたので、このユーザチェーンに接続します。

iptables -I INPUT -i eth0 -j eth-in
iptables -I FORWARD -i eth0 -j eth-in



さて、入力のほうはこれでOKですが、出力のほうが何でも出て行ってしまうので余計なトラフィックを流さないように OUTPUT のほうも設定しましょう。

ユーザーチェーンを作ります。

iptables -N eth-out



Windows のパケットが出て行かないようにします。

iptables -A eth-out -p udp --dport 137:139 -j DROP
iptables -A eth-out -p tcp --dport 137:139 -j DROP



LANのパケットが出て行かないようにします。

iptables -A eth-out -d 192.168.0.0/24 -j DROP



チェーンを接続します。

iptables -I FORWARD -o eth0 -j eth-out
iptables -I OUTPUT -o eth0 -j eth-out



iptables は3つのテーブルを持っていて、デフォルトのテーブルである filter テーブルの設定はこれで完了です。 次に ipforward を有効にするために、/etc/sysctl.conf ファイルの net.ipv4.ip_forward = 0 net.ipv4.ip_forward = 1 に変更します。 ついでに

# Disables the reply to broadcasts icmp
net.ipv4.icmp_echo_ignore_broadcasts = 1



の行も追加しておくといいでしょう。 これでブロードキャストの ping に反応しなくなります。

このままではLAN側からのパケットは転送されるものの通信できる状態にはなっていません。 LAN側での IP がそのままパケットにセットされているため転送されても相手側で受け付けてくれません。 そこで、nat テーブルに MASQUERADE の設定をして、IP を変換します。

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE



ここまで入力できたら

service iptables save



を実行して今までの設定をセーブします。 ネットワークの再起動が必要なので、リブートして動作を確認してください。

iptables -t filter -n -L -v --line-numbers



と入力すれば、今までの設定が見れます。

この他にもip forwarding port forwarding の設定ができますが、必要に応じてやっていきたいと思います。

05/18/2002



ところで、このままの設定で ftp を使おうとすると、PASV モードに入ったところで止まってしまいます。 PASV モードでは、ポート21でコネクションを確立したあとクライアント側から >1024 のポートを指定して来るため、新規コネクションとなってはねられてしまうためです。 ftp PASV モードで使うためには、ip_conntrack_ftp モジュールをロードしておく必要があります。 /etc/modules.conf above ip_conntrack ip_conntrack_ftp の一行を追加しておけば、起動時にロードされて ftp が使用可となります。

11/14/2003



戻る