CentOS サーバー運用・管理 iptables

(最終更新日時:2015-05-14 03:27:12)
※ 2015/05/14 CentOS7サーバーへの移行により、当コンテンツの更新は停止しました。※
※ 当コンテンツは今後予告なく削除される場合があります。※
※ 当サイトにおける今後のファイアウォールは [firewalld : /server/firewalld.html] になります。※
当サイトでは、ファイアウォールに iptables を使用しています。
また、サーバーにはNICを2枚挿しにして、ゲートウェイサーバーとして運用しています。
以下は、ゲートウェイサーバーとしての iptables の運用設定です。
さらに、併せて、迷惑メール送信業者等からの接続を拒否するための設定を行っています。
あくまでも当サイトの設定内容であり、不正アクセス等が防げることを保証するものではありません。また、こうしなければならないというものでもありません。
実際のiptablesの運用や設定につきましては、各々の責任でお願いいたします。

※ 以下の内容は iptables-1.4.7-5.1.el6_2.x86_64 を対象に記述しています。

設定ファイルの編集

起動時にFTPをPASVモードで使用するためのモジュールを追加します。
# vi /etc/sysconfig/iptables-config
----------(vi ここから)----------
       :
IPTABLES_MODULES="ip_conntrack_netbios_ns ip_conntrack_ftp"
       :
----------(vi ここまで)----------

# service iptables restart                                    # 再起動します

設定用スクリプトの作成

設定のためのスクリプトを作成します。
# vi /usr/local/sbin/firewall.sh
----------(vi ここから)----------
#!/bin/sh
# --------------------------------------------------------------------------- (変数定義) ---
# 外部I/Fのネットワーク情報
EXTIF="eth0"
EXTIP=$(ifconfig $EXTIF | grep inet | cut -d ":" -f 2 | cut -d " " -f 1)

# 内部I/Fのネットワーク情報
INTIF="eth1"
INTIP=$(ifconfig $INTIF | grep inet | cut -d ":" -f 2 | cut -d " " -f 1)
INTMASK=$(ifconfig $INTIF | grep Mask | cut -d ":" -f 4)
INTLAN=$INTIP'/'$INTMASK

# 非特権ポート
UNPRIVPORTS="1024:65535"

# パラメータ
LOGLIMIT="1/s"                                           # ログマッチ許可    1回/秒
LOGBURST="3"                                             # ログマッチ最大値  3回
SYNLIMIT="10/s"                                          # SYN-Flood許可    10回/秒
SYNBURST="30"                                            # SYN-Flood最大値  30回
PINGLIMIT="10/s"                                         # PING-Flood許可   10回/秒
PINGBURST="30"                                           # PING-Flood最大値 30回

# ----------------------------------------------------------------------------- (初期化) ---
# 全チェインを空にする
iptables           -F
iptables -t nat    -F
iptables -t mangle -F

# 全ユーザー定義チェインを削除する
iptables           -X
iptables -t nat    -X
iptables -t mangle -X

# 全チェインのカウンタをクリアする
iptables           -Z
iptables -t nat    -Z
iptables -t mangle -Z

# デフォルトポリシーをDROPに設定する
iptables -P INPUT   DROP
iptables -P OUTPUT  DROP
iptables -P FORWARD DROP

# ----------------------------------------------------------------------- (ログチェイン) ---
# DROPパケット
iptables -N LOG-DROP
iptables -A LOG-DROP -p all \
                     -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
                     -j LOG --log-prefix "iptables DROP "
iptables -A LOG-DROP -f \
                     -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
                     -j LOG --log-prefix "iptables FRAGMENT DROP "
iptables -A LOG-DROP -j DROP

# REJECTパケット
iptables -N LOG-REJECT
iptables -A LOG-REJECT -p all \
                       -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
                       -j LOG --log-prefix "iptables REJECT "
