IP漂移頻繁?一文教你固定靜態(tài)IP的完整方案)
1. 虛擬機(jī)IP漂移這件事到底卡住了多少人的開(kāi)發(fā)節(jié)奏做本地開(kāi)發(fā)環(huán)境的朋友尤其是跟著實(shí)戰(zhàn)項(xiàng)目練手的朋友大概率都遇到過(guò)這樣一個(gè)場(chǎng)景昨天還能正常連上的數(shù)據(jù)庫(kù)、緩存服務(wù)今天一開(kāi)機(jī)連接超時(shí)了。打開(kāi)配置文件一看IP地址還是昨天那個(gè)但虛擬機(jī)里的網(wǎng)卡已經(jīng)悄悄換了一個(gè)新地址。這種IP漂移現(xiàn)象在本地虛擬機(jī)環(huán)境中極其常見(jiàn)尤其是使用動(dòng)態(tài)主機(jī)配置協(xié)議DHCP自動(dòng)分配地址的時(shí)候。我自己在搭建本地開(kāi)發(fā)環(huán)境時(shí)就被這個(gè)問(wèn)題反復(fù)折磨過(guò)。項(xiàng)目里寫(xiě)死了數(shù)據(jù)庫(kù)連接地址、緩存服務(wù)地址、消息隊(duì)列地址每次虛擬機(jī)重啟IP一變所有配置全部失效得挨個(gè)文件去改。更麻煩的是有些項(xiàng)目在代碼里硬編碼了服務(wù)地址改起來(lái)牽一發(fā)動(dòng)全身。后來(lái)我下定決心把虛擬機(jī)網(wǎng)絡(luò)徹底改成靜態(tài)IP從此再也沒(méi)被這個(gè)問(wèn)題困擾過(guò)。這篇文章就是把我踩過(guò)的坑、試過(guò)的方案、最終穩(wěn)定運(yùn)行的配置方法完整梳理出來(lái)。不管你是剛接觸虛擬機(jī)的新手還是已經(jīng)用過(guò)一段時(shí)間但一直被IP變動(dòng)困擾的開(kāi)發(fā)者都能從里面找到可以直接抄作業(yè)的步驟。我會(huì)從網(wǎng)絡(luò)模式的選擇講起到具體配置文件的修改再到驗(yàn)證和排錯(cuò)把整個(gè)鏈路講透。核心目標(biāo)只有一個(gè)讓你的虛擬機(jī)IP固定下來(lái)不再漂移。2. 先搞清楚虛擬機(jī)網(wǎng)絡(luò)為什么會(huì)變來(lái)變?nèi)?.1 DHCP的工作機(jī)制與IP漂移的根源虛擬機(jī)IP變動(dòng)的根本原因在于默認(rèn)網(wǎng)絡(luò)配置使用的是動(dòng)態(tài)主機(jī)配置協(xié)議。這個(gè)協(xié)議的工作邏輯很簡(jiǎn)單虛擬機(jī)啟動(dòng)時(shí)向網(wǎng)絡(luò)中的DHCP服務(wù)器發(fā)送請(qǐng)求服務(wù)器從地址池里挑一個(gè)當(dāng)前空閑的IP分配給它同時(shí)給一個(gè)租期。租期到了或者虛擬機(jī)重啟如果原來(lái)的地址已經(jīng)被占用或者地址池策略有變化服務(wù)器就會(huì)分配一個(gè)新的地址。這個(gè)過(guò)程在物理機(jī)環(huán)境里通常感知不強(qiáng)因?yàn)槁酚善鲿?huì)盡量給同一臺(tái)設(shè)備分配同一個(gè)地址。但在虛擬機(jī)環(huán)境里尤其是使用網(wǎng)絡(luò)地址轉(zhuǎn)換模式或者僅主機(jī)模式時(shí)虛擬化軟件自帶的DHCP服務(wù)管理策略比較簡(jiǎn)單地址池的分配順序、租期管理都不如企業(yè)級(jí)路由器那么聰明。所以虛擬機(jī)每次重啟拿到不同IP的概率相當(dāng)高。用一個(gè)生活化的類(lèi)比DHCP就像去圖書(shū)館自習(xí)管理員隨機(jī)給你安排一個(gè)空座位。你今天坐3號(hào)桌明天去晚了3號(hào)桌有人了管理員就讓你坐7號(hào)桌。你的座位號(hào)變了別人按原來(lái)的座位號(hào)找你自然找不到。靜態(tài)IP就是你跟管理員申請(qǐng)了一個(gè)固定座位不管什么時(shí)候來(lái)那個(gè)座位都留給你。2.2 不同網(wǎng)絡(luò)模式下IP變動(dòng)的表現(xiàn)差異虛擬機(jī)軟件通常提供三種網(wǎng)絡(luò)模式每種模式下IP變動(dòng)的表現(xiàn)不太一樣網(wǎng)絡(luò)模式IP分配方式IP變動(dòng)頻率適用場(chǎng)景橋接模式由物理網(wǎng)絡(luò)的路由器分配較低但重啟后可能變虛擬機(jī)需要被局域網(wǎng)其他設(shè)備訪問(wèn)NAT模式由虛擬機(jī)軟件的虛擬DHCP分配較高重啟后經(jīng)常變虛擬機(jī)只需訪問(wèn)外網(wǎng)不需要被外部訪問(wèn)僅主機(jī)模式由虛擬機(jī)軟件的虛擬DHCP分配較高重啟后經(jīng)常變虛擬機(jī)與宿主機(jī)之間互相訪問(wèn)從表格能看出來(lái)NAT模式和僅主機(jī)模式下IP變動(dòng)最頻繁而這兩種模式恰恰是本地開(kāi)發(fā)環(huán)境最常用的。橋接模式雖然相對(duì)穩(wěn)定但在某些網(wǎng)絡(luò)環(huán)境下比如公司網(wǎng)絡(luò)限制了MAC地址綁定也會(huì)出現(xiàn)變動(dòng)。2.3 為什么開(kāi)發(fā)環(huán)境對(duì)固定IP如此敏感有人可能會(huì)說(shuō)IP變了重新查一下不就行了問(wèn)題在于開(kāi)發(fā)環(huán)境里大量配置文件、連接字符串、服務(wù)注冊(cè)地址都依賴(lài)這個(gè)IP。舉幾個(gè)典型場(chǎng)景數(shù)據(jù)庫(kù)連接配置里寫(xiě)死了jdbc:mysql://192.168.xxx.xxx:3306/xxx緩存服務(wù)配置里寫(xiě)死了spring.redis.host192.168.xxx.xxx項(xiàng)目里的Nginx反向代理配置指向了固定IP本地DNS解析或者h(yuǎn)osts文件里綁定了IP和域名的映射一旦IP變動(dòng)這些配置全部失效輕則連接報(bào)錯(cuò)重則整個(gè)項(xiàng)目跑不起來(lái)。每次改配置不僅浪費(fèi)時(shí)間還容易漏改某個(gè)文件導(dǎo)致排查半天。所以把IP固定下來(lái)是一勞永逸解決這類(lèi)問(wèn)題的根本辦法。3. 動(dòng)手之前先把這幾件事確認(rèn)清楚3.1 確認(rèn)虛擬機(jī)的網(wǎng)絡(luò)模式在修改任何配置之前第一件事是確認(rèn)當(dāng)前虛擬機(jī)用的是哪種網(wǎng)絡(luò)模式。打開(kāi)虛擬機(jī)軟件的管理界面找到對(duì)應(yīng)虛擬機(jī)的網(wǎng)絡(luò)適配器設(shè)置看它連接的是哪個(gè)網(wǎng)絡(luò)。不同虛擬機(jī)軟件的界面叫法略有差異但核心信息是一樣的你需要知道虛擬機(jī)是通過(guò)哪種方式接入網(wǎng)絡(luò)的。這一步很關(guān)鍵因?yàn)椴煌W(wǎng)絡(luò)模式下靜態(tài)IP的配置范圍和網(wǎng)關(guān)地址完全不同。配錯(cuò)了會(huì)導(dǎo)致虛擬機(jī)直接斷網(wǎng)連宿主機(jī)都連不上。我建議在修改之前先把當(dāng)前的網(wǎng)絡(luò)信息完整記錄下來(lái)包括IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)地址、DNS服務(wù)器地址。這些信息在后續(xù)配置靜態(tài)IP時(shí)都要用到。3.2 記錄當(dāng)前網(wǎng)絡(luò)參數(shù)避免配錯(cuò)后無(wú)法回退在虛擬機(jī)里打開(kāi)終端執(zhí)行查看網(wǎng)絡(luò)信息的命令。不同操作系統(tǒng)命令不同主流的兩類(lèi)系統(tǒng)分別如下# 基于Red Hat系的系統(tǒng)如CentOS、Rocky Linux等 ip addr show ip route show cat /etc/resolv.conf # 基于Debian系的系統(tǒng)如Ubuntu、Debian等 ip addr show ip route show cat /etc/resolv.conf把輸出結(jié)果里的關(guān)鍵信息記下來(lái)網(wǎng)卡名稱(chēng)通常是ens33、eth0、enp0s3這類(lèi)名字每臺(tái)機(jī)器可能不同當(dāng)前IP地址比如192.168.xxx.xxx子網(wǎng)掩碼通常是255.255.255.0或者CIDR表示法/24默認(rèn)網(wǎng)關(guān)比如192.168.xxx.1或192.168.xxx.2DNS服務(wù)器比如114.114.114.114或8.8.8.8提示建議把當(dāng)前網(wǎng)絡(luò)配置截圖或者復(fù)制到宿主機(jī)上保存一份。萬(wàn)一靜態(tài)IP配錯(cuò)了導(dǎo)致虛擬機(jī)斷網(wǎng)還能對(duì)照著恢復(fù)回去。3.3 選定一個(gè)合適的靜態(tài)IP地址靜態(tài)IP不能隨便選要滿(mǎn)足兩個(gè)條件一是在當(dāng)前子網(wǎng)范圍內(nèi)二是不能和網(wǎng)絡(luò)中已有設(shè)備的IP沖突。通常的做法是選一個(gè)地址池邊緣的地址比如網(wǎng)段是192.168.xxx.0/24網(wǎng)關(guān)是192.168.xxx.2那你可以選192.168.xxx.200這種不太可能被DHCP分配到的地址。如果你不確定哪些地址已經(jīng)被占用可以在宿主機(jī)上ping幾個(gè)候選地址試試能ping通說(shuō)明已被占用ping不通大概率是空閑的。更穩(wěn)妥的辦法是登錄到虛擬化軟件的管理界面查看DHCP地址池的分配范圍選一個(gè)地址池之外的地址。4. 主流Linux發(fā)行版固定IP的完整操作鏈路4.1 確認(rèn)系統(tǒng)版本和網(wǎng)絡(luò)管理工具不同Linux發(fā)行版使用的網(wǎng)絡(luò)管理工具不同配置文件的路徑和格式也不一樣。先確認(rèn)你的系統(tǒng)用的是哪種網(wǎng)絡(luò)管理方式# 查看系統(tǒng)版本 cat /etc/os-release # 查看網(wǎng)絡(luò)管理服務(wù) systemctl status NetworkManager systemctl status network目前主流的有兩種一種是傳統(tǒng)的network服務(wù)配合ifcfg-xxx格式的配置文件另一種是NetworkManager配合nmcli命令或者keyfile格式的配置文件。較新的系統(tǒng)如CentOS 8以上、Ubuntu 18.04以上默認(rèn)使用NetworkManager但為了兼容性很多教程仍然使用修改ifcfg文件的方式這種方式在大多數(shù)系統(tǒng)上依然有效。4.2 修改網(wǎng)卡配置文件的關(guān)鍵字段找到網(wǎng)卡配置文件的位置通常在/etc/sysconfig/network-scripts/目錄下文件名格式為ifcfg-網(wǎng)卡名稱(chēng)。用文本編輯器打開(kāi)vi /etc/sysconfig/network-scripts/ifcfg-ens33需要修改和確認(rèn)的關(guān)鍵字段如下# 將動(dòng)態(tài)分配改為靜態(tài) BOOTPROTOstatic # 確保開(kāi)機(jī)自動(dòng)啟用網(wǎng)卡 ONBOOTyes # 設(shè)置靜態(tài)IP地址 IPADDR192.168.xxx.200 # 設(shè)置子網(wǎng)掩碼 NETMASK255.255.255.0 # 或者用PREFIX24代替NETMASK # 設(shè)置默認(rèn)網(wǎng)關(guān) GATEWAY192.168.xxx.2 # 設(shè)置DNS服務(wù)器 DNS1114.114.114.114 DNS28.8.8.8這里有幾個(gè)容易出錯(cuò)的點(diǎn)需要特別注意BOOTPROTO的值必須是static或none寫(xiě)dhcp就還是動(dòng)態(tài)分配ONBOOT必須是yes否則開(kāi)機(jī)網(wǎng)卡不啟動(dòng)GATEWAY要和虛擬機(jī)網(wǎng)絡(luò)設(shè)置里的網(wǎng)關(guān)一致不能隨便填DNS1建議填一個(gè)國(guó)內(nèi)可用的公共DNS保證域名解析正常4.3 讓配置生效并驗(yàn)證連通性配置文件改完之后需要重啟網(wǎng)絡(luò)服務(wù)讓配置生效# 重啟網(wǎng)絡(luò)服務(wù) systemctl restart network # 或者如果用的是NetworkManager systemctl restart NetworkManager然后驗(yàn)證IP是否已經(jīng)變成你設(shè)置的靜態(tài)地址ip addr show ens33如果看到inet后面跟著你設(shè)置的IP地址說(shuō)明配置生效了。接下來(lái)測(cè)試網(wǎng)絡(luò)連通性# 測(cè)試網(wǎng)關(guān)是否可達(dá) ping -c 4 192.168.xxx.2 # 測(cè)試外網(wǎng)是否可達(dá) ping -c 4 114.114.114.114 # 測(cè)試域名解析是否正常 ping -c 4 www.baidu.com三個(gè)測(cè)試都通過(guò)說(shuō)明靜態(tài)IP配置完全成功。如果網(wǎng)關(guān)能通但外網(wǎng)不通通常是DNS配置有問(wèn)題如果網(wǎng)關(guān)都不通檢查IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)是否在同一個(gè)網(wǎng)段。4.4 使用nmcli命令配置靜態(tài)IP的替代方案對(duì)于使用NetworkManager的系統(tǒng)除了修改配置文件還可以用nmcli命令來(lái)配置這種方式更直觀也不容易改錯(cuò)文件格式# 查看當(dāng)前連接名稱(chēng) nmcli connection show # 修改連接的IP配置 nmcli connection modify ens33 ipv4.method manual nmcli connection modify ens33 ipv4.addresses 192.168.xxx.200/24 nmcli connection modify ens33 ipv4.gateway 192.168.xxx.2 nmcli connection modify ens33 ipv4.dns 114.114.114.114,8.8.8.8 # 重新激活連接 nmcli connection down ens33 nmcli connection up ens33這種方式的優(yōu)勢(shì)在于命令執(zhí)行完立即生效不需要手動(dòng)重啟網(wǎng)絡(luò)服務(wù)而且配置格式由工具保證不會(huì)出現(xiàn)手寫(xiě)配置文件時(shí)的語(yǔ)法錯(cuò)誤。我個(gè)人在較新的系統(tǒng)上更傾向于用這種方式。5. 配完之后連不上網(wǎng)排查思路按這個(gè)順序來(lái)5.1 從虛擬機(jī)內(nèi)部逐層排查網(wǎng)絡(luò)狀態(tài)靜態(tài)IP配完發(fā)現(xiàn)連不上網(wǎng)不要慌按照從內(nèi)到外的順序逐層排查。第一步是確認(rèn)網(wǎng)卡本身是否啟動(dòng)、IP是否已經(jīng)生效# 查看網(wǎng)卡狀態(tài)和IP ip addr show # 查看路由表 ip route show # 查看DNS配置 cat /etc/resolv.conf重點(diǎn)看三個(gè)地方網(wǎng)卡是否有UP標(biāo)志、IP地址是否是你設(shè)置的那個(gè)、路由表里是否有默認(rèn)網(wǎng)關(guān)。如果網(wǎng)卡沒(méi)起來(lái)檢查ONBOOT是否設(shè)為yes如果IP沒(méi)生效檢查配置文件語(yǔ)法是否有誤如果路由表里沒(méi)有默認(rèn)網(wǎng)關(guān)檢查GATEWAY字段是否填寫(xiě)正確。5.2 宿主機(jī)與虛擬機(jī)之間的連通性測(cè)試從虛擬機(jī)內(nèi)部排查完接下來(lái)從宿主機(jī)往虛擬機(jī)方向測(cè)試。在宿主機(jī)的終端或命令提示符里ping虛擬機(jī)的靜態(tài)IP# 在宿主機(jī)上執(zhí)行 ping 192.168.xxx.200如果ping不通可能是以下幾種原因虛擬機(jī)的防火墻攔截了ICMP請(qǐng)求虛擬機(jī)網(wǎng)絡(luò)模式設(shè)置有問(wèn)題靜態(tài)IP和宿主機(jī)不在同一個(gè)網(wǎng)段可以臨時(shí)關(guān)閉虛擬機(jī)防火墻測(cè)試一下# 臨時(shí)關(guān)閉防火墻僅用于測(cè)試 systemctl stop firewalld # 或者 systemctl stop ufw如果關(guān)閉防火墻后能ping通說(shuō)明是防火墻規(guī)則的問(wèn)題需要添加相應(yīng)的放行規(guī)則而不是直接關(guān)閉防火墻。5.3 常見(jiàn)配置錯(cuò)誤對(duì)照表根據(jù)我自己的踩坑經(jīng)驗(yàn)靜態(tài)IP配置失敗的原因高度集中整理成對(duì)照表方便快速定位現(xiàn)象可能原因排查方法虛擬機(jī)完全斷網(wǎng)網(wǎng)關(guān)地址填錯(cuò)對(duì)比虛擬機(jī)網(wǎng)絡(luò)設(shè)置里的網(wǎng)關(guān)能ping通網(wǎng)關(guān)但上不了外網(wǎng)DNS配置錯(cuò)誤檢查/etc/resolv.conf內(nèi)容IP地址沒(méi)變成靜態(tài)的BOOTPROTO沒(méi)改檢查配置文件該字段值重啟后IP又變了配置文件未保存或ONBOOTno重新檢查并保存配置文件宿主機(jī)ping不通虛擬機(jī)防火墻攔截或網(wǎng)絡(luò)模式不對(duì)檢查防火墻規(guī)則和網(wǎng)絡(luò)模式虛擬機(jī)ping不通宿主機(jī)宿主機(jī)防火墻攔截檢查宿主機(jī)防火墻設(shè)置這張表基本覆蓋了90%以上的靜態(tài)IP配置問(wèn)題遇到故障時(shí)按表排查效率比盲目試錯(cuò)高得多。5.4 配置回滾與恢復(fù)動(dòng)態(tài)分配的方法如果靜態(tài)IP怎么都配不好或者你只是想臨時(shí)恢復(fù)網(wǎng)絡(luò)可以快速回滾到動(dòng)態(tài)分配模式# 將BOOTPROTO改回dhcp BOOTPROTOdhcp # 刪除或注釋掉靜態(tài)IP相關(guān)配置 # IPADDR... # NETMASK... # GATEWAY... # 重啟網(wǎng)絡(luò)服務(wù) systemctl restart network回滾之后虛擬機(jī)應(yīng)該能重新通過(guò)DHCP獲取到IP。這時(shí)候你可以對(duì)照之前記錄的網(wǎng)絡(luò)參數(shù)重新檢查靜態(tài)配置哪里出了問(wèn)題。6. 讓靜態(tài)IP真正穩(wěn)定運(yùn)行的幾個(gè)關(guān)鍵細(xì)節(jié)6.1 虛擬機(jī)克隆后的IP沖突問(wèn)題用虛擬機(jī)做開(kāi)發(fā)的人經(jīng)常會(huì)克隆虛擬機(jī)來(lái)快速搭建多臺(tái)環(huán)境。克隆出來(lái)的虛擬機(jī)如果保留了原來(lái)的靜態(tài)IP就會(huì)出現(xiàn)IP沖突兩臺(tái)機(jī)器都上不了網(wǎng)。正確的做法是克隆完成后第一時(shí)間修改新虛擬機(jī)的IP地址確保和源虛擬機(jī)不在同一個(gè)地址上。具體操作是登錄克隆后的虛擬機(jī)修改網(wǎng)卡配置文件里的IPADDR字段改成另一個(gè)空閑地址然后重啟網(wǎng)絡(luò)服務(wù)。另外有些虛擬機(jī)軟件在克隆時(shí)會(huì)自動(dòng)生成新的MAC地址如果配置文件里綁定了MAC地址也需要同步更新。6.2 虛擬機(jī)軟件網(wǎng)絡(luò)設(shè)置與系統(tǒng)配置的一致性靜態(tài)IP能否穩(wěn)定工作不僅取決于虛擬機(jī)系統(tǒng)內(nèi)部的配置還和虛擬機(jī)軟件本身的網(wǎng)絡(luò)設(shè)置有關(guān)。以NAT模式為例虛擬機(jī)軟件會(huì)有一個(gè)虛擬網(wǎng)絡(luò)編輯器里面定義了子網(wǎng)地址、子網(wǎng)掩碼、網(wǎng)關(guān)地址、DHCP范圍。你在系統(tǒng)里設(shè)置的靜態(tài)IP必須在這個(gè)子網(wǎng)范圍內(nèi)網(wǎng)關(guān)必須和虛擬網(wǎng)絡(luò)編輯器里的網(wǎng)關(guān)一致。我遇到過(guò)好幾次這樣的情況系統(tǒng)里配置看起來(lái)完全正確但就是連不上網(wǎng)最后發(fā)現(xiàn)是虛擬機(jī)軟件的虛擬網(wǎng)絡(luò)編輯器里網(wǎng)關(guān)地址和系統(tǒng)里配的不一樣。所以修改靜態(tài)IP之前務(wù)必先確認(rèn)虛擬機(jī)軟件層面的網(wǎng)絡(luò)參數(shù)。6.3 多網(wǎng)卡環(huán)境下的配置注意事項(xiàng)有些虛擬機(jī)配置了兩塊網(wǎng)卡一塊用于NAT上網(wǎng)一塊用于僅主機(jī)模式內(nèi)部通信。這種情況下兩塊網(wǎng)卡都需要配置而且要注意路由優(yōu)先級(jí)。默認(rèn)網(wǎng)關(guān)應(yīng)該設(shè)置在用于上網(wǎng)的那塊網(wǎng)卡上內(nèi)部通信的網(wǎng)卡不要設(shè)默認(rèn)網(wǎng)關(guān)否則會(huì)導(dǎo)致路由混亂。判斷哪塊網(wǎng)卡該設(shè)網(wǎng)關(guān)的方法很簡(jiǎn)單看虛擬機(jī)軟件里哪塊網(wǎng)卡連接的是NAT網(wǎng)絡(luò)或橋接網(wǎng)絡(luò)那塊就是用來(lái)上網(wǎng)的網(wǎng)關(guān)設(shè)在它上面。僅主機(jī)模式的網(wǎng)卡只配IP和子網(wǎng)掩碼即可。6.4 靜態(tài)IP配置完成后的驗(yàn)證清單配置完成后建議按照以下清單逐項(xiàng)驗(yàn)證確保萬(wàn)無(wú)一失虛擬機(jī)內(nèi)部ip addr顯示的IP是設(shè)定的靜態(tài)地址虛擬機(jī)內(nèi)部能ping通網(wǎng)關(guān)虛擬機(jī)內(nèi)部能ping通外網(wǎng)IP如114.114.114.114虛擬機(jī)內(nèi)部能ping通域名如www.baidu.com宿主機(jī)能ping通虛擬機(jī)靜態(tài)IP虛擬機(jī)重啟后IP保持不變項(xiàng)目中的數(shù)據(jù)庫(kù)、緩存等連接配置使用新IP后能正常連接這七項(xiàng)全部通過(guò)說(shuō)明靜態(tài)IP配置真正穩(wěn)定了。尤其是第六項(xiàng)一定要重啟驗(yàn)證因?yàn)橛行┡渲迷诋?dāng)前會(huì)話(huà)生效但重啟后會(huì)失效。7. 項(xiàng)目實(shí)戰(zhàn)中關(guān)于IP配置的經(jīng)驗(yàn)之談7.1 配置文件里到底該寫(xiě)IP還是寫(xiě)主機(jī)名很多項(xiàng)目在配置文件里直接寫(xiě)IP地址比如spring.redis.host192.168.xxx.200。這種做法在單機(jī)環(huán)境下沒(méi)問(wèn)題但一旦IP變動(dòng)就要改配置。更優(yōu)雅的做法是在hosts文件里做一層映射配置文件里寫(xiě)主機(jī)名# 在虛擬機(jī)和宿主機(jī)的hosts文件里都加上 192.168.xxx.200 redis-server 192.168.xxx.201 mysql-server然后項(xiàng)目配置里寫(xiě)spring.redis.hostredis-server。這樣即使IP變了只需要改hosts文件一處項(xiàng)目配置不用動(dòng)。當(dāng)然前提是IP已經(jīng)固定了否則hosts文件也得跟著改。這個(gè)技巧在需要頻繁切換環(huán)境的場(chǎng)景下特別有用。7.2 把網(wǎng)絡(luò)配置納入環(huán)境初始化腳本如果你經(jīng)常需要重建虛擬機(jī)環(huán)境建議把靜態(tài)IP配置寫(xiě)進(jìn)初始化腳本里。這樣每次新建虛擬機(jī)后執(zhí)行一次腳本就自動(dòng)完成網(wǎng)絡(luò)配置不用手動(dòng)一步步操作。腳本的核心邏輯就是修改網(wǎng)卡配置文件、重啟網(wǎng)絡(luò)服務(wù)、驗(yàn)證連通性。#!/bin/bash # 靜態(tài)IP配置腳本示例 NETWORK_SCRIPT/etc/sysconfig/network-scripts/ifcfg-ens33 STATIC_IP192.168.xxx.200 GATEWAY192.168.xxx.2 sed -i s/BOOTPROTO.*/BOOTPROTOstatic/ $NETWORK_SCRIPT sed -i s/ONBOOT.*/ONBOOTyes/ $NETWORK_SCRIPT grep -q IPADDR $NETWORK_SCRIPT || echo IPADDR$STATIC_IP $NETWORK_SCRIPT grep -q GATEWAY $NETWORK_SCRIPT || echo GATEWAY$GATEWAY $NETWORK_SCRIPT grep -q DNS1 $NETWORK_SCRIPT || echo DNS1114.114.114.114 $NETWORK_SCRIPT systemctl restart network這個(gè)腳本只是示例實(shí)際使用時(shí)需要根據(jù)你的系統(tǒng)版本和網(wǎng)卡名稱(chēng)調(diào)整。把這類(lèi)腳本保存下來(lái)以后重建環(huán)境能省不少時(shí)間。7.3 快照功能是靜態(tài)IP配置的安全網(wǎng)在修改網(wǎng)絡(luò)配置之前強(qiáng)烈建議先給虛擬機(jī)打一個(gè)快照。這樣萬(wàn)一配置出錯(cuò)導(dǎo)致虛擬機(jī)徹底斷網(wǎng)可以直接回滾到快照狀態(tài)不用重裝系統(tǒng)。我自己的習(xí)慣是任何涉及網(wǎng)絡(luò)、系統(tǒng)服務(wù)、關(guān)鍵配置文件的修改之前都先打快照。這個(gè)習(xí)慣幫我省了無(wú)數(shù)次重裝系統(tǒng)的時(shí)間??煺盏牧硪粋€(gè)用途是配置好靜態(tài)IP并驗(yàn)證穩(wěn)定后再打一個(gè)快照作為干凈基線。以后如果環(huán)境被搞亂了直接回滾到這個(gè)基線IP配置還是好的不用重新配。7.4 關(guān)于IP地址選擇的長(zhǎng)期規(guī)劃建議如果你同時(shí)維護(hù)多臺(tái)虛擬機(jī)建議從一開(kāi)始就做好IP規(guī)劃而不是隨便選。比如192.168.xxx.200給數(shù)據(jù)庫(kù)服務(wù)器192.168.xxx.201給緩存服務(wù)器192.168.xxx.202給消息隊(duì)列服務(wù)器192.168.xxx.210-220留給后續(xù)擴(kuò)展這樣每臺(tái)機(jī)器的角色和IP一一對(duì)應(yīng)管理起來(lái)清晰也不容易沖突。我見(jiàn)過(guò)不少人因?yàn)镮P隨便選后來(lái)加機(jī)器時(shí)發(fā)現(xiàn)地址沖突又得挨個(gè)改非常折騰。前期花五分鐘規(guī)劃后期省幾小時(shí)排查。7.5 虛擬機(jī)重啟后IP仍然變動(dòng)的終極排查如果按照上面的步驟配置完重啟后IP還是變了那說(shuō)明配置沒(méi)有真正生效。這時(shí)候需要檢查幾個(gè)容易被忽略的地方是否有其他網(wǎng)絡(luò)管理服務(wù)在覆蓋你的配置比如cloud-init在某些鏡像里會(huì)自動(dòng)重置網(wǎng)絡(luò)網(wǎng)卡配置文件是否被其他腳本或工具修改是否存在多個(gè)網(wǎng)卡配置文件導(dǎo)致沖突虛擬機(jī)軟件層面是否有網(wǎng)絡(luò)重置策略排查方法是重啟后立即查看ip addr和配置文件內(nèi)容對(duì)比是否一致。如果配置文件被改了說(shuō)明有服務(wù)在自動(dòng)修改它需要找到那個(gè)服務(wù)并禁用它。這類(lèi)問(wèn)題比較隱蔽但一旦定位到原因解決起來(lái)很簡(jiǎn)單。8. 寫(xiě)在最后的一點(diǎn)個(gè)人體會(huì)靜態(tài)IP這件事說(shuō)起來(lái)簡(jiǎn)單但真正配到重啟一百次都不變的穩(wěn)定狀態(tài)還是需要把虛擬機(jī)軟件層面、系統(tǒng)層面、項(xiàng)目配置層面都打通。我自己從最開(kāi)始每次重啟改配置到后來(lái)寫(xiě)腳本自動(dòng)配置再到現(xiàn)在把網(wǎng)絡(luò)配置納入環(huán)境初始化流程前后折騰了不少時(shí)間。回頭看最值得投入的就是把IP固定下來(lái)這件事因?yàn)樗且粍谟酪莸呐浜弥笤僖膊恍枰獮檫B接問(wèn)題分心。另外分享一個(gè)小習(xí)慣每次配置完靜態(tài)IP我都會(huì)把完整的配置過(guò)程、參數(shù)、驗(yàn)證結(jié)果記錄在一個(gè)文檔里。下次換機(jī)器或者幫別人排查時(shí)直接翻文檔就行不用重新回憶。這個(gè)習(xí)慣在排查網(wǎng)絡(luò)問(wèn)題時(shí)尤其有用因?yàn)榫W(wǎng)絡(luò)配置的細(xì)節(jié)太多靠腦子記很容易漏。