• 1-bo‘lim Dastur kodi
  • Universiteti telekommunikatsiya texnologiyalari fakulteti




    Download 2,52 Mb.
    bet15/16
    Sana25.05.2024
    Hajmi2,52 Mb.
    #253955
    1   ...   8   9   10   11   12   13   14   15   16
    Bog'liq
    “DNS server tarmoq dasturini yaratish” (2)

    Dunyo miqyosi zonasi.
    Windows Server 2008 barcha DNS mijozlariga "Server resurslari" Server resurslariga ulanish uchun bitta yorliqdan nomlarni bitta yorliqdan foydalanish uchun Active Directorite Faol katalogdan foydalanish imkoniyatini beradigan yangi komponentni o‘z ichiga oladi. Agar DNS mijozlari uchun standart DNS šilishlar ro‘yxati bo‘lsa, ushbu komponent foydalanuvchiga bunday nomdan foydalanib, manbadan foydalanib resursga tezda ulanishiga (yoki umuman) tezroq ulanishiga ruxsat berilmasa, bu komponent qulay qo‘llaniladi.
    Windows Server 2008-dagi DNS serveringiz sizga global stend mintaqasini yaratishga imkon beradi. Odatiy bo‘lib, global stok zonasi mavjud emas, ammo zonani ushbu nom bilan aylantirib, siz Fins-dan foydalanmasdan ismlar yordamida tanlangan manbalardan foydalanishni ta’minlashingiz mumkin. Qoida tariqasida, bitta belgidan ismlar muhim va keng qo‘llaniladigan statik IP manzillar berilgan serverlardir. Masofaviy serverda global serverda, o‘rniga masofaviy server nomini kiriting.

    AMALIY QISM


    1-bo‘lim
    Dastur kodi:
    import socket

    local_host = '127.0.0.1' # Ulanishni qabul qiladigan manzil


    local_port = 53 # Порт
    remote_host = '192.168.0.1' # Biz yuboradigan manzil
    remote_port = 53
    _cache = {} # Kesh saqlanadigan joy
    _DEBUG = True
    # Funktsiya argument sifatida socket tipidagi ob'ektni oladi.
    def receive_from(_socket):
    _socket.settimeout(1) # TimeOut
    try:
    data, addres = _socket.recvfrom(512)
    except:
    data = '' # Hech qanday ma’lumot olinmasa, bo‘sh ma’lumotlarni qaytaramiz
    addres = ('', 0)
    return data, addres
    return data, addres
    def dns_receive_remore(local_buffer, local_addr, remote_socket):
    # Biz lokal olgan ma’lumotlarimizni, yuboruvchining manzilini va ma’lumotlarni
    # uzatish uchun socketni jo‘natamiz.
    # Bu yerda biz ikkita socket mavjud. Biri foydalanuvchilardan ma’lumotlarni qabul qilish va unga
    # jo‘natish uchun,ikkinchisi DNS serveriga yuborish va undan ma’lumotlarni qabul qilish uchun.

    if len(local_buffer) and len(local_addr[0]): # Lokal ma’lumotlar bo‘sh bo‘lmasa


    try:
    remote_socket.sendto(local_buffer, (remote_host, remote_port)) # DNS server ma’lumotlarini jo‘natamiz
    except:
    print('[!]Can not send DNS to remote.')
    remote_buffer, remore_addr = receive_from(remote_socket) # Ma’lumotlar qabul qilish protsedurasini chaqiramiz.
    if len(remote_buffer):
    return remote_buffer
    return None
    def server_loop(local_host, local_port):
    global _DEBUG
    server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
    server.bind((local_host, local_port)) # So‘rovlarni qabul qilish uchun lokal socketni ishga tushiramiz
    except:
    print("[!!] Failed to listen on %s:%d" % (local_host, local_port))
    print("[!!] Check for other listening sockets or correct permissions.")
    print("[*] Listening on %s:%d" % (local_host, local_port))


    # DNS serveriga so‘rov yuborish uchun socket yaratamiz
    remote_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


    # Bu yerda biz dns_receive_remore funksiyasi uchun memoize dekoratoridan foydalanamiz
    # va biz uni funksiya keshi deb ataymiz
    cache = memoize(dns_receive_remore)
    while True:


    # Lokal so‘rovni olish
    local_buffer, local_addr = receive_from(server)


    # DNS serveridan yoki keshdan javob olamiz
    remote_buffer = cache(local_buffer, local_addr, remote_socket)
    if remote_buffer is not None:
    server.sendto(remote_buffer, local_addr) # Lokal foydalanuvchiga javob yuboramiz
    if _DEBUG:
    print('Send localhost %d bytes' % len(remote_buffer)) # so‘rovlar qabul qilinadigan va yuboriladigan kichik debag
    _DEBUG = False
    # Funksiya boshqa funksiyani parametr sifatida oladi
    def memoize(func):
    """ Xususiyat so‘rovi keshini boshqarish uchun dekorator. """
    name = func.__name__ # O‘tkazilgan funktsiya nomini olamiz
    def wrapper(*args, **kwargs):


    # Bizda mavjud bo‘lgan birinchi argument local_buffer bo‘lib, undan dastlabki ikki baytni
    # olib tashlaymiz (DNS so‘rov identifikatori)
    # DNS so‘rovi va javobida dastlabki ikki bayt mijoz DNS serveriga
    # so‘rov yuborishda yaratadigan ID uchun ajratilgan
    # Har bir so‘rov va javob uchun u har xil
    dns_not_id_header = args[0][2:]
    _id = args[0][:2] #Lokal foydalanuvchiga qaytarish uchun ID ni saqlab qo‘yamiz
    key = (name, dns_not_id_header, frozenset(kwargs.items())) #Kalit yaratib olamiz (kesh uchun)
    if key in _cache:
    if _cache[key] is not None:
    print('[*] Received cache DNS %d bytes from localhost' % len(_cache[key]))
    print('[?] Len caches: ', len(_cache))
    return _id + _cache[key] # Agar kalit keshda bo‘lsa, so‘rov ID + qiymatini qaytaramiz
    result = func(*args, **kwargs) # Agar keshda bo‘lmasa, o‘tkazilgan argumentlar bilan o‘tkazilgan funktsiyani bajaramiz
    if result is not None:
    _cache[key] = result[2:] # Kalit qiymatini keshda saqlaymiz
    return result
    return wrapper
    server_loop(local_host, local_port)



    Download 2,52 Mb.
    1   ...   8   9   10   11   12   13   14   15   16




    Download 2,52 Mb.

    Bosh sahifa
    Aloqalar

        Bosh sahifa



    Universiteti telekommunikatsiya texnologiyalari fakulteti

    Download 2,52 Mb.