debian:syslog-ng

Розбіжності

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

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

Порівняння попередніх версій Попередня ревізія
Наступна ревізія
Попередня ревізія
debian:syslog-ng [2024/07/25 21:37] – [On Syslog-NG server] Methoddebian:syslog-ng [2025/05/01 19:52] (поточний) – [DNS query logging] Method
Рядок 3: Рядок 3:
  
 <code bash> <code bash>
-wget -qO - https://ose-repo.syslog-ng.com/apt/syslog-ng-ose-pub.asc | sudo apt-key add - +wget -qO - https://ose-repo.syslog-ng.com/apt/syslog-ng-ose-pub.asc | gpg --dearmor > /usr/share/keyrings/ose-repo-syslog-ng-keyring.gpg 
-echo "deb https://ose-repo.syslog-ng.com/apt/ stable debian-bookworm" | sudo tee -a /etc/apt/sources.list.d/syslog-ng-ose.list+cat <<EOF > /etc/apt/sources.list.d/syslog-ng-ose.list 
 +deb [ signed-by=/usr/share/keyrings/ose-repo-syslog-ng-keyring.gpg ] https://ose-repo.syslog-ng.com/apt/ stable debian-bookworm 
 +EOF 
 apt update apt update
 apt-get install syslog-ng-core syslog-ng-scl apt-get install syslog-ng-core syslog-ng-scl
 +syslog-ng -V
 </code> </code>
  
