Назад | Перейти на главную страницу

Конфигурация syslog-ng работает в режиме отладки, но не без

Я пытаюсь запустить syslog-ng как ресурс OCF в кластере высокой доступности. Я сталкиваюсь с ужасно странным поведением - когда я запускаю отдельный экземпляр в режиме отладки, фильтры совпадают, и он пересылается соответствующим образом. Однако, когда я удаляю флаг отладки, он соответствует только одному из двух фильтров. Итак, вот как это работает (имена хостов и IP-адреса отредактированы):

# pcs status
Cluster name: fwdr
Stack: corosync
Current DC: fwdr-secondary (version 1.1.19-8.el7_6.4-c3c624ea3d) - partition with quorum
Last updated: Thu Sep  5 11:50:18 2019
Last change: Thu Sep  5 10:27:51 2019 by root via cibadmin on fwdr-primary

2 nodes configured
2 resources configured

Online: [ fwdr-primary fwdr-secondary ]

Full list of resources:

 virtual_ip     (ocf::heartbeat:IPaddr2):       Started fwdr-primary
 syslog-ng      (ocf::heartbeat-git:syslog-ng): Started fwdr-primary

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

syslog-ng.conf:

@version: 3.5

source incoming {
        udp(
            ip("VIP")
            port(514)
            flags(no-parse)
        );

        tcp(
            ip("VIP")
            port(514)
            flags(no-parse)
        );
};

filter pi_duplication {
    netmask("someip/32")
    or netmask("someip/32")
    or netmask("someip/32")

    ...a bunch of these...

    or netmask("someip/32")
};

destination dl {
    udp(
            "<REDACTED:dl hostname>"
            port(514)
            spoof_source(yes)
            template( "${MESSAGE}\n" )
    );
};

destination ci {
    tcp(
        "<REDACTED:ci hostname>"
        port(11468)
        template( "${MESSAGE}\n" )
    );
};

log {
    source(incoming);
    filter(pi);
    destination(ci);
};

Теперь отключите ресурс syslog-ng:

# pcs resource disable syslog-ng
...
Full list of resources:

 virtual_ip     (ocf::heartbeat:IPaddr2):       Started fwdr-primary
 syslog-ng      (ocf::heartbeat-git:syslog-ng): Stopped (disabled)

Теперь запустим его в режиме отладки:

# syslog-ng -f /etc/syslog-ng/syslog-ng.conf --foreground --debug
Reading path for candidate modules; path='//usr/lib64/syslog-ng'

...

Compiling #unnamed sequence [log] at [/etc/syslog-ng/syslog-ng.conf:6]
  Compiling incoming reference [source] at [/etc/syslog-ng/syslog-ng.conf:6]
    Compiling incoming sequence [source] at [/etc/syslog-ng/syslog-ng.conf:3]
      Compiling #unnamed junction [log] at [/etc/syslog-ng/syslog-ng.conf:3]
        Compiling #unnamed single [log] at [/etc/syslog-ng/syslog-ng.conf:4]
        Compiling #unnamed single [log] at [/etc/syslog-ng/syslog-ng.conf:1]
  Compiling pi_duplication reference [filter] at [/etc/syslog-ng/syslog-ng.conf:6]
    Compiling pi_duplication sequence [filter] at [/etc/syslog-ng/syslog-ng.conf:1]
      Compiling #unnamed single [log] at [/etc/syslog-ng/syslog-ng.conf:1]
  Compiling ci reference [destination] at [/etc/syslog-ng/syslog-ng.conf:6]
    Compiling ci sequence [destination] at [/etc/syslog-ng/syslog-ng.conf:5]
      Compiling #unnamed junction [log] at [/etc/syslog-ng/syslog-ng.conf:5]
        Compiling #unnamed single [log] at [/etc/syslog-ng/syslog-ng.conf:5]
Compiling #unnamed sequence [log] at [/etc/syslog-ng/syslog-ng.conf:7]
  Compiling incoming reference [source] at [/etc/syslog-ng/syslog-ng.conf:7]
  Compiling dl reference [destination] at [/etc/syslog-ng/syslog-ng.conf:7]
    Compiling dl sequence [destination] at [/etc/syslog-ng/syslog-ng.conf:4]
      Compiling #unnamed junction [log] at [/etc/syslog-ng/syslog-ng.conf:4]
        Compiling #unnamed single [log] at [/etc/syslog-ng/syslog-ng.conf:5]
