Db2
無法建立從 db2 客戶端到 db2 伺服器 v11.5 的連接
- 我在 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 規則:
sudo iptables -nvL
允許所有策略,所以我假設防火牆被禁用(或沒有效果)。
但是啟用並執行了另一個防火牆firewalld服務:
sudo systemctl status firewalld
我已停止並禁用它:
sudo systemctl stop firewalld sudo systemctl disable firewalld sudo systemctl mask firewalld
或者,我可以添加防火牆異常來允許我的 Db2 服務的 50000 埠,而不是上述三個命令:
firewall-cmd --add-port=50000/tcp
注意:我的步驟 11 和 12 是錯誤的假設。我已經更詳細地分析了網路數據包。我看到僅從 Db2 Windows 客戶端收到 TCP SYN 數據包,並且沒有從 Db2 伺服器機器返回客戶端的 TCP SYN/ACK 響應。沒有建立 TCP 連接(因為它被防火牆阻止了),顯然不能建立任何 DRDA 協議,因為依賴於 TCP 連接。