CloudFlareでのiptables設定例

シェアする

  • このエントリーをはてなブックマークに追加
CloudFlare使用中のサーバーIPアドレスの漏洩を防ぐ手だての1つとして、iptables等のファイアウォールを使用してCloudFlareの使用するIPアドレス以外からのアクセスを拒否する方法があります。

By: Glen


この方法を使うことで、CloudFlare以外からのhttp/httpsアクセスを拒否しCloudFlareを経由しない通信ができないようにできます。
なお、この方法はroot権限が使用可能な環境でのみ使用できます。従って、root権限のない共有サーバーでは使用できませんのでご了承ください。

スクリプト

具体的なスクリプトは次の通りです。

#!/bin/bash
##
#
# cf_iptables
# ===========
#
# Simple iptables script for cloudflare
# 
# Sets iptables rules to only allow cloudflare IP ranges
# This stops direct traffic from visitors / hackers & means every visitor is
# connecting via cloudflare.
#
##
# equk 2014 - equk.co.uk
# Modified by Shizusa Tsubasa - shizusa.net
##
# check if root (required for iptables)
if [ $(whoami) != "root" ]; then
    echo "ERROR: Please Run As Root User (required for iptables)"
    exit 1
fi
# check argument
if [ "$#" != "1" ]
then
    echo "ERROR: Please Specify One Network Interface Name"
    exit 1
fi
# cloudflare ipv4
for i in `curl https://www.cloudflare.com/ips-v4`; do iptables -I INPUT -i $1 -p tcp -s $i --dport http -j ACCEPT; done
for i in `curl https://www.cloudflare.com/ips-v4`; do iptables -I INPUT -i $1 -p tcp -s $i --dport https -j ACCEPT; done
# cloudflare ipv6
for i in `curl https://www.cloudflare.com/ips-v6`; do ip6tables -I INPUT -i $1 -p tcp -s $i --dport http -j ACCEPT; done
for i in `curl https://www.cloudflare.com/ips-v6`; do ip6tables -I INPUT -i $1 -p tcp -s $i --dport https -j ACCEPT; done
# drop all others ipv4
iptables -A INPUT -i $1 -p tcp --dport http -j REJECT --reject-with tcp-reset
iptables -A INPUT -i $1 -p tcp --dport https -j REJECT --reject-with tcp-reset
# drop all others ipv6
ip6tables -A INPUT -i $1 -p tcp --dport http -j REJECT --reject-with tcp-reset
ip6tables -A INPUT -i $1 -p tcp --dport https -j REJECT --reject-with tcp-reset

使い方

拡張子shとして保存し、起動時と一定時間おきに実行してください。引数は必須で、ネットワークインタフェース名(例:eth0)を指定します。
定期的にiptables -Fを使用した後に実行してください。こうすることで、CloudFlareのIPアドレス帯が変更されても古いIPアドレスを消去できます。

スクリプトについて

このスクリプトは、CloudFlareが公開しているIP帯のファイルからIPアドレスを取得し、iptablesに登録した上でそれ以外のIPアドレスからのhttp/httpsアクセスを遮断するものです。
equk’s blogのスクリプトがベースですが、次のような改修を施しています。

RSTパケットにより接続を切断

元のスクリプトでは接続をDROPしていましたが、これでは当該ホストでHTTPサーバーが動作していることが分かってしまいます。アクセスは拒否できますが、80番および443番ポートで何かが動いているというヒントを攻撃者に与えてしまいます。
RSTパケットにより接続をREJECTすることで、当該ポートが閉じているように見せかけることができます。

インタフェースを引数で指定可能にした

元のスクリプトではインタフェースを指定していないため、ループバックインタフェース(lo)を含めすべてのインタフェースで同じように制限がかかります。従って、ローカルネットワークを構成していたり、ローカルホストにアクセスするスクリプトやソフトウェアがある場合は動作に支障が出ます。
-sオプションでインタフェースが指定できるため、これを引数で指定できるようにしています。

なお、使用されなくなったIPアドレスを削除する機能はついていません。定期的にiptables -Fを使用してルールをクリアしてください。この操作を行うとすべてのiptablesに設定されたルールが消去されるため、実行時のセキュリティにはご注意ください。

広告





シェアする

  • このエントリーをはてなブックマークに追加

フォローする