GeoIP 簡単検索 Maxmind GeoLite2

目的

自動アップデートされる GeoIP データベースを無料で利用する

事前準備

MAXMIND アカウントの作成とアカウントへのログイン
 → "My License Key" の作成
   *作成時に下記の GeoIP update に使う設定ファイル (GeoIP.conf) が自動作成されるので、ダウンロードしておく
 

GeoLite2 DB 自動アップデートと検索

Ubuntu 20 では簡単
 
- install
 
$ lsb_release -d
Description: Ubuntu 20.04 LTS
$ sudo add-apt-repository ppa:maxmind/ppa
$ sudo apt update
$ sudo apt install geoipupdate
 
- import config file & configure
 
$ mkdir Maxmind
$ cd Maxmind
$ scp hoge@fuga:/GeoIP.conf .
$ echo "DatabaseDirectory $PWD" >> GeoIP.conf
 
- execute
 
$ geoipupdate -f GeoIP.conf 
$ ls
GeoIP.conf  GeoLite2-ASN.mmdb  GeoLite2-City.mmdb  GeoLite2-Country.mmdb
 
- auto update
 
$ crontab -l
5 1 * * * /usr/bin/geoipupdate -f /home/hoge/Maxmind/GeoIP.conf
 
- db search
 
$ sudo apt install libmaxminddb0 libmaxminddb-dev mmdb-bin
$ mmdblookup -f GeoLite2-City.mmdb -i 1.2.3.4
 
 
--------------------------------------------------

