客戶端無法連線資料庫的小問題

dbhelper發表於2016-04-27
     最近碰到了一個比較奇怪的資料庫連線問題。問題的起因是做一個資料整合的時候,把伺服器B的防火牆資訊都拷貝到了伺服器A,遷移的過程都很順利,是一套開發測試環境,遷移完成之後,從應用的反饋來說都沒有發現問題,過了幾天有個開發的同事找到我說,她現在連線資料庫的時候總是有超時的錯誤。之前連線伺服器B是沒有問題的,想讓我幫她看看。
   對於這個問題,最直接的思路就是防火牆了,確認客戶端IP,埠庫,資料庫例項名都沒有問題,但是她那邊的反饋就是怎麼都連線不了。而且比較奇怪的是和她一個組的另外一個同事連線就沒有問題,所以就想如果跨網段實在訪問不了,應該是得找IT的同事來解決了吧,是不是有什麼特定的規則限制,最開始也沒有怎麼上心,但是等她再次找到我時,感覺這個問題確實有些奇怪。
   為了進一步驗證,我專門抽了一些時間來了解開發同學的這個連線問題,最後為了進一步確認,我們開了遠端協助,我可以看到她那邊的連線情況。
基本情況如下:
tnsping 顯示操作超時
使用telnet連線22號埠,顯示連線失敗,目前開了22號的埠
使用ping 伺服器,顯示正常

所以這個問題看起來就比較奇怪,而且有些讓人捉摸不透,在伺服器端再三確認了防火牆的設定。可以看到防火牆是開通了1521,22和1528的埠的。
# iptables -nvL|grep 10.12.1.12
  374 39102 ACCEPT     tcp  --  eth0   *       10.12.1.12          0.0.0.0/0           multiport dports 1528
    0     0 ACCEPT     tcp  --  eth0   *       10.12.1.12          0.0.0.0/0           multiport dports 22
    0     0 ACCEPT     tcp  --  eth0   *       10.12.1.12          0.0.0.0/0           multiport dports 1521
但是現在情況是tnsping和telnet都是失敗的。
帶著一絲嘗試,重新賦予了1521埠的許可權,再次檢視也確認開通了,這個時候繼續嘗試連線就沒有問題了。
# iptables -nvL|grep 10.12.1.12
    5   299 ACCEPT     tcp  --  eth0   *       10.12.1.12          0.0.0.0/0           multiport dports 1521,1522
  374 39102 ACCEPT     tcp  --  eth0   *       10.12.1.12          0.0.0.0/0           multiport dports 1528
    0     0 ACCEPT     tcp  --  eth0   *       10.12.1.12          0.0.0.0/0           multiport dports 22
    0     0 ACCEPT     tcp  --  eth0   *       10.12.1.12          0.0.0.0/0           multiport dports 1521     
這個問題雖然解決了,但是問題原因還是沒有找到,於是今天繼續檢視。終於在同事的幫助下找到了原因。在/etc/sysconfig/iptables裡面的內容和記憶體中的內容是同步的。得到的檔案內容結果有這麼一段。
-A INPUT -s 10.10.xx.61/32 -i eth0 -j ACCEPT
-A INPUT -s 10.10.xx.60/32 -i eth0 -j ACCEPT
-A INPUT -s 192.168.xx.232/32 -i eth0 -j ACCEPT
-A INPUT -s 192.168.xx.228/32 -i eth0 -j ACCEPT
-A INPUT -i eth0 -p icmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p icmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth1 -j DROP
-A INPUT -i eth0 -j DROP
-A INPUT -s 10.12.xx.99/32 -i eth0 -p tcp -m multiport --dports 1521 -j ACCEPT
-A INPUT -s 10.12.1.12/32 -i eth0 -p tcp -m multiport --dports 1521 -j ACCEPT
-A INPUT -s 10.127.xxx.82/32 -i eth0 -p tcp -m multiport --dports 10050 -j ACCEPT
-A INPUT -s 10.127.xxx.82/32 -i eth0 -p tcp -m multiport --dports 1521 -j ACCEPT
當然亮點的還是
-A INPUT -s 10.12.1.12/32 -i eth0 -p tcp -m multiport --dports 1521 -j ACCEPT 這一行上面的內容
-A INPUT -i eth0 -j DROP 這一行的內容代表的含義是不允許eth0的網路卡訪問,在防火牆設定裡面還是存在這樣一種依賴,自上向下,規則越嚴格,越要放在最上面。
所以之一行之後的連線都被限制了。當然通過iptables -nvL也確實看到後面的哪些IP確實都沒有任何的流量。
問題到了這裡就很清楚了,當然這也是對防火牆的操作不夠規範導致的。可以把防火牆中的內容轉化為iptables的命令,避免直接拷貝檔案內容這種簡單粗暴的方式。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2072047/,如需轉載,請註明出處,否則將追究法律責任。

相關文章