Syslog connection established; fd='9', server='AF_INET(<REDACTED:dl host's IP>:514)', local='AF_INET(0.0.0.0:0)'
Running application hooks; hook='1'
Running application hooks; hook='3'
syslog-ng starting up; version='3.5.6'
Syslog connection established; fd='8', server='AF_INET(<REDACTED:is host's IP>:11468)', local='AF_INET(0.0.0.0:0)'
Syslog connection accepted; fd='16', client='AF_INET(<REDACTED:ci host's IP>:47876)', local='AF_INET(10.68.233.48:514)'
Incoming log entry; line='<REDACTED>'
Filter rule evaluation begins; rule='pi_duplication', location='/etc/syslog-ng/syslog-ng.conf:17:32'
Filter node evaluation result; result='not-match'
Filter node evaluation result; result='not-match'
Filter node evaluation result; result='not-match', type='OR'
Filter node evaluation result; result='not-match'
Filter node evaluation result; result='not-match', type='OR'
Filter node evaluation result; result='not-match'
Filter node evaluation result; result='not-match', type='OR'

...repeated...

Filter node evaluation result; result='not-match'
Filter node evaluation result; result='not-match', type='OR'
Filter node evaluation result; result='match'
Filter node evaluation result; result='match', type='OR'
Filter node evaluation result; result='match', type='OR'
Filter node evaluation result; result='match', type='OR'
Filter node evaluation result; result='match', type='OR'
Filter node evaluation result; result='match', type='OR'
Filter node evaluation result; result='match', type='OR'
Filter rule evaluation result; result='match', rule='pi_duplication', location='/etc/syslog-ng/syslog-ng.conf:17:32'

И так далее, каждая входящая строка совпадает и правильно отправляется обеим целям. Пример трафика, где источник - это генерирующий хост, пункт назначения - это хост ci, myvip - это VIP, который я слушаю, а myrealip - это реальный IP-адрес fwdr-primary:

# tcpdump -nn -i enp15s0f0 "port 514 or port 11468"                                       
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp15s0f0, link-type EN10MB (Ethernet), capture size 262144 bytes
12:03:14.545138 IP source.48100 > myvip.514: Flags [P.], seq 2372587949:2372588369, ack 3533250116, win 29, length 420
12:03:14.545185 IP myvip.514 > source.48100: Flags [R], seq 3533250116, win 0, length 0
12:03:15.227043 IP source.48112 > myvip.514: Flags [S], seq 2965678208, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 9], length 0
12:03:15.227107 IP myvip.514 > source.48112: Flags [S.], seq 280396112, ack 2965678209, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
12:03:15.260720 IP source.48112 > myvip.514: Flags [.], ack 1, win 29, length 0
12:03:15.260773 IP source.48112 > myvip.514: Flags [P.], seq 1:401, ack 1, win 29, length 400
12:03:15.260796 IP myvip.514 > source.48112: Flags [.], ack 401, win 237, length 0
12:03:15.262926 IP source.48112 > dlhost.514: SYSLOG local0.info, length: 400
12:03:15.263037 IP myrealip.41003 > destination.11468: Flags [P.], seq 2022253190:2022253590, ack 3273547315, win 229, options [nop,nop,TS val 3195491935 ecr 501321261], length 400
12:03:15.263175 IP destination.11468 > myrealip.41003: Flags [.], ack 400, win 235, options [nop,nop,TS val 501331496 ecr 3195491935], length 0

Теперь снова включите ресурс кластера:

# pcs resource enable syslog-ng

Сейчас сеть молчит:

12:08:24.610741 IP source.48240 > myvip.514: Flags [S], seq 3387574314, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 9], length 0
12:08:24.610796 IP myvip.514 > source.48240: Flags [S.], seq 2754922833, ack 3387574315, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
12:08:24.644579 IP source.48240 > myvip.514: Flags [.], ack 1, win 29, length 0
12:09:01.941077 IP source.48240 > myvip.514: Flags [P.], seq 1:484, ack 1, win 29, length 483
12:09:01.941127 IP myvip.514 > source.48240: Flags [.], ack 484, win 237, length 0
12:09:01.942064 IP source.48240 > dlhost.514: SYSLOG local0.info, length: 483

(Пакеты напрямую из источника> dlhost - это то место, где я подделываю источник в правиле dl). Другими словами, трассировка при работе в кластере показывает, что она соответствует только правилу dl, тогда как при работе на переднем плане в режиме отладки правильно соответствует обоим правилам! Это затрудняет отладку, и я не могу понять, что происходит.

Судя по вашей версии syslog-ng, я предполагаю, что вы используете syslog-ng от EPEL на RHEL / CentOS 7.

Не могу проверить это прямо сейчас, но у меня есть далекие воспоминания, что когда syslog-ng запускается из systemd, SELinux блокирует сетевые подключения. Вы должны проверить свои журналы аудита, если есть что-нибудь, связанное с syslog-ng.

Мой блог по этой теме может помочь: https://www.syslog-ng.com/community/b/blog/posts/using-syslog-ng-with-selinux-in-enforcing-mode