Як відомо, логи у CloudFlare (CF) дивитися дуже незручно. А от в kibana – зовсім інша річ. Наше завдання зробити пересилку log’ів у logstash. Дана стаття припускає, що у вас вже є налаштований ELK стек і розкаже, як додати в існуючий стек новий source, тобто CF. Стаття буде розбита на 2 частини: Logstash і CF
Logstash
Спочатку налаштуємо прийом повідомлень, бо якщо робити навпаки, то не пройде health check (HC) зі сторони CF. Налаштовувати будемо через nginx proxy_pass. Чому не напряму? Тому що, час від часу CF посилає HC пакет, щоб перевірити, чи живий DST і цей пакет кардинально відрізняється від даних: HC не стиснутий gzip, на відміну від data-пакету і тому, якщо направляти напряму в logstash, то останній будемо мати помилку
#<Puma::HttpParserError: Invalid HTTP format, parsing fails.>
і відповідно, HC не пройде і CF припинить посилати логи. Отже, конфіг nginx’a:
server {
listen 80 ssl;
server_name _;
ssl_certificate /etc/nginx/ssl/domain.com.crt;
ssl_certificate_key /etc/nginx/ssl/domain.com.key;
client_max_body_size 100M;
location / {
# Pass the request as plain HTTP to Logstash on localhost
proxy_pass http://127.0.0.1:8764;
# Ensure headers are preserved for Logstash
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Increase timeout for large log batches
proxy_read_timeout 300;
}
}
Важливий момент: тільки https. Схему http не пропустить на етапі створення у CF:
Invalid destination configuration: error getting destination: unsupported scheme: http
Конфіг logstash
input {
http {
port => "8764"
codec => "json_lines"
additional_codecs => { "application/gzip" => "gzip_lines" } # Handles CF compression
# ssl => true
# keystore => "/etc/nginx/ssl/keystore"
# keystore_password => "XXX"
}
}
filter {
if [JA4] {
mutate { add_tag => [ "has_fingerprint" ] }
}
}
output {
else if [http_host] == "cflog.domain.com" {
elasticsearch {
hosts => "elk.domain.net"
index => "cf-%{+YYYY-MM}"
sniffing => false
}
}
}
Деякі нюанси в конфігу. Я навмисне залишив секцію ssl, раптом вам треба буде налаштувати security connection між nginx і logstash. І для logstash 6.2 треба саме такі параметри, інакше в при запуску будуть помилки
[2026-02-17T16:05:14,497][ERROR][logstash.inputs.http ] Unknown setting 'ssl_certificate' for http
[2026-02-17T16:05:14,498][ERROR][logstash.inputs.http ] Unknown setting 'ssl_key' for http
CloudFlare
Вибираємо відповідний домен -> Analytics & logs -> Logpush. Вибираємо Create a Logpush job -> HTTP destination і заповнюємо:
Http destination: cflog.domain.com
Send fields: тут треба вибрати з розумом, які поля передавати.
Timestamp format: rfc3339
Все інше – по бажанню.
Логи почнуть писатися не одразу, а з деякою затримкою, це треба враховувати. Якщо в логах nginx’a побачите
"POST / HTTP/2.0" 200 2 "-" "Go-http-client/2.0"
значить все пройшло успішно.