Рядок 32: Рядок 36:
 destination d_a10nat_json_main { destination d_a10nat_json_main {
     file(     file(
-        "/var/log/syslog-ng/jnat/${SOURCEIP}/${SOURCEIP}_${YEAR}-${MONTH}-${DAY}--${HOUR}-${MIN}.json"+        "/nfs/syslog/jnat/${SOURCEIP}/${SOURCEIP}_${S_YEAR}-${S_MONTH}-${S_DAY}--${S_HOUR}-${S_MIN}.json"
         template("$(format-json --pair UNIXTIME=$R_UNIXTIME --pair PROGRAM=$PROGRAM --pair HOST=$HOST --pair SOURCEIP=$SOURCEIP --pair MSG=$MSGONLY)\n")         template("$(format-json --pair UNIXTIME=$R_UNIXTIME --pair PROGRAM=$PROGRAM --pair HOST=$HOST --pair SOURCEIP=$SOURCEIP --pair MSG=$MSGONLY)\n")
         create_dirs(yes)         create_dirs(yes)
Рядок 41: Рядок 45:
 destination d_a10nat_json_backup { destination d_a10nat_json_backup {
     file(     file(
-        "/var/log/syslog-ng/jnat_backup/${SOURCEIP}/${SOURCEIP}_${YEAR}-${MONTH}-${DAY}--${HOUR}-${MIN}.json"+        "/var/log/syslog-ng/jnat/${SOURCEIP}/${SOURCEIP}_${S_YEAR}-${S_MONTH}-${S_DAY}--${S_HOUR}-${S_MIN}.json"
         template("$(format-json --pair UNIXTIME=$R_UNIXTIME --pair PROGRAM=$PROGRAM --pair HOST=$HOST --pair SOURCEIP=$SOURCEIP --pair MSG=$MSGONLY)\n")         template("$(format-json --pair UNIXTIME=$R_UNIXTIME --pair PROGRAM=$PROGRAM --pair HOST=$HOST --pair SOURCEIP=$SOURCEIP --pair MSG=$MSGONLY)\n")
         create_dirs(yes)         create_dirs(yes)
Рядок 59: Рядок 63:
     filter(f_a10nat_cgnat);     filter(f_a10nat_cgnat);
     destination(d_a10nat_json_backup);     destination(d_a10nat_json_backup);
-    when not exists("/var/log/syslog-ng/jnat");+    when not exists("/nfs/syslog/jnat");
     flags(flow-control);     flags(flow-control);
 }; };
 </code> </code>
- 
  
   systemctl restart syslog-ng   systemctl restart syslog-ng
Рядок 100: Рядок 103:
  
 ==== Скрипт міграції логів ==== ==== Скрипт міграції логів ====
 +
   nano /usr/local/bin/move_jnat_to_nfs   nano /usr/local/bin/move_jnat_to_nfs
  
 <code bash> <code bash>
-  #!/bin/bash+#!/bin/bash
  
 # Перевірка, чи основний каталог доступний # Перевірка, чи основний каталог доступний
Рядок 113: Рядок 117:
     echo "Основний каталог не доступний. Логи залишаються в запасному каталозі."     echo "Основний каталог не доступний. Логи залишаються в запасному каталозі."
 fi fi
-<code>+</code>
  
   chmod +x /usr/local/bin/move_jnat_to_nfs   chmod +x /usr/local/bin/move_jnat_to_nfs
   crontab -e   crontab -e
  
-  */5 * * * * /usr/local/bin/move_jnat_to_nfs +<code bash> 
- +*/5 * * * * /usr/local/bin/move_jnat_to_nfs 
 +</code> 
  
 +===== DNS query logging =====
 +  apt-get install syslog-ng-mod-python
  
 +Підготуємо каталоги
 +
 +Створюємо tmpfs директорію та монтуємо
 +
 +  mkdir -p /var/log/syslog-ng/tmpfs
 +  echo "tmpfs /var/log/syslog-ng/tmpfs tmpfs defaults,size=2G,noatime,nodiratime 0 0" >> /etc/fstab
 +  mount -a
 +  mkdir -p /var/log/syslog-ng/tmpfs/dnsdist
 +
 +Створюємо директорію для архівів
 +  mkdir -p /var/log/syslog-ng/archive/dnsdist
 +
 +Створимо скрипт для переміщення логів
 +<code bash>
 +cat <<EOT > /usr/local/bin/move_old_dns_logs.sh
 +#!/bin/bash
 +
 +SRC_DIR="/var/log/syslog-ng/tmpfs/dnsdist"
 +DST_DIR="/var/log/syslog-ng/archive/dnsdist"
 +
 +# Знайти файли старші за 15 хвилин
 +find "$SRC_DIR" -type f -mmin +15 | while read -r file; do
 +    # Визначити відносний шлях
 +    rel_path="${file#$SRC_DIR/}"
 +    target_dir="$DST_DIR/$(dirname "$rel_path")"
 +
 +    # Створити директорію в цільовому місці
 +    mkdir -p "$target_dir"
 +
 +    # Перемістити файл
 +    mkdir -p "$(dirname "$target_dir/$rel_path")"
 +    mv "$file" "$target_dir/"
 +done
 +
 +# Видалити всі порожні каталоги у вихідному каталозі
 +find "$SRC_DIR" -type d -empty -delete
 +EOT
 +</code>
 +
 +  chmod +x /usr/local/bin/move_old_dns_logs.sh
 +  bash /usr/local/bin/move_old_dns_logs.sh
 +
 +  crontab -e
 +
 +Вписуємо
 +  * * * * * /usr/local/bin/move_old_dns_logs.sh
 +
 +Додатково логи можна переміщати на віддаленний сервер по NFS
 +
 +  apt install nfs-common
 +  mkdir -p /var/log/syslog-ng/nfs
 +  showmount --exports 172.16.0.14
 +  echo "172.16.0.14:/volume2/dns-log /var/log/syslog-ng/nfs/ nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0" >> /etc/fstab
 +  mount -a
 +  mkdir -p /var/log/syslog-ng/nfs/dnsdist
 +
 +Створимо скрипт для переміщення логів
 +<code bash>
 +cat <<EOT > /usr/local/bin/move_dns_logs_to_nfs.sh
 +#!/bin/bash
 +
 +SRC_DIR="/var/log/syslog-ng/archive/dnsdist"
 +NFS_DIR="/var/log/syslog-ng/nfs/dnsdist"   # шлях до каталогу на NFS
 +NFS_MOUNT="/var/log/syslog-ng/nfs/" # основна точка монтування NFS
 +RETENTION_DAYS=100                   # кількість днів для зберігання файлів
 +
 +# Перевірити, чи змонтовано NFS
 +if ! mountpoint -q "$NFS_MOUNT"; then
 +    echo "ERROR: NFS не змонтовано у $NFS_MOUNT."
 +    exit 1
 +fi
 +
 +# Знайти файли старші за 15 хвилин
 +find "$SRC_DIR" -type f -mmin +15 | while read -r file; do
 +    # Визначити відносний шлях
 +    rel_path="${file#$SRC_DIR/}"
 +    target_dir="$NFS_DIR/$(dirname "$rel_path")"
 +
 +    # Створити директорію на NFS
 +    mkdir -p "$target_dir"
 +
 +    # Перемістити файл
 +    mkdir -p "$(dirname "$target_dir/$rel_path")"
 +    mv "$file" "$target_dir/"
 +done
 +
 +# Видалити всі порожні каталоги у вихідному каталозі
 +find "$SRC_DIR" -type d -empty -delete
 +
 +# Видалити файли на NFS, які старші за вказану кількість днів
 +find "$NFS_DIR" -type f -mtime +"$RETENTION_DAYS" -delete
 +
 +# Також видалити порожні каталоги на NFS після видалення файлів
 +find "$NFS_DIR" -type d -empty -delete
 +EOT
 +</code>
 +
 +  chmod +x  /usr/local/bin/move_dns_logs_to_nfs.sh
 +  ln -s /usr/local/bin/move_dns_logs_to_nfs.sh /etc/cron.hourly/move_dns_logs_to_nfs
 +  bash /usr/local/bin/move_dns_logs_to_nfs.sh
 +
 +<code bash>
 +cat <<EOT > /etc/syslog-ng/conf.d/source_net_udp_514.conf
 +source source_net_udp_514 {
 +    udp(ip(0.0.0.0) port(514) flags(no-parse));
 +};
 +EOT
 +cat <<EOT > /etc/syslog-ng/conf.d/source_net_tcp_514.conf
 +source source_net_tcp_514 {
 +    tcp(ip(0.0.0.0) port(514) flags(no-parse));
 +};
 +EOT
 +</code>
 +
 +<code bash>
 +cat <<EOT > /etc/syslog-ng/conf.d/dnsdist.conf
 +#rewrite r_round_min_10 {
 +#    set("$(subst(\"((\\d*)(\\d)$)\", \"\\10\", $(env MIN)))" value("R_MIN_10"));
 +#};
 +
 +#rewrite r_round_min_10 {
 +#    subst("^(\\d)(\\d)$", "${1}0", value("MIN") type("pcre") flags(global) condition(filter(f_dns)));
 +#    set("${MIN}" value("R_MIN_10"));  # Копіюємо MIN → R_MIN_10 після округлення останньої цифри
 +#};
 +
 +# Округлення хвилин до 10
 +rewrite r_round_min_10 {
 +    # Використовуємо pcre для заміни останньої цифри на 0
 +    set("$R_MIN_10" value("env $MIN"));
 +    subst("^([0-9]?)([0-9])$", "$1\0", value("R_MIN_10"));
 +};
 +
 +parser p_json {
 +    json-parser(prefix(".json."));
 +};
 +
 +template t_full_dnsdist {
 +    template("${.json.timestamp},${.json.ip_version},${.json.client_ip},${.json.protocol},${.json.query_type},${.json.query_name}\n");
 +};
 +
 +template t_custom_dnsdist {
 +    template("${.json.timestamp},${.json.client_ip},${.json.query_name}\n");
 +};
 +
 +destination d_dns_csv {
 +    file("/var/log/syslog-ng/tmpfs/dnsdist/${YEAR}/${MONTH}/${DAY}/${HOUR}_${R_MIN_10}_queries.csv"
 +        #template("${.json.timestamp},${.json.ip_version},${.json.client_ip},${.json.protocol},${.json.query_type},${.json.query_name}\n")
 +        template(t_custom_dnsdist)
 +        template-escape(yes)
 +        create-dirs(yes)
 +        flush-lines(100)
 +        #flush-timeout(1000)
 +        log-fifo-size(2048)
 +        disk-buffer(
 +            mem-buf-size(10000)        # Або mem-buf-size, але краще length, залежно від версії
 +            disk-buf-size(1073741824)    # 1 GB у байтах
 +            reliable(yes)
 +            dir("/var/log/syslog-ng/tmpfs/buffer")
 +        )
 +        #init("echo 'timestamp,client_ip,query_name' > $FILENAME");
 +        flags(no-multi-line)
 +    );
 +};
 +
 +destination d_debug_all {
 +    file("/var/log/syslog-ng/debug/all.log"
 +        template("${ISODATE} ${HOST} ${PROGRAM} [${PID}]: ${MSG}\n")
 +        template-escape(no)
 +        create-dirs(yes)
 +        flush-lines(1)
 +    );
 +};
 +
 +#log {
 +#    source(source_net_udp_514);
 +#    destination(d_debug_all);
 +#};
 +
 +# Фільтр для ігнорування доменів
 +filter f_ignore_domains {
 +    not match("($(cat /etc/syslog-ng/ignore_domains.list | tr '\n' '|' | sed 's/|$//'))" value("MESSAGE"));
 +};
 +
 +log {
 +    source(source_net_udp_514);
 +    rewrite(r_round_min_10);
 +    parser(p_json);
 +    destination(d_dns_csv);
 +};
 +EOT
 +</code>
 +
 +
 +Налаштування продуктивності syslog-ng
 +
 +  * flush_lines - кількість рядків перед записом
 +  * time_reopen - час перед повторним відкриттям
 +  * log_fifo_size - розмір черги
 +  * threaded - багатопотоковий режим
 +
 +<code bash>
 +cat << EOF > /etc/syslog-ng/conf.d/performance.conf 
 +options {
 +    flush_lines(1000);
 +    time_reopen(10);
 +    log_fifo_size(10000);
 +    stats_freq(0);
 +    threaded(yes);
 +    use_dns(no);
 +    use_fqdn(no);
 +    chain_hostnames(off);
 +    keep_hostname(yes);
 +};
 +EOF
 +</code>
 +
 +Домени, які не будуть логуватися
 +
 +Формат: один домен на рядок
 +<code bash>
 +cat << EOF > /etc/syslog-ng/ignore_domains.list
 +google.com
 +youtube.com
 +facebook.com
 +instagram.com
 +twitter.com
 +netflix.com
 +amazon.com
 +microsoft.com
 +apple.com
 +EOF
 +</code>
 +
 +Перевіримо правильність конфігурацій
 +  syslog-ng -s -f /etc/syslog-ng/syslog-ng.conf
 +
 +Тестовий запуск
 +  syslog-ng -Fev
 +або
 +  syslog-ng -R /tmp/syslog-ng.persist -Fevdd
 +
 +З іншої консолі посилаємо тестове повідомлення
 +  logger -n 127.0.0.1 -P 514 -d "Тестове повідомлення через UDP"
 +
 +Перезапуск служб
 +
 +  systemctl restart syslog-ng
 +
 +
 +FIXME
 +  361  nano /usr/local/bin/move_logs_to_nfs.sh
 +  362  nano /usr/local/bin/move_old_logs.sh
 +  382  nano /etc/fstab
 +  393  nano /etc/tmpfiles.d/syslog-ng.conf
 +  394  systemd-tmpfiles --create /etc/tmpfiles.d/syslog-ng.conf
 +  396  systemctl restart syslog-ng
 +FIXME
 +<code bash>
 +cat <<EOT > /etc/syslog-ng/conf.d/dnsdist.conf
 +D /var/log/syslog-ng/tmpfs 0755 root root
 +D /var/log/syslog-ng/tmpfs/buffer 0700 root root
 +D /var/log/syslog-ng/tmpfs/dnsdist 0755 root root
 +EOT
 +</code>
 +FIXME