Cloudflare とは、無料で簡単に使えるCDN(コンテンツ・デリバリー・ネットワーク)サービスです。
Cloudflareを導入すると、ウェブサーバへのアクセスが、すべてCloudflare経由になります。そのため、ウェブサーバのiptablesの設定で、ウェブサーバへのHTTPとHTTPSのアクセスをCloudflareのIPアドレスに制限することができます。
そこで、CloudflareのIPアドレスを自動的に取得して、iptablesに設定するようにしてみました。
まず、CloudflareのIPアドレスは、 Cloudflareの「IP Ranges」のページ に載っています。そのページにある通り、IPv4のアドレスのリストだけのページが https://www.cloudflare.com/ips-v4 に用意されています。
次に、IPアドレスのリストを取得して、iptablesを設定する方法が、Cloudflareのブログ記事「How do I whitelist Cloudflare’s IP addresses in iptables?」に載っています。
しかし、今回は、そのブログにある方法ではなく、以下のようなスクリプトを作成して、設定しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#!/bin/bash iptables -F iptables -X ## Deafult Rule ################################################## iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP ## OUTPUT ######################################################## iptables -A OUTPUT -j ACCEPT ## INPUT ######################################################### ## ALLOW ESTABLISHED and RELATED iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT iptables -A INPUT -m state --state RELATED -j ACCEPT ## loopback iptables -A INPUT -i lo -j ACCEPT ## trusted ip iptables -A INPUT -s 192.168.1.2 -j ACCEPT ## http, https cloudflare_ipsv4="https://www.cloudflare.com/ips-v4" ipranges=() for ip in $(curl -s ${cloudflare_ipsv4}); do if [[ $ip =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/[0-9]{1,2} ]]; then ipranges+=($ip) fi done if [ ${#ipranges[*]} -eq 0 ]; then iptables -A INPUT -p tcp -m multiport --dports http,https -j ACCEPT else for ip in "${ipranges[@]}"; do iptables -A INPUT -p tcp -m multiport --dports http,https -s $ip -j ACCEPT done fi ## Others iptables -A INPUT -j DROP |
可用性を考えて、IPアドレスのリストの取得に失敗した場合は、すべてのIPアドレスからのHTTPとHTTPSのアクセスを許可しています。
スクリプトの設定方法は、以前の記事「Debianでのiptables設定」の通りに行いました。