iptables

更新日2017-08-12 (土) 17:33:09

CentOSでのNATの設定

/etc/sysconfig/iptables

# Generated by iptables-save v1.4.7 on Wed Sep 21 22:14:47 2011
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [11:1476]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
# FORWARDをLAN(eth0:1)からWAN(eth0)に許可
-A FORWARD -i eth0:1 -j ACCEPT
-A FORWARD -o eth0 -j ACCEPT
# それ以外はFORWARD拒否
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Sep 21 22:14:47 2011
# Generated by iptables-save v1.4.7 on Wed Sep 21 22:14:47 2011
*nat
:PREROUTING ACCEPT [1:60]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [1:108]
# MASQUERADEの設定
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Wed Sep 21 22:14:47 2011

確認コマンド

# /sbin/iptables-save

FORWORDの設定コマンド

# echo 1 > /proc/sys/net/ipv4/ip_forward
# /sbin/modprobe iptable_nat

ip_forwardは「/etc/sysctl.conf」に書き込み次のコマンドで設定でも可

# sysctl -p

ネットワーク、IPの追加

エイリアス等でネットワークやIPを追加するときは「iptables」でルールを決めた後に指定する必要がある。DROP当でその関係が拒否されると、ifconfig,route addも消えるようだ。

pptpパススルー

iptablesでは内部LANのpptpクライアントから外部のpptpサーバに接続するためのpptpパススルーがipマスカレードと併用して利用できる。しかし、Vine4.xではGREプロトコルを通すモジュール「ip_nat_pptp」をつけ加えなくてはいけない

構成図

-----------------         eth0:1----------        
|pptpクライアント|==============| GW     |
------------------        |eth0 |        |   
                          |     ----------       ------------    -------------
                          |======================|WAN       |====|pptpサーバ |
                                                 ------------    -------------

設定方法

# /sbin/ifconfig eth0:1 10.99.99.98
# /sbin/modprobe iptable_nat
# /sbin/modprobe ip_nat_pptp   <==このモジュール(pptpパススルー)が必要
# echo 1 > /proc/sys/net/ipv4/ip_forward
# /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

スプーフィング対策としてカーネルパラメータのrp_filterを有効
送信アドレスの偽装を防ぐらしい。

# echo 1 >/proc/sys/net/ipv4/conf/eth1/rp_filter
# echo 1 >/proc/sys/net/ipv4/conf/eth0/rp_filter

確認

# /sbin/lsmod
Module                  Size  Used by
ipt_MASQUERADE          7680  1
ip_nat_pptp            10244  0
ip_conntrack_pptp      14736  1 ip_nat_pptp
iptable_nat            12036  1
ip_nat                 21548  3 ipt_MASQUERADE,ip_nat_pptp,iptable_nat
ip_tables              17108  1 iptable_nat
ip_conntrack           52568  5 ipt_MASQUERADE,ip_nat_pptp,ip_conntrack_pptp,iptable_nat,ip_nat
nfnetlink              10520  2 ip_nat,ip_conntrack
x_tables               16644  3 ipt_MASQUERADE,iptable_nat,ip_tables

(略)

ファイアウォール

Vine4.xでは、iptablesがファイアウォールとしてインストールされる。
設定は/etc/sysconfig/iptablesにあるのでそれを以下のように編集しiptablesを再起動すればOK

ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp  dpt:http
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:https  <==追加

しかしこれだけだとX上のユーティリティに反映されないので以下も変更しておく

/etc/sysconfig/system-config-securitylevel

# system-config-securitylevel config written out by anaconda

-f
--enabled
--port=22:tcp
--port=80:tcp
--port=443:tcp   <==追加
--port=25:tcp

環境

インストールするマシンは以下ようなネット接続で G/Wおよび、各種サーバ (WWW,Mail 等)として利用する
よって、ローカル側からはipマスカレードを利用しインターネットにアクセスしインターネット側からはローカルネットへのアクセス禁止とG/W内部へのアクセスも必要以外のポートを禁止する。

                              ---------
(インターネット)<------>(eth1)| G/W   |(eth0)<----->(ローカルネット) 
                              ---------

ipchainsの停止

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 (起動時起動しないようにする)

iptablesの起動および設定

以下のようなスクリプトを実行

#!/bin/sh
##nat用モジュールをロードする
/sbin/modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward

##テーブルの条件を初期化する(ただしポリシーは変更できない)

