Сценарий SQL Developer PL/SQL не отображает выходные данные через OpenVPN после работы определенного времени.
Проблема:
Когда я пытаюсь запустить сбор статистики через OpenVPN в моей базе данных Oracle 19c, SQL Developer не возвращает типичное сообщение «Процедура PL/SQL успешно завершена», если она выполняется более определенного времени.
Судя по всему, через некоторое время соединение зависает, и мне нужно либо отключиться от OpenVPN, либо убить SQL Developer в диспетчере задач Windows, чтобы закрыть его.
Моя база данных Oracle 19c и сервер OpenVPN находятся у разных облачных провайдеров.
Сбор статистики в этой базе данных обычно занимает около получаса.
Запуск команды сбора статистики в SQL Developer
Что я проверил:
Ничего необычного в журналах Iptables и OpenVPN на сервере OpenVPN или в журналах прослушивателей и предупреждений на сервере Oracle 19c.
Для net.ipv4.tcp_keepalive_time и net.netfilter.nf_conntrack_tcp_timeout_installed на обоих компьютерах установлены значения по умолчанию: 7200 (2 часа) и 432000 (5 дней).
Если я подключусь к базе данных как система и запущу:
выберите 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';
Примерно через полчаса я заметил, что сессия сбора статистики неактивна. Поэтому я предполагаю, что сбор статистики действительно запускается и завершается успешно, но просто не возвращает вышеупомянутое выходное сообщение.
Сбор статистики, работающей в базе данных
Сеанс сбора статистики неактивен примерно через полчаса
Что я пробовал:
В базе данных меньшего размера в том же экземпляре запуск сбора статистики через OpenVPN возвращает вышеупомянутое сообщение об успехе. Это занимает около 10 минут.
Прямое подключение (без OpenVPN) к базе данных путем добавления моего IP-адреса в брандмауэр облачного провайдера и запуска сбора статистики также возвращает вышеупомянутое сообщение об успехе.
Генерация пары открытого/закрытого ключей SSH на сервере Oracle 19c и использование хостов SSH в SQL Developer, но соединение очень нестабильно/всегда сбрасывается.
Настройка прокси-сервера Dante. Судя по всему, SQL Developer может использовать только какой-то специальный прокси-сервер.
Настройка 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 получает сообщение об успехе и закрывает соединение.