JDBC соединение с Mysql за пределами VPN - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть общедоступный экземпляр Mysql, и я пытаюсь получить к нему доступ через VPN-клиент. Итак, по VPN мне был предоставлен доступ к БД, поэтому, выполнив
mysql -h IP -u user -p
Я могу подключиться к нему и выполнять запросы просто отлично Проблемы начинаются, когда я пытаюсь подключиться к нему через Java-приложение CLI. Я открываю соединение вот так

Connection source= DriverManager.getConnection("jdbc:mysql://"+getHost()+"/"+getDB()+"?useUnicode=true",
            getUser(),getPass());

и я не получаю ошибок. когда я пытаюсь выполнить запрос вроде

rs=source.createStatement().executeQuery("select ...");

Я ничего не получаю. Я сидел там в ожидании, и никаких результатов не возвращается, ни ошибка / исключение!

Экземпляр Mysql принимает соединение, так как я вижу соединение, когда получаю список процессов

+ ---- + ------ + ----- + ---- + --------------- + ------ + -------- + ------ +
| Id | Пользователь | Хост | дБ | Команда | Время | Государство | Информация | + ---- + ------ + ----- + ---- + --------------- + ------ + --- ----- + ------ +
| 9094 | пользователь | ClientIp: 58450 | БД | Спать | 4933 | | НОЛЬ |

плюс, когда я получаю журнал ошибок БД

tail /var/log/mysql/error.log 2019-04-23T14: 17: 34.286979Z 9175 [Примечание] Прервано соединение 9175 с db: 'db' user: 'user' host: 'ClientIp' (Ошибка чтения пакеты связи) 2019-04-23T14: 17: 46.501602Z 9174 [Примечание] Прервано соединение 9174 с db: 'db' user: 'user' host: 'ClientIp' (Получено время ожидания пакеты связи)

Я начинаю думать, что они сетевые парни на стороне клиента, открывают исходящие порты (3306, чтобы я мог подключиться к БД), но входящий порт (который является случайным, насколько я знаю и помню из моего курс колледжа сети). Это должно быть подтверждено записью хоста списка процессов, которая является IP:58450. Это порт прослушивания клиента, верно. Поэтому, если это закрыто, соединение будет оставаться открытым, ожидая входящего сообщения, но само сообщение будет заблокировано (так как порт заблокирован)
Во-первых, есть ли способ проверить это, чтобы я мог точно знать, что это проблема с этим? Просто чтобы поговорить с сетевыми людьми.

Из того, что я знаю, вы не можете указать (диапазон) порта для клиента, с которым можно разговаривать. Что вы можете сделать в случаях, когда порты заблокированы брандмауэрами?

Заранее спасибо. Ильяс


UPDATE
При запуске netstat при подключении к Mysql я вижу это

netstat -a | grep mysql
tcp 0 0 клиент: 58744 MySqlRemote.e: mysql УСТАНОВЛЕНО

когда я подключаюсь с помощью Java, я получаю

tcp6 0 0 клиент: 58748 MySqlRemote.e: mysql УСТАНОВЛЕНО

итак, похоже, что в обоих случаях соединение в порядке. Единственным очевидным отличием является tcp - tcp6 в двух записях. Поэтому я подумал, что проблема может заключаться в использовании IP6 в Java. Я пытался отключить его с помощью System.setProperty("java.net.preferIPv4Stack" , "true"); и полностью отключить IP6 на ВМ, отредактировав файл /etc/hosts. В результате теперь используется netstat. Я вижу, что используется IP4, но запрос все еще не отвечает.

...