DNSで使用しているプロトコルを教えてください。
DNSを引くのに使用しているプロトコル(そこで流れている情報)について
知っている人がいれば教えていただけないでしょうか?
nslookup等で、
ls -d yahoo.co.jp
とかすると、yahoo.co.jp ドメインのすべてのアドレスが出てきますよね?
あれを、nslookupっていうコマンドを経由しないで使う方法はないでしょうか?
具体的には
telnet ??????? 53
としてどんなコマンドを打ち込めば目的のアドレスを知ることができるかが
知りたいです。
わかる人、書いてあるアドレス何でも結構です。教えてください
わからん。すまん。
ってかいま、誰もいないみたい。気長に待ってくれ。 了解です。
自分で作ってる簡易SMTPサーバで必要なだけなので
気長に待つことにします。 RFC883に書いてあったと思う。
所で自前で書いてるの?
簡単に正引き・逆引きできるコンポーネントないのかなぁ・・
いやOSが何で何使ってコード書いてるがわからんのだがw
(VBとかは勘弁してくれよ)
ちょっと待て。
DNSで使ってるのはudpだぞ。
telnetで出せるのはtcpだ。
ついでに言うと、nslookup で、ls コマンドを使うと
流れるのは transfer 通常の名前引きは query
最近は特定のサーバにしかtransferを許さないのが普通。
あと、正引き、逆引きを簡単に行うなら、
socket の(windowsならwinsock)
gethostbyaddr, getaddrbyhost関数を使うのが
普通だぞ?
なんか知識が大幅にずれてないか? それでsmtpサーバ作る
つもりなのか? 使ってるOSはWindows2000 Proで、VC6を使ってます。
最近はプロバイダのSMTPサーバが、自前のネットワークのみから
しか反応しないので、それの橋渡しをするSMTPサーバを
つくれないかな?と考えました。
メール送信部分は、相手のサーバを探して(ここがDNSのとこ)
コネクション張って、
HELO
MAIL FROM: ???
RCPT TO: ???
DATA
???
.
で送れたと思うのですが、名前を引くところに関しては
さっぱりわからなくて質問をしました。 >5
別にTCPでもいいじゃん。
まー,コストの高いから普段使うのはイヤだけどね。
>1
DNSはASCIIベースのプロトコルじゃないので,普通にやるとtelnetじゃあ無理だ。
RFCを資料にするなら,RFC1035 引く方が良いぞ。
RFC883 では,肝心のMXについて触れられていない。
RFC調べたことなさそうだから,こういうのも教えてやろう。
http://www.csl.sony.co.jp/rfc/
一般的なプロトコルについては,まずSTDの一覧を探すのがいいぞ。
頑張れ。 >7
ありがとう御座います。出来ました。解決です。
あと、resolverで検索をしていたので見つからなかったみたいです。
素直にdomainで検索をすれば良かったです(DNSじゃ出てこないし)。 残念。(>ε<)
Winsockにはresolverが実装されていない。
ところで,SMTPの方のエラー処理や再送は上手くいった?
なかなか繋がらんMXも多いからな。
>9
SMTPの方が先に組みあがっていたので、大丈夫です。
反応が遅いところもあるようですが、今のところ問題なしです。
遅いサーバーに対しては、1つのメールに対し複数のコネクションを張るようにしてあります。
これって、嫌がられそうだけど(笑。
>5
ふと思ったんですが、gethostbyaddr, getaddrbyhostでMX引けましたっけ?
単に25ポートで繋いでも無理だったので、不可能なような気が...。
もし引けるようでしたら、やり方を教えてください。お願いします。
>>10 すこし時間をくだされ。知識の裏取っておく。 >>10
手持ちのソケット本が出払ってた(Kよ返してくれ!)ので
ソケット関数で引けたかどうかは未確認……
引けないってことはないように思うんだが……
UDPで直接送受信する仕組みができてたら、DNSメッセージを
直接やりとりするのも可能か。
説明すると結構繁雑なので、オーム社「マスタリングTCP/IP 応用編」
の第15章5節を参照してください。 >12
> オーム社「マスタリングTCP/IP 応用編」
かなり読んでます。ハイ。でも、意外と内容が薄い...。
RFCの日本語訳が見つからなかったので、英語をヒタスラ読んでますが。
DNSの応答処理が意外と面倒な事になってます。 >>13
DNSの応答処理って
DNSから送られてきた応答パケット(とは限らないが)の
受信と解釈のことでしょうか。
オライリーのDNS&BINDの14章2節に、DNS問い合わせと
応答の解析を行うサンプルプログラム(C)が載ってたので
参考になるのでは。
俺はCはよく使わないのでよくわかりませんが(w
14.3にはPerlのNetオブジェクトを使った例もある。
>>15
初級ネットは偽名じゃ。
名前のせいで勘違いして紛れ込んでくる初心者が多いのだが致し方ないことなのだ。 >>14
> 応答の解析を行うサンプルプログラム
そんなのが欲しいです...。
やっとこさ、IPまで辿り着ける状態になりましたです。
> Perl
は使った事が無いので、全くわかりません。
C/C++かアセンブラかVBしか出来ません。 >>17 素直にオライリー買いましょう。\5000也。 誘導したのは良いが・・・ 結論が出てなかったのか!!
つーか 本買えで終わってるとは・・・ なんか質問スレで呼ばれてる? まぁいいか。
RFCを読んでUDPでパケット投げてみました。
ものすごい勢いで誰かが質問に答えますPart30
http://pc.2ch.net/test/read.cgi/hack/1033381894/991-992
に記載されていたパケットダンプは一部分ですので問題の
個所は理解できません。
とりあえず投げるパケットの組み立て。
問い合わせパケット
00 1F :データ長
--ここからヘッダ--
?? ?? :16ビットの適当なID(乱数でOK)
00 00 :QR=0 OPCODE=0 AA=0 TC=0 RD=0 RA=0 Z=0 RCODE=0
00 01 :質問の数(今回は1個なので1)
00 00 :回答の数=当然0
00 00 :NSレコードの数=0
00 00 :追加部の数=0
--ここから質問部-- 今回の内容は mc.kcom.ne.jp
02 6D 63 :ラベルの長さとmcのキャラコード
04 6B 63 6F 6D :ラベルの長さとkcomのキャラコード
02 6E 65 :ラベルの長さとneのキャラコード
02 6A 70 :ラベルの長さとjpのキャラコード
00 :ドメイン終了=ルートに辿り着いた事を表す
00 0F :MXを問い合わせてます(15)
00 01 :問い合わせクラス 01=IN=インターネット
回答パケット(オフセットが重要なのでオフセット付きです)
※オフセットは10進数です
-002: 00 9E :データ長 (オフセットマイナスなので注意!)
--ここからヘッダ--
+000: ?? ?? :送ったID(一致を確認すること)
+002: ?? ?? :回答時のフラグ(サーバによって変わります)
+004: 00 01 :質問の数=質問パケットと一致
+006: 00 01 :回答の数=1個
+008: 00 02 :NSレコードの数=2
+010: 00 04 :追加部の数=4
--ここから質問部のコピー--
+012: 02 6D 63 :ラベルの長さとmcのキャラコード
+015: 04 6B 63 6F 6D :ラベルの長さとkcomのキャラコード
+020: 02 6E 65 :ラベルの長さとneのキャラコード
+023: 02 6A 70 :ラベルの長さとjpのキャラコード
+026: 00 :ドメイン終了=ルートに辿り着いた事を表す
+027: 00 0F :MXを問い合わせてます(15)
+029: 00 01 :問い合わせクラス 01=IN=インターネット
--ここから回答部--
+031: C0 0C :Name=Offset+0x0C(12)=0xC000+0x0Cの意味(圧縮)
+033: 00 0F :TYPE=15=MXレコード
+035: 00 01 :CLASS=1=IN=インターネット
+037: 00 01 48 23 :TTL=0x00014823
+041: 00 0A :リソースデータ長
--ここからリソースデータ--
+043: 05 6F 72 69 67 31 :ラベル長(05)と'orig1'のキャラクタ
+049: C0 0F : Offset+0x0F(15)(圧縮)
ただし、これはヘッダからのオフセット
↓これ以降NSレコードと追加部が続く
DNSの回答はいちいちFQDN返してると大変なので一部の文字列を
共有しています。(これをRFCでは圧縮と書いてるみたい)
上記例では +031に名前(ホスト名)を書いても良いのですが、ここに
記載されるべき名前はリソースデータの名前(MX問い合わせの回答)と
一致しますので「そこまでの相対アドレス」を書きます。
このように相対アドレスを書く場合は0xC000+ポインタ値を使います。
0xC0で大丈夫な理由は、1つのラベルは63文字以内と定められている
からです。
ポインタはこの値の次を0としますので31+12=43で+043からのラベルと
言うことになります。つまり'orig1'です。
+043から始まるラベルの最後にさらにポインタ0x0Fが有ります。
この様にラベルの最後にあるポインタは「前に定義されたラベル」への
ポインタになります。つまり+015から始まるラベル'kcom.ne.jp'です。
+015から始まるラベルは最後がルートで終わってますので連結は終了です。
これでFQDNである'orig1.kcom.ne.jp'を表しています。
+043からも同じ方法で、NSレコードも全く同じ方法です。
>>26
(・∀・)ニヤニヤ あ〜良い所に・・・
>この様にラベルの最後にあるポインタは「前に定義されたラベル」への
>ポインタになります
この訳あってますかね・・・RFC1035だとちょろっとしか出てこないんです。
>>25 しまった修正
--ここから回答部--
+031: C0 0C :Name=Offset+0x0C(12)=0xC000+0x0Cの意味(圧縮)
+033: 00 0F :TYPE=15=MXレコード
+035: 00 01 :CLASS=1=IN=インターネット
+037: 00 01 48 23 :TTL=0x00014823
+041: 00 0A :リソースデータ長
--ここからリソースデータ--
+043: 00 0A :Preference=10 ←追加
+045: 05 6F 72 69 67 31 :ラベル長(05)と'orig1'のキャラクタ
+051: C0 0F : Offset+0x0F(15)(圧縮)
ただし、これはヘッダからのオフセット
↓これ以降NSレコードと追加部が続く
>27 修正(中央辺り)
ポインタはこの値の次を0としますので33+12=45で+043からのラベルと
言うことになります。つまり'orig1'です。
+045から始まるラベルの最後にさらにポインタ0x0Fが有ります。