iptables -A LOG-REJECT -f \
                       -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
                       -j LOG --log-prefix "iptables FRAGMENT REJECT "
iptables -A LOG-REJECT -p tcp -j REJECT --reject-with tcp-reset
iptables -A LOG-REJECT -p udp -j REJECT --reject-with icmp-port-unreachable
iptables -A LOG-REJECT -j REJECT

# 悪質な接続元からのパケットを破棄
iptables -N LOG-BLACK-IP
iptables -A LOG-BLACK-IP -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
                         -j LOG --log-prefix "iptables BLACK-IP DROP "
iptables -A LOG-BLACK-IP -j DROP

# 不正なフラグを持つパケットを破棄
iptables -N LOG-BADFLAG
iptables -A LOG-BADFLAG -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
                        -j LOG --log-prefix "iptables BADFLAG DROP "
iptables -A LOG-BADFLAG -j DROP

# 既存の接続に結び付けられていないパケットを破棄
iptables -N LOG-INVALID
iptables -A LOG-INVALID -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
                        -j LOG --log-prefix "iptables INVALID DROP "
iptables -A LOG-INVALID -j DROP

# SYN-Floodパケットを破棄
iptables -N LOG-SYNFLOOD
iptables -A LOG-SYNFLOOD -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
                         -j LOG --log-prefix "iptables SYNFLOOD DROP "
iptables -A LOG-SYNFLOOD -j DROP

# PING-Floodパケットを破棄
iptables -N LOG-PINGFLOOD
iptables -A LOG-PINGFLOOD -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
                          -j LOG --log-prefix "iptables PINGFLOOD DROP "
iptables -A LOG-PINGFLOOD -j DROP

# 接続拒否国からのパケットを破棄
iptables -N LOG-DENY-COUNTRY
iptables -A LOG-DENY-COUNTRY -m limit --limit $LOGLIMIT --limit-burst $LOGBURST \
                             -j LOG --log-prefix "iptables DENY-COUNTRY DROP "
iptables -A LOG-DENY-COUNTRY -j DROP

# --------------------------------------------------------------- (ユーザー定義チェイン) ---
# 悪質な接続元をチェック
iptables -N CHK-BLACK-IP
# ※チェイン内容は別のスクリプトで作成します

# SYN-Floodをチェック
iptables -N CHK-SYNFLOOD
iptables -A CHK-SYNFLOOD -p tcp --syn \
                         -m limit --limit $SYNLIMIT --limit-burst $SYNBURST -j ACCEPT
iptables -A CHK-SYNFLOOD -p tcp   --syn -j LOG-SYNFLOOD
iptables -A CHK-SYNFLOOD -p tcp ! --syn -j ACCEPT

# 不正なフラグを持つパケットをチェック
iptables -N CHK-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags SYN,RST SYN,RST         -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags SYN,FIN SYN,FIN         -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ACK,FIN FIN             -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ACK,PSH PSH             -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ACK,URG URG             -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags FIN,RST FIN,RST         -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ALL ALL                 -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ALL NONE                -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ALL FIN,URG,PSH         -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ALL SYN,FIN,URG,PSH     -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-option  64                    -j LOG-BADFLAG
iptables -A CHK-BADFLAG -p tcp --tcp-option 128                    -j LOG-BADFLAG

# 既存の接続に結び付けられていないパケットをチェック
iptables -N CHK-INVALID
iptables -A CHK-INVALID -p tcp --dport 80 -j RETURN                             # WindowsXP IE 対応
iptables -A CHK-INVALID -p all -m state --state INVALID -j LOG-INVALID

# 国別のアクセス制限をチェック
iptables -N CHK-COUNTRY
# ※チェイン内容は別のスクリプトで作成します

# INPUT ICMPパケットをチェック
iptables -N CHK-IN-ICMP
# Ping Flood対策
iptables -A CHK-IN-ICMP -p icmp --icmp-type echo-request \
                        -m limit --limit $PINGLIMIT --limit-burst $PINGBURST -j ACCEPT
