Как сразу сбросить соединение TCP на обоих концах на определенном условии с помощью Linux netfilter/iptables?

Я не видел, что сегментация дает сбой ошибка снова, но я все еще вижу, что высокий ЦП прибывает из httpd. Я смог выполнить strace на процессе httpd с ЦП, и я получил следующее:

   # strace -c -p 28964
    Process 28964 attached - interrupt to quit
    ^CProcess 28964 detached
    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
     88.94    0.006093           0     98299      4562 lstat
      3.01    0.000206           0      2740           getcwd
      2.28    0.000156           0      2158         2 read
      2.26    0.000155           0       541        37 open
      1.68    0.000115           0      1321      1321 readlink
      1.52    0.000104           0      1678       822 access
      0.32    0.000022           0       502           fstat
      0.00    0.000000           0        25           write
      0.00    0.000000           0       507           close
      0.00    0.000000           0       547       478 stat
      0.00    0.000000           0        23           poll
      0.00    0.000000           0         2           rt_sigaction
      0.00    0.000000           0         2           rt_sigprocmask
      0.00    0.000000           0         2           writev
      0.00    0.000000           0         3           setitimer
      0.00    0.000000           0         1           sendfile
 ...
    ------ ----------- ----------- --------- --------- ----------------
    100.00    0.006851                108381      7224 total

Эти 4 562 ошибки от lstat являются тем же типом ошибок и обнаруживаются как это на файле журнала:

# strace -f -t -o /var/log/strace.output -p 28964

strace.output

28964 07:10:38 lstat("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
28964 07:10:38 lstat("/var/www", {st_mode=S_IFDIR|0755, st_size=94, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs/sites", {st_mode=S_IFDIR|0755, st_size=30, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs/sites/all", {st_mode=S_IFDIR|0755, st_size=66, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs/sites/all/modules", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs/sites/all/modules/views", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs/sites/all/modules/views/includes", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
28964 07:10:38 lstat("/var/www/vhosts/example.com/httpdocs/sites/all/modules/views/includes/sites", 0x7fff1e627370) = -1 ENOENT (No such file or directory)

Упомянутые выше папки являются всеми в этом каталоге веб-сайта и части CMS Drupal. Однако последний перечислен

/var/www/vhosts/example.com/httpdocs/sites/all/modules/views/includes/sites 

не делает существует, и это должно действительно быть

/var/www/vhosts/example.com/httpdocs/sites

который действительно существует. Похож на lstat, пытается прочитать каталог, который не делает существует....?

-1 ENOENT (No such file or directory)

Каков был бы лучший способ диагностировать это и найти источник этой ошибки для недостающего каталога?

6
задан 13 September 2013 в 16:37
3 ответа

Вы можете использовать xt_RESET , например, -j RESET

1
ответ дан 3 December 2019 в 00:41

К сожалению, локальная сторона не будет уведомлена о принудительном отключении

. Должно быть, tcp-reset означает, что клиенту следует сообщить, что соединение закрывается. Если ваш клиент зависает при отправке сброса, это означает, что он неправильно обрабатывает сброс, отправленный обратно с вашего хоста, на котором запущены IPTables. Если у вас нет средств для решения этой проблемы, я не могу придумать, как вы можете этого добиться.

0
ответ дан 3 December 2019 в 00:41

Вы можете настроить ваше приложение на таймаут.

Другим решением является настройка TCP KeepAlive и более частые проверки, например каждые 10 мин.

Некоторые приложения реализуют KeepAlive на уровне приложения. Например, SSH, apache.

Когда KeepAlive будет отправлен, а соединение будет закрыто на удаленном конце, вы получите RST, с удаленного конца.

Statefull брандмауэры забудут о соединении после периода бездействия. Это означает, что вы можете получить отброшенные пакеты и полуоткрытые соединения, когда у вас нет трафика некоторое время (30 минут или 1 час).

Думаю, лучше спросить о вашей конкретной проблеме, которую вы пытаетесь решить, чем о конкретном решении, которое вы пытаетесь реализовать.

.
1
ответ дан 3 December 2019 в 00:41

Теги

Похожие вопросы