Czy możliwe jest wykonywanie skryptów w BIND na podstawie wyszukiwania?

9

Czy to możliwe, aby skonfigurować BIND jako serwer DNS w mojej sieci lokalnej i wykonywać skrypty, gdy zostanie wyszukany?

Chciałbym wykonać skrypt Python lub Bash, w oparciu o przychodzące wyszukiwanie DNS, jak mogę to rozwiązać?

Jeśli to możliwe w Bind, powiedz mi, jak to zrobić, a jeśli nie, powiedz, czy jest to możliwe w innych implementacjach serwera DNS, które działają na Ubuntu.

Dziękuję Ci bardzo.

Gunnar
źródło
1
Wydaje mi się to trochę dziwne, czy mogę zapytać, co próbujesz osiągnąć?
sr_
To może być trochę dziwne;) Staram się wyszukać w mojej bazie danych, jeśli docelowy adres IP wyszukiwania znajduje się w pewnym obcym kraju, a jeśli tak, to chcę ustawić trasę na moim serwer, który działa również jako router, do konkretnego usługodawcy internetowego lub w niektórych przypadkach połączenie VPN. Próbowałem ustawić wiele tras, 99% nigdy nie zostanie wykorzystane, a wydajność jest bardzo zła. Jeśli mogę to zrobić na żądanie, wydajność DNS będzie niska, ale w moim przypadku nie ma to żadnego wpływu.
Gunnar
Hmm, może to zawieść okropnie, jeśli, powiedzmy, węgierska strona korzysta z Google Ad-blah, prawda? (Przepraszam, nie mam też innego pomysłu)
sr_
Jestem raczej ciekawy, co próbujesz osiągnąć, ponieważ co będzie musiało się wydarzyć, otrzymasz żądanie z adresu IP, które będziesz musiał dopasować do lokalizacji geograficznej, która może być fałszywa, a następnie skonfiguruj trasę w systemie DNS serwer, który odpowiada na ten adres IP konkretną trasą, co nie ma sensu, ponieważ żądanie zostało już przesłane do BIND?
Karlson,
Jeśli moje przypuszczenie, co próbujesz osiągnąć, jest prawidłowe (kieruj określone połączenia za pośrednictwem niestandardowych bram), czy BIND nie jest złym miejscem do zrobienia tego? Czy sprawdziłeś routing zasad i / lub iptables?
Alexios

Odpowiedzi:

1

Mogę wymyślić dwie dodatkowe opcje, które w ogóle nie wymagają analizy dzienników BIND ani ingerowania w BIND.

1) Mirroring portów - duplikuj pakiety i wysyłaj je do osobnego portu, na którym aplikacja nasłuchuje, analizuje żądania DNS i podejmuje działania. dpktlub scapypodobne biblioteki do tworzenia pakietów pomogą parsować nieprzetworzone żądania.

2) Użyj jakiegoś rodzaju biblioteki wąchania pakietów, aby pasywnie monitorować żądania. Oto przykład z użyciem scapy:

from scapy.all import *

def handler(req):
    if req.haslayer(DNS) and req.getlayer(DNS).qr == 0:
        ip = req.getlayer(IP)
        dns = req.getlayer(DNS)

        q = dns.qd
        print q.qname # simply print domain name


if __name__ == '__main__':
    sniff(iface="eth0", filter="udp and port 53", prn=handler, store=0)

Oczywiście jest to tylko prymitywny przykład. Drukuje tylko nazwę domeny, której dotyczy zapytanie, ale można oczywiście dodać sporo logiki. Jeśli odwołujesz się do dokumentacji scapy, przekonasz się, że wszystkie pola z żądania DNS są łatwo dostępne.

kwarrick
źródło
To wygląda interesująco. Przyjrzę się temu. Dzięki :-)
Gunnar,
0

Można to zrobić, monitorując dziennik serwera powiązań (rejestrowanie zapytań musi być włączone). Powodzenia...

Nils
źródło
Należy pamiętać, że rejestrowanie wszystkich zapytań o powiązanie powoduje znaczne obniżenie wydajności. Nie poleciłbym tego na żadnym wiarygodnym serwerze na poziomie produkcyjnym.
Shadur
Zależy od obciążenia tego serwera powiązań. Można też np. Zapisać dzienniki na dysku RAM /dev/shm.
Nils,
zaloguj się, a następnie uruchom swatchlub OSSEC w dziennikach, aby wywołać skrypt. w każdym razie niezbyt dobry pomysł na dłuższą metę.
Jodie C
0

Żadne takie rzeczy jak zdarzenia nie są zaimplementowane w bind, nie potrzebuje tego.

Możesz rozejrzeć się za aplikacyjnymi zaporami ogniowymi, które są używane w niektórych organizacjach w celu ograniczenia dostępu do niektórych użytkowników. Tam masz większe szanse na osiągnięcie tego, co chcesz.

Konfigurowanie tras również wydaje się dobrym pomysłem, w końcu to, co chcesz osiągnąć dzięki wiązaniu i uruchamianiu skryptów, również będzie nieefektywne: musisz:

for each dest IP 
look up through your database  
if match set the route
then the OS will see and use the root

Konfiguracja mnóstwa tras nie stanowi problemu i nie wpłynie znacząco na wydajność. Jak myślisz, ile tras ma router korporacyjny? setki? niezupełnie ... I niekoniecznie mają fantazyjną konfigurację sprzętową. Poważnie, wszystko w porządku, poważne systemy operacyjne są specjalnie zaprojektowane do obsługi wielu tras i optymalizacji wyszukiwania.

Poza tym przede wszystkim chciałbyś użyć bazy danych na szczycie tabeli routingu, która byłaby innym rodzajem bazy danych. Nie komplikuj. Na serwerach BGP wiele tras jest faktycznie wybieranych / preferowanych ze względów politycznych / finansowych, każdy ISP / organizacja może to zrobić i wszystkie dodają w tym celu określone trasy. Koszt tranzytu lub orzeczenia sądowego jest często przyczyną takich środków.

Aki
źródło