Порівняння попередніх версій Попередня ревізія Наступна ревізія | Попередня ревізія |
debian:powerdns [23/04/2025 11:53] – [Install PowerDNS Server] Method | debian:powerdns [25/04/2025 10:02] (поточний) – [DNSDist SNMP] Method |
---|
{{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|Нотатки]] - додаткові посилання та інформація |
| |
| |
</code> | </code> |
| |
===== PowerDNS Recursor ===== | {{anchor:install_powerdns_recursor}} ===== PowerDNS Recursor ===== |
{{anchor:install_powerdns_recursor}} | |
| |
<WRAP center round info 80%> | <WRAP center round info 80%> |
Встановимо необхідні пакети | Встановимо необхідні пакети |
<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> |
| |
===== Додаткові можливості ===== | ===== Додаткові можливості ===== |
| |
==== Чорний список DNSDist ==== | {{anchor:configure_dnsdist_black_list}} ==== Чорний список DNSDist ==== |
{{anchor:configure_dnsdist_black_list}} | |
| |
<WRAP center round info 80%> | <WRAP center round info 80%> |
Коментуємо рядок "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> |
| |
</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> |
| |
| |