テーブル名チェイン名
filterINPUT
OUTPUT
FORWARD
natOUTPUT
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マスカレードの設定(LAN側[eth0]に別ネットワークがあった場合route addされているとマスカレードされないで元IPでその追加されたLAN側のネットワークにアクセスに行く)

/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)

注1)マスカレードの設定をしても、filterテーブルのFORWARDチェインのポリシーがDROPだと、パケットがforwardされない.

##ポリシーを決める(通過およびマシンが応答するパケットは基本的に禁止)

/sbin/iptables -t filter -P FORWARD DROP
/sbin/iptables -t filter -P INPUT DROP

## 確立しているコネクションのFORWARDを許可---(1)

/sbin/iptables -t filter -A FORWARD  -m state --state ESTABLISHED,RELATED -j ACCEPT

ESTABLISHED: このパケットは、過去双方向にパケットがやり取りされた接続に属するパケットである。
NEW: このパケットが新しい接続を開始したか、 双方向にはパケットがやり取りされていない接続に属するパケットである。 RELATED: このパケットが新しい接続を開始しているが、 FTP データ転送や ICMP エラーのように、既存の接続に関係している。 注)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

(全てをLAN側からのみ通過させるには[ipマスカレードを使用時:
マスカレード使用しないと戻りパケットがLAN側のみの場合は通過しない。また、
確立しているコネクションのFORWARDを許可(1)[SPI(ステートフルインスペクション)]を設定する必要がある]
/sbin/iptables -t filter -A FORWARD -i eth0 -j ACCEPT
とすればよい)

## 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

注)
filterで自分自身を許可する場合は自分のIPではなく127.0.0.1でしか有効にならない場合もあるようだ。

IPファイルタ

条件の追加
ポリシはすべて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

POSTROUTINGの場合

# /sbin/iptables -t nat -D POSTROUTING 2

Logの表示

FORWARDでログを取ってみる

設定

# /sbin/iptables -I FORWARD 1 -j LOG --log-prefix "JE2ISM-: "

注:以下のようにMASQUERADEよりLOGのほうが先にセットされないとLOGが出力されない

# /sbin/iptables -L
(略)

Chain FORWARD (policy ACCEPT) target prot opt source destination LOG 0 -- anywhere anywhere LOG level warning prefix `MASQUERAD by JE2ISM ' ACCEPT icmp -- anywhere anywhere

(略)

/var/log/messagesにログが出る

Dec 28 09:59:46 vmvine42 kernel: JE2ISM-: IN=eth1 OUT=eth0 SRC=192.168.99.2  
DST=192.244.75.246 LEN=48 TOS=0x00 PREC=0x00 TTL=127 ID=52158 DF PROTO=TCP  
SPT=1364 DPT=8089 WINDOW=64240 RES=0x00 SYN URGP=0
Dec 28 09:59:49 vmvine42 kernel: JE2ISM-: IN=eth1 OUT=eth0 SRC=192.168.99.2 
DST=192.244.75.246 LEN=48 TOS=0x00 PREC=0x00 TTL=127 ID=52159 DF PROTO=TCP 
SPT=1364 DPT=8089 WINDOW=64240 RES=0x00 SYN URGP=0

MASQUERADでは

# /sbin/iptables -A FORWARD -j LOG --log-prefix "MASQUERAD by JE2ISM "
# /sbin/iptables -t nat -A POSTROUTING -j LOG --log-prefix "MASQUERAD by JE2ISM "

/var/log/messagesにログが出る

Dec 28 07:27:04 vmvine42 kernel: MASQUERAD by JE2ISM IN=eth1 OUT=eth1 
SRC=192.168.99.2 DST=216.218.229.84 LEN=48 TOS=0x00 PREC=0x00 TTL=127 ID=738
DF PROTO=TCP SPT=1148 DPT=80 WINDOW=64240 RES=0x00 SYN URGP=0
Dec 28 07:27:10 vmvine42 kernel: MASQUERAD by JE2ISM IN=eth1 OUT=eth1 
SRC=192.168.99.2 DST=216.218.229.84 LEN=48 TOS=0x00 PREC=0x00 TTL=127 ID=739 
DF PROTO=TCP SPT=1148 DPT=80 WINDOW=64240 RES=0x00 SYN URGP=0

ただ某所ではCPUリソースが異常に増えたのでFORWARDで代用した


/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を再起動


元ページ

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS