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