インストールするマシンは以下ようなネット接続で G/Wおよび、各種サーバ (WWW,Mail 等)として利用する
よって、ローカル側からはipマスカレードを利用しインターネットにアクセスしインターネット側からはローカルネットへのアクセス禁止とG/W内部へのアクセスも必要以外のポートを禁止する。
--------- (インターネット)<------>(eth1)| G/W |(eth0)<----->(ローカルネット) ---------
ipchainsが動作しているときはこれを停止する
# /sbin/lsmod (確認コマンド) sis900 11264 1 (autoclean) ipchains 38976 0 (unused) ^^^^^^^^<-ipchainsが動作している usb-uhci 20720 0 (unused)
# /sbin/rmmod ipchains (停止コマンド)
起動時に動作させないようように
# /sbin/chkconfig --list (確認コマンド) apmd 0:オフ 1:オフ 2:オン 3:オン 4:オン 5:オン 6:オフ ipchains 0:オフ 1:オフ 2:オン 3:オン 4:オン 5:オン 6:オフ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^これをオフにする iptables 0:オフ 1:オフ 2:オン 3:オン 4:オン 5:オン 6:オフ identd 0:オフ 1:オフ 2:オフ 3:オフ 4:オフ 5:オフ 6:オフ
# /sbin/chkconfig --del ipchains (起動時起動しないようにする)
以下のようなスクリプトを実行
#!/bin/sh ##モジュールをロードする /sbin/modprobe iptable_nat echo 1 > /proc/sys/net/ipv4/ip_forward
##テーブルの条件を初期化する(ただしポリシーは変更できない)
|テーブル名 |チェイン名|
filter | INPUT |
OUTPUT | |
FORWARD | |
nat | OUTPUT |
PREROUTING | |
POSTROUTING |
チェイン名 | 説明 |
INPUT | 受信したパケットに対するチェイン |
OUTPUT | 送信したパケットに対するチェイン |
FORWARD | 対象サーバを経由するパケットに対するチェイン |
PREROUTING | 受信時にパケットのアドレス変換をするチェイン |
POSTROUTING | 送信時にパケットのアドレス変換をするチェイン |
# /sbin/iptables -t filter -F FORWARD <--FORWARDの初期化 # /sbin/iptables -t filter -F INPUT <--INPUTの初期化 # /sbin/iptables -t nat -F POSTROUTING <--POSTROUTINGの初期化
全ての初期化なら
/sbin/iptables -F
でよい
##ipマスカレードの設定($color(red){LAN側[eth0]に別ネットワークがあった場合route addされているとマスカレードされないで元IPでアクセスに行く};)
/sbin/iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
(指定IPだけNAT: /sbin/iptables -t nat -A POSTROUTING -o eth1 -s 10.0.0.0/8 -j MASQUERADE)
$color(red){注1)マスカレードの設定をしても、filterテーブルのFORWARDチェインのポリシーがDROPだと、パケットがforwardされない.};
##ポリシーを決める(通過およびマシンが応答するパケットは基本的に禁止)
/sbin/iptables -t filter -P FORWARD DROP /sbin/iptables -t filter -P INPUT DROP
## 確立しているコネクションのFORWARDを許可$color(red){---(1)};
/sbin/iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
ESTABLISHED: このパケットは、過去双方向にパケットがやり取りされた接続に属するパケットである。
NEW: このパケットが新しい接続を開始したか、 双方向にはパケットがやり取りされていない接続に属するパケットである。
RELATED: このパケットが新しい接続を開始しているが、 FTP データ転送や ICMP エラーのように、既存の接続に関係している。
$color(red){注)NEWを入れると、WAN側からも新しいも入ってくるので、WAN側からLAN側にも接続できるようになる.};
## pingの通過および応答を許可
/sbin/iptables -t filter -A FORWARD -i eth0 -p icmp -j ACCEPT
(注1で一切パケットをWAN側に流さないのでicmpだけインターフェイスeth0(LAN)だけ 許可する。両方許可するとWANからもicmpが流れてくる) /sbin/iptables -t filter -A INPUT -i eth1 -p icmp -j ACCEPT
## DNS問い合わせの通過および応答を許可
/sbin/iptables -t filter -A FORWARD -i eth0 -p udp --dport 53 -j ACCEPT /sbin/iptables -t filter -A INPUT -i eth1 -p udp --dport 53 -j ACCEPT
## wwwの通過および応答を許可
/sbin/iptables -t filter -A FORWARD -i eth0 -p tcp --dport 80 -j ACCEPT /sbin/iptables -t filter -A INPUT -i eth1 -p tcp --dport 80 -j ACCEPT
## POPの通過および応答を許可
/sbin/iptables -t filter -A FORWARD -i eth0 -p tcp --dport 110 -j ACCEPT /sbin/iptables -t filter -A INPUT -i eth1 -p tcp --dport 110 -j ACCEPT
## SMTPの通過および応答を許可
/sbin/iptables -t filter -A FORWARD -i eth0 -p tcp --dport 25 -j ACCEPT /sbin/iptables -t filter -A INPUT -i eth1 -p tcp --dport 25 -j ACCEPT
$color(red){(全てをLAN側からのみ通過させるには[ipマスカレードを使用時:};
$color(red){マスカレード使用しないと戻りパケットがLAN側のみの場合は通過しない。また、};
$color(red){確立しているコネクションのFORWARDを許可(1)[SPI(ステートフルインスペクション)]を設定する必要がある]};
$color(red){/sbin/iptables -t filter -A FORWARD -i eth0 -j ACCEPT};
$color(red){とすればよい)};
## ftp通信用モジュールのロード(FTPの通過および応答を許可)
/sbin/iptables -t filter -A FORWARD -i eth0 -p tcp --dport 21 -j ACCEPT /sbin/iptables -t filter -A INPUT -i eth1 -p tcp --dport 21 -j ACCEPT /sbin/modprobe ip_nat_ftp /sbin/modprobe ip_conntrack_ftp
$color(red){注)};
filterで自分自身を許可する場合は自分のIPではなく127.0.0.1でしか有効にならない場合もあるようだ。
条件の追加
ポリシはすべてACCEPT、ポート21を192.168.10.0/24以外からのアクセスを拒否
# /sbin/iptables -A INPUT -p tcp --dport 21 -s ! 192.168.10.0/24 -j DROP
設定状況の表示
# /sbin/iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- !192.168.10.0/24 anywhere tcp dpt:ftp Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
NATの表示は
# /sbin/iptables -t nat -n -L Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT) target prot opt source destination
許可するアドレスが1つしか設定できないので許可するアドレスを羅列して その後それ以外を拒否
全てを拒否
# /sbin/iptables -A INPUT -p tcp --dport 21 -s 0.0.0.0/0 -j DROP # /sbin/iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere anywhere tcp dpt:ftp Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
許可するアドレスを追加
DROPより先に追加する必要があるので、-I INPUT 1(<=1行目に追加の意味)
# /sbin/iptables -I INPUT 1 -p tcp --dport 21 -s 192.168.10.24 -j ACCEPT ^^^^^^^^^^^順番に注意(チェイン名の後にNoを指定) # /sbin/iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 192.168.10.24 anywhere tcp dpt:ftp DROP tcp -- anywhere anywhere tcp dpt:ftp Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
条件の指定
# /sbin/iptables -D INPUT -p tcp --dport 21 -s 192.168.10.24 -j ACCEPT
行数の指定
# /sbin/iptables -D INPUT 2
Logの表示
/sbin/iptables -I INPUT 1 -j LOG --log-prefix "iptables_log: "
/var/messagesにiptables_log:の文字列とともにlogがとれる
ただし、入力されるパケットが全て記録されるので、デバッグ以外使用しないほうが
いいかも?これも1行目であれば全て記録するが、適用な行のときはその行の以前に
適用されたルールは記録されない。
うまくいったら、/etc/rc.d/rc.localにでも書けばOK
または、
# /sbin/service iptables save
で
/etc/sysconfig/iptablesに保存される
/etc/sysconfig/iptables *filter <---(1) :INPUT ACCEPT [325:26749] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [306:44475] [0:0] -A INPUT -s ! 192.168.10.0/255.255.255.0 -p tcp -m tcp --dport 21 -j DROP ^^^^^^^^^^^保存された内容 COMMIT
(1)は-tオプションで指定されるテーブルで、filter,nat,mangleがある。デフォルトは
filterで,
filter: INPUT,OUTPUT,FORWARDがある
nat:このテーブルは新しい接続を開くようなパケットに対して参照される。
PREROUTING, OUTPUT がある
mangle: このテーブルは特別なパケット変換に使われる。
詳しくはman参照。
/sbin/service iptables saveでsaveしてもよいが
直接編集しても良い。
[0:0]部分はなくても動作するようだ
編集後
/etc/rc.d/init.d/iptables restart
でiptablesを再起動