У меня есть общедоступный экземпляр 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, но запрос все еще не отвечает.