#! /bin/sh □ ・ループバック・アクセスはすべて許可する ・ローカル・ネットワーク内では、pingを使えるようにする。 ・どのサーバーに対しても、DNSの問い合わせはできるようにする。 ・DNS以外は、クライアントとしては利用しない。 ・Webアクセス(HTTPおよびHTTPS)は外部にも許可し、どのホストからもアクセスできるようにする。 ・メールの送受信(SMTP)はすべてのホストと行えるようにする。 ・リモート・ログインはSSHのみとし、特定のホストだけに許可する。 ・上記以外のすべてのアクセスはデフォルトで拒否に設定する。 #------------------------------------------# # IPアドレス,ネットワーク・アドレスの設定 # #------------------------------------------# MYHOST='192.168.100.50' #--- 自ホストのIPアドレス LOCALNET='192.168.100.0/24' #--- ローカル・ネットワーク・アドレス LOCALHOST='127.0.0.1' #--- ループバック・アドレス(localhost) TRUSTHOST='192.168.100.2' #--- 信頼するホストのIPアドレス ANY='0.0.0.0/0' #--- すべてのホスト #-------------------------# # iptables コマンドのパス # #-------------------------# IPTABLES='/sbin/iptables' #--------------------------------# # すべてのルールを削除(初期化) # #--------------------------------# /etc/rc.d/init.d/iptables stop #----------------------------------# # デフォルトのルール(拒否)の設定 # #----------------------------------# $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT DROP #---------------------------------------------# # ループバック・アドレスのアクセスをすべて許可# #---------------------------------------------# $IPTABLES -A INPUT -s $LOCALHOST -d $LOCALHOST -j ACCEPT $IPTABLES -A OUTPUT -s $LOCALHOST -d $LOCALHOST -j ACCEPT #----------------------------------------# # ローカル・ネットワーク内でのpingを許可 # #----------------------------------------# $IPTABLES -A INPUT -p icmp -s $LOCALNET --icmp-type 0 -d $MYHOST -j ACCEPT $IPTABLES -A INPUT -p icmp -s $LOCALNET --icmp-type 8 -d $MYHOST -j ACCEPT $IPTABLES -A OUTPUT -p icmp -s $MYHOST --icmp-type 0 -d $LOCALNET -j ACCEPT $IPTABLES -A OUTPUT -p icmp -s $MYHOST --icmp-type 8 -d $LOCALNET -j ACCEPT type 0 ICMP Echo Reply type 8 ICMP Echo Request #-----------------------------------# # すべての DNS への問い合わせを許可 # #-----------------------------------# $IPTABLES -A INPUT -p udp -s $ANY --sport 53 -d $MYHOST -j ACCEPT $IPTABLES -A OUTPUT -p udp -s $MYHOST -d $ANY --dport 53 -j ACCEPT #------------------------------------# # Webサーバーへのアクセスをすべて許可# #------------------------------------# $IPTABLES -A INPUT -p tcp -s $ANY -d $MYHOST --dport 80 -j ACCEPT $IPTABLES -A OUTPUT -p tcp -s $MYHOST --sport 80 -d $ANY -j ACCEPT $IPTABLES -A INPUT -p tcp -s $ANY -d $MYHOST --dport 443 -j ACCEPT $IPTABLES -A OUTPUT -p tcp -s $MYHOST --sport 443 -d $ANY -j ACCEPT #------------------------------------------# # メール・サーバーへのアクセスをすべて許可 # #------------------------------------------# $IPTABLES -A INPUT -p tcp -s $ANY -d $MYHOST --dport 25 -j ACCEPT $IPTABLES -A OUTPUT -p tcp -s $MYHOST --sport 25 -d $ANY -j ACCEPT $IPTABLES -A OUTPUT -p tcp -s $MYHOST -d $ANY --dport 25 -j ACCEPT $IPTABLES -A INPUT -p tcp -s $ANY --sport 25 -d $MYHOST \ -m state --state ESTABLISHED -j ACCEPT 「ステートフル・インスペクション機能」とは、通信の状態(ステート)に応じて、 フィルタリングしたいパケットを動的に変更できる仕組み。 「-m state --state ESTABLISHED」で25/tcpにSYNパケットを送信した状態 (接続を要求した状態)をシステムが覚えておくようにする。 SYN→SYN/ACK→ACK $IPTABLES -A INPUT -p tcp -s $ANY -d $MYHOST --dport 113 -j REJECT \ --reject-with tcp-reset $IPTABLES -A OUTPUT -p tcp -s $MYHOST --sport 113 -d $ANY -j ACCEPT sendmailなどは、25/tcpに接続されると接続もとの113/tcpにアクセスしてユーザー情報を 取得する機能が備わっており、113/tcpへのアクセスをDROPしてしまうと、メール送信に余計な 時間が掛かってしまう。そのため、DROPではなくREJECTを指定している。 #---------------------------------------------------# # 信頼するホストからのリモート・ログイン(SSH)を許可 # #---------------------------------------------------# $IPTABLES -A INPUT -p tcp -s $TRUSTHOST -d $MYHOST --dport 22 -j ACCEPT $IPTABLES -A OUTPUT -p tcp -s $MYHOST --sport 22 -d $TRUSTHOST -j ACCEPT #----------------# # 設定内容の保存 # #----------------# /etc/rc.d/init.d/iptables save