iptables -A CHK-IN-ICMP -p icmp --icmp-type echo-request -j LOG-PINGFLOOD
# ICMP Type  5 (redirect)を破棄
iptables -A CHK-IN-ICMP -p icmp --icmp-type redirect             -j LOG-DROP
# ICMP Type 13 (timestamp-request)を破棄
iptables -A CHK-IN-ICMP -p icmp --icmp-type timestamp-request    -j LOG-DROP
# ICMP Type 14 (timestamp-reply)を破棄
iptables -A CHK-IN-ICMP -p icmp --icmp-type timestamp-reply      -j LOG-DROP
# ICMP Type 17 (address-maskrequest)を破棄
iptables -A CHK-IN-ICMP -p icmp --icmp-type address-mask-request -j LOG-DROP
# ICMP Type 18 (address-mask-reply)を破棄
iptables -A CHK-IN-ICMP -p icmp --icmp-type address-mask-reply   -j LOG-DROP
# チェックOKなら許可
iptables -A CHK-IN-ICMP -p icmp -j ACCEPT

# OUTPUT ICMPパケットをチェック
iptables -N CHK-OUT-ICMP
# ICMP Type  5 (redirect)を破棄
iptables -A CHK-OUT-ICMP -p icmp --icmp-type redirect             -j LOG-DROP
# ICMP Type 11 (time-exceeded)を破棄
iptables -A CHK-OUT-ICMP -p icmp --icmp-type time-exceeded        -j LOG-DROP
# ICMP Type 12 (parameter-problem)を破棄
iptables -A CHK-OUT-ICMP -p icmp --icmp-type parameter-problem    -j LOG-DROP
# ICMP Type 13 (timestamp-request)を破棄
iptables -A CHK-OUT-ICMP -p icmp --icmp-type timestamp-request    -j LOG-DROP
# ICMP Type 13 (timestamp-reply)を破棄
iptables -A CHK-OUT-ICMP -p icmp --icmp-type timestamp-reply      -j LOG-DROP
# ICMP Type 17 (address-mask-request)を破棄
iptables -A CHK-OUT-ICMP -p icmp --icmp-type address-mask-request -j LOG-DROP
# ICMP Type 18 (address-mask-reply)を破棄
iptables -A CHK-OUT-ICMP -p icmp --icmp-type address-mask-reply   -j LOG-DROP
# チェックOKなら許可
iptables -A CHK-OUT-ICMP -p icmp -j ACCEPT

# SMBパケットをチェック
iptables -N CHK-SMB
iptables -A CHK-SMB -p tcp --dport 137:139 -j DROP
iptables -A CHK-SMB -p tcp --dport 445     -j DROP
iptables -A CHK-SMB -p udp --dport 137:139 -j DROP
iptables -A CHK-SMB -p udp --dport 445     -j DROP
iptables -A CHK-SMB -p tcp --sport 137:139 -j DROP
iptables -A CHK-SMB -p tcp --sport 445     -j DROP
iptables -A CHK-SMB -p udp --sport 137:139 -j DROP
iptables -A CHK-SMB -p udp --sport 445     -j DROP

# # ---------------------------------------------------------------------- (INPUTチェイン) ---
# ローカルからのパケットを許可
iptables -A INPUT -i lo -j ACCEPT

# 内部LANからのパケットを許可
iptables -A INPUT -i $INTIF -s $INTLAN -j ACCEPT

# 内部I/FのDHCP Broadcastを許可
iptables -A INPUT -i $INTIF -p udp --sport 68 --dport 67 -j ACCEPT

# 悪質なアクセス元をチェック
iptables -A INPUT -p tcp -j CHK-BLACK-IP

# 内部LANを騙る偽パケットを破棄
iptables -A INPUT -s $INTLAN -j LOG-DROP

