Home > Linux | セキュリティ | ソフトウェア | 自宅サーバー > iptablesを覚えたいなぁ…とりあえず基本スクリプト。

iptablesを覚えたいなぁ…とりあえず基本スクリプト。

最近、すでに自宅サーバーブログじゃなくてふつーのブログになってるな。まあ、個人ブログだからどっちゃでもえーんですが。ああ、そういえばMacOS XはFree BSDベースですが、iPhoneもJailbrakeすればSSH接続できるらしいですよ(保証対象外)(でも自分はやらない)(だってベンダーデフォルト派なんだもん)(っていうか本題逸れてるよ)。ちなみに、Windows Mobile5で、CE用のHTTPD使ってハンドヘルドWebサーバーならやったことがあります(意味ねー)。

とりあえず、ずっとiptablesを勉強したいと思っておるのですが、Web検索した範囲ではなかなか基礎から説明されているサイトはみつからないのですが、とりあえずシェルスクリプトのサンプルをおいとくから各自の環境に合わせて設定してくれ、というところはいくつかありました。実際に自分が設定する際も、イチイチ毎回手動設定をするワケにはいかないので、基本的にはスクリプトとしてまとめておくことになると思います。

ITサイトの連載でもあったのですが、より優秀なスクリプトを紹介されている、有名なこちらで:CentOSで自宅サーバー構築。こちらを必要に応じて改造したものを使います。

#!/bin/bash

#---------------------------------------#
# 設定開始                              #
#---------------------------------------#

# インタフェース名定義
LAN=eth0

#---------------------------------------#
# 設定終了                              #
#---------------------------------------#

# 内部ネットワークのネットマスク取得
LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d`

# 内部ネットワークアドレス取得
LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '`
LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK

# ファイアウォール停止(すべてのルールをクリア)
/etc/rc.d/init.d/iptables stop

# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
iptables -P INPUT   DROP   # 受信はすべて破棄
iptables -P OUTPUT  ACCEPT # 送信はすべて許可
iptables -P FORWARD DROP   # 通過はすべて破棄

# 自ホストからのアクセスをすべて許可
iptables -A INPUT -i lo -j ACCEPT

# 内部からのアクセスをすべて許可
iptables -A INPUT -s $LOCALNET -j ACCEPT

# 内部から行ったアクセスに対する外部からの返答アクセスを許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SYN Cookiesを有効にする
# ※TCP SYN Flood攻撃対策
sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null
sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf

# ブロードキャストアドレス宛pingには応答しない
# ※Smurf攻撃対策
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null
sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf

# ICMP Redirectパケットは拒否
sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
    sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null
    echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf
done

# Source Routedパケットは拒否
sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
    sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null
    echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf
done

# フラグメント化されたパケットはログを記録して破棄
iptables -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : '
iptables -A INPUT -f -j DROP

# 外部とのNetBIOS関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT -s ! $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A INPUT -s ! $LOCALNET -p udp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A OUTPUT -d ! $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
iptables -A OUTPUT -d ! $LOCALNET -p udp -m multiport --sports 135,137,138,139,445 -j DROP

# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
iptables -N LOG_PINGDEATH
iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : '
iptables -A LOG_PINGDEATH -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH

# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT -d 255.255.255.255 -j DROP
iptables -A INPUT -d 224.0.0.1 -j DROP

# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset

#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここから)               #
#----------------------------------------------------------#

# 外部からのTCP22番ポート(SSH)へのアクセスを許可
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 外部からのTCP80番ポート(HTTP)へのアクセスを許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 外部からのTCP443番ポート(HTTPS)へのアクセスを許可
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 外部からのTCP21番ポート(FTP)へのアクセスを許可
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

# 外部からのPASV用ポート(FTP-DATA)へのアクセスを許可
# ※PASV用ポート60000:60030は当サイトの設定例
iptables -A INPUT -p tcp --dport 60000:60030 -j ACCEPT

#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここまで)               #
#----------------------------------------------------------#

# 拒否IPアドレスからのアクセスはログを記録せずに破棄
# ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと
# (/root/deny_ipがなければなにもしない)
if [ -s /root/deny_ip ]; then
    for ip in `cat /root/deny_ip`
    do
        iptables -I INPUT -s $ip -j DROP
    done
fi

# 上記のルールにマッチしなかったアクセスはログを記録して破棄
iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : '
iptables -A INPUT -j DROP
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : '
iptables -A FORWARD -j DROP

# サーバー再起動時にも上記設定が有効となるようにルールを保存
/etc/rc.d/init.d/iptables save

# ファイアウォール起動
/etc/rc.d/init.d/iptables start

長くなるので、汎用的な部分のみに削ってます。メールサーバーとかDNSサーバーとか、サーバーの用途に応じた設定は、他の行を参考にポートなどを適宜変えて行を追加していけば問題ないと思います。
また、参考にさせていただいた元ページでは、国外からの接続制限などをされていますが、汎用性を優先してそういった設定は外しています。

とりあえずifconfigで表示されるNICを最初のインタフェース名定義のところに書きます。ローカルホストは自動的に拾って許可してくれるようになっているので、あとはサーバーの用途に応じて、各種サービスを公開する場合の設定を追加・削除していけば良いと思います。あと、外部からの攻撃対策が幾つかありますが、必要に応じて調整はしてください(ただのWebサーバー、とかならそのままでも特に問題ありませんが…)。

あとは、この例ではSSH、FTPのポートはとりあえず通過できるようにしただけなので、当然TCP Wrapperやxinetd.d/で接続ホスト制限などを行ってください(そのままだとSSHにバカみたいにアタックに晒されるので)。公開鍵認証方式にもすると素敵。あとは25番など、メール関係の設定は踏み台にされる恐れがあるので慎重に行ってください(こちらもかなり来ます)。

人気ブログランキング

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://s-srv.net/archives/176/trackback
Listed below are links to weblogs that reference
iptablesを覚えたいなぁ…とりあえず基本スクリプト。 from 缶詰ファクトリー - さばかん 自宅サーバーBlog

Home > Linux | セキュリティ | ソフトウェア | 自宅サーバー > iptablesを覚えたいなぁ…とりあえず基本スクリプト。

Search
Link
Feeds
Meta

Return to page top