為主機(jī)配置 IP 地址并調(diào)通網(wǎng)絡(luò),是開(kāi)發(fā)工程師和網(wǎng)絡(luò)管理員的必備技能。
本節(jié)提供了 4 個(gè)典型的實(shí)驗(yàn)場(chǎng)景,講解為 Linux 主機(jī)配置 IP 地址的關(guān)鍵步驟。實(shí)踐是最佳的學(xué)習(xí)途徑,本節(jié)實(shí)驗(yàn)請(qǐng)務(wù)必親自動(dòng)手操作,對(duì)理解 IP 協(xié)議、路由原理以及子網(wǎng)掩碼等核心知識(shí)點(diǎn)大有裨益。
這是一個(gè)典型的局域網(wǎng)拓?fù)?,所有主機(jī)直接接入同一個(gè)以太網(wǎng):
只要為這個(gè)局域網(wǎng)分配一個(gè)網(wǎng)段,例如 192.168.1.0/24 ,并為每臺(tái)主機(jī)配置合適的 IP 地址,主機(jī)便可通過(guò) IP 協(xié)議來(lái)通信了。
實(shí)驗(yàn)環(huán)境同樣通過(guò) docker 容器提供,只需執(zhí)行這個(gè) docker 命令,即可一鍵啟動(dòng):
docker run --name switch-lab --rm -it --privileged --cap-add=NET_ADMIN --cap-add=SYS_ADMIN -v /data -h switch fasionchan/netbox:0.3 bash /script/switch-lab.sh
我們先觀察每臺(tái)主機(jī)的網(wǎng)絡(luò)信息,一開(kāi)始它們都沒(méi)有配置 IP 地址,路由表也是空的:
root@ant [ ~ ] ? ip addr show eth0
6: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 40:aa:aa:aa:aa:aa brd ff:ff:ff:ff:ff:ff link-netnsid 0
root@ant [ ~ ] ? ip route
root@ant [ ~ ] ?
root@bee [ ~ ] ? ip addr show eth0
8: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 40:bb:bb:bb:bb:bb brd ff:ff:ff:ff:ff:ff link-netnsid 0
root@bee [ ~ ] ? ip route
root@bee [ ~ ] ?
root@cicada [ ~ ] ? ip addr show eth0
10: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 40:cc:cc:cc:cc:cc brd ff:ff:ff:ff:ff:ff link-netnsid 0
root@cicada [ ~ ] ? ip route
root@cicada [ ~ ] ?
我們先為主機(jī) ant 配置 IP 地址 192.168.1.1/24 :
root@ant [ ~ ] ? ip addr add 192.168.1.1/24 dev eth0
/24 與拓?fù)鋱D網(wǎng)段保持一致,表示該局域網(wǎng)網(wǎng)絡(luò)號(hào)為 24 位,其余 8 位是主機(jī)號(hào)。
執(zhí)行 ip 命令查看網(wǎng)卡信息,可以發(fā)現(xiàn) IP 地址已經(jīng)生效了:
root@ant [ ~ ] ? ip addr show eth0
6: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 40:aa:aa:aa:aa:aa brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.1.1/24 scope global eth0
valid_lft forever preferred_lft forever
此外,我們發(fā)現(xiàn),系統(tǒng)自動(dòng)在路由表中添加了一條路由規(guī)則:
root@ant [ ~ ] ? ip route
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1
由于我們?yōu)?eth0 網(wǎng)卡配置了 192.168.1.0/24 網(wǎng)段的地址,這意味著 eth0 直接連接網(wǎng)絡(luò) 192.168.1.0/24 。因此,去往 192.168.1.0/24 網(wǎng)段的 IP 包,都可以通過(guò) eth0 網(wǎng)絡(luò)發(fā)往目標(biāo)主機(jī),這就是這條路由規(guī)則的由來(lái)。
同樣,我們可以為主機(jī) bee 配置 IP 地址:
root@bee [ ~ ] ? ip addr add 192.168.1.2/24 dev eth0
root@bee [ ~ ] ? ip addr show eth0
8: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 40:bb:bb:bb:bb:bb brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.1.2/24 scope global eth0
valid_lft forever preferred_lft forever
root@bee [ ~ ] ? ip route
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2
配置完畢后,主機(jī) ant 就可以通過(guò) IP 協(xié)議與 bee 進(jìn)行通信了。我們?cè)谥鳈C(jī) ant 上 ping 主機(jī) bee ,網(wǎng)絡(luò)已經(jīng)通了:
root@ant [ ~ ] ? ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.122 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.109 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.211 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.245 ms
主機(jī) cicada 的配置方法也是類(lèi)似的,不再贅述。當(dāng)局域網(wǎng)所有主機(jī)都配置完畢,整個(gè)網(wǎng)絡(luò)也就全通了。
兩臺(tái)帶以太網(wǎng)卡的主機(jī),只需用一根網(wǎng)線連起來(lái),即可通信。以下圖為例:
主機(jī) ant 和 bee 由一根網(wǎng)線連接,它們彼此間組成一個(gè)迷你以太網(wǎng),只有兩臺(tái)主機(jī)接入。我們可以分配一個(gè)最小的網(wǎng)段 192.168.1.0/30 ,這個(gè)網(wǎng)段除了網(wǎng)絡(luò)地址和廣播地址,只有兩個(gè)可供分配的主機(jī)地址。
實(shí)驗(yàn)環(huán)境由 docker 容器提供,只需執(zhí)行以下 docker 命令,即可一鍵啟動(dòng):
docker run --name cable-lab --rm -it --privileged --cap-add=NET_ADMIN --cap-add=SYS_ADMIN -v /data -h switch fasionchan/netbox:0.3 bash /script/cable-lab.sh
一開(kāi)始,兩臺(tái)主機(jī)都沒(méi)有配置任何 IP 地址,因此無(wú)法通過(guò) IP 協(xié)議進(jìn)行通信:
root@ant [ ~ ] ? ip addr show eth0
5: eth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 16:8a:1f:f3:54:0a brd ff:ff:ff:ff:ff:ff link-netnsid 1
root@bee [ ~ ] ? ip addr show eth0
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 32:65:21:d3:01:2f brd ff:ff:ff:ff:ff:ff link-netnsid 0
我們依次為它們配置 IP 地址,方法與上節(jié)介紹的一樣,這里不再贅述:
root@ant [ ~ ] ? ip addr add 192.168.1.1/30 dev eth0
root@ant [ ~ ] ? ip addr show eth0
5: eth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 16:8a:1f:f3:54:0a brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet 192.168.1.1/30 scope global eth0
valid_lft forever preferred_lft forever
root@ant [ ~ ] ? ip route
192.168.1.0/30 dev eth0 proto kernel scope link src 192.168.1.1
root@bee [ ~ ] ? ip addr add 192.168.1.2/30 dev eth0
root@bee [ ~ ] ? ip addr show eth0
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 32:65:21:d3:01:2f brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.1.2/30 scope global eth0
valid_lft forever preferred_lft forever
root@bee [ ~ ] ? ip route
192.168.1.0/30 dev eth0 proto kernel scope link src 192.168.1.2
值得一提的是,這個(gè)場(chǎng)景我們采用了 /30 網(wǎng)段,因?yàn)楸緦?shí)驗(yàn)只有兩臺(tái)主機(jī)。
地址配置完畢后,這兩臺(tái)主機(jī)就可以互相 ping 通了:
root@ant [ ~ ] ? ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.035 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.305 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.107 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.110 ms
在 U 盤(pán)等移動(dòng)存儲(chǔ)介質(zhì)還不普及的年代,我們經(jīng)常采用這種方式,在兩臺(tái)主機(jī)間拷貝數(shù)據(jù)。
雙機(jī)直連的場(chǎng)景,我們甚至都不需要分配網(wǎng)段,只需在設(shè)置 IP 的同時(shí)記錄對(duì)端地址。兩臺(tái)主機(jī)的 IP 甚至可以在不同網(wǎng)段,理論上任何 IP 都可以:
我們重新執(zhí)行以下命令,啟動(dòng)一個(gè)全新的實(shí)驗(yàn)環(huán)境來(lái)演示該場(chǎng)景。我們先配置主機(jī) ant :
root@ant [ ~ ] ? ip addr add 192.168.1.1 dev eth0 peer 10.0.1.1
這個(gè)命令為 eth0 網(wǎng)絡(luò)配置地址 192.168.1.1 ,并告訴系統(tǒng)對(duì)端 bee 的地址是 10.0.1.1 。
配置完畢后,我們可以看到網(wǎng)卡上的地址信息,以及系統(tǒng)自動(dòng)添加的一條路由規(guī)則:
root@ant [ ~ ] ? ip addr show eth0
5: eth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 16:8a:1f:f3:54:0a brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet 192.168.1.1 peer 10.0.1.1/32 scope global eth0
valid_lft forever preferred_lft forever
root@ant [ ~ ] ? ip route
10.0.1.1 dev eth0 proto kernel scope link src 192.168.1.1
路由規(guī)則表明,去往 10.0.1.1 的 IP 包,可以通過(guò) eth0 網(wǎng)卡直接向目標(biāo)主機(jī)發(fā)送。
同樣地,我們?yōu)橹鳈C(jī) bee 配置地址 10.0.1.1 并告訴它對(duì)端 ant 的地址是 192.168.1.1 :
root@bee [ ~ ] ? ip addr add 10.0.1.1 dev eth0 peer 192.168.1.1
root@bee [ ~ ] ? ip addr show eth0
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 32:65:21:d3:01:2f brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.1.1 peer 192.168.1.1/32 scope global eth0
valid_lft forever preferred_lft forever
root@bee [ ~ ] ? ip route
192.168.1.1 dev eth0 proto kernel scope link src 10.0.1.1
兩臺(tái)主機(jī)都配置完畢后,它們就能 ping 通對(duì)方了:
root@ant [ ~ ] ? ping 10.0.1.1
PING 10.0.1.1 (10.0.1.1) 56(84) bytes of data.
64 bytes from 10.0.1.1: icmp_seq=1 ttl=64 time=0.156 ms
64 bytes from 10.0.1.1: icmp_seq=2 ttl=64 time=0.109 ms
64 bytes from 10.0.1.1: icmp_seq=3 ttl=64 time=0.126 ms
64 bytes from 10.0.1.1: icmp_seq=4 ttl=64 time=0.105 ms
由于主機(jī) ant 只有去往 10.0.1.1 的路由規(guī)則,我們 ping 任何其他 IP,都會(huì)收到 網(wǎng)絡(luò)不可達(dá) 錯(cuò)誤:
root@ant [ ~ ] ? ping 10.0.1.2
ping: connect: Network is unreachable
主機(jī) bee 也是類(lèi)似的。
下圖是一個(gè)典型的家用局域網(wǎng)拓?fù)?,路由器通過(guò) ADSL 連接互聯(lián)網(wǎng),局域網(wǎng)內(nèi)的網(wǎng)絡(luò)設(shè)備則通過(guò)路由器上網(wǎng)。那么,對(duì)于接入這個(gè)局域網(wǎng)的一臺(tái)主機(jī),如何設(shè)置 IP 地址,才能上網(wǎng)呢?
現(xiàn)在,以上圖中的 PC 為例,進(jìn)行實(shí)驗(yàn)。執(zhí)行下面這個(gè) docker 命令一鍵啟動(dòng)實(shí)驗(yàn)環(huán)境,并進(jìn)入 PC 命令行:
docker run --name host-gw-lab --rm -it --privileged --cap-add=NET_ADMIN --cap-add=SYS_ADMIN -v /data -h switch fasionchan/netbox:0.3 bash /script/host-gw-lab.sh
PC 通過(guò) eth0 網(wǎng)卡連接局域網(wǎng),剛開(kāi)始時(shí)網(wǎng)卡還沒(méi)配置 IP 地址:
root@netbox [ ~ ] ? ip addr show eth0
6: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 5a:ff:7e:28:81:bc brd ff:ff:ff:ff:ff:ff link-netnsid 0
因此,這時(shí) PC 無(wú)法 ping 通局域網(wǎng)中的其他設(shè)備,比如路由;更別說(shuō)訪問(wèn)公網(wǎng)服務(wù)了:
root@netbox [ ~ ] ? ping 192.168.1.1
ping: connect: Network is unreachable
root@netbox [ ~ ] ? ping 223.5.5.5
ping: connect: Network is unreachable
223.5.5.5 是一個(gè)公網(wǎng) IP ,運(yùn)行著阿里提供的公共 DNS 服務(wù)。
我們先執(zhí)行 ip 命令,為 eth0 網(wǎng)絡(luò)配置一個(gè)局域網(wǎng) IP 地址。如無(wú)意外,PC 就可以訪問(wèn)局域網(wǎng)中的其他設(shè)備了:
root@netbox [ ~ ] ? ip addr add 192.168.1.2/24 dev eth0
root@netbox [ ~ ] ? ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.265 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.096 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.105 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.095 ms
請(qǐng)注意,選用的 IP 地址必須與局域網(wǎng)在同一個(gè)網(wǎng)段,而且不能與其他設(shè)備沖突。本實(shí)驗(yàn)按照拓?fù)鋱D中的標(biāo)注進(jìn)行配置即可。
那么,IP 地址配置好后,是不是就可以訪問(wèn)公網(wǎng)了呢?
root@netbox [ ~ ] ? ping 223.5.5.5
ping: connect: Network is unreachable
顯然不是。我們 ping 公網(wǎng)地址時(shí),ping 命令報(bào) 網(wǎng)絡(luò)不可達(dá) 錯(cuò)誤。這是為什么呢?
PC 路由表一開(kāi)始是空的,我們?yōu)?eth0 配置好 IP 地址后,系統(tǒng)自動(dòng)添加了一條直接路由,用于訪問(wèn)局域網(wǎng):
root@netbox [ ~ ] ? ip route
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2
這條路由的意思是,去往 192.168.1.0/24 這個(gè)網(wǎng)段的 IP 包,可以通過(guò) eth0 網(wǎng)卡,直接發(fā)到目標(biāo)設(shè)備。由于 223.5.5.5 不在這個(gè)這個(gè)網(wǎng)段內(nèi),系統(tǒng)也就不知道該如何處理發(fā)給它的 IP 包,這也是 ping 命令報(bào)錯(cuò)的原因。
為了訪問(wèn)互聯(lián)網(wǎng),我們?yōu)?PC 添加一條默認(rèn)路由,以路由器 192.168.1.1 為下一跳:
root@netbox [ ~ ] ? ip route add default via 192.168.1.1
root@netbox [ ~ ] ? ip route
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2
有了這條默認(rèn)路由,如果一個(gè) IP 包未命中其他任何路由規(guī)則,默認(rèn)將發(fā)給路由器 192.168.1.1 ,由它負(fù)責(zé)轉(zhuǎn)發(fā)。這樣一來(lái),去往 223.5.5.5 的 IP 包,系統(tǒng)將發(fā)給路由器 192.168.1.1 ,路由器則接力將包發(fā)送到互聯(lián)網(wǎng)。
有了默認(rèn)路由之后,我們就可以 ping 通公網(wǎng) IP 223.5.5.5 了:
root@netbox [ ~ ] ? ping 223.5.5.5
PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data.
64 bytes from 223.5.5.5: icmp_seq=1 ttl=36 time=20.5 ms
64 bytes from 223.5.5.5: icmp_seq=2 ttl=36 time=21.8 ms
64 bytes from 223.5.5.5: icmp_seq=3 ttl=36 time=16.2 ms
64 bytes from 223.5.5.5: icmp_seq=4 ttl=36 time=18.4 ms
聯(lián)系客服