背景
由于安全原因,公司网络做了限制,必须通过代理才能连接数据库。
代理有两种方式,一种是动态代理,一种是端口转发,本文描述在基于socks动态代理下,DBeaver无法访问数据库的问题现象以及分析、解决。
在Dbeaver中创建Oracle连接时,设置了代理,如下:
其中的proxy.com是基于hosts文件配置的解析。
在DBeaver中通过socks代理访问Oracle数据库失败,报错信息如下:
由于通过socks连接数据库对我来说是刚需,所以这个问题需要快速解决。
问题分析
首先检查socks端口是否通畅,通过telnet proxy.com 1080发现没有问题。
于是打开wireshark,通过tcp.port == 1080监听1080端口,然后再通过DBeaver连接数据库,发现没有数据包,到此得出初步结论:
通过DBeaver连接Oracle数据库,即使设置有socks连接配置,但是在实际连接时也不会走代理服务器。
通过Google搜索,找到了原因:https://support.oracle.com/knowledge/Middleware/2589708_1.html
意思是jdbc驱动从12.2版本开始,不支持socks代理,即使设置了socks代理最终也没有效果。
Dbeaver是通过Java语言开发的程序,其连接数据库也是通过jdbc去连接,如果jdbc本身不支持代理,那么即使设置了代理也没有意义。
解决方案
定位到问题后开始尝试解决,第一次使用DBeaver连接Oracle时会自动下载驱动,通过DBeaver中的驱动管理可以看到,下载的驱动版本是12.2.0.1,正好在受影响的版本范围内。
知道原因,解决起来就方便多了,继续搜索,在stackoverflow中找到如下参数:oracle.jdbc.javaNetNio=false
地址如下:https://stackoverflow.com/questions/49357985/does-oracle-jdbc-driver-support-socks5-proxy
从字面意思看,通过该参数,可以限制oracle驱动使用Nio。
于是在DBeaver中设置自定义驱动属性,完成后问题解决。