linux コンピュータ

53番ポートが繋がらない環境で無理やりDNSサーバに接続するお話

2018年6月6日

状況

現在進行している案件で早急に開発環境構築をする際に新しくサーバを作らなくなった。
書類作成し申請、通常2週間かかるところを早く作ってくれとお願いしたら当日に作ってくれたが、「申請書通りに作ったので修正したい場合は再申請してね」というメッセージとともにサーバ情報が記載されていた。

太文字がやけに意味深なので確認してみると「DNSのポートが開いていないので名前解決できないよ」と笑いながら返答してきた。

再申請を行ったが、設定されるまで時間がかかることから何か代替案がないかということでこの物語はスタートする。

現状

サーバはminimal構成されたCentOS7.1

物理FWでDNS通信用のポート(TCP・UDP:53番ポート)が閉じられているため、いくらサーバ側のソフトウェアFWで開放してもDNSサーバに接続することができない。

接続できるポートは

  • TCP:22(外⇒内)※IP規制あり
  • TCP:80(内⇔外)
  • TCP:443(内⇔外)

であった。

22ポートが内⇔外だとSSHのポートフォワーディングで行えるのだが、外⇒

22ポートが内⇔外だとSSHのポートフォワーディングで行えるのだが、外⇒内の一方通行のため、使用することができない。

CentOS7のminimal構成はnslookupやdigコマンドが使えないのでcurlで確認。確かに名前解決は失敗する。

対策

hostsで運用する方法や手動で名前解決し、IPアドレス直打ちでする方法があるが、どれも現実的ではない。
そのため、他に対策方法ないかなと考えていたら、そういやGoogleでpublic DNSでHTTP上からアクセスできたなーっていうことを思い出したので使ってみることにした。

DNS over HTTPS(doh)

DNSはUDP及びTCPの53番ポートを使って通信を行うのですが、平文送信であるため盗み見や改ざんというセキュリティリスクがありました。
それを防ぐ目的でHTTPS上でDNS問い合わせを行おうと標準化に向けて取り組みを行われており、2018年度内完了目標とのことだそうです。

まぁ、改ざんに対しての対策としてDNSSECといった公開鍵暗号化方式を用いた通信がすでにあるんですが、DNSSECに対応したサーバが少ないことや暗号化通信じゃないので盗聴リスクがあることからもdohは普及されるかもと言われています。

HTTPS上に乗せるだけなので導入しやすいですしね。

現時点でGoogleやCloudflareなどが使えるようで、実際にやってみるとJSONデータでやり取りするみたいです。

https://dns.google.com/resolve?name=kaede.jp&type=A
{
	"Status": 0,
	"TC": false,
	"RD": true,
	"RA": true,
	"AD": false,
	"CD": false,
	"Question": [
		{
			"name": "kaede.jp.",
			"type": 1
		}
	],
	"Answer": [
		{
			"name": "kaede.jp.",
			"type": 1,
			"TTL": 299,
			"data": "133.130.113.153"
		}
	],
	"Comment": "Response from ...."
}

他いろいろ見てみたい方はこちらからどうぞ

Cloudflareだとproxy-dnsを用いてdohが使えるコマンドがあるそうなので使ってみることにしました。

Cloudflareを使ったdoh

まず初めに、/etc/resolv.confやnmtuiコマンドでDNSの設定を127.0.0.1に変更します。

# Generated by NetworkManager
#nameserver 8.8.8.8
nameserver 127.0.0.1

次にCloudFlareからツールをPC上にダウンロードし、SCP等でサーバにアップロードして解凍⇒実行します。

[root@localhost ~]# tar xvfz cloudflared-stable-linux-amd64.tgz
cloudflared
[root@localhost ~]# ./cloudflared proxy-dns
WARN[0000] Cannot determine default configuration path. No file [config.yml config.yaml] in [~/.cloudflared ~/.cloudflare-warp ~/cloudflare-warp /usr/local/etc/cloudflared /etc/cloudflared]
INFO[0000] Adding DNS upstream url="https://1.1.1.1/dns-query"
INFO[0000] Adding DNS upstream url="https://1.0.0.1/dns-query"
INFO[0000] Starting DNS over HTTPS proxy server addr="dns://localhost:53"
INFO[0000] Starting metrics server addr="127.0.0.1:41138"

Starting metrics serverになったらDNSが接続状態になります。

この状態のままだとDNS確認ができないため、アンパサンド(&)を最後につけるバックラウンド実行を行うか別ターミナルを開き、SSH接続します。

[root@localhost ~]# curl kaede.jp
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

301が出てますが、正常にDNS取得ができています。
これでyumを使ってupdate、installなど簡単にできるようになりました。

digコマンドで見る

yum -y install bind-utilsでdig及びnslookupを使える状態にし、コマンドをたたいてみました。

[root@localhost ~]# dig @127.0.0.1 kaede.jp

; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> @127.0.0.1 kaede.jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32040
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1536
;; QUESTION SECTION:
;kaede.jp. IN A

;; ANSWER SECTION:
kaede.jp. 300 IN A 133.130.113.153

;; Query time: 43 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: 水 6月 06 09:12:19 JST 2018
;; MSG SIZE rcvd: 61

ちゃんと名前解決できます。

さいごに

内部DNSを使ってる環境だと思っており、今までの申請書でもDNSの開通は記載してなかったのに、意地悪されちゃいました。

こんなケースは滅多にないでしょうが、HTTPSがあればDNSも使えるっていうことがわかり無事解決できてよかったです。

最近はSSL移行が流行ってますね。なんでも暗号化、秘匿化になりつつあるIT世界です。

dnscrypt-proxyでもdohは使えるみたいなのですが、なぜかうまく通信できなかった。今度再チャレンジしてみよ。

-linux, コンピュータ
-, ,