2015-04-25 11 views
6

bramki

Chciałbym wykorzystać moduł ograniczeń Pythona zbadać reakcję tuż przed jego wysłaniem do klienta. Przede wszystkim interesuje mnie ;; ANSWER SECTION:, tj. Adres IP, do którego rozwiązano zapytanie.ograniczeń serwera DNS, moduł Pythona: skontrolować elementy komunikat odpowiedzi

Problem

Co wyglądało jak trywialny modyfikacji logDnsMsg funkcji okazało się zadaniem dounting przeglądania reply_info, rrset_ref i ub_packed_rrset_key struktur w dążeniu do osiągnięcia pożądanych ;; ANSWER SECTION: bajtów.

Powodem jest funkcja logDnsMsg nie działa zgodnie z oczekiwaniami dla A odpytuje ;; ANSWER SECTION:, natomiast zaskakująco działa zgodnie z oczekiwaniami dla ;; AUTHORITY SECTION: na AAAA zapytaniami.

Lemme demonstruje porównanie między wprowadzoną w Pythonie funkcją logDnsMsg a natywną funkcją log_dns_msg; przy czym ten pierwszy wyświetla bełkot, a drugi działa dokładnie zgodnie z oczekiwaniami. Obie funkcje są wywoływane z poziomu kontekście moduł Pythona następująco:

+++ 
def operate(id, event, qstate, qdata): 
    log_info("pythonmod: operate called, id: %d, event:%s" % (id, strmodulevent(event))) 
    if (qstate.return_msg): 
     logDnsMsg(qstate) 
     log_dns_msg("blackpie KARMMMMMM XXXXXXX", qstate.return_msg.qinfo, qstate.return_msg.rep) 
+++ 

pamiętać, że zmienił pierwotną logDnsMsg tak ponieważ wykorzystuje ramy zalogowaniu rzecz print. Dane wyjściowe były takie same dla print, ale były rozproszone w pliku dziennika według uznania bufora.

wyjściowa:

[email protected]:~$ dig seznam.cz @127.0.0.1 -p53535 
; <<>> DiG 9.9.4-P2-RedHat-9.9.4-18.P2.fc20 <<>> seznam.cz @127.0.0.1 -p53535 
;; global options: +cmd 
;; Got answer: 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38630 
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 
;; OPT PSEUDOSECTION: 
; EDNS: version: 0, flags:; udp: 4096 
;; QUESTION SECTION: 
;seznam.cz.  IN A 
;; ANSWER SECTION: 
seznam.cz. 300 IN A 77.75.76.3 
;; Query time: 656 msec 
;; SERVER: 127.0.0.1#53535(127.0.0.1) 
;; WHEN: Sat Apr 25 16:04:32 CEST 2015 
;; MSG SIZE rcvd: 54 

Wyjście AAAA zapytania ;; AUTHORITY SECTION: wygląda przyzwoicie zarówno logDnsMsg i log_dns_msg:

[1429970672] unbound[14053:0] info: pythonmod: operate called, id: 1, event:module_event_moddone 
[1429970672] unbound[14053:0] info: ------------------------------------------------------------------------------------------ 
[1429970672] unbound[14053:0] info: Query: e.root-servers.net., type: AAAA (28), class: IN (1) 
[1429970672] unbound[14053:0] info: ------------------------------------------------------------------------------------------ 
[1429970672] unbound[14053:0] info: Return reply :: flags: 8080, QDcount: 1, Security:0, TTL=86400 
[1429970672] unbound[14053:0] info:   qinfo :: qname: ['e', 'root-servers', 'net', ''] e.root-servers.net., qtype: AAAA, qclass: IN 
[1429970672] unbound[14053:0] info: Reply: 
[1429970672] unbound[14053:0] info: 0:['root-servers', 'net', ''] root-servers.net. flags: 0004 
[1429970672] unbound[14053:0] info: type:SOA (6) class:IN (1) 
[1429970672] unbound[14053:0] info: 0:TTL=3600000 
[1429970672] unbound[14053:0] info: 
[1429970672] unbound[14053:0] info:  0x00 | 00 40 01 61 0C 72 6F 6F 74 2D 73 65 72 76 65 72 73 | . @ . a . r o o t - s e r v e r s 
     0x10 | 73 03 6E 65 74 00 05 6E 73 74 6C 64 0C 76 65 72 69 | s . n e t . . n s t l d . v e r i 
     0x20 | 69 73 69 67 6E 2D 67 72 73 03 63 6F 6D 00 78 0C E3 | i s i g n - g r s . c o m . x . . 
     0x30 | E3 24 00 00 38 40 00 00 1C 20 00 12 75 00 00 36 EE | . $ . . 8 @ . . . . . u . . 6 . 
     0x40 | EE 80            | . . 
