anycastDNS
V siti 2connect bezi 2 rekurzivni DNS, ktere pouzivaji anycastove smerovani provozu. Protoze i pri redundatnich DNS v resolv.conf je vypadek DNS serveru casto velice znat (aplikace pouzije jeden DNS, pripadne vysoky timeout na kazdy dns request atp), implementoval jsem anycastove adresovani DNS serveru, kdy vice DNS serveru sdili IP adresy a pomoci dynamickeho routingu je zajisteno, ze pri vypadku jednoho z nich obslouzi tuto IP adresu druhy DNS server.
Aby bylo mozne snadno debugovat problemy s DNS a bylo mozno zkouset pri problemu druhy DNS, je anycast udelan tak, ze jsou stale 2 IP adresy (+ 2xIPv6), oznacme je jako IP-DNSA a IP-DNSB. Routing je nastaven tak, ze server DNSA obsluhuje defaultne IP-DNSA a totez druhy, DNSB obsluhuje IP-DNSB. Druhou adresu nalezici defaultne druhemu serveru kazdy z nich oznamuje do OSPF s vetsi cenou. Cili v pripade vypadku jednoho serveru se v siti objevi routa na jeho IP s vyssi cenou, ale funkcni.
Adresace:
| DNSA | 109.205.72.80 | 2a00:1238:2c::1 |
| DNSB | 31.170.176.80 | 2a00:1238:2c::2 |
Lokace:
Jeden DNS server bezi na LH3 (ovz_2connect_dnsa), druhy bezi v Zabehlicich na jalovici (ovz_2connect_dnsb_prod)
OSPF
Kazdy server ma 3 interfacy, pricemz jeden (eth0) je spojovacku na svuj router (kazdy DNS pouziva jako ospf neighbor jiny router) a ostatni 2 interfacy slouzi jen jako "drzaky IP adres A a B. Normalne se pouziva dummy interface (napr.), ale ve VZ byl s dummy problem, takze jsou 2 ifacy pichnute do stejneho dummy bridge.
Takto udelano je to proto, abychom v birdu mohli jednotlivym IP adresam priradit ruzne OSPF cost, coz pri ospf stub interface nejde, pak je cost stejne velka (alespon se to ta jevilo podle testu).
Cili v birdu je definovan protocol ospf vuci juniperu na spojovacim interfacu a obe IP adresy A a B jsou propagovany do OSPF jako connected, pricemz ve filtru je jim nastavena rozdilna cena, viz prilozene bird configy pro ipv4 a ipv6.
Do OSPF importujeme pouze tyto 2 routy a exportujeme defaultni routu, vic neni potreba.
Overeni funkce:
Na serveru DNSA bezi bind, kdezto na DNSB bezi unbound, takze si muzeme overit, ze nam odpovida skutecne ten server, ktereho se ptame, napr dotazem:
[dan@zarja ~]$ dig version.bind txt chaos @31.170.176.80 ;; ANSWER SECTION: version.bind. 0 CH TXT "unbound 1.4.20"
[dan@zarja ~]$ dig version.bind txt chaos @109.205.72.80 ;; ANSWER SECTION: version.bind. 0 CH TXT "9.9.4-RedHat-9.9.4-29.el7_2.2"
Primo na serveru muzeme overit routing v birdc konzoli birda:
bird> show ospf neighbors ospf1: Router ID Pri State DTime Interface Router IP 109.205.72.24 128 full/ptp 00:11 eth0 109.205.72.216
pripadne overit routy exportovane a importovane do/z OSPF protokolu (vc. metriky metriky/cost danych IP):
bird> show route all export ospf1
31.170.176.80/32 dev eth2 [direct1 14:51:47] * (240)
Type: device unicast univ
OSPF.metric1: 16777215
OSPF.metric2: 1000
OSPF.tag: 0x00000000
OSPF.router_id: 0.0.0.0
109.205.72.80/32 dev eth1 [direct1 14:51:47] * (240)
Type: device unicast univ
OSPF.metric1: 16777215
OSPF.metric2: 100
OSPF.tag: 0x00000000
OSPF.router_id: 0.0.0.0
bird> show route protocol ospf1
0.0.0.0/0 via 109.205.72.216 on eth0 [ospf1 14:51:56] * E1 (150/100) [109.205.72.24]