※ 以下の内容は iptables-1.4.7-5.1.el6_2.x86_64 を対象に記述しています。
# 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
# 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
# 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 ここまで)----------
# # 最初に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
# 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
System House ACT Weblog 内記事 : CentOS サーバー運用・管理情報 iptables
トラックバックまたはコメントにてお寄せください。-- Contents -- |
Top |
代表の経歴 |
サーバー構築・運用 |
メールサーバー |
ウェブサーバー |
開発環境(Linux) |
開発環境(Windows) |
Eclipse |
製品情報 |
BOINC(WCG) |
Archives |
公式ブログ |
Weblog(旧ブログ) |