パブリッククラウドのサーバに DNS を設定した場合の注意点(Let's get rid of unnecessary DNS records..)

AWS などのパブリッククラウドで一時的にサーバを立て、DNS レコードを登録した場合は、サーバのシャットダウン時に DNS レコードの削除も忘れないこと。

背景 

パブリッククラウドで一時的に付与されたグローバル IP アドレスは他のアカウントと共有のため、サーバシャットダウン後に使い回される。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-instance-addressing.html#concepts-private-addresses

パブリック IP アドレスは、Amazon のパブリック IPv4 アドレスプールからインスタンスに割り当てられ、お客様の AWS アカウントには関連付けられません。パブリック IP アドレスをインスタンスから割り当て解除すると、そのパブリック IPv4 アドレスはパブリック IP アドレスプールに戻され、再利用することはできません。

手動でパブリック IP アドレスをインスタンスに関連付けること、また、手動でインスタンスから割り当て解除することはできません。場合によって、パブリック IP アドレスはインスタンスから解放されたり、新しいインスタンスに割り当てられたりします

インスタンスのパブリック IP アドレスが停止または終了すると、インスタンスのパブリック IP アドレスが解放されます。停止していたインスタンスが再起動されると、そのインスタンスには新しいパブリック IP アドレスが送信されます。

テスト

  • AWS( ap-northeast )に連続してインスタンスを建てる(1,000インスタンス
  • 付与された IP アドレスについて、実際に DNS に登録があるかを確認( PDNS を利用)
  • テスト時間:スクリプトは適当に sleep を入れてゆっくり実施し、5時間程度で終了

結果

  • 1,000 インスタンスに振られた IP アドレスのうち、DNS 登録が有効なものは 52 IP( 5 % )

 

IP address ,  FQDN

54. ***.**.*** , ***.jp

3.***.***.*** , *************.****.link

54.***.***.** , ***.****.biz

3.***.***.** , *********.com

13.***.***.*** , *******.***.net 

:

:

まとめ

  • 管理者は不要な DNS レコードを消す仕組みを作る。
  • サーバ証明書の取得など、悪用の可能性あり。
  • サーバを継続利用する場合は Elastic IP を使うなど、IP アドレスを管理下に置くことを考える。 

PDNS について

https://www.farsightsecurity.com/solutions/dnsdb/

Raspberry Pi で広告ブロック

概要

f:id:kslugger:20200420153309p:plain

稼働中の管理画面

流れ

  1. Raspberry Pi の準備
  2. ioc2rpz のサイトにアカウントを作成
  3. ioc2rpz のサイトで設定ファイルを作成
  4. Raspberry Pi で上記設定ファイルの入手とインストールを行うスクリプトを実行

チュートリアルビデオ(公式)

youtu.be

Raspberry Pi の準備

  • インターネットに接続した Raspberry Pi
  • 今のところ Raspbian のみ対応

ioc2rpz でのアカウント作成とログイン(5分)

  1. ioc2rpz でアカウントを作成
  2. 登録確認のメールが来るので承諾、サインイン

RpiDNS の設定(5分)

  1. ioc2rpz にサインイン、RpiDNS β を選択

f:id:kslugger:20200414153440p:plain

rpiDNS を選択
  1. + ボタンをクリック、設定画面に移動
  2. RpiDNS の名前(任意)を入力
  3. 使用する Raspberry Pi のハードウェアを選択

f:id:kslugger:20200414154115p:plain

ハードウェア選択
  1. RpiDNS が使用する DNS ソフトウェアを選択(現時点では BIND のみ)

f:id:kslugger:20200414154511p:plain

DNSサーバの選択
  1. 有効にする RPZ を選択(指定したハードウェアのメモリを超過しそうな場合は警告されるので、上限に収まるように取捨選択)
  2. それぞれの RPZ ごとにアクションを設定

f:id:kslugger:20200414154853p:plain

RPZ ごとにアクションを定義
  1. Add ボタンで完了

RpiDNSのインストール(10分)

  1. 完成した RpiDNS の設定画面からリンクアイコンをクリックし、cURL のリンクをコピー

f:id:kslugger:20200414160143p:plain

cURL リンクのコピー
  1. Raspberry PiSSH でログインし、コピーしたコマンドを貼り付け
$ curl 'https://ioc2rpz.net/get_rpidns_config.php?req=download&uuid=<略>' -o ioc2rpz_community_install.sh
  1. 作成されたファイルを実行
$ sudo bash ioc2rpz_community_install.sh
  1. 正常に終了すれば、最後に管理画面の URL とパスワードが出力されるので、メモ
#########
RpiDNS was installed
#########
Management console: https://<つけた名前>.rpidns.ioc2rpz.local/rpi_admin/
Username: rpiadmin
Password: <略>

DNS サーバの切り替えと動作確認(5分)

  1. 端末の DNS サーバの設定を RpiDNS の IP アドレスに切り替え(あるいは DHCP サーバのオプションで DNS サーバを変更)
  2. ブラウザから上記の Management Console に記載の URL に接続(ユーザ名とパスワードもコピペ)
  3. いくつかのサイトにアクセス、Dashboard でブロックされたホストのログを確認

f:id:kslugger:20200420144707j:plain

ブロック警告画面(デフォルト)

その他

  • 見れなくなったサイトやアプリ
- ヤフー(日本)のブラウジング
- iphone アプリではヤフー(日本)関連、その他、乗換案内や駅すぱあとなど
- ブロックしているのは notracking.ioc2rpz "No more ads, tracking and other virtual garbage"
- 回避のためホワイトリストに入れることはできるが、どのドメインを許可すればいいのかログから判断するのが面倒
  • 管理コンソールや警告画面の証明書エラーを回避
- RpiDNS のルート証明書を取得( Admin > Downloads からルート証明書をダウンロード)
- 各端末にインストール
  • 管理画面のログの時刻を日本時刻に変更
OSのタイムゾーンが日本の場合

$ timedatectl | grep zone
Time zone: Asia/Tokyo (JST, +0900)
$ cd /opt/rpidns/www/rpi_admin/
$ sudo cp rpidata.php rpidata.php.bak
$ sudo sh -c 'sed -e "s/%Y-%m-%dT%H:%M:%SZ/%Y-%m-%dT%H:%M:%S/g" -e "s/'utc'/'localtime'/g" rpidata.php > rpidata.php.new'
$ sudo ln -sf rpidata.php.new rpidata.php
$ sudo systemctl restart php7.3-fpm.service
  • 管理画面の表示を MAC アドレスからわかり易い名前に変更
Admin > Assets で MAC アドレスごとに NAME を設定

リソース

https://github.com/Homas/ioc2rpz/
https://ioc2rpz.net/
https://www.raspberrypi.org/

Secure DNS with DoH client authentication 【無料枠パブリッククラウドに TLS/SSL 認証する自分専用の DoH サーバを建てる】

  • 自分の DNS 検索を見られるのが恥ずかしいので、パブリッククラウド上に DoH サーバを建てる

  • 費用かけられないので DoH サーバは GCP の無料枠の Micro を使う

  • 移動したり複数の端末から使うので、IP アドレスでの接続制限はできない、が、オープンリゾルバにはしたくない

  • せっかくの HTTPS なので TLS のクライアント認証をはめて DNS を自分専用にする 

  • この時点でのクライアント側の DoH + TLS クライアント認証対応状況の例 --> Mozilla 不可、curl 不可、dnscrypt-proxy(v2.0.40 ~) 可能

  • クライアントは dnscrypt-proxy 一択

  • サーバは Nginx で TLS 認証、doh-proxy から Unbound あたりが手っ取り早いか(多段だけど)

  • Windows 10 に dnscrypt-proxy を入れたが、そんなにもっさりした感じはしない(ブラウザが DNS Prefetching やってくれているおかげか?)

  • GCP 無料枠がアメリカなのでネットワーク遅延はある。。。

 

This post is a quick example of secure DNS lookup in public clouds.

 

The latest release of dnscrypt-proxy (v2.0.40) has added TLS client authentication for DoH. DoH client like firefox or curl don't look to support this yet, so using dnscrypt-proxy would be one of the easiest way to make our personal DoH servers more private at the moment. 

https://github.com/dnscrypt/dnscrypt-proxy/releases/tag/2.0.40

 

0. topology

 

 [your PC]  -- DoH + Auth --> [your personal DoH server in a public cloud] -- DNS --> (DNS tree)

 

f:id:kslugger:20200517013805j:plain

1. DoH server 

  - nginx (TLS termintation + authentication) https://github.com/nginx/nginx

  - doh-proxy (DoH + forwarder to localhost)  https://github.com/jedisct1/rust-doh

  - unbound (full service resolver especially for localhost + qname minimization) https://github.com/NLnetLabs/unbound

 

  # Any other softwares can be used, of course. ;-)

 

2. DoH client

  - dnscrypt-proxy (v2.0.40, TLS client authentication enabled) https://github.com/DNSCrypt/dnscrypt-proxy

 

3. DoH client configuration

  - calculate your personal DoH server's DNS stamp  https://dnscrypt.info/stamps/

  - copy your TLS public and private key into dnscrypt-proxy directory 

  - adjust dnscrypt-proxy configuration something like below:

  

    ##################################
    # Global settings #
    ##################################

    
    server_names = ['myserver']

     

    ################################
    # TLS Client Authentication #
    ################################

    [tls_client_auth]

    creds = [
    { server_name='myserver', client_cert='user1.pem', client_key='user1.key' },
    ]

    
    ################################
    # Anonymized DNS #
    ################################

    [static]

    [static. 'myserver']
    stamp = 'sdns://MY_SERVERS_STAMP'

 

4. Logs

  - DoH client (dnscrypt-proxy) log

    [NOTICE] dnscrypt-proxy 2.0.40
    [NOTICE] Network connectivity detected
    [NOTICE] Source [relays] loaded
    [NOTICE] Source [public-resolvers] loaded
    [NOTICE] Firefox workaround initialized
    [NOTICE] Now listening to 127.0.0.1:53 [UDP]
    [NOTICE] Now listening to 127.0.0.1:53 [TCP]
    [NOTICE] [myserver] Cert: user1.pem, Key: user1.key
    [NOTICE] [myserver] OK (DoH) - rtt: 219ms
    [NOTICE] Server with the lowest initial latency: myserver (rtt: 219ms)
    [NOTICE] dnscrypt-proxy is ready - live servers: 1 

 

f:id:kslugger:20200517184759j:plain

Delay (JP-US)

 

5. Next steps

  - move the server from Oregon to Tokyo, but it isn't free..

  - remove nginx from the server and offload tls_auth to CDN local pops, but it may not be free..