# IDENTパケットを拒否
iptables -A INPUT -i $EXTIF -p tcp --dport 113 -j REJECT --reject-with tcp-reset

# ローカルアドレス宛のパケットを拒否
iptables -A INPUT -d 127.0.0.0/8 -j LOG-REJECT

# 不正なフラグを持つパケットをチェック
iptables -A INPUT -p tcp -j CHK-BADFLAG

# INPUT ICMPパケットをチェック
iptables -A INPUT -i $EXTIF -p icmp -j CHK-IN-ICMP

# 外部I/FのSMBパケットをチェック
iptables -A INPUT -i $EXTIF -j CHK-SMB

# 既存の接続に結び付けられていないパケットをチェック
iptables -A INPUT -i $EXTIF -j CHK-INVALID

# ※各サービスのルールをここに入れます

# ESTABLISHED/RELATED接続を許可
iptables -A INPUT -i $EXTIF -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i $EXTIF -p tcp --dport $UNPRIVPORTS \
                            -m state --state RELATED     -j CHK-SYNFLOOD
iptables -A INPUT -i $EXTIF -p udp --dport $UNPRIVPORTS -m state --state RELATED -j ACCEPT

# 上記の何れにもマッチしなかったINPUTパケットを廃棄
iptables -A INPUT -j LOG-DROP

# --------------------------------------------------------------------- (OUTPUTチェイン) ---
# ローカルのパケットを許可する
iptables -A OUTPUT -o lo -j ACCEPT

# 内部LANへのパケットを許可
iptables -A OUTPUT -o $INTIF -d $INTLAN -j ACCEPT

# UDPによるtracerouteコマンドを許可
iptables -A OUTPUT -o $EXTIF -p udp --dport 33434:33523 -m state --state NEW -j ACCEPT

# OUPUT ICMPパケットをチェック
iptables -A OUTPUT -o $EXTIF -p icmp -j CHK-OUT-ICMP

# 外部I/FのSMBパケットをチェック
iptables -A OUTPUT -o $EXTIF -j CHK-SMB

# ※各サービスのルールをここに入れます

# 非特権ポートからのTCP/UDPパケットを許可
iptables -A OUTPUT -o $EXTIF -s $EXTIP -p tcp --sport $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -o $EXTIF -s $EXTIP -p udp --sport $UNPRIVPORTS -j ACCEPT

# 上記の何れにもマッチしなかったOUTPUTパケットを廃棄
iptables -A OUTPUT -j LOG-DROP

# -------------------------------------------------------------------- (FORWARDチェイン) ---
# 既存の接続に結び付けられていないパケットを破棄
iptables -A FORWARD -i $EXTIF -m state --state INVALID -j LOG-INVALID

# 不正なフラグを持つパケットをチェック
iptables -A FORWARD -p tcp -j CHK-BADFLAG

# 外部I/FのSMBパケットをチェック
iptables -A FORWARD -o $EXTIF -j CHK-SMB

# ※各サービスのルールをここに入れます

# 内部LANの非特権ポートから外部への転送を許可
iptables -A FORWARD -i $INTIF -o $EXTIF -s $INTLAN -p tcp --sport $UNPRIVPORTS -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -s $INTLAN -p udp --sport $UNPRIVPORTS -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -s $INTLAN -p icmp -j ACCEPT

# 外部から内部LANの非特権ポートへの転送を許可
iptables -A FORWARD -i $EXTIF -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $EXTIF -p tcp --dport $UNPRIVPORTS -m state --state RELATED -j CHK-SYNFLOOD
iptables -A FORWARD -i $EXTIF -p udp --dport $UNPRIVPORTS -m state --state RELATED -j ACCEPT
iptables -A FORWARD -i $EXTIF -p icmp -m state --state RELATED -j ACCEPT

# 上記の何れにもマッチしなかったFORWARDパケットを廃棄
iptables -A FORWARD -j LOG-DROP

