|
Universiteti telekommunikatsiya texnologiyalari fakulteti
|
bet | 15/16 | Sana | 25.05.2024 | Hajmi | 2,52 Mb. | | #253955 |
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)
|
| |