Сценарий SQL Developer PL/SQL не отображает выходные данные через OpenVPN после работы определенного времени.

Проблема:

Когда я пытаюсь запустить сбор статистики через OpenVPN в моей базе данных Oracle 19c, SQL Developer не возвращает типичное сообщение «Процедура PL/SQL успешно завершена», если она выполняется более определенного времени.

Судя по всему, через некоторое время соединение зависает, и мне нужно либо отключиться от OpenVPN, либо убить SQL Developer в диспетчере задач Windows, чтобы закрыть его.

Моя база данных Oracle 19c и сервер OpenVPN находятся у разных облачных провайдеров.

Сбор статистики в этой базе данных обычно занимает около получаса.

Запуск команды сбора статистики в SQL Developer

Что я проверил:

  1. Ничего необычного в журналах Iptables и OpenVPN на сервере OpenVPN или в журналах прослушивателей и предупреждений на сервере Oracle 19c.

  2. Для net.ipv4.tcp_keepalive_time и net.netfilter.nf_conntrack_tcp_timeout_installed на обоих компьютерах установлены значения по умолчанию: 7200 (2 часа) и 432000 (5 дней).

  3. Если я подключусь к базе данных как система и запущу:

    выберите x.sid, x.serial#, x.username, x.status, x.osuser, x.machine, x.program, x.event, x.state, sql.sql_text из v$sqlarea sql, v$session x, где x.sql_hash_value = sql.hash_value и x.sql_address = sql.address и x.username = 'myuser';

Примерно через полчаса я заметил, что сессия сбора статистики неактивна. Поэтому я предполагаю, что сбор статистики действительно запускается и завершается успешно, но просто не возвращает вышеупомянутое выходное сообщение.

Сбор статистики, работающей в базе данных

Сеанс сбора статистики неактивен примерно через полчаса

Что я пробовал:

  1. В базе данных меньшего размера в том же экземпляре запуск сбора статистики через OpenVPN возвращает вышеупомянутое сообщение об успехе. Это занимает около 10 минут.

  2. Прямое подключение (без OpenVPN) к базе данных путем добавления моего IP-адреса в брандмауэр облачного провайдера и запуска сбора статистики также возвращает вышеупомянутое сообщение об успехе.

  3. Генерация пары открытого/закрытого ключей SSH на сервере Oracle 19c и использование хостов SSH в SQL Developer, но соединение очень нестабильно/всегда сбрасывается.

  4. Настройка прокси-сервера Dante. Судя по всему, SQL Developer может использовать только какой-то специальный прокси-сервер.

  5. Настройка IPSEC VPN с помощью StrongSwan. Моя Windows 10 по какой-то причине не смогла установить с ним соединение.

1 ответ

Прежде всего, я смог убедиться, что сбор статистики действительно завершился успешно, выполнив:

      select * from v$session_longops where opname like '%Schema%' order by start_time desc;

После этого я выполнил следующие команды tcpdump на обоих серверах:

      tcpdump -i eth0 -A "(src <myipaddress> or src <myoracle19caddress> or dst <myipaddress> or dst <myoracle19caddress>) and not port ssh and not port openvpn and not icmp" (OpenVPN Server)

tcpdump -i eth0 -A "(src <myipaddress> or src <myopenvpnserveraddress> or dst <myipaddress> or dst <myopenvpnserveraddress>) and not port ssh and not icmp" (Oracle 19c Server)

И обнаружил, что сервер Oracle 19c отправил сообщение об успехе, но сервер OpenVPN так и не получил его.

Покопавшись на разных сайтах, я обнаружил, что неправильно понимаю, что на самом деле делает net.ipv4.tcp_keepalive_time.

Это означает, что [по умолчанию] процедуры проверки активности ждут два часа (7200 секунд)перед отправкой первого теста проверки активности , а затем повторно отправляют его каждые 75 секунд.

После этого я узнал о конфигурации сети облачного провайдера, на котором размещен мой сервер OpenVPN.

Свободные соединения

[...] реализовать 10-минутное отслеживание соединений для IP-протоколов, в которых есть концепция соединения. Это означает, что входящие пакеты, связанные с установленным соединением, разрешены, если хотя бы один пакет отправлен или получен для соединения в течение последних 10 минут. Если пакеты для соединения не отправляются и не принимаются в течение 10 или более минут, записи отслеживания простоя соединения удаляются. После удаления записей отслеживания соединения [...] не разрешается принимать дополнительные входящие пакеты до тех пор, пока не будет отправлен хотя бы один новый исходящий пакет. Это отслеживание соединений применяется ко всем источникам и пунктам назначения — как внутренним, так и внешним IP-адресам.

Благодаря этой новой информации я обошел это ограничение, установив для времени поддержки активности значение менее 10 минут, выполнив следующую команду на сервере Oracle 19c:

      sysctl -w net.ipv4.tcp_keepalive_time=300 net.ipv4.tcp_keepalive_intvl=60 net.ipv4.tcp_keepalive_probes=5

И сделал эти изменения постоянными, сохранив их в /etc/sysctl.conf.

Наконец, SQL Developer получает сообщение об успехе и закрывает соединение.

Другие вопросы по тегам