# ------------------------------------------------------------------------ (POSTROUTING) ---
iptables -A POSTROUTING -t nat -o $EXTIF -j MASQUERADE

# --- (ルールを保存する) ---
service iptables save
----------(vi ここまで)----------

ファイアウォールの適用

作成したスクリプトを実行します。
# chmod +x /usr/local/sbin/firewall.sh
# firewall.sh

国別のアクセス制限チェック

World Wide なインターネット環境を利用していながら、接続してくる国を制限するというのは心苦しい限りです。
しかし、迷惑メールやサーバーへの不正侵入対策としてはかなりの効果があります、

当サーバーでは、無条件に制限するというのではなく、メールや SSH 、FTP といったサービスへの接続を制限しています。
SSH や Anonymous 接続を許可していない FTP サービスでは、許可されたユーザー以外の接続を元々制限していますので、拒否して問題になることはほとんどないでしょう。
出張等で海外へ行く場合は、都度制限を外すという運用を行います。
また、メールについては、ホワイトリストによる救済を行えば問題ないと考えます。

ホワイト IP 作成用のスクリプトを準備します。
# mkdir /usr/local/sbin/firewall
# cd    /usr/local/sbin/firewall

# (DNS の A レコードからファイアウォールの White IP を作成するスクリプト)
# vi white_ip_a.sh
----------(vi ここから)----------
#!/bin/sh

for IP_ADDR in $(dig a $1 | grep "^$1" | sed "s/[[:blank:]]\+/ /g" | cut -d " " -f 5); do
  iptables -A CHK-COUNTRY -s $IP_ADDR -j RETURN
done
----------(vi ここまで)----------

# chmod +x white_ip_a.sh

# (DNS の SPF レコードからファイアウォールの White IP を作成するスクリプト)
# vi white_ip_spf.sh
----------(vi ここから)----------
#!/bin/sh

# DNS の MX レコードからファイアウォールの White IP 設定を行う関数
function mx_record {
  for MX_NAME in $(dig mx $1 | grep "^$1" | sed "s/[[:blank:]]\+/ /g" | cut -d " " -f 6); do
    ./white_ip_a.sh $MX_NAME
  done
}

for SPF_TEXT in $(dig txt $1 | grep v=spf1 | sed "s/^.*\"\(.*\)\".*$/\1/"); do
  KEYWORD=$(echo $SPF_TEXT | cut -d ":" -f 1 -s)
  case $KEYWORD in
  include)
    INCLUDE_SPF=$(echo $SPF_TEXT | cut -d ":" -f 2)
    ./white_ip_spf.sh $INCLUDE_SPF
    ;;
  ip4)
    IP_ADDR=$(echo $SPF_TEXT | cut -d ":" -f 2)
    iptables -A CHK-COUNTRY -s $IP_ADDR -j RETURN
    ;;
  a)
    INCLUDE_A=$(echo $SPF_TEXT | cut -d ":" -f 2)
    ./white_ip_a.sh $INCLUDE_A
    ;;
  mx)
    INCLUDE_MX=$(echo $SPF_TEXT | cut -d ":" -f 2)
    mx_record $INCLUDE_MX
    ;;
  esac
done
----------(vi ここまで)----------

# chmod +x white_ip_spf.sh

国別アクセス制限のチェックルール作成スクリプトを作成します。
Office Nami 様 が提供されている 『世界の国別 IPv4 アドレス割り当てリスト』 を使用させていただいております。
# cd /usr/local/sbin/firewall
# vi check_country.sh
----------(vi ここから)----------
#!/bin/sh

CIDRFILE="cidr.txt"

cd /usr/local/sbin/firewall

