作者 @飛洲人飛舟魂轉載請註明出處.
一直以來對linux的網路管理不大明白,今天研究了一下網路的手動配置,現在記錄一下.我使用Ubuntu20.04.1來進行演示.
介紹
首先我們先明確一些概念性的東西,剔除掉一下你對linux下網路管理的錯誤認知.
1.ip配置方式
ip配置方式有兩種,一種是靜態(static)方式,另一種是DHCP的方式.靜態ip就是給網路卡分配一個不動的ip;DHCP方式則要複雜些,以平常通過路由器連線網際網路為例,路由器上執行有DHCP伺服器,負責給各個裝置分配ip,而各個裝置則有DHCP客戶端,用於和路由器通訊,然後獲取路由器分配給自己的ip地址(獲取了ip之後當然要呼叫底層的工具來配置網路卡ip).DHCP方式分配的ip可能是會變化的,而static方式則不會.
2.linux上的底層網路命令
現在最常見的有兩組網路命令,net-tools和iproute2(參考archlinux wiki).如下圖是這兩組工具集中常用命令的對應關係,左邊的是net-tools包裡的命令集,右邊的則是較新的iproute2工具集.中文網際網路教程上經常使用的ifconfig命令就是net-tools包裡的.現在我們推薦使用iproute2工具集來管理網路,因為net-tools由於不再維護,會逐漸被廢棄.我們最好不要混用這兩組命令,造成混淆.
我們可以用這些底層命令來配置網路,連線到網際網路,具體方法後面再說.
3.linux上的network manager
要知道用底層的網路管理命令來管理網路是要使用一長串的命令列的,對於一個linux普通使用者來說十分麻煩,更不用說那些沒接觸過linux的小白使用者了,因此network manager就出現了,它們可以自動配置你的網路,十分方便地連線到網際網路.
下面就是一些常見的network manager,使用者利用這些管理器提供的命令列介面或者是圖形介面能很容易地配置自己ip是靜態的還是DHCP的,配置自己的閘道器,還能配置自定義的dns等,甚至還可以很容易地連線到wifi.
但是我們需要注意的是:network manager是互斥的,即不可以同時利用多個network manager來管理網路連線;同時,在用network manager來管理網路連線的時候我們也不要手動地用底層網路命令來控制網路連線,因為網路管理器已經代替我們做了這些事,如果同時使用網路命令改變了網路的設定可能會造成網路連線的問題.
Ubuntu20.04.1上的網路管理器(network manager)
據我瞭解,ubuntu的兩個網路管理器預設都是執行狀態.使用下面兩個命令來確認.
#使用下面兩個命令檢視兩種網路管理器的狀態.
> systmctl status NetworkManager
...(output)
>systemctl status systemd-networkd
...(output)
你應該能看到都是顯示active的,那之前介紹裡不是說了網路管理器是互斥的麼?其實前面只是通俗地叫你最好不要這樣用,只要保證網路配置不衝突即可,而Ubuntu發行版通過開發人員的配置已經避免了這兩個管理器的衝突問題,具體如何如何做到,我也沒有深入研究.
為了保證強迫症的需求,我們進行一個實驗,輸入如下命令:
#永久關閉systemd-networkd管理器
>sudo systemctl disable --now systemd-networkd
關閉systemd-networkd網路管理器後重啟系統,你可以發現你仍然可以正常使用網路,沒有任何變化.
systemd-resolved是networkd管理器的一個組成部分,不過你要是自作聰明地關閉systemd-resolved就會發現重啟之後網路不對勁了:
>sudo systemctl disable --now systemd-resolved
這是因為在ubuntu中,NetworkManager的dns管理部分預設使用systemd-resolved提供的dns服務.而systemd-resolved用作域名解析,可以理解為DHCP客戶端.若是關閉了systemd-resolved服務,dns解析就會出錯,就不能正確訪問網頁了,但是你可以通過ping 命令發現雖然不可以ping通域名,卻可以正常ping通ip,
>ping www.baidu.com //ping 錯誤
>ping 114.114.114.114 //可以ping通
手動配置網路並連線至網際網路
下面就來進行我們本文的主題,不適用網路管理器,手動配置網路讓我們的系統能正常上網.
首先你要將你前面所作的更改取消,讓系統恢復原狀.
第一步:關閉所有的網路管理器
為了避免由於手動配置網路而造成的網路衝突,我們需要關閉網路管理器,在ubuntu上,我們使用如下命令:
> systmctl disable --now NetworkManager
> systmctl disable --now systemd-networkd
>reboot
重啟後,網路不可以正常使用,連ping 也ping不通
第二步:給網路卡介面分配ip,並開啟網路卡介面
使用下面的命令給網路卡分配ip地址
ip addr add [ip/madk] dev [interface]
我的linux虛擬機器和宿主機是橋接的,宿主機與路由器通過通過wifi連線,因此我的宿主機,linux虛擬機器,路由器應當處於同一網段.我路由器的ip為192.168.31.1,路由器的DHCP的ip範圍是192.168.31.5到192.168.31.254,為了防止和DHCP池裡的IP相沖突,我就將linux設為192.168.31.4,而我的網路介面名字為ens33
,因此用命令如下來新增ip:
> sudo ip addr add 192.168.31.2/24 dev ens33
這時我的介面ens33
還沒有開啟,你可以使用ip addr
來看你的status是否是down狀態,如果是,需要類似用下面的命令來開啟介面:
>ip link set dev ens33 up
這個時候我們使用ping命令,發現可以通區域網下的主機:
>ping 192.168.31.1
>ping 192.168.31.212 //這是我宿主機的ip
第三步:新增路由條目
我們上一步發現可以ping通同一個區域網內的主機,但若是區域網外的ip就無法通了,如下:
>ping 114.114.114.114//ping 不通
這是由於我們沒有設定路由導致的,如下圖,我們區域網內可通是因為家用路由器並不是常規意義上的路由器(具體可參考:https://www.zhihu.com/question/369737960).區域網在家用路由器下是通過交換機連線的,不需要通過路由器路由.如果需要與外網交流,我們需要給linux加一條通過路由器的路由模組的路由條目.
我們這裡使用ip route
命令,對我來說是下面這個命令:
>sudo ip route add default via 192.168.31.1 dev ens33
新增完路由表我們會發現我們就可以ping通外網了.
第四步:手動配置dns伺服器
ping通了外網還不行,我們這時是不能正常訪問網頁的,沒了網路管理器後,想要正常上網,我們還必須手動配置dns伺服器,這裡我們使用之前提到過的啊 systemd-resolved
提供的cli命令resolvectl
來配置dns伺服器,類似下面這樣:
>resolvectl dns ens33 192.168.31.1
下面驗證一下:
>ping www.baidu.com // 返回正常
這時我們就可以正常瀏覽網頁了.