вторник, 24 октября 2023 г.

Отказоустойчивый proxy-cache DNS кластер на Nginx

 Доменные контролеры часто выполняют функцию и корпоративного DNS-сервера, что может привести к их повышенной нагрузке или даже перезагрузке ОС. Но эта роль важна, т.к. при авторизации в домене динамически заводятся  A и PTR записи авторизованных в домене компьютеров и серверов. Для разгрузки AD DC от частых DNS запросов можно использовать кеширующий DNS-сервер (перед ним), но для того, чтобы сам кеш-DNS-сервер не стал точкой отказа, то их надо использовать 2, и для отслеживания их статуса, перед ними поставить UDP прокси-сервер. Проще это сделать на основе связки Nginx c keepalived. Keepalived кроме VRRP функционала должен также отслеживать статуc Nginx за счет постоянного выполнения скрипта (на основе "pidof nginx") или команды (killall -0 nginx) и тот и другой скрипт должны выдавать 0 в RC при наличии процесса.

Также на этих  2-х хостах необходимо установить по экземпляру DNS-cache "unbound" (или другой аналогичный) , который в свою очередь (но намного реже), обращается с DNS запросами к 2-м AD DC серверам.

В первой ноде Nginx  (10.0.0.131) должны быть прописаны, как backend два кэш-сервера:

- 127.0.0.1:53  (экземпляр кеш-сервера на своей же машинке , что и UDP-proxy сервер)

- 10.0.0.132:53  (экземпляр кеш-сервера на другом участнике VRRP кластера)

на втором Nginx (10.0.0.132):

- 127.0.0.1:53  (экземпляр кеш-сервера на своей же машинке , что и UDP-proxy сервер)

- 10.0.0.131:53  (экземпляр кеш-сервера на  другом участнике VRRP кластера)

VIP:10.0.0.130 (важно чтобы frontend слушал только VIP:53, т.к. настоящие IP:53 займет кеширующий сервер на этой  машине)





Cкрипт (на основе "pidof"):
nano /bin/check_nginx.sh
#!/bin/sh
if [ -z "`pidof nginx`" ]; then
  exit 1
fi
chmod 755 /bin/check_nginx.sh

вместо скрипта можно использовать только команду "killall -0 nginx"
тогда скрип с ОС заводить не надо.
=======================
Конфигурация Keepalived:
# (одинаковая для обоих хостов)
нужно проверить/убедиться что включена опция в ядре:
echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf && sysctl -p
#
global_defs {
  # Keepalived process identifier
  router_id nginx
}

# Script to check whether Nginx is running or not
vrrp_script check_nginx {
  script "/bin/check_nginx.sh"
  interval 2
}

# Virtual interface - The priority specifies the order in which the assigned interface to take over in a failover
vrrp_instance VI_01 {
  state BACKUP    # if MASTER proirty 120
  interface eth0
  nopreempt 
  virtual_router_id 130
  priority 110

  # The virtual ip address shared between the two NGINX Web Server which will float
  virtual_ipaddress {
    10.0.0.130/24
  }
  track_script {
    check_nginx
  }
}

=============
конфигурация Nginx:
(установка модуля)
yum install nginx-mod-stream

#======

/etc/nginx/nginx.conf
...
events {
worker_connections 1024;
}

stream {
  upstream backends {
    zone   backend 64k;
    server 127.0.0.1:53 fail_timeout=1s;
    server 10.0.0.131:53 fail_timeout=1s;   #for another nginx ip will: 10.0.0.132
  }
  server {
    listen 10.0.0.130:53 udp;
    listen 10.0.0.130:53;  # tcp
    proxy_pass backends;
    proxy_timeout 1s;
    proxy_responses 1;

  }
}

=====
Конфигурация unbound:
(обоих)
...
server:
interface: 127.0.0.1
access-control: 127.0.0.0/8 allow
interface: 10.0.0.131 # for another node 10.0.0.132
access-control: 10.0.0.0/8 allow
        cache-max-ttl: 14400
        cache-min-ttl: 3600
        hide-identity: yes
        hide-version: yes
        minimal-responses: yes
        prefetch: yes
    prefetch-key: yes
    msg-cache-size: 50m
    msg-cache-slabs: 2
    rrset-cache-size: 100m
    rrset-cache-slabs: 2
    key-cache-size: 128m
    key-cache-slabs: 2
    qname-minimisation: yes
...
forward-zone:
  name: "."
  forward-addr: 10.0.0.2
  forward-addr: 10.0.0.3
  forward-first: yes






пятница, 20 октября 2023 г.

Двойной NAT Сisco IOS

Для NAT с подменой source и destination IP на Cisco IOS нужно использовать функционал "ip nat enable" на интерфейсах. Например, чтобы попасть (c IP 10.0.2.158) на 22 порт устройства в "inside" сети  за "inside" интерфейсом (с source IP/net этого "inside" интерфейса  роутера),  обращаясь на виртуальный порт/IP внешнего Outside интерфейса этого роутера, NAT необходимо настроить следующим образом:

interface FastEthernet8
 description
Outside
 ip address 10.129.162.2 255.255.255.240
 ip nat enable
  !
!
interface GigabitEthernet0
 description Inside
 ip address 10.72.1.10 255.255.255.0
 ip nat enable


ip nat source static tcp 10.72.1.1 22 10.129.162.2 443 extendable

ip access-list extended nat
 permit tcp host 10.0.2.158 host 10.129.162.2 eq 443

ip nat source list nat interface GigabitEthernet0 overload

Команда на хосте 10.0.2.158 (который "видит" 10.129.162.2): 
ssh 10.129.162.2 -p 443 
приведет к открытию ssh сессии с 10.0.2.158 на 22-й порт 10.72.1.1 с source  IP: 10.72.1.10 (то есть хосту 10.72.1.1 не нужен маршрут к 10.0.2.158, а достаточно только связности внутри connected сети 10.72.1.0/24.