きまぐれほげほげひろば

■ ファイアウォール(iptables)

PCがローカルネットワークにある場合、他のPCからの攻撃なんて考えなくてもいいのかも しれませんが、念のためなんてこともあるかもしれませんので。 iptables コマンドを使ってファイアウォールを構築する方法。

起動時に自動でファイアウォール(iptables)が起動するように設定します。
# chkconfig iptables on

上の設定をすれば、次回以降する必要がありません。
service iptables start

以下のコマンドでiptables の設定を確認します。X上のGUIのツールでファイアウォールの設定を行った場合は以下のようになっていると思います。
# iptables -L
Chain INPUT (policy ACCEPT)              ←パケットの入力 全て許可
target                prot opt source               destination
RH-Lokkit-0-50-INPUT  all  --  anywhere             anywhere      ←"RH-Lokkit-0-50-INPUT "はチェイン名 内容は下で定義

Chain FORWARD (policy ACCEPT)            ←パケットの転送 全て許可
target                prot opt source               destination
RH-Lokkit-0-50-INPUT  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)             ←パケットの出力 全て許可
target                prot opt source               destination

Chain RH-Lokkit-0-50-INPUT (2 references)      ←チェイン"RH-Lokkit-0-50-INPUT "のルール
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere           tcp dpt:http flags:SYN,RST,ACK/SYN   ←httpの接続を許可
ACCEPT     tcp  --  anywhere             anywhere           tcp dpt:ftp flags:SYN,RST,ACK/SYN    ←ftpの接続を許可
ACCEPT     tcp  --  anywhere             anywhere           tcp dpt:ssh flags:SYN,RST,ACK/SYN    ←sshの接続を許可
ACCEPT     all  --  anywhere             anywhere                                                ←ローカルホストの接続を全て許可
REJECT     all  --  anywhere             anywhere           reject-with icmp-host-prohibited     ←全てを拒否

新しいルールを手で加えるために、何してるかわからない既存のルールを削除します
# iptables -X RH-Lokkit-0-50-INPUT      ←  チェイン:RH-Lokkit-0-50-INPUT を削除

。 基本は、ローカル以外の入力を全否定にして、必要なポートだけ(下ではSSHと,FTP,HTTP,HTTPSだけ)許可をして開けていく。 出力は全て許可にする。
*いきなりINPUTのポリシーをDROPにするとTermから繋いでいる場合悲劇を見るので注意
# iptables -F INPUT                     ← INPUT(他のマシンからの接続)チェイン内のルールを全て削除
# iptables -F OUTPUT                    ← OUTPUT(他のマシンへの接続)チェイン内のルールを全て削除
# iptables -F FORWARD                   ← FORWARD(他のマシンへの転送)チェイン内のルールを全て削除
# iptables -N FIREWALL1                  ← 新しいユーザ定義チェインの作成
# iptables -A INPUT -j FIREWALL1         ← INPUTチェインをユーザ定義チェインと結びつける
# iptables -A FIREWALL1 -i lo -j ACCEPT       ← ローカルホストからの入力を許可・必須
# iptables -A FIREWALL1 -m state --state ESTABLISHED,RELATED -j ACCEPT   ←確立済みとその関連するコネクションを許可・必須
# iptables -A FIREWALL1 -p icmp -j ACCEPT       ← icmpプロトコルのパケットを許可
# iptables -A FIREWALL1 -p tcp --dport 21 -j ACCEPT   ← FTP(tcp/21)への接続を許可
# iptables -A FIREWALL1 -p tcp --dport 22 -j ACCEPT   ← SSH(tcp/22)への接続を許可
# iptables -A FIREWALL1 -p tcp --dport 80 -j ACCEPT   ← HTTP(tcp/80)への接続を許可
# iptables -A FIREWALL1 -p tcp --dport 443 -j ACCEPT   ← HTTPS(tcp/443)への接続を許可
# iptables -A FIREWALL1 -j REJECT --reject-with icmp-host-prohibited   ← 先に許可したポート以外全て不許可にする
# iptables -P INPUT ACCEPT                ← INPUT(他のマシンからの接続)のポリシーをACCEPT(許可)
# iptables -P FORWARD DROP              ← FORWARD(他のマシンへの転送)のポリシーをDROP(破棄・応答も返さない)
# iptables -P OUTPUT ACCEPT             ← OUTPUT (他のマシンへの接続)のポリシーをACCEPT(許可)

最後に以下のコマンドで現在の設定を保存する。

# service iptables save     #設定したルールの保存
現在のルールを/etc/sysconfig/iptablesに保存中:             [  OK  ]

ちなみにチェイン丸ごと消すときは

# iptables -X チェイン名

チェイン内のあるルールを消すときは

# iptables -D チェイン名 消したいルールのチェイン内の上からの順番

チェイン名を変えるときは

# iptables -E 元のチェイン名 新しいチェイン名

ルータにするときは

vi /etc/sysctl.conf    #次の再起動時に有効となる
net.ipv4.ip_forward = 1
または (こちらは即時)
echo 1 > /proc/sys/net/ipv4/ip_forward 

上のiptables の設定に次の設定を加える。 (eth0がインターネット eth1がローカルとする)

# iptables -A FORWARD -j FIREWALL1 
# iptables -A FIREWALL1 -i eth1 -j ACCEPT 

さらにIPマスカレードにする場合は

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -L -t nat  ←nat テーブルを確認

戻る