- 我在 Windows 10 上使用 VirtualBox 在我的虚拟 PC 内的 Linux/x86_64 上安装了 Db2 v11.5.7.0。
- 我创建了名为 TEST1 的数据库
- 我使用 Unix 套接字连接到数据库:
db2 connect to TEST1
并且连接成功完成。 - 检查 DB2COMM 设置:
db2set DB2COMM
输出为 DB2COMM=TCPIP - 只是为了确保 TCP/IP 连接对 Db2 有效,我创建了本地节点和目录数据库:
db2 catalog tcpip node loctcp remote localhost server 50000
db2 catalog database test1 as tcptest1 at node loctcp
db2 terminate
db2 connect to tcptest1 user db2inst1 using <password>
并成功完成连接。
- 现在在我的 PC VirtualBox Windows 10 主机上,我设置端口转发主机端口:60127 和访客端口:50000。
- 在我的 Windows PC 上:
netstat -an -p tcp | find ":60127"
我可以看到连接处于 LISTENING 状态。 - 在我的 Windows PC 上:
db2 catalog tcpip node remtcp remote localhost server 60127
db2 catalog database test1 as tcptest1 at node remtcp
db2 terminate
- 在我的 Windows PC 上连接到数据库
db2 connect to tcptest1 user db2inst1 using <password>
问题:看起来连接挂起。几分钟后,我在 Db2 客户端中遇到错误:
SQL30081N 检测到通信错误。正在使用的通信协议:“TCP/IP”。正在使用的通信 API:“SOCKETS”。检测到错误的位置:“127.0.0.1”。检测错误的通信功能:“recv”。协议特定错误代码:“10054”、“*”、“0”。SQLSTATE=08001
- 试图理解问题。在 Linux 服务器上:a) 我已经检查了防火墙并且它被禁用了。b) IPv6 已禁用 c) Db2 正在使用 IPv4 侦听 50000 端口
- Windows 上的 Wireshark 监听 60127 端口。a) TCP 连接已建立 b) Db2 DRDA 连接从未出现。
- Linux 服务器上的 Tcpdump 捕获 50000 端口网络流量。a) TCP 连接已建立 b) Db2 DRDA 连接从未出现。
Linux 虚拟机内部似乎出现了问题,但第 4 步和第 5 步对于 Db2 TCP/IP 连接应该一切正常。
知道还有什么可以检查为什么 Db2 客户端连接不起作用吗?
PS 我与 Db2 v11.1 安装完全相同,我的 PC 上的 Db2 连接工作正常。
我已经解决了这个问题。这是防火墙问题。
我对第 10 步的假设是错误的。我只检查了 iptables 规则:
允许所有策略,所以我假设防火墙被禁用(或没有效果)。
但是启用并运行了另一个防火墙firewalld服务:
我已停止并禁用它:
或者,我可以添加防火墙异常来允许我的 Db2 服务的 50000 端口,而不是上述三个命令:
注意:我的步骤 11 和 12 是错误的假设。我已经更详细地分析了网络数据包。我看到仅从 Db2 Windows 客户端收到 TCP SYN 数据包,并且没有从 Db2 服务器机器返回客户端的 TCP SYN/ACK 响应。没有建立 TCP 连接(因为它被防火墙阻止了),显然不能建立任何 DRDA 协议,因为依赖于 TCP 连接。