# 国別IPアドレスリストを取得する
if [ "$(find $CIDRFILE -ctime -6 -print)" = "" ] ; then
  wget -q http://nami.jp/ipv4bycc/cidr.txt.gz
  if [ ! -f cidr.txt.gz ]; then
    echo "Could not get the cidr.txt.gz from http://nami.jp/" \
       | mail -s "iptables CHK-COUNTRY Chain Rule Setup Script" root
    exit 1
  fi
  gzip -df cidr.txt.gz
fi

# CHK-COUNTRYルールを初期化する
iptables -F CHK-COUNTRY

# WHITE_IPをルールに追加する(以下、空白行までは適宜、追加・削除してください)
./white_ip_spf.sh amazon.com                      # Amazon
./white_ip_spf.sh facebook.com                    # Facebook
./white_ip_spf.sh google.com                      # Google
./white_ip_spf.sh isc.org                         # ISC(Internet Systems Consortium)
./white_ip_spf.sh microsoft.com                   # Microsoft
./white_ip_spf.sh startcom.org                    # StartSSL
./white_ip_spf.sh twitter.com                     # Twitter
./white_ip_spf.sh worldcommunitygrid.org          # BOINC(WCG)
./white_ip_a.sh   www.boincstats.com              # BOINC(stats/BAM!)
./white_ip_a.sh   ice.skype.com                   # Skype
./white_ip_a.sh   skype.outbound.ed10.com         # Skype
./white_ip_a.sh   verifier.port25.com             # SPF/Sender ID/DomainKeys Check

if [ -s white_ip_list ]; then
  for IP_ADDR in $(cat white_ip_list | sed -e "/^#/d" -e "s/^\([^[:blank:]]*\).*/\1/"); do
    iptables -A CHK-COUNTRY -s $IP_ADDR -j RETURN
  done
fi

# 国別アクセスルールをiptablesのルールに追加する
if [ -s rule_list ]; then
  for RULE in $(cat rule_list | sed -e "/^#/d" -e "s/^\([^[:blank:]]*\).*/\1/"); do
    CONTRY=$(echo $RULE | cut -d "|" -f 1)
    TARGET=$(echo $RULE | cut -d "|" -f 2)
    if [ "$TARGET" = "RETURN" ]; then
      TARGET="-j $TARGET"
    else
      TARGET="-p tcp -m state --state NEW -j $TARGET"
    fi
    if [ "$CONTRY" != "**" ]; then
      for IP in $(cat cidr.txt | grep "^$CONTRY" | sed "s/$CONTRY[^0-9]*\(.*\)/\1/"); do
        iptables -A CHK-COUNTRY -s $IP $TARGET
      done
    else
      iptables -A CHK-COUNTRY $TARGET
    fi
  done
fi

# ルールを保存する
service iptables save
----------(vi ここまで)----------

# chmod +x check_country.sh

国別アクセス制限のチェックルールリストを作成します。
# cd /usr/local/sbin/firewall

# (個別の White IP リストを作成します)
# vi white_ip_list
----------(vi ここから)----------
# ※以下は例です。
1.2.3.4                 # (例) 単独指定
1.2.3.0/24              # (例) 範囲指定 CIDR
1.2.3.0/255.255.255.0   # (例) 範囲指定 サブネットマスク
----------(vi ここまで)----------

# (ルールリストを作成します)
# vi rule_list
----------(vi ここから)----------
# (例) 中国、韓国からの接続を廃棄します
CN|DROP
KR|DROP

# (例) 日本以外からの接続を廃棄します
JP|RETURN
**|DROP                 # ** は最後の行になります
                        # 記述がない場合は **|RETURN になります

# (例) 中国、韓国からの接続は廃棄し、
#      日本以外からの接続はログに出力して廃棄します
CN|DROP
KR|DROP
JP|RETURN
**|LOG-DENY-COUNTRY
----------(vi ここまで)----------

国別アクセス制限のチェックルールを登録します。
また、IPアドレスの割当ては日々更新されていますので、定期的にスクリプトが実行されるようにします。
# # 最初に1度スクリプトを実行します
# /usr/local/sbin/firewall/check_country.sh

