DNSを監視してネットワークトラフィックの分析と管理を改善する方法

ほとんどすべての場所でIPアドレスではなくドメイン名を使用していますが、ネットワークトラフィックを監視および制御するツールは通常IPアドレスで動作します。 一般に名前解決(特にDNS)は、条件付きで使用されます。



これは、DNSのいくつかの機能によるものです。名前をアドレスに解決した結果はすぐに酸っぱくなり、次のリクエストは異なるアドレスを返すことがあります。結果は、リクエスターの地理とプロバイダーによって異なります。



小規模ネットワークの名前とアドレスの対応表を実際に作成することは可能ですか? ユーザーが要求したドメインとIPアドレスを受信したドメインはどれですか? いくつかの予約で、はい。



ネットワーク管理者は通常、これに制御されたDNSサーバーを使用します。 すべてのネットワークユーザーはこれらのサーバーでのみ名前を解決し、残りのDNSトラフィックはブロックされると想定されています。 これは良い解決策ですが、特定のネットワークサイズとユーザーの資格に応じて機能します。



友好的な会社では、Netflowレポートをより有益なものにするように依頼されました。 IPアドレスにrDNSとwhoisを提供する代わりに、彼らは実際にどのドメイン名がアドレスであるかを確認したかったのです。



組織内には複数のMicrosoftおよびBIND DNSサーバーがあり、一部のユーザーはローカルキャッシュDNSを持ち、一部はパブリックGoogleサーバーを使用していました。 すべてのユーザーにサーバー上の名前を解決させることでさえ、ほとんど不可能に思えました。 ほとんどの場合、逆の結果が得られます-一部のユーザーはVPNでDNSを起動したり、DNSCryptを使用したりします。



少し考えた後、私たちはもっと簡単な方法に進むことにしました。 トラフィック出口ポイントでDNS応答をスキャンするとどうなりますか? 第一に、これにより、ソリューション内の特定のDNSサーバーに縛られることがなくなり、第二に、既存のネットワーク構成を変更する必要がなくなり、ユーザーを困らせることがなくなります。



既製のユーティリティの検索に失敗した後、私(イニシエーターとして)は勇気を出し、RFCを取り上げ、小さなプログラム( https://github.com/vmxdev/sidmat/)をスケッチしました。



プログラムはサーバーのDNS回答をスキャンし(これで十分です。回答内にリクエストがあります)、ドメイン名が正規表現と一致する場合、Aレコードからアドレスを出力します(解決の結果)。



このユーティリティを使用すると、ほとんどすべての統計情報を収集できます-どのドメイン名がIPアドレスに解決されたか、いつ発生したか。 もちろん、訓練されたユーザーはこの情報を隠すことができます(たとえば、hostsファイルにノードを書き込むか、DNSクエリに別のチャネルを使用します)が、ノードの大部分については満足のいく画像が得られます。



仕組み:



$ sudo ./sidmat eth0 "." iu
      
      





ドメイン名とそれらが解決されるものを確認します(eth0はDNSトラフィックが通過するインターフェイスです)。



 $ sudo ./sidmat eth0 "." iu | while IFS= read -r line; do printf '%s\t%s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$line"; done
      
      





時間を修正します。 結果をファイルにリダイレクトするために残り、通信テーブルを使用できます。 このユーティリティは、pcap(Linux / BSD)またはLinuxのnflogメカニズムを使用してDNS回答をキャプチャできます。



同じ手法を使用してトラフィックを制御できます。 ドメインでフィルタリングし、名前にキーワードを含むドメインアドレスを取得します。



管理があまり正確でない可能性があることに留意する必要があります。 DNS回答がユーザーに到達し、ユーザーがこのノードにトラフィックを送信し始めている間に、アドレスをipset / iptables / routing table /どこかに追加する時間がない場合、トラフィックは「通常の」方法で送信されます。



さらに、資格のあるユーザーは誤ったDNS回答を生成する可能性があります。つまり、抑圧のためにこれを注意して使用することをお勧めします。



いくつかの例:



vk.comおよびそのサブドメインが解決するIPアドレスのリストを取得する方法 (「u」オプションなしでは、一意のIPアドレスのみが印刷されます)



 $ sudo ./sidmat eth0 "^vk.com$|\.vk.com$" d
      
      





オプション「d」または「i」を使用すると、IPアドレスに解決されるドメインを確認できます。「d」はドメイン名をstderrに出力します。



vk.comが許可されているアドレス、そのサブドメイン、および単語odnoklassnikiを持つすべてのドメインをブロックする方法は? (avk.comのようなドメインはルールに該当せず、odnoklassnikii.comは該当しません)。



 $ sudo sh -c '/sidmat eth0 "^vk\.com$|\.vk\.com$|odnoklassniki" | /usr/bin/xargs -I {} /sbin/iptables -A INPUT -s {} -j DROP'
      
      





小さな正規表現に加えて、ファイル内のリストを使用できます(オプション「f」、2番目の引数はファイル名、その内容は1つの大きな正規表現として解釈されます)。 リストは非常に大きくなる可能性があり、ILNドメインリストのパフォーマンスを調べ(禁止されたドメインへのトラフィックはVPNにリダイレクトされました)、通常のPCルーターがこれを非常に冷静に管理しました。



All Articles