えいのうにっき

a-knowの日記です

nginx で EU からのアクセスを拒否する

「あ、EUからのアクセスを拒否したいな......」と思うこと、ありますよね。私も今日、そう思いました。

私は趣味と実益を兼ねて(いるつもり)、いくつかのしょうもないWebサービスを個人で運用してるのですが、そこに対するEUからのアクセスを遮断したいと思い、それを nginx で対応してみたので、そのメモです。

手順

基本的にはこちら↓の知見の固まりを参考文献としています。

inaba-serverdesign.jp

EU加盟国は、外務省のページ(EU加盟国と地図 第5次拡大|外務省)によると以下の28カ国。

  • アイルランド
  • イタリア
  • 英国
  • エストニア
  • オーストリア
  • オランダ
  • キプロス
  • ギリシャ
  • クロアチア
  • スウェーデン
  • スペイン
  • スロバキア
  • スロベニア
  • チェコ
  • デンマーク
  • ドイツ(加盟時西ドイツ)
  • ハンガリー
  • フィンランド
  • フランス
  • ブルガリア
  • ベルギー
  • ポーランド
  • ポルトガル
  • マルタ
  • ラトビア
  • リトアニア
  • ルーマニア
  • ルクセンブルク

これを国コードに置き換えると以下のようになります。

  • IE
  • IT
  • GB
  • EE
  • AT
  • NL
  • CY
  • GR
  • HR
  • SE
  • ES
  • SK
  • SI
  • CZ
  • DK
  • DE
  • HU
  • FI
  • FR
  • BG
  • BE
  • PL
  • PT
  • MT
  • LV
  • LT
  • RO
  • LU

そして、この国コード別でIPv4アドレスリストを加工して公開してくださっている素晴らしい方がおられます。

世界の国別 IPv4 アドレス割り当てリスト

ここから取得したアドレスリストに対し、以下のような sed コマンドを使って nginx の conf として使えるアクセス拒否ルールを作成。

sed -n 's/^IE\t\(.*\)/deny \1;/p' cidr.txt > dropip.conf
sed -n 's/^IT\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^GB\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^EE\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^AT\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^NL\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^CY\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^GR\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^HR\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^SE\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^ES\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^SK\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^SI\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^CZ\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^DK\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^DE\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^HU\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^FI\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^FR\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^BG\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^BE\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^PL\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^PT\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^MT\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^LV\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^LT\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^RO\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf
sed -n 's/^LU\t\(.*\)/deny \1;/p' cidr.txt >> dropip.conf

愚直です。

$ wc -l dropip.conf 
40564 dropip.conf

すごい。

そして、これを nginx の conf の中で include する。もし他に include しているものがあれば、その前に。

    include /etc/nginx/dropip.conf;
    include /etc/nginx/conf.d/*.conf;

最後に nginx を reload して完了。

以下が具体的な対応ログだったりしますので、よければご参考まで。

Deny access from EU countries by a-know · Pull Request #23 · a-know/yukizuri-provisioning · GitHub