記錄一下自己在使用dnspython來update TLSA時遇到的問題
1。在填充好TLSA對象,update對象後,列印update對象,發現報文正確,但是使用tcp發送後查詢新添加的記錄發現位元組錯位了,如
待添加記錄為:_443._tcp.www.test.com IN TLSA 1 2 3 XXXX
添加成功後查詢該記錄得到
_443._tcp.www.test.com IN TLSA 0 1 0 0203XXXX
很奇怪的是發生了位元組錯位,一開始是懷疑不會是bind9不遵守RFC吧?後來想想可能性幾乎為0。。。。
然後又試圖通過截取報文,驗證是否是自己發送的報文存在問題,最後發現問題出現在dns.query.tcp()處
使用pdb調試後未發現問題,只知道最後是由於to_wire()函數導致,從Update.to_wire()到Message.to_wire(),然後又追蹤到到Render.get_wire()(發現這個函數是列印報文頭的) 最後不知道怎麼調用了TLSA.to_wire函數
好吧……嗯。。。。反正最後問題是通過我更新dnspython的編譯莫名其妙的解決了,似乎是沒什麼借鑒意義……
2 。 有關delete時候的rdataclass問題
在TLSA delete 時,列印update對象發現構造update時指定的dns.rdataclass.IN 變成了NONE 雖然未影響最後update結果,但是還是不太明白為什麼要這麼做。
我傳入delete函數的參數是 TLSA對象,
149 args = list(args) 150 if isinstance(args[0], dns.rdata.Rdata):#傳回值True,進入該分支 151 for rd in args: 152 self._add_rr(name, 0, rd, dns.rdataclass.NONE)#設定rdataclass 為NONE, 153 else:#如果是依次傳入的args 154 rdtype = args.pop(0) #pop出RR TYPE 155 if isinstance(rdtype, (str, unicode)): 156 rdtype = dns.rdatatype.from_text(rdtype)#如果是type字串表示,則轉化成相應Type的對象 157 if len(args) == 0: 158 rrset = self.find_rrset(self.authority, name, 159 self.zone_rdclass, rdtype, 160 dns.rdatatype.NONE, 161 dns.rdataclass.ANY, 162 True, True) 163 else: 164 for s in args: 165 rd = dns.rdata.from_text(self.zone_rdclass, rdtype, s, 166 self.origin)#產生TLSA 對象 167 self._add_rr(name, 0, rd, dns.rdataclass.NONE)#還是設定成NONE?
為啥呢?難道刪除的時候不用匹配rdataclass嗎?