# (cron により定期的に実行します)
# # ※Office Nami 様サーバーへの負荷を考慮し、週1回にします
# vi /etc/cron.weekly/firewall
----------(vi ここから)----------
#!/bin/sh
# ==========================================================================================
# File    : /etc/cron.weekly/firewall
# Author  : System House ACT
#
# ファイアーウォール iptables 関連の定期実行ジョブ
#
# Copyright 2012 System House ACT All rights reserved.
# ==========================================================================================

# 国別アクセス制限(IPアドレス再取得)
/usr/local/sbin/firewall/check_country.sh > /dev/null 2>&1
----------(vi ここまで)----------

# chmod +x /etc/cron.weekly/firewall

悪質なアクセス元をブロック

出会い系サイトに代表される迷惑メールの配信傾向として、ここ最近はメール配信業者を経由することが多くなっています。
メール配信業者といっても、悪質な出会い系サイト業者からのメール配信に対して、何ら有効な対策を採ることのない業者は同列だと考えます。
そのような業者からのアクセスをブロックする設定を行います。

悪質なアクセス元のチェックルール作成スクリプトを作成します。
# cd /usr/local/sbin/firewall
# vi check_black_ip.sh
----------(vi ここから)----------
#!/bin/sh

cd /usr/local/sbin/firewall

# CHK-BLACK-IPルールを初期化する
iptables -F CHK-BLACK-IP

# BLACK-IPをルールに追加する
if [ -s black_ip_list ]; then
  for RULE in $(cat black_ip_list | sed -e "/^#/d" -e "s/^\([^[:blank:]]*\).*/\1/"); do
    IP_ADDR=$(echo $RULE | cut -d "|" -f 1)
    TARGET=$(echo $RULE | cut -d "|" -f 2)
    iptables -A CHK-BLACK-IP -s $IP_ADDR -j $TARGET
  done
fi

# ルールを保存する
service iptables save
----------(vi ここまで)----------

# chmod +x check_black_ip.sh

悪質なアクセス元 IP アドレスのリストを作成します。
# cd /usr/local/sbin/firewall
# vi black_ip_list
----------(vi ここから)----------
# Redspeed Networks (mail-b.net/mag-r.net)
27.100.28.0/22|DROP
119.82.8.0/21|DROP
119.82.152.0/21|DROP
180.222.32.0/19|DROP

# カゴヤ・ジャパン株式会社
124.248.144.0/23|DROP
203.142.207.16/28|DROP
203.142.214.0/24|DROP

# 株式会社ビーム(旧株式会社ウインズコミュニケーションズ)
61.200.43.0/25|DROP
61.209.246.0/24|DROP
210.175.80.0/24|DROP
211.8.127.0/25|DROP

# 株式会社エーアールケイ(関連会社:株式会社ウインズコミュニケーションズ)
210.175.115.0/24|DROP

# 株式会社ビーコンエヌシー
116.214.80.0/20|DROP
120.143.64.0/19|DROP

# 株式会社サイバークリエイト(旧株式会社エルメデイア)
124.146.214.0/24|DROP
202.229.6.160/27|DROP
210.150.128.0/24|DROP

# 株式会社プレミア (mail-relay.jp)
210.175.83.0/24|DROP
----------(vi ここまで)----------

悪質なアクセス元のチェックルールを登録します。
# /usr/local/sbin/firewall/check_black_ip.sh

フィードバック

記事の内容についてのご質問、ご指摘、その他ご意見等は、Weblog/Twitter にて受け付けております。

System House ACT Weblog 内記事 : CentOS サーバー運用・管理情報 iptables

トラックバックまたはコメントにてお寄せください。

Twitter では .@systemact 宛につぶやいてください。
また、こちら から、この記事についてつぶやくことができます。
a System House to build an Accounting system by the Computer Technology