debian:powerdns

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Порівняння попередніх версій Попередня ревізія
Наступна ревізія
Попередня ревізія
debian:powerdns [23/04/2025 11:33] – [DNSDist] Methoddebian:powerdns [25/04/2025 10:02] (поточний) – [DNSDist SNMP] Method
Рядок 1: Рядок 1:
-{{tag>[debian debian_12 dns]}} 
 ====== PowerDNS AIO ====== ====== PowerDNS AIO ======
 +{{tag>[debian debian_12 dns]}}
  
 В цій статті опишу встановлення комплексу для обслуговування DNS, в неї входить: В цій статті опишу встановлення комплексу для обслуговування DNS, в неї входить:
-  * [[debian:powerdns#prepare|Підготовка]] - базове налаштування системи та встановлення необхідних компонентів +  * [[#prepare|Підготовка]] - базове налаштування системи та встановлення необхідних компонентів 
-  * [[debian:powerdns#install_powerdns_recursor|PowerDNS-Recursor]] - для обслуговування DNS-запитів клієнтів. Відповідає за рекурсивне вирішення DNS-запитів +  * [[#install_powerdns_recursor|PowerDNS-Recursor]] - для обслуговування DNS-запитів клієнтів. Відповідає за рекурсивне вирішення DNS-запитів 
-  * [[debian:powerdns#install_powerdns_server|PowerDNS-Authoritative]] - для обслуговування DNS-запитів регуляторів та тримання власних DNS-зон. Відповідає за авторитарне вирішення DNS-запитів +  * [[#install_powerdns_server|PowerDNS-Authoritative]] - для обслуговування DNS-запитів регуляторів та тримання власних DNS-зон. Відповідає за авторитарне вирішення DNS-запитів 
-  * [[debian:powerdns#install_dnsdist|DNSDist]] - високопродуктивний балансувальник DNS-запитів (теж від команди PowerDNS). Забезпечує балансування навантаження та захист від DDoS-атак +  * [[#install_dnsdist|DNSDist]] - високопродуктивний балансувальник DNS-запитів (теж від команди PowerDNS). Забезпечує балансування навантаження та захист від DDoS-атак 
-  * [[debian:powerdns#install_powerdns_admin|PowerDNS-Admin]] - веб-інтерфейс для керування PowerDNS-Authoritative +  * [[#install_powerdns_admin|PowerDNS-Admin]] - веб-інтерфейс для керування PowerDNS-Authoritative 
-  * [[debian:powerdns#additional_features|Додаткові можливості]] - Додаткові можливості для покращення продуктивності та функціоналу +  * [[#additional_features|Додаткові можливості]] - Додаткові можливості для покращення продуктивності та функціоналу 
-    * [[debian:powerdns#configure_dnsdist_snmp|DNSDist SNMP]] - для моніторингу станів серверів +    * [[#configure_dnsdist_snmp|DNSDist SNMP]] - для моніторингу станів серверів 
-    * [[debian:powerdns#configure_dnsdist_black_list|Чорний список DNSDist]] - для блокування шкідливого трафіку +    * [[#configure_dnsdist_black_list|Чорний список DNSDist]] - для блокування шкідливого трафіку 
-  * [[debian:powerdns#notes|Нотатки]] - додаткові посилання та інформація+    * [[#configure_dnsdist_logger|Логування запитів DNSDist]] - для відстеження на запити спецслужб 
 +  * [[#notes|Нотатки]] - додаткові посилання та інформація
  
  
Рядок 43: Рядок 44:
 </code> </code>
  
-===== PowerDNS Recursor ===== +{{anchor:install_powerdns_recursor}} ===== PowerDNS Recursor =====
-{{anchor:install_powerdns_recursor}}+
  
 <WRAP center round info 80%> <WRAP center round info 80%>
Рядок 169: Рядок 169:
 apt-get install -y pdns-server pdns-backend-mysql apt-get install -y pdns-server pdns-backend-mysql
 cp -r /etc/powerdns/ /etc/powerdns.orig/ cp -r /etc/powerdns/ /etc/powerdns.orig/
 +rm /etc/powerdns/pdns.d/*
 </code> </code>
 +
  
 Налаштуємо конфігурацію pdns.conf Налаштуємо конфігурацію pdns.conf
Рядок 176: Рядок 178:
 setgid=pdns setgid=pdns
 setuid=pdns setuid=pdns
-local-address=127.0.0.1 
-local-port=53 
 include-dir=/etc/powerdns/pdns.d include-dir=/etc/powerdns/pdns.d
 launch= launch=
-EOF+EOT 
 +</code> 
 + 
 +Налаштуємо конфігурацію прослуховування pdns.d/00_listen.conf 
 +<code bash> 
 +cat <<EOT > /etc/powerdns/pdns.d/00_listen.conf 
 +local-address=127.0.0.1 
 +local-port=53 
 +EOT 
 +</code> 
 + 
 +Налаштуємо конфігурацію тюнінгу pdns.d/09_tuning.conf 
 +<code bash> 
 +cat <<EOT > /etc/powerdns/pdns.d/09_tuning.conf 
 +allow-axfr-ips=127.0.0.1/32 
 +cache-ttl=60 
 +control-console=no 
 +default-ttl=3600 
 +disable-axfr=no 
 +log-dns-queries=yes 
 +logging-facility=0 
 +loglevel=4 
 +max-queue-length=5000 
 +max-tcp-connections=50 
 +EOT
 </code> </code>
  
Рядок 297: Рядок 321:
 Згенеруємо пароль для консолі Згенеруємо пароль для консолі
 <code bash> <code bash>
-dnsdist -c +pip  install  dnsdist_console
-</code>+
  
-<code Lua> +python3 -c "from dnsdist_console import HashPassword as H;print(H().generate(\"mysupersecret\"))" 
-makeKey() +  $scrypt$ln=10,p=1,r=8$rY9YB+QnTOkxKOBlNUUYaw==$4C4Hm5IFiOTluLkjGtPMl4FtYQIwJvSA/eb7uqAlFg4=
-setKey("BV6DNSOSOfEAV98LDeNb3+99L7f9CuFqoomlWvw3SwA=")+
 </code> </code>
 Якщо хочемо відкрити рекурсію для всіх, то прибираємо всі правила і додаємо recursive_ips:addMask('0.0.0.0/0'). Якщо хочемо відкрити рекурсію для всіх, то прибираємо всі правила і додаємо recursive_ips:addMask('0.0.0.0/0').
Рядок 367: Рядок 389:
 Встановимо необхідні пакети Встановимо необхідні пакети
 <code bash> <code bash>
-apt install python3-dev python3-venv apt install libpq-devgit default-libmysqlclient-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential curl jq+apt install python3-dev python3-venv libpq-dev default-libmysqlclient-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential curl jq
 </code> </code>
  
Рядок 578: Рядок 600:
 ===== Додаткові можливості ===== ===== Додаткові можливості =====
  
-==== Чорний список DNSDist ==== +{{anchor:configure_dnsdist_black_list}} ==== Чорний список DNSDist ====
-{{anchor:configure_dnsdist_black_list}}+
  
 <WRAP center round info 80%> <WRAP center round info 80%>
Рядок 1010: Рядок 1031:
 Коментуємо рядок "mibs :" для snmp-mibs-downloader Коментуємо рядок "mibs :" для snmp-mibs-downloader
 <code bash> <code bash>
-nano /etc/snmp/snmp.conf+sudo sed -i 's/^mibs\s*:/#mibs :/' /etc/snmp/snmp.conf
 </code> </code>
  
-Налаштовуємо snmpd agentx для dnsdist+Вмикаємо snmpd agentx
 <code bash> <code bash>
-nano /etc/snmp/snmpd.conf+cat <<EOT > /etc/snmp/snmpd.conf.d/00_agent.conf 
 +master  agentx 
 +EOT
 </code> </code>
  
-Правимо конфігурацію snmpd+Конфігурація snmpd agentx для dnsdist
 <code bash> <code bash>
-master  agentx+cat <<EOT > /etc/snmp/snmpd.conf.d/10_dnsdist.conf
 agentxperms 0700 0700 _dnsdist _dnsdist agentxperms 0700 0700 _dnsdist _dnsdist
 rocommunity dnsdist42 rocommunity dnsdist42
 +EOT
 +</code>
 +
 +Вказуємо IP, на яких буде слухати snmp agentx.
 +<code bash>
 +cat <<EOT > /etc/snmp/snmpd.conf.d/99_bind_address.conf
 +agentaddress 127.0.0.1,[::1], 172.16.0.16
 +EOT
 </code> </code>
  
Рядок 1131: Рядок 1162:
 </code> </code>
 та змінити параметр agentaddress в /etc/snmp/snmpd.conf з 127.0.0.1 на іп адресу, за якою можна звернутись до хоста з мережі, або на 0.0.0.0 для глобального досупу та змінити параметр agentaddress в /etc/snmp/snmpd.conf з 127.0.0.1 на іп адресу, за якою можна звернутись до хоста з мережі, або на 0.0.0.0 для глобального досупу
 +
 +
 +{{anchor:configure_dnsdist_logger}
 +} ==== Логування запитів DNSDist ====
 +
 +<WRAP center round info>
 +Логування запитів DNSDist дозволяє перенаправити всі DNS-запити на віддалений syslog сервер
 +</WRAP>
 +
 +<WRAP center round info>
 +інформаційний блок
 +</WRAP>
 +
 +<code bash>
 +apt install lua-socket
 +</code>
 +
 +<code bash>
 +nano /etc/dnsdist/conf.d/00_logger.lua
 +</code>
 +
 +<code lua>
 +-- apt install lua-socket
 +-- Спроба підключити luasocket
 +local socket_ok, socket = pcall(require, "socket")
 +
 +-- UDP сокет для syslog
 +local udp
 +if socket_ok then
 +   udp = socket.udp()
 +   udp:settimeout(0)
 +   udp:setpeername("172.16.0.48", 514)
 +end
 +
 +-- Функція для декодування qtype у рядок
 +function qtype_to_string(qtype)
 +   if not qtype then return nil end -- Якщо qtype не вказано, повертаємо nil
 +   local names = {
 +      [1]="A",[2]="NS",[3]="MD",[4]="MF",[5]="CNAME",[6]="SOA",[7]="MB",[8]="MG",[9]="MR",[10]="NULL",[11]="WKS",[12]="PTR",[13]="HINFO",
 +      [14]="MINFO",[15]="MX",[16]="TXT",[17]="RP",[18]="AFSDB",[19]="X25",[20]="ISDN",[21]="RT",[22]="NSAP",[23]="NSAP-PTR",[24]="SIG",
 +      [25]="KEY",[26]="PX",[27]="GPOS",[28]="AAAA",[29]="LOC",[30]="NXT",[31]="EID",[32]="NIMLOC",[33]="SRV",[34]="ATMA",[35]="NAPTR",
 +      [36]="KX",[37]="CERT",[38]="A6",[39]="DNAME",[40]="SINK",[41]="OPT",[42]="APL",[43]="DS",[44]="SSHFP",[45]="IPSECKEY",[46]="RRSIG",
 +      [47]="NSEC",[48]="DNSKEY",[49]="DHCID",[50]="NSEC3",[51]="NSEC3PARAM",[52]="TLSA",[53]="SMIMEA",[55]="HIP",[56]="NINFO",
 +      [57]="RKEY",[58]="TALINK",[59]="CDS",[60]="CDNSKEY",[61]="OPENPGPKEY",[62]="CSYNC",[63]="ZONEMD",[64]="SVCB",[65]="HTTPS",
 +      [99]="SPF",[100]="UINFO",[101]="UID",[102]="GID",[103]="UNSPEC",[104]="NID",[105]="L32",[106]="L64",[107]="LP",[108]="EUI48",
 +      [109]="EUI64",[249]="TKEY",[250]="TSIG",[255]="ANY",[256]="URI",[257]="CAA",[258]="AVC",[259]="TA",[260]="DLV"
 +   }
 +   return names[qtype] or "TYPE"..tostring(qtype) -- Якщо qtype не відповідає жодному з визначених типів, повертаємо "TYPE" + рядок qtype
 +end
 +
 +-- Формат часу з мікросекундами (UTC ISO8601)
 +local function timestamp_us()
 +   local t = os.date("!*t")
 +   local usec = math.floor(socket.gettime() * 1e6) % 1e6
 +   return string.format("%04d-%02d-%02dT%02d:%02d:%02d.%06dZ",
 +      t.year, t.month, t.day, t.hour, t.min, t.sec, usec)
 +end
 +
 +-- Логер
 +function myFuncLoger(dq)
 +   local ip = dq.remoteaddr:toString()
 +   local ip_version = dq.remoteaddr:isIPv6() and "IPv6" or "IPv4"
 +   local qname = dq.qname:toStringNoDot()
 +   local qtype = qtype_to_string(dq.qtype)
 +   local protocol = dq:getProtocol()
 +   local time = timestamp_us()
 +
 +   -- Побудова JSON
 +   local json = string.format(
 +      '{"timestamp":"%s","ip_version":"%s","client_ip":"%s","protocol":"%s","query_type":"%s","query_name":"%s"}',
 +      time, ip_version, ip, protocol, qtype, qname
 +   )
 +
 +   -- Лог в консоль dnsdist
 +   -- infolog("[LOG JSON] " .. json)
 +
 +   -- Відправка
 +   if udp then
 +      udp:send(json)
 +   else
 +      local fifo = io.open("/var/run/dnsdist_query_log.fifo", "w")
 +      if fifo then
 +         fifo:write(json .. "\n")
 +         fifo:flush()
 +         fifo:close()
 +      end
 +   end
 +
 +   return DNSAction.None
 +end
 +
 +if udp then
 +   infolog "[LOGGER] Logger initialized: SYSLOG-UDP"
 +else
 +   infolog "[LOGGER] Logger initialized: FIFO fallback"
 +end
 +
 +addAction(NetmaskGroupRule(recursive_ips), LuaAction(myFuncLoger))
 +</code>
  
  
  • debian/powerdns.1745408001.txt.gz
  • Востаннє змінено: 23/04/2025 11:33
  • повз Method