Vyatta problemy z nat reflection i hairpin nate


Jako, że w życiu nie ma lekko to i z moją Vyattą pojawił się problem. Oczywiście wpadłem na sposób jego rozwiązania, ale regułka nie chciała działać za żadne skarby. Na szczęście problem okazał się być sprzętowy (a raczej czeski sprzętowy – źle wpięte kable do kolejnych interfaców). Problem zasadniczo dotyczył takiego wydarzenia:

sieć lokalna, w klasie 192.168.0.1/16 (255.255.0.0) oczywiście wszystko za NATem, żeby było ciekawiej w środku tej sieci jeden serwer lokalny (LAMP) dostępny ze świata pod określoną nazwą domenową. Na routerze mamy odpowiednie forwardy:

rule 20 {
  destination {
    address x.x.x.x
    port http,https,ftp
  }
  inbound-interface eth1
  inside-address {
    address 192.168.0.111
  }
  protocol tcp
  type destination
}

No i pojawił nam się malutki problem… Otóż dostęp do zasobów serwer w postaci subdomena.domena.pl był dostępny tylko z zewnątrz. Chyba, że wpisaliśmyn na sztywno mapowanie w hostach / static-dns sub.domena.pl na adres wewnętrzny 192.168.0.111. Udało mi się wyśledzić, że domeny były rozpoznawane po zewnętrznym adresie IP, a potem cały ruch musiał być zamieniany na wewnętrzne adresy przez maskaradę.
Problem mógł być rozwiązany na dwa sposoby. Pierwszy który mi przyszedł do głowy, to postawienie wewnętrznego serwera DNS, który obsługiwałby sieć lokalną i od razu „podmieniał” domeny na adresy IP lokalne.
Drugi to przechwycenie ruchu z sieci lokalnej kierowanego na zewnętrzny adres domeny i przerzucenie go od razu na serwer wewnętrzny.
Drugie rozwiązanie, być może mniej eleganckie dawało mi szybkie rozwiązanie problemu. Niestety nie chciało działać (bo źle wpiąłem kable do switcha i ruch był routowany przez switch a nie przez router ;). Z całym problemem nie wiedząc o switchu skierowałem sie na forum Vyatty i dosyć szybkó naprowadzono mnie na moje nieskuteczne rozwiązanie ;).
Tak czy inaczej poniżej przydatna regułka, pamiętać należy że eth0 obsługuje ruch wewnętrzny, eth1 wyjście na świat.

rule 2 {
  destination {
    address x.x.x.x
  }
  inbound-interface eth0
  inside-address {
    address 192.168.0.111
  }
  source {
    address 192.168.0.0/16
  }
  type destination
}
rule 3 {
  destination {
    address 192.168.0.111
  }
  outbound-interface eth0
  source {
    address 192.168.0.0/16
  }
  type masquerade
}

Regułki są bajecznie proste. Pierwsze przechwytuje cały ruch z sieci lokalnej kierowanyn na zewnętrzne IP naszego serwera (wtedy DNSy nie muszą podrabiać adresów). Druga robi maskaradę dla wewnętrznego serwera tak aby mógł on pokazywać się w sieci lokalnej. Ważne jest aby regułki te były PRZED tymi, które puszczają ruch z zewnątrz.