ECSでDNS over HTTPSを設定
はじめに
本記事では、中国のGreat Firewall対策としてDNSキャッシュポイズニングを避けるDNS over HTTPS (DoH) の設定についてご紹介します。
結論から言うと、DNS over HTTPS (DoH) の設定は出来ましたが、GFW超えはできませんでした。
DNSCrypt について
オープンソースの DoHプロジェクトです。
このプロジェクト内で、DoH クライアントのDNSプロキシソフトウェアとして dnscrypt-proxy があります。
DNSCrypt v2、DNS-over-HTTPS、Anonymized DNSCrypt などの最新の暗号化されたDNSプロトコルをサポートする柔軟なDNSプロキシです。
Cloudflare のキャッシュDNSについて
Cloudflareが用意しているパブリックに利用可能なキャッシュDNSサーバです。有名ですね。
キャッシュDNS サーバ : 1.1.1.1 / 1.0.0.1
このキャッシュサーバは DoH のためのエンドポイントを用意しています。
https://cloudflare-dns.com/dns-query
利用方法はこちらを見てください。
ドキュメントではCloudflareが開発しているクライアントソフト cloudflared からこの https://cloudflare-dns.com/dns-query を利用する方法が紹介されていますが、dnscrypt-proxy からもこのエンドポイントを利用することが出来ます。
設定方法を見ていきます。
dnscrypt-proxy のインストール
Linux のインストール方法はこちらです。この内容に沿ってやっていきます。
ECS は root 権限です。
ss -lp 'sport = :domain'Netid State Recv-Q Send-Q Local Address:Port Peer Address:Porttcp LISTEN 0 128 127.0.0.1:domain *:* users:(("unbound",pid=28146,fd=6))tcp LISTEN 0 128 127.0.0.1:domain *:* users:(("unbound",pid=28146,fd=4))systemctl stop systemd-resolvedsystemctl disable systemd-resolvedss -lp 'sport = :domain'Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
Githubから最新のソフトウェアを確認して、ダウンロードします。
2020/08/24 時点では、2.0.44 が最新バージョンでした。
ECS の Linux の場合には、dnscrypt-proxy-linux_x86_64-2.x.xx.tar.gz がファイル名となります。
wget https://github.com/DNSCrypt/dnscrypt-proxy/releases/download/2.0.44/dnscrypt-proxy-linux_x86_64-2.0.44.tar.gztar -zxvf dnscrypt-proxy-linux_x86_64-2.0.44.tar.gzcd linux-x86_64cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml./dnscrypt-proxy -version./dnscrypt-proxy[2020-08-24 20:47:32] [NOTICE] Sorted latencies:[2020-08-24 20:47:32] [NOTICE] - 30ms nextdns[2020-08-24 20:47:32] [NOTICE] - 55ms jp.tiar.app[2020-08-24 20:47:32] [NOTICE] - 55ms geekdns-doh-ext[2020-08-24 20:47:32] [NOTICE] - 57ms jp.tiar.app-doh[2020-08-24 20:47:32] [NOTICE] - 155ms jp.tiarap.org[2020-08-24 20:47:32] [NOTICE] - 162ms quad9-dnscrypt-ip4-nofilter-pri・・・[2020-08-24 20:47:32] [NOTICE] - 1088ms quad101[2020-08-24 20:47:32] [NOTICE] - 1252ms bcn-doh[2020-08-24 20:47:32] [NOTICE] - 1405ms dnscrypt.ca-2-doh[2020-08-24 20:47:32] [NOTICE] Server with the lowest initial latency: nextdns (rtt: 30ms)[2020-08-24 20:47:32] [NOTICE] dnscrypt-proxy is ready - live servers: 68
dnscrypt-proxyは起動したまま、別のターミナルでECSへアクセスしてください。
resolve.conf 設定を変更
resolveの指定を、dnscrypt-proxy (つまりECS自身)に変更します。
cp /etc/resolv.conf /etc/resolv.conf.backupnameserver 127.0.0.1options edns0./dnscrypt-proxy -resolve example.comResolving [facebook.com]Domain exists: yes, 4 name servers foundCanonical name: facebook.com.IP addresses: 157.240.22.35, 2a03:2880:f131:83:face:b00c:0:25deTXT records: v=spf1 redirect=_spf.facebook.com google-site-verification=A2WZWCNQHrGV_TWwKh6KHY90tY0SHZo_RnyMJoDaG0s google-site-verification=wdH5DTJTc9AYNwVunSVFeK0hYDGUIEOGb-RReU6pJlYResolver IP: 172.69.32.84
続いて、キャッシュDNSサーバにCloudflareを指定します。
dnscrypt-proxyの設定で Cloudflare を指定
./dnscrypt-proxy -versionvi dnscrypt-proxy.tomlserver_names = ['cloudflare', 'cloudflare-ipv6']./dnscrypt-proxy[2020-08-24 21:13:30] [NOTICE] dnscrypt-proxy 2.0.44[2020-08-24 21:13:30] [NOTICE] Network connectivity detected[2020-08-24 21:13:30] [NOTICE] Now listening to 127.0.0.1:53 [UDP][2020-08-24 21:13:30] [NOTICE] Now listening to 127.0.0.1:53 [TCP][2020-08-24 21:13:30] [NOTICE] Source [relays] loaded[2020-08-24 21:13:30] [NOTICE] Source [public-resolvers] loaded[2020-08-24 21:13:30] [NOTICE] Firefox workaround initialized[2020-08-24 21:13:32] [NOTICE] [cloudflare] OK (DoH) - rtt: 650ms[2020-08-24 21:13:32] [NOTICE] Server with the lowest initial latency: cloudflare (rtt: 650ms)[2020-08-24 21:13:32] [NOTICE] dnscrypt-proxy is ready - live servers: 1
設定は以上です。
DoH設定はしたが、GFWは超えられない
これで中国国内のキャッシュDNSによるDNSポイズニングを回避することができます。
dig facebook.com +short75.126.164.178dig facebook.com +short69.171.248.128dig facebook.com +short75.126.164.178dig facebook.com +short75.126.164.178dig facebook.com +short67.228.235.91dig facebook.com +short31.13.86.1dig facebook.com +short157.240.22.35dig facebook.com +short157.240.22.35dig facebook.com +short157.240.22.35dig facebook.com +short157.240.22.35dig facebook.com +short157.240.22.35tcpdump -i eth0 -n port 53 or port 44322:24:04.121170 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [S], seq 804152926, win 29200, options [mss 1460,sackOK,TS val 3646337796 ecr 0,nop,wscale 7], length 022:24:04.411794 IP 1.0.0.1.https > 192.168.100.249.46062: Flags [S.], seq 1308200225, ack 804152927, win 65535, options [mss 1460,nop,nop,sackOK,nop,wscale 10], length 022:24:04.411831 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [.], ack 1, win 229, length 022:24:04.412129 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [P.], seq 1:289, ack 1, win 229, length 28822:24:04.702571 IP 1.0.0.1.https > 192.168.100.249.46062: Flags [.], ack 289, win 66, length 022:24:04.705915 IP 1.0.0.1.https > 192.168.100.249.46062: Flags [.], seq 1:1461, ack 289, win 66, length 146022:24:04.705926 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [.], ack 1461, win 251, length 022:24:04.705943 IP 1.0.0.1.https > 192.168.100.249.46062: Flags [P.], seq 1461:2553, ack 289, win 66, length 109222:24:04.705949 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [.], ack 2553, win 274, length 022:24:04.706880 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [P.], seq 289:353, ack 2553, win 274, length 6422:24:04.706948 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [P.], seq 353:439, ack 2553, win 274, length 8622:24:04.707015 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [P.], seq 439:604, ack 2553, win 274, length 16522:24:04.707046 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [P.], seq 604:703, ack 2553, win 274, length 9922:24:04.997449 IP 1.0.0.1.https > 192.168.100.249.46062: Flags [.], ack 353, win 66, length 022:24:04.997472 IP 1.0.0.1.https > 192.168.100.249.46062: Flags [.], ack 439, win 66, length 022:24:04.997527 IP 1.0.0.1.https > 192.168.100.249.46062: Flags [.], ack 604, win 67, length 022:24:04.997632 IP 1.0.0.1.https > 192.168.100.249.46062: Flags [.], ack 703, win 67, length 022:24:04.998953 IP 1.0.0.1.https > 192.168.100.249.46062: Flags [P.], seq 2553:2624, ack 703, win 67, length 7122:24:04.999062 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [P.], seq 703:734, ack 2624, win 274, length 3122:24:05.288907 IP 1.0.0.1.https > 192.168.100.249.46062: Flags [.], ack 734, win 67, length 022:24:06.768028 IP 1.0.0.1.https > 192.168.100.249.46062: Flags [P.], seq 2624:3354, ack 734, win 67, length 73022:24:06.808203 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [.], ack 3354, win 297, length 022:24:36.768389 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [P.], seq 734:758, ack 3354, win 297, length 2422:24:36.768431 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [F.], seq 758, ack 3354, win 297, length 022:24:37.059664 IP 1.0.0.1.https > 192.168.100.249.46062: Flags [.], ack 758, win 67, length 022:24:37.059862 IP 1.0.0.1.https > 192.168.100.249.46062: Flags [F.], seq 3354, ack 759, win 67, length 022:24:37.059872 IP 192.168.100.249.46062 > 1.0.0.1.https: Flags [.], ack 3355, win 297, length 0
最後に
これならGFW超えができそうな気がしましたが、実際には facebook にはアクセス出来ませんでした。
おそらく正常なIPアドレス自体が443/80で中国ISPにブロックされているのだろうと思います。
とは言っても中国に限らずDNSのセキュリティとしては良い設定だと思いますので、是非試してみてください。