[1429970672] unbound[14053:0] info: ------------------------------------------------------------------------------------------ 
[1429970672] unbound[14053:0] info: blackpie KARMMMMMM XXXXXXX ;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 0 
;; flags: qr ra ; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 
;; QUESTION SECTION: 
e.root-servers.net. IN AAAA 
;; ANSWER SECTION: 
;; AUTHORITY SECTION: 
root-servers.net. 3600000 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2014110500 14400 7200 1209600 3600000 
;; ADDITIONAL SECTION: 
;; MSG SIZE rcvd: 96 
[1429970672] unbound[14053:0] debug: mesh_run: python module exit state is module_finished 

Wręcz przeciwnie, dla A zapytania ;; ANSWER SECTION: jest całkowicie bezużyteczne, jak daleko jako logDnsMsg:

[1429970672] unbound[14053:0] info: pythonmod: operate called, id: 1, event:module_event_moddone 
[1429970672] unbound[14053:0] info: ------------------------------------------------------------------------------------------ 
[1429970672] unbound[14053:0] info: Query: seznam.cz., type: A (1), class: IN (1) 
[1429970672] unbound[14053:0] info: ------------------------------------------------------------------------------------------ 
[1429970672] unbound[14053:0] info: Return reply :: flags: 8080, QDcount: 1, Security:0, TTL=300 
[1429970672] unbound[14053:0] info:   qinfo :: qname: ['seznam', 'cz', ''] seznam.cz., qtype: A, qclass: IN 
[1429970672] unbound[14053:0] info: Reply: 
[1429970672] unbound[14053:0] info: 0:['seznam', 'cz', ''] seznam.cz. flags: 0000 
[1429970672] unbound[14053:0] info: type:A (1) class:IN (1) 
[1429970672] unbound[14053:0] info: 0:TTL=300 
[1429970672] unbound[14053:0] info: 
[1429970672] unbound[14053:0] info:  0x00 | 00 04 4D 4B 4C 03         | . . M K L . 
[1429970672] unbound[14053:0] info: ------------------------------------------------------------------------------------------ 
[1429970672] unbound[14053:0] info: blackpie KARMMMMMM XXXXXXX ;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 0 
;; flags: qr ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 
;; QUESTION SECTION: 
seznam.cz. IN A 
;; ANSWER SECTION: 
seznam.cz. 300 IN A 77.75.76.3 
;; AUTHORITY SECTION: 
;; ADDITIONAL SECTION: 
;; MSG SIZE rcvd: 43 
[1429970672] unbound[14053:0] debug: mesh_run: python module exit state is module_finished 

Zwróć uwagę na bajty 00 04 4D 4B 4C 03 błędnie zinterpretowane jako ASCII.

Pytanie

Gdzie w jednym struct ub_packed_rrset_key** rrsets; wyszukuje żądane dane ;; ANSWER SECTION:? (Jeśli rzeczywiście jest to odpowiednie miejsce.)

Od jakiegoś czasu błądzę z nim bez żadnego szczęścia. Zbadałem funkcję sldns_wire2str_pkt_scan, która jest używana wewnętrznie do rozpakowywania danych binarnych wire, ale ja nie jestem mądrzejszy.

+0

dodam tag Pythona na twoje pytanie, jeśli jest źle, usuń je;). –

+0

@ shA.t Nie jestem pewien, czy jest to problem w Pythonie, ale dlaczego nie. Tag "Bez ograniczeń" będzie najbardziej odpowiedni; Nie mam jednak reputacji, aby to stworzyć. –

Odpowiedz

1

logDnsMsg() rejestruje się w postaci hex dump zawartości każdego rekordu zasobu DNS. Wyprowadza bajty wraz z ich interpretacją ASCII (z . s dla bajtów niedrukowalnych). Oznacza to, że jeśli dane zawierają ciągi znaków ASCII, będą one widoczne w danych wyjściowych, podczas gdy inne typy danych (takie jak adresy IP) nie będą tłumaczone na znaczący tekst.

Pierwsze dwa bajty danych to pole RDLENGTH, wskazujące długość rekordów danych. Pozostałe bajty to właściwe pole RDATA. Interpretacja tych bajtów zależy od typu rekordu. Rekordy A składają się z pojedynczego 32-bitowego adresu IP, więc można je łatwo analizować.

Poniższy przykład kodu wyświetla zawartość w A rekordu:

def print_a_record(data): 
    rdlength, rdata = data[:2], data[2:] 
    assert rdlength == '\x00\x04' 
    assert len(rdata) == 4 
    addr_bytes = [ord(c) for c in rdata] 
    print('{}.{}.{}.{}'.format(*addr_bytes)) 

Dalsze informacje:

Powiązane problemy