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 tcp
は tcp接続に限定している。http2 は UDPも使うので tcp はなくてもいいかもしれない。
-dport
は宛先ポート
-m conntrack --ctstate NEW
はTCP新規接続を指定している。(SYN+SYN/ACK+SYN)の SYNを指定する。
-m set
は ipset を使う設定。マッチしたときに適用される。 ! -m set
は 否定でマッチしないとき(set以外)に適用される。
-set name
は ipset のルール名を指定する。