DNS - 2 zony s 1:1 NAT

Dzavy

DNS - 2 zony s 1:1 NAT
« kdy: 09. 01. 2018, 11:17:09 »
Mam stroje s adresama 172.17.x.y v domene abc.int, ktera je ale uzavrena a dostat se do ni da static NAT (1:1) adresama 10.5.x.y (stejne x.y jako v 172.17.) v domene def.int.

Priklad: server.abc.int [172.17.64.10] je "zvenku" dostupnej jako server.def.int [10.5.64.10].

DNS (BIND) je aktulne reseno jako dve rucne spravovany zony se "stejnym" obsahem - lisi se jenom domena a IP prefix. Nekdo nejakej napad jak to resit lip bez ty duplikace (tech zaznamu jsou stovky)? Pripadne co hledat?

Nasel jsem DNS Doctoring na ASAch, teoreticky by se dal pro obe zony pouzit stejnej soubor a pro zonu def.int to pak nekde necim prepsat...

Predem diky


Re:DNS - 2 zony s 1:1 NAT
« Odpověď #1 kdy: 09. 01. 2018, 13:07:26 »
Asi bych se v prvním momentě zamyslel, jestli to nelze řešit nějakým lepším řešením. Toto je síťová zoufalost, a kromě situací, kde je nedostatek, nebo prastarý hardware, dá se to řešit určitě lépe.

Jestli se nepletu, na DNS to řeší RPZ (Reverse Policy Zone), bind by to měl podporovat, další DNS servery také.

Re:DNS - 2 zony s 1:1 NAT
« Odpověď #2 kdy: 09. 01. 2018, 16:51:52 »
Řešit to líp podle mne jde pomocí IPv6 a s vyhozením toho NATu.
Vy ale předpokládám chcete jen lepší workaround stále s IPv4. Pak to můžete řešit buď na úrovni zónového souboru – ročně editovat jeden z nich, ten druhý vytvářet skriptem, který ty IP adresy nahradí. Nebo, pokud se vám nechce parsovat zónový soubor, mít jeden zdrojový soubor v nějakém lepším formátu (např. XML) a z něj generovat oba zónové soubory (např. XSLT transformací).
Další možnost je překládat ty IP adresy až na DNS serveru. Pro autoritativní server o hotovém řešení nevím (můžete si napsat modul do Knot DNS), pokud můžete dotazy směrovat přes vlastní DNS resolver, Knot DNS Resolver má modul Renumber, který dělá přesně to, co potřebujete – IP adresy z jedné sítě přemapuje do jiné sítě.

Re:DNS - 2 zony s 1:1 NAT
« Odpověď #3 kdy: 09. 01. 2018, 17:32:35 »
Na IPv4, vzhledem k tomu, že je to všechno na privátech, dal bych server do jiné vlan, na jiný subnet a rozchodil VRF. Z jedné i z druhé LAN by bylo vidět na server, ale mezi sebou ne. A server by měl z pohledu všech vždy stejnou adresu. Bylo by to i bezpečnější pro aplikace běžící na serveru, pokud detekují a v aplikační vrstvě pracují s vlastní IP adresou. Přematlávat DNS by mělo být až na posledním místě.

Re:DNS - 2 zony s 1:1 NAT
« Odpověď #4 kdy: 09. 01. 2018, 18:09:21 »
dal bych server do jiné vlan
Já jsem dotaz pochopil tak, že nejde o jeden server, ale o stovky zařízení. Otázka samozřejmě je, proč je to tak udělané – a návrh na skutečně lepší řešení asi nepřijde bez znalosti toho, jaký problém tazatel skutečně řeší.


Dzavy

Re:DNS - 2 zony s 1:1 NAT
« Odpověď #5 kdy: 09. 01. 2018, 22:42:01 »
Jsem zapomnel zminit, ze se jedna o korporatni reseni propojeni siti pri akvizici - tj. to tak proste je. Ta sit abc.int je vicemene sobestacna, neni tam nutny zadny extra propojeni, pristup pres def.int je z 90% pro uzivatele - SSH, nejaky webapky aj. Tj. na urovni DNS dostacujici.

Diky za tip na Knot Renumber, to vypada zajimave. Nicmene jsem behem dne dal patral a nasel jsem reseni pomoci F5 LTM s DNS profilem, da se tam jednoduse delat cokoliv s requestem i odpovedi, mapovani pomoci data-group atd. Kdyby to nekoho zajimalo, muzu to sem pak postnout. "Labova" verze s 10Mbps limitem se da sehnat docela levne.

Dzavy

Re:DNS - 2 zony s 1:1 NAT
« Odpověď #6 kdy: 10. 01. 2018, 10:44:51 »
Kód: [Vybrat]
ltm data-group internal DNS-Translate-Question-Name {
  records {
    def.int {
      data abc.int
    }
    .5.10.in-addr.arpa {
      data .17.172.in-addr.arpa
    }
  }
  type string
}

ltm data-group internal DNS-Translate-Answer-IP {
  records {
    172.17. {
      data 10.5.
    }
  }
  type string
}

ltm data-group internal DNS-Translate-Answer-Name {
  records {
    abc.int {
      data def.int
    }
    .17.172.in-addr.arpa {
      data .5.10.in-addr.arpa
    }
  }
  type string
}

ltm rule DNS-Translate {
  when DNS_REQUEST {
    set original_question [DNS::question name]
    DNS::question name [string map [class match -element [DNS::question name] ends_with DNS-Translate-Question-Name] [DNS::question name]]
  }

  when DNS_RESPONSE {
    if { [DNS::question name] != $original_question } {
      DNS::question name [string map [class match -element [DNS::question name] ends_with DNS-Translate-Answer-Name] [DNS::question name]]

      foreach a [DNS::answer] {
        DNS::name $a [string map [class match -element [DNS::name $a] ends_with DNS-Translate-Answer-Name] [DNS::name $a]]
        switch [DNS::type $a] {
          "A" { DNS::rdata $a [string map [class match -element [DNS::rdata $a] starts_with DNS-Translate-Answer-IP] [DNS::rdata $a]] }
          default { DNS::rdata $a [string map [class match -element [DNS::rdata $a] ends_with DNS-Translate-Answer-Name] [DNS::rdata $a]] }
        }
      }

      foreach a [DNS::additional] {
        DNS::name $a [string map [class match -element [DNS::name $a] ends_with DNS-Translate-Answer-Name] [DNS::name $a]]
        switch [DNS::type $a] {
          "A" { DNS::rdata $a [string map [class match -element [DNS::rdata $a] starts_with DNS-Translate-Answer-IP] [DNS::rdata $a]] }
          default { DNS::rdata $a [string map [class match -element [DNS::rdata $a] ends_with DNS-Translate-Answer-Name] [DNS::rdata $a]] }
        }
      }

      foreach a [DNS::authority] {
        DNS::name $a [string map [class match -element [DNS::name $a] ends_with DNS-Translate-Answer-Name] [DNS::name $a]]
        switch [DNS::type $a] {
          "A" { DNS::rdata $a [string map [class match -element [DNS::rdata $a] starts_with DNS-Translate-Answer-IP] [DNS::rdata $a]] }
          default { DNS::rdata $a [string map [class match -element [DNS::rdata $a] ends_with DNS-Translate-Answer-Name] [DNS::rdata $a]] }
        }
      }
    }
  }
}