說到查自己主機在公網上的IP,你的第一反應是用什么: ifconfig? curl ip.sb? 百度/谷歌我的ip?這些方法都對,也都不對。下面從我們一個實際開發的業務場景來逐步抽絲剝繭這個過程吧。
我們在使用云端數據庫的時候,本地需要連接數據庫進行開發管理。
默認情況下,從安全角度考慮,云端的數據庫是禁止外網訪問的。如果需要外網訪問,可以通過設置IP白名單進行過濾。因此,我們可以將單位的出口IP添加到數據庫連接的白名單中,這樣開發同學在單位的網絡環境下,就可以本地連接云端數據庫了。
按照這個思路走,首先需要獲取單位的出口IP是什么。用curl ip.gs得到出口IP是:IP_A, 然后將這個IP_A加入到了數據庫訪問的白名單中, 然后本地訪問數據庫,發現連接不上,telnet 數據庫的端口也顯示無法連接。
連接不上,排查的思路有2個:
- 云端數據庫的白名單機制有問題
- IP_A有問題
第一個排查思路,云端這個SaaS服務出問題的概率基本很小,而且比較難以從使用者的角度去直接證明。第二個排查思路,比較好處理,而且如果這個排查思路被證實/證偽,那么可以間接去證明第一個排查思路。
如果IP_A有問題,說明這個IP并不是真正連接數據庫的IP,那么真正連接數據庫的IP是否可以獲得呢?答案是可以的:
- 先放開數據庫連接白名單,也就是允許所有的外部連接都可訪問該數據庫。
- 本地連接數據庫 MySQL -hRDS連接地址 -u賬戶 -p密碼 -P3306
- 進入數據庫查看進程信息:show processlist;
- 找到Info是show processlist的這一列,發現IP果然不是IP_A, 而是IP_B
然后把IP_B添加到數據庫訪問的白名單之后,就可以正常訪問數據庫了。
其實到這里,就會有個問題出現:
為什么我通過curl ip.gs 或者google查詢我的IP顯示的都是IP_A,而數據庫連接后,顯示我的IP是IP_B呢?
因為單位的網絡是(合法地)支持科學上網的,會根據請求的目的地地址,自動判斷走國內的網絡還是走境外的代理。在獲取IP_A的時候,其實請求的目的地地址都在境外,所以返回的公網IP自然也是境外代理的IP,也就是IP_A。如果用curl cip.cc 或者 baidu查詢我的IP顯示的就是IP_B,這個是走的國內的網絡。
以上。