Ubuntu日本語フォーラム
ログインしていません。
質問させていただきます。
■■概要
Ubuntu16.04において、squidをつかったWebプロキシを立ち上げようとしていますが、Windows端末からこのsquidを経由したWebページの取得・表示に10秒以上かかってしまいます。同じWindows端末でこのsquidを使用しない場合は即座にWebページが表示できます。
このUbuntu16.04+Squidのプロキシを使用した場合でも正常にWebページを参照できるようにしたいです。
通信を見たところ、Ubuntu+squidで生じるIPv6の名前解決の動作に問題がありました。
状況の認識と解決策について、
・後述する状況・原因の考察(想像)についてのご指摘
・改善に向けた対処
などについて、皆さんのご意見をいただきたいです。
■■状況
■問題が生じている機器の構成
●問題のホスト
Ubuntu 16.04のホストで、squidを走らせています。
【IPアドレス】192.168.11.2、2409:10:29c0:f0:20c:29ff:fed6:63bd
【Kernelについて】:~$ uname -a
Linux (省略) 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
【ディストリビューションについて】:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"
【squidについて】$ dpkg -l | grep squid
ii squid 3.5.12-1ubuntu7.5 amd64 Full featured Web Proxy cache (HTTP proxy)
ii squid-common 3.5.12-1ubuntu7.5 all Full featured Web Proxy cache (HTTP proxy) - common files
ii squid-langpack 20150704-1 all Localized error pages for Squid
●DNSサーバ
192.168.11.1 Buffalo社 WXR-1900DHP2 ファームウェアはVer.2.53
●Squidを利用するWebクライアント
192.168.11.12 Windows10 + Chrome 65.03325.181
■パケットの情報
squidを動かしているホストでパケットを取得しました。それを下記に置きました。
https://onedrive.live.com/?authkey=%21ADXbfAXH51zYeoo&id=4B5326FB0D244625%211308&cid=4B5326FB0D244625
なお、このファイルは個人で提供しているので、いずれ消しますがご容赦ください。
■問題の状況
●前提
Ubuntu(192.168.11.2)がsquidサーバになります。
LAN内のWindowsホスト(192.168.11.12)がsquidを経て、http://www.kame.net/を参照します。
UbuntuおよびWindowsと同じリンクにあるゲートウェイ兼DNSは192.168.11.1です。
WindowsホストでURL入力して通信を開始した後、Webページの表示まで10秒以上かかりました。
●通信の説明
Ubuntuで取得した前述のパケットファイルをもとにしますが、なくてもできるだけ想像できるように書きます。
通信の流れはまず、WindowsホストがSquidサーバに接続して、HTTPの要求を送るところから始まります。
パケット1(0秒000.0ミリ秒)からWindowsホストによるTCPの3wayがはじまっており、
パケット4(0秒001.6m秒)でwww.kame.netへの接続を要求します。
そしてsquidによりUbuntuは、パケット6(0秒001.7m秒)でAのDNSクエリを、パケット7(0秒001.7m秒)でAAAAのDNSクエリをDNSサーバに投げます。
BuffaloのDNSサーバが、パケット8(0秒014.2m秒)で応答しています。
このパケット8には、
・Answer Sectionに、kameのAレコード
・Additional Sectionに、kameのAAAAレコード
が書かれています。
しかし、squidは一向にクエリをに出しません。
Ubuntuはさらに、パケット9(5秒350.9m秒)パケット10(15秒352.8m秒)でAAAAのクエリを繰り返します。
そして、そのパケット10のDNSクエリをうけて、
BuffaloのDNSサーバがパケット11(15秒364.2m秒)で応答、こんどは
・Answer Sectionで、kameのAAAAレコード(2001:200:dff:fff1:216:3eff:feb1:44d7)
としています。
その直後にSquidがパケット12(15秒364.3m秒)でTCPをはじめます。
以降、パケット16(15秒377.6m秒)でHTTPクエリを送りサーバに向けて出し、
パケット24(15秒399.5m秒)でkameサーバからの応答を得て、
パケット28(15秒399.7m秒)でLAN内のWindowsホストに応答を返し、
Windowsホストがパケット30(15秒400.3m秒)でそのAckを返しています。
■■考察
ここまでの流れから、下記のような想定ができます。
・UbuntuはAとAAAAの名前解決をパケット6および7でしようとした。
・Buffaloのホームルータは名前解解決結果をパケット9の一つで応答しており、Aの結果をAnswer Sectionで、AAAAの結果をAdditional Sectionで返した。
・UbuntuはAnswer SectionのAの応答を得てはいるが、Additional SectionのAAAAの応答を得られていないようだ。
・パケット11で、BuffaloのホームルータがAAAAの結果をAnswer Sectionで返したら、それをUbuntuが受け取ったようで、即座にHTTPの通信を始めた。
つまり、
BuffaloのDNSサーバは
「AとAAAAの複数のクエリを一つのDNS応答で、それぞれAnswer SectionとAdditional Sectionで応答する」
という仕様だ
Ubuntu 16.04は
「それらのうちAdditional Sectionで応答されたAAAA応答を理解できない。Answer SectionでAAAAが返されたら理解できる」
という仕様だ
と想像します。
■■読んでくださった皆さんに相談
下記の2点について、皆さんのご意見をいただきたいです。
・上記の考察(想像)の問題・間違いなどのご指摘
・名前解決で発生している待ち時間をなくす対処とか(そもそもおまえの使い方が悪い or そもそもubuntuの問題じゃない or このパッチで直るかも or 別のところで聞いたほうがいい or 本家に聞け or 自分で直せ etc...)
なんでも構いませんので、なにかご指摘いただけましたら幸いです。
オフライン
勝手な憶測ですが、たぶん Buffalo WXR-1900DHP2 の DNS サーバーの仕様がおかしいのだろうと思います。
パケットのデータを見る手段がありませんので、解釈に間違いがあるかもしれません。
Ohhira による投稿:
そしてsquidによりUbuntuは、パケット6(0秒001.7m秒)でAのDNSクエリを、パケット7(0秒001.7m秒)でAAAAのDNSクエリをDNSサーバに投げます。
BuffaloのDNSサーバが、パケット8(0秒014.2m秒)で応答しています。
このパケット8には、
・Answer Sectionに、kameのAレコード
・Additional Sectionに、kameのAAAAレコード
が書かれています。
しかし、squidは一向にクエリをに出しません。
Ubuntuはさらに、パケット9(5秒350.9m秒)パケット10(15秒352.8m秒)でAAAAのクエリを繰り返します。
そして、そのパケット10のDNSクエリをうけて、
BuffaloのDNSサーバがパケット11(15秒364.2m秒)で応答、こんどは
・Answer Sectionで、kameのAAAAレコード(2001:200:dff:fff1:216:3eff:feb1:44d7)
としています。
ubuntu がパケット 6、7 のそれぞれで A レコードと AAAA レコードのクエリ要求を出しています。
つまりは、パケット 6 による A レコードのクエリ要求と、パケット 7 による AAAA のクエリ要求の二つの独立した要求が発行されていることになります。
これに対して、Buffalo の DNS サーバーは、パケット 8 のひとつの回答しか返していません。
このパケットには Answer として A レコードのクエリー結果が入っていることから、パケット 6 に対応する回答と思われます。
Additional Section として AAAA レコードの結果が入っていたとしても、パケット 7 の回答ではないため、ubuntu がパケット 7 の回答を待ち続けたとしてもおかしいとは言い切れません。
そしてパケット 7 の回答待ちタイムアウトで、再度 AAAA のクエリ要求を送信 (パケット 10) し、その回答である パケット 11 を受信できて初めて、次の動作に進むという動作になるのではないでしょうか。
※パケット 9 が無視されている理由は不明です。Baffalo 側が多忙でロストしたとか?
ubuntu が参照する DNS サーバーを ISP のものか、思い切って 8.8.8.8 に変えて試してみるのはどうでしょうか。
それか Unbound 辺りをインストールして、自前で DNS キャッシュ サーバーを持ってしまうとか。
オフライン
ryさん、どうもありがとうございます。
上流のDNSサーバに直接投げる件、なるほどと思いためしました。
結果、プロバイダのDNSサーバでも、最初はAの応答しか来ず、AAAAの応答は10秒以上たってから届くという状態でした。
くわえてBuffaloとは違い、プロバイダのDNSによる初回のAの応答にはAdditional Sectionもなく、AAAAの情報は完全に10秒以上たってからでないと届かない次第でした。
プロバイダに確認をとろうと思います。
どうもありがとうございました。
オフライン
原因はわからないのですが、問題が解決しました。
squidをパッケージではなく最新のものを自分でコンパイルしてインストールしたところ、前述の名前解決の問題がなくなり、正常に動作するようになりました。
ただ、正常時・異常時の両者のAAAAクエリパケットの送信タイミングや内容に有意な差を見出せなくて、なぜsquidのバージョンによってDNSの応答に差が生じるのかはわかりません。
ただ、今回の教訓としてsquidの動作が不良な場合、最新版を試すのが良いかもしれません。
考えてみれば Web系は Happy Eyeballs のような新しいハックもしているでしょうし、apt をつかえないデメリットをテイクしても、最新のものを使うメリットも大きいかもしれません。
# あと、confファイルがすっきりしたのもうれしいです。
# プロバイダ様にも解決しましたの連絡を送らねば。
オフライン