それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

cloudflare 以外からのアクセスを拒否する/ipsetとiptablesで

linux のFWで特定のアクセス元だけを許可する。

たとえば、cloudflare からのアクセスを許可して、通常のアクセスは全部拒否する。

アクセス元IPで接続を限定する。 クラウドVPSにデータを置くときには、アクセス制限をキッチリやらないから、情報漏洩が起きたときに被害甚大で「何万人」のデータが閲覧可能だったみたいな報道になっちゃうわけで。

cloudflareのIPリストはこれ

2021-04-06 現在では、次の場所に公開されています。https://www.cloudflare.com/ips/

173.245.48.0/20
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
141.101.64.0/18
108.162.192.0/18
190.93.240.0/20
188.114.96.0/20
197.234.240.0/22
198.41.128.0/17
162.158.0.0/15
104.16.0.0/12
172.64.0.0/13
131.0.72.0/22

ipset でリストを作る。

ipset create cloudflare
curl -s https://www.cloudflare.com/ips-v4 | xargs -n 1   echo sudo ipset add cloudflare @

アクセス元IPで制限。

cloudflare以外のアクセスを全部拒否する。

送信元のIPアドレスが指定のポートに来たときにチェックして、特定のIPアドレス以外を全部削除(DROP)する設定を次のように iptablesに入れてやる。

IF=eth0
dport=443
list=cloudflare
iptables -A INPUT -i $IF -p tcp -m comment --comment "takuya: deny ${dport} no cloudflare " \
   -m conntrack  \
   --ctstate NEW -m tcp --dport $dport -m set ! --match-set $list src -j DROP

消したいときは -Aを-Dに変える。

IF=eth0
dport=443
list=cloudflare
iptables -D INPUT -i $IF -p tcp -m comment --comment "takuya: deny ${dport} no cloudflare " \
   -m conntrack  \
   --ctstate NEW -m tcp --dport $dport -m set ! --match-set $list src -j DROP

iptablesについて。

上記の書き方だと次のとおりになる。

削除(DROP)ではなく拒否・拒絶(REJECT)でもいい。

-A は先頭にルールを追記するので即座にルールが最優先でマッチングされる。

-m comment --comment 'コメント' は、コメントを突っ込むモジュール。iptables -Lしたときにコメントが表示されるので便利。

-m tcptcp接続に限定している。http2 は UDPも使うので tcp はなくてもいいかもしれない。

-dport は宛先ポート

-m conntrack --ctstate NEWTCP新規接続を指定している。(SYN+SYN/ACK+SYN)の SYNを指定する。

-m set は ipset を使う設定。マッチしたときに適用される。 ! -m set は 否定でマッチしないとき(set以外)に適用される。

-set name は ipset のルール名を指定する。

参考資料

Allowing Cloudflare IP addresses – Cloudflare Help Center