原創(chuàng)深度精華好文,網(wǎng)絡(luò)是如何工作的?建議靜下心好好看,收獲會(huì)頗豐!
很多做IT相關(guān)工作的人,多少都會(huì)覺得“網(wǎng)絡(luò)”這個(gè)技術(shù)已經(jīng)很老了,非技術(shù)人員甚至還有另外一個(gè)體會(huì),就是“就應(yīng)該有網(wǎng)絡(luò)”,根本就不關(guān)心網(wǎng)絡(luò)是怎么來(lái)的,就像很多人每天吃米飯一樣,吃飯成了理所當(dāng)然,但是很多城市孩子根本不知道一碗米飯來(lái)源得有多珍貴:泡種、育種、耕地、養(yǎng)地、插秧、除草去蟲、收割、晾曬、去殼......
網(wǎng)絡(luò)也是如此,我們每天都使用 IP 和 DNS 之類的詞,但不了解它們是如何工作的,這種越是基本的理論對(duì)于一個(gè)有追求、想要突破自己的工程師非常重要,只要你是從事IT相關(guān)的,一定離不開網(wǎng)絡(luò)。
OSI模型
首先,我們需要熟悉OSI 模型。該模型標(biāo)準(zhǔn)化了網(wǎng)絡(luò)協(xié)議之間的通信。
OSI 將通信分為 7 層,每一層都有自己的協(xié)議,你會(huì)經(jīng)常聽到“它發(fā)生在第三層”之類的事情,以下是這些層:
物理層
數(shù)據(jù)鏈路層
網(wǎng)絡(luò)層
傳輸層
會(huì)話層
表示層
應(yīng)用層
物理層
這一層的協(xié)議負(fù)責(zé)最低層的硬件通信,描述了有線(或無(wú)線)數(shù)據(jù)傳輸。
協(xié)議示例:Wi-Fi、藍(lán)牙、DSL。
數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層負(fù)責(zé)在一個(gè)網(wǎng)絡(luò)中的兩個(gè)設(shè)備之間傳輸數(shù)據(jù),數(shù)據(jù)以幀為單位傳輸,一個(gè)幀包含發(fā)送方和接收方的物理地址,該地址稱為 MAC 地址。
那么,誰(shuí)是發(fā)送者和接收者?
首先,每個(gè)設(shè)備(包括筆記本電腦)都有 NIC — 網(wǎng)絡(luò)接口控制器。這是一個(gè)硬件(或虛擬硬件),負(fù)責(zé)發(fā)送和接收幀。
NIC 有一個(gè) MAC 地址——一個(gè)獨(dú)特的地址,通常嵌入在硬件中或由虛擬化系統(tǒng)生成。
當(dāng)然,一臺(tái)機(jī)器可以有多個(gè) NIC,讓我們看一下使用ip命令的接口:
[root@localhost?~]$?ip?link?show
1:?lo:?<LOOPBACK,UP,LOWER_UP>?mtu?65536?qdisc?noqueue?state?UNKNOWN?mode?DEFAULT
????link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00
2:?eth0:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?pfifo_fast?state?UP?mode?DEFAULT?qlen?1000
????link/ether?52:54:00:05:36:e6?brd?ff:ff:ff:ff:ff:ff
在這種情況下,用于通過(guò)網(wǎng)絡(luò)與外界通信的接口是 eth0,其 MAC 地址為52:54:00:05:36:e6。
有個(gè)問題:
什么是lo?
lo是一個(gè)環(huán)回接口,一個(gè)特定的虛擬接口,系統(tǒng)使用它與自身進(jìn)行通信,多虧了lo,即使沒有網(wǎng)絡(luò)連接,本地應(yīng)用程序也可以相互通信。
一般情況下,每臺(tái)計(jì)算機(jī)有數(shù)十億條電纜直接連接到世界上所有的計(jì)算機(jī),當(dāng)然這肯定不是直接連接,需要依賴其他的設(shè)備,例如,交換機(jī)。
交換機(jī)是一種建立網(wǎng)絡(luò)的設(shè)備,我們所有的機(jī)器都通過(guò)端口連接到它。L2 交換機(jī)的任務(wù)(有更高級(jí)的交換機(jī),比如 L3 甚至 L7)——將幀從 MAC 發(fā)送方轉(zhuǎn)發(fā)到 MAC 接收方,許多設(shè)備連接到一個(gè)交換機(jī)形成一個(gè)局域網(wǎng)(LAN)。

將一堆服務(wù)器連接到一個(gè)交換機(jī)是創(chuàng)建網(wǎng)絡(luò)最常見的方式,但是如果我們想建立一個(gè)物理上位于不同地方的服務(wù)器網(wǎng)絡(luò)呢?或者,比如說(shuō),我們想在邏輯上將連接到一個(gè)位置的一臺(tái)交換機(jī)的服務(wù)器分離到不同的網(wǎng)絡(luò)中?
對(duì)于這種情況,要?jiǎng)?chuàng)建 VLAN(虛擬局域網(wǎng)),它的工作原理非常簡(jiǎn)單:將帶有 VLAN 標(biāo)記的附加標(biāo)頭添加到幀中,并確定該幀屬于哪個(gè)網(wǎng)絡(luò)。

另一種設(shè)備是網(wǎng)橋。L2 網(wǎng)橋用于連接兩個(gè)使用交換機(jī)形成的網(wǎng)絡(luò),如下所示:

交換機(jī)和網(wǎng)橋(以及集線器)都可以實(shí)現(xiàn)將多個(gè)設(shè)備連接到一個(gè)網(wǎng)絡(luò)中。還有連接網(wǎng)絡(luò)的路由器,它們?cè)?L3 上工作,例如,你家里的 Wi-Fi 路由器將您的局域網(wǎng)(有您的筆記本電腦、手機(jī)和平板電腦)連接到互聯(lián)網(wǎng)。
除了局域網(wǎng),還有一些其他的網(wǎng)絡(luò)類型:例如,廣域網(wǎng),可以將 Internet 視為 WAN,但 Internet 完全消除了網(wǎng)絡(luò)的地理邊界。
正如我上面提到的 L3 交換機(jī),它不僅可以將幀從一個(gè)設(shè)備轉(zhuǎn)發(fā)到另一個(gè)設(shè)備,而且還具有一些更高級(jí)的特性,例如路由。那么,你可能會(huì)問,路由器和 L3 交換機(jī)之間有什么區(qū)別?你可以看我之前的文章,或者后面我會(huì)再介紹一下。
網(wǎng)絡(luò)層
在第三層,網(wǎng)絡(luò)層,使用 IP 地址而不是 MAC 地址,讓我們使用以下命令查看我們?cè)O(shè)備的 IP:
[root@localhost?~]$?ip?addr?show
1:?lo:?<LOOPBACK,UP,LOWER_UP>?mtu?65536?qdisc?noqueue?state?UNKNOWN
????link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00
????inet?127.0.0.1/8?scope?host?lo
???????valid_lft?forever?preferred_lft?forever
????inet6?::1/128?scope?host
???????valid_lft?forever?preferred_lft?forever
2:?eth0:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?pfifo_fast?state?UP?qlen?1000
????link/ether?52:54:00:05:36:e6?brd?ff:ff:ff:ff:ff:ff
????inet?192.168.122.212/24?brd?192.168.122.255?scope?global?dynamic?eth0
???????valid_lft?2930sec?preferred_lft?2930sec
????inet6?fe80::5054:ff:fe05:36e6/64?scope?link
???????valid_lft?forever?preferred_lft?forever
該192.168.122.212/24地址分配給eth0接口。
但什么是/24?為什么環(huán)回接口有/8?
我們知道IPv4 地址大概有4 294 967 296 個(gè) ,Internet 不是一個(gè)大網(wǎng)絡(luò),而是由許多小網(wǎng)絡(luò)構(gòu)成,此外,為不同類型的網(wǎng)絡(luò)(例如,無(wú)法從外部訪問的專用網(wǎng)絡(luò))保留了單獨(dú)的 IP 地址塊。
現(xiàn)在已經(jīng)慢慢推行IPv6 地址,但尚未完全過(guò)渡到 IPv6。
CIDR 是一種為不同類型的網(wǎng)絡(luò)分配 IP 地址的方法。CIDR 表示法是一種以格式寫入此塊的方法192.168.122.212/24
,其中的數(shù)字/24
稱為掩碼,可以了解此塊中有多少地址。
IPv4 是一個(gè)簡(jiǎn)單的版本,長(zhǎng)度為 32 位,可以用二進(jìn)制代碼表示。在二進(jìn)制代碼中,IP 地址從00000000000000000000000000000000
到11111111111111111111111111111111
。為方便起見,我們將這個(gè)數(shù)字分成 4 份,每份有 8 位數(shù)字:11111111.11111111.11111111.11111111.
在我們習(xí)慣的十進(jìn)制系統(tǒng)中,這個(gè)地址看起來(lái)像這樣:255.255.255.255
。
掩碼/24
可以表示為255.255.255.0
,或者用二進(jìn)制表示法表示為11111111.11111111.11111111.00000000
。為了找到網(wǎng)絡(luò)的第一個(gè)和最后一個(gè)地址,我們可以使用其中一個(gè)地址和網(wǎng)絡(luò)掩碼,并對(duì)它們的二進(jìn)制表示法應(yīng)用按位與:
11000000.10101000.01111010.11010100
&
11111111.11111111.11111111.00000000
=
11000000.10101000.01111010.00000000
讓我們將結(jié)果翻譯成人類可讀的表示:192.168.122.0
是網(wǎng)絡(luò)地址。為了計(jì)算所有可訪問地址的數(shù)量,我們需要計(jì)算掩碼中零的數(shù)量。在我們的例子中,有 8 個(gè)零位置,它們中的每一個(gè)都可以擁有 1 或 0 的值,這就是為什么總的來(lái)說(shuō)我們得到 2^8 也就是256 個(gè)地址,這意味著最后一個(gè)地址將是192.168.122.255。
“當(dāng)然計(jì)算這些玩意,知道方法就行了,真正用的時(shí)候用計(jì)算器計(jì)算就可以了。
”
ARP
我們已經(jīng)知道 L2 使用 MAC 地址和 L3使用IP 地址,這個(gè)時(shí)候必須有某種機(jī)制將 MAC 地址與其 IP 地址相關(guān)聯(lián),這種機(jī)制稱為ARP(地址解析協(xié)議)。
Linux 有一個(gè)同名命令arp,它允許我們查看設(shè)備已知的 MAC 地址表和映射到它們的 IP 地址表。
[root@localhost]#?arp?-n
Address?HWtype?HWaddress?Flags?Mask?Iface
192.168.178.1?ether?5c:49:79:99:f3:23?C?wlp3s0
在這種情況下,192.168.178.1
是我的 Wi-Fi 路由器的 IP 地址,我的筆記本電腦通過(guò) wlp3s0 接口連接到該路由器。
該arp命令被視為已棄用,強(qiáng)烈建議使用ip neigh
代替。
有一種網(wǎng)絡(luò)攻擊類型與 ARP 相關(guān),稱為ARP 欺騙,這種攻擊的目標(biāo)是用黑客的設(shè)備地址替換與某個(gè) IP 地址相關(guān)聯(lián)的 MAC 地址。
DHCP
大家有沒有想過(guò)這樣的問題,網(wǎng)絡(luò)接口究竟是如何分配 IP 地址的?
選項(xiàng)之一:手動(dòng)
缺點(diǎn):手工的會(huì)因?yàn)檎J(rèn)為原因配置重復(fù)的地址并產(chǎn)生沖突
另一種選擇:動(dòng)態(tài)主機(jī)配置協(xié)議 ( DHCP )
一種用于自動(dòng)設(shè)置不同配置(包括 IP 地址)的協(xié)議。
有關(guān) DHCP 的更多詳細(xì)信息,請(qǐng)參閱 RFC 文檔:https : //www.ietf.org/rfc/rfc2131.txt
要使 DHCP 工作,需要一個(gè) DHCP 服務(wù)器,它可以分配 IP 地址。在家里,DHCP 服務(wù)器通常位于路由器中。
為了理解 DHCP 究竟是如何工作的,你需要了解“廣播”。這是一個(gè)過(guò)程,我們的服務(wù)器將消息傳輸?shù)骄W(wǎng)絡(luò)中的所有服務(wù)器,因?yàn)樗恢浪枰男畔⒌拇_切位置,這種廣播通信接近于無(wú)線電廣播。
就比如一個(gè)新老師到你班里發(fā)作業(yè),不認(rèn)識(shí)學(xué)生,那就全班喊“王某某、李某某”,這個(gè)就相當(dāng)于廣播了。
在 DHCP 的情況下,它是這樣發(fā)生的:
DHCP 客戶端發(fā)送帶有請(qǐng)求“我需要 IP 地址”的廣播消息
DHCP 服務(wù)器捕獲它并發(fā)送回廣播消息“我有一個(gè) IP 地址 xxxx,你想要嗎?”
DHCP 客戶端收到消息并發(fā)送另一個(gè)消息:“是的,我想要地址 xxxx”
DHCP 服務(wù)器回答“好的,那么 xxxx 屬于你”
連接設(shè)置存儲(chǔ)在哪里?
連接設(shè)置存儲(chǔ)在/etc/sysconfig/network-scripts
. 在這里你可以編輯諸如分配 IP 地址的方式(自動(dòng)或靜態(tài))、是否在系統(tǒng)加載時(shí)自動(dòng)啟動(dòng)連接等內(nèi)容。例如,這就是我的 Wi-Fi 連接配置的樣子:
[root@localhost?network-scripts]#?cat?ifcfg-FRITZ-Box_7490
HWADDR=4C:34:88:54:C1:2B
ESSID="FRITZ!Box?7490"
MODE=Managed
KEY_MGMT=WPA-PSK
TYPE=Wireless
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME="FRITZ!Box?7490"
UUID=55ba9218-1d2f-407d-af13-51502d542edb
ONBOOT=yes
SECURITYMODE=open
PEERDNS=yes
PEERROUTES=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
注意BOOTPROTO=dhcp——這個(gè)選項(xiàng)意味著我的電腦將使用 DHCP 服務(wù)器,用于接收 IP 地址。作為比較,環(huán)回設(shè)備的連接配置:
[root@localhost?network-scripts]#?cat?ifcfg-lo
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
#?If?you're?having?problems?with?gated?making?127.0.0.0/8?a?martian,
#?you?can?change?this?to?something?else?(255.255.255.255,?for?example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
靜態(tài)地址在此處指定:IPADDR=127.0.0.1,在家里,你可以使用該工具nmcli或安裝軟件包Networkmanager-tui,這將在你的控制臺(tái)中提供一個(gè)用戶友好的文本界面,而不是手動(dòng)編輯配置。
下面需要配置一個(gè)更重要的東西:路由。
如何理解,流量將流向何處?
一切都很簡(jiǎn)單:使用ip_r
命令查看本地路由表就足夠了。
在寫這篇文章的時(shí)候,我坐在咖啡店里,拿著一臺(tái)筆記本電腦,它用手機(jī)作為路由器。這就是ip_r顯示:
default?via?172.20.10.1?dev?wlp3s0?proto?static?metric?600
172.20.10.0/28?dev?wlp3s0?proto?kernel?scope?link?src?172.20.10.3?metric?600
192.168.100.0/24?dev?virbr2?proto?kernel?scope?link?src?192.168.100.1
192.168.122.0/24?dev?virbr0?proto?kernel?scope?link?src?192.168.122.1
如你所見,默認(rèn)情況下,所有流量都流向地址為 的機(jī)器172.20.10.1
。如果我運(yùn)行ip addr show
,我會(huì)看到我的筆記本電腦上的網(wǎng)絡(luò)接口也有一個(gè)來(lái)自這個(gè)網(wǎng)絡(luò)的 IP 地址:
4:?wlp3s0:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?mq?state?UP?group?default?qlen?1000
????link/ether?4c:34:88:54:c1:2b?brd?ff:ff:ff:ff:ff:ff
????inet?172.20.10.3/28?brd?172.20.10.15?scope?global?dynamic?wlp3s0
???????valid_lft?83892sec?preferred_lft?83892sec
????inet6?fe80::4e34:88ff:fe54:c12b/64?scope?link
???????valid_lft?forever?preferred_lft?forever
你可以使用該ip r add
命令添加新路徑,并使用該ip r del
命令刪除它們。
DNS
你可能已經(jīng)聽說(shuō)過(guò) DNS,這個(gè)名詞很簡(jiǎn)單:請(qǐng)求服務(wù)器不是通過(guò)它的 IP 地址(人們很難記?。?,而是通過(guò)它的正常名稱。
最古老和最流行的 DNS 服務(wù)器(存儲(chǔ)有關(guān)地址的信息并響應(yīng)請(qǐng)求的服務(wù)器)是 BIND。
在 DNS 之前,我們所擁有的只是一個(gè)文件 /etc/hosts
,現(xiàn)在也經(jīng)常使用它。
還有一個(gè)更有趣的文件 /etc/nsswitch.conf
。這是它以什么順序定義的地方,以及在哪里尋找不同的信息,包括在哪里尋找主機(jī)。默認(rèn)情況下,它們會(huì)在 /etc/hosts
中查找,然后才會(huì)向 DNS 服務(wù)器發(fā)送請(qǐng)求。
順便說(shuō)一下,用于解析 DNS 名稱的服務(wù)器在 /etc/resolv.conf
中定義。
最好使用命令 dig
和 nslookup
來(lái)調(diào)試 DNS 問題。例如,要從名稱服務(wù)器 8.8.8.8
請(qǐng)求有關(guān) mkdev.me 的信息,你需要做的就是:
#?dig?mkdev.me?@8.8.8.8
;?<<>>?DiG?9.10.3-P4-RedHat-9.10.3-12.P4.fc23?<<>>?mkdev.me?@8.8.8.8
;;?global?options:?+cmd
;;?Got?answer:
;;?->>HEADER<<-?opcode:?QUERY,?status:?NOERROR,?id:?3320
;;?flags:?qr?rd?ra;?QUERY:?1,?ANSWER:?1,?AUTHORITY:?0,?ADDITIONAL:?1
;;?OPT?PSEUDOSECTION:
;?EDNS:?version:?0,?flags:;?udp:?512
;;?QUESTION?SECTION:
;mkdev.me.?IN?A
;;?ANSWER?SECTION:
mkdev.me.?299?IN?A?52.28.20.212
;;?Query?time:?355?msec
;;?SERVER:?8.8.8.8#53(8.8.8.8)
;;?WHEN:?Fri?May?27?12:51:04?CEST?2016
;;?MSG?SIZE?rcvd:?53
虛擬機(jī)
虛擬機(jī),大家都玩過(guò)吧,相比于物理機(jī),虛擬機(jī)就是運(yùn)行在物理機(jī)的操作系統(tǒng)。
首先,讓我們使用 virt-install
創(chuàng)建一個(gè) VM :
sudo?virt-install?--name?mkdev-networking-basics-1?\
--location?~/Downloads/CentOS-7-x86_64-Minimal-1511.iso?\
--initrd-inject?/path/to/ks.cfg?\
--extra-args?ks=file:/ks.cfg?\
--memory=1024?--vcpus=1?--disk?size=8
默認(rèn)情況下,libvirt 創(chuàng)建一個(gè)網(wǎng)絡(luò):
[root@localhost]#?virsh?net-list
?Name?State?Autostart?Persistent
---------------------------------------------------------------
?default?active?yes?yes
192.168.0.0/16
為專用網(wǎng)絡(luò)分配一個(gè)塊。libvirt192.168.122.212/24
為其網(wǎng)絡(luò)分配了一個(gè)塊,這意味著從192.168.122.0
到 的所有地址192.168.122.255
。
要查看有關(guān)某個(gè)網(wǎng)絡(luò)的詳細(xì)信息,可以使用virsh net-info
或virsh net-dumpxml
。第二個(gè)命令將返回更多詳細(xì)信息,這就是我們使用它的原因:
[root@CentOS-72-64-minimal?~]#?virsh?net-dumpxml?default
<network?connections='1'>
??<name>default</name>
??<uuid>f2ee9249-6bed-451f-a248-9cd223a80702</uuid>
??<forward?mode='nat'>
????<nat>
??????<port?start='1024'?end='65535'/>
????</nat>
??</forward>
??<bridge?name='virbr0'?stp='on'?delay='0'/>
??<mac?address='52:54:00:83:b4:74'/>
??<ip?address='192.168.122.1'?netmask='255.255.255.0'>
????<dhcp>
??????<range?start='192.168.122.2'?end='192.168.122.254'/>
????</dhcp>
??</ip>
</network>
connections顯示連接到該網(wǎng)絡(luò)的機(jī)器數(shù)量,可以在libvirt 文檔 中閱讀此 XML 文件的所有可能選項(xiàng)的詳細(xì)說(shuō)明。
這里解釋一下橋接和 dhcp。
網(wǎng)橋或virbr0設(shè)備或虛擬網(wǎng)絡(luò)交換機(jī)是一種特殊設(shè)備,該網(wǎng)絡(luò)中的所有 VM 都連接到該設(shè)備。在一個(gè)網(wǎng)絡(luò)中從一個(gè)虛擬機(jī)到另一個(gè)虛擬機(jī)的所有請(qǐng)求都通過(guò)這個(gè)虛擬交換機(jī)。Libvirt 為每個(gè)網(wǎng)絡(luò)創(chuàng)建一個(gè)虛擬交換機(jī),每個(gè)交換機(jī)都被識(shí)別為主機(jī)上的一個(gè)單獨(dú)設(shè)備:
[root@localhost]#?ip?link?show
8:?virbr1:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?noqueue?state?UP?mode?DEFAULT
????link/ether?52:54:00:a8:02:f2?brd?ff:ff:ff:ff:ff:ff
默認(rèn)情況下,在 libvirt 中創(chuàng)建網(wǎng)絡(luò)等同于創(chuàng)建一個(gè)所有 VM 都連接到的虛擬交換機(jī),從而創(chuàng)建局域網(wǎng) LAN。
virbr0 交換機(jī)是使用Linux Bridge實(shí)現(xiàn)的——一種最初專門用于創(chuàng)建虛擬局域網(wǎng)的技術(shù)。
Linux Bridge 與典型的硬件 L2 交換機(jī)“略有不同”。在它存在的幾年中,它添加了許多功能,例如流量過(guò)濾和防火墻。
<ip?address='192.168.122.1'?netmask='255.255.255.0'>
????<dhcp>
??????<range?start='192.168.122.2'?end='192.168.122.254'/>
????</dhcp>
??</ip>
這里聲明了用于該網(wǎng)絡(luò)中虛擬機(jī)的地址塊,192.168.122.1
是此虛擬網(wǎng)絡(luò)中主機(jī)的 IP 地址。
如果我們ip r在 VM 中運(yùn)行,我們會(huì)看到:
[vagrant@localhost?~]$?ip?r
default?via?192.168.122.1?dev?eth0?proto?static?metric?100
192.168.122.0/24?dev?eth0?proto?kernel?scope?link?src?192.168.122.209?metric?100
默認(rèn)情況下,來(lái)自 VM 的流量通過(guò)主機(jī)與外界通信。
眾所周知,DHCP 服務(wù)負(fù)責(zé)分配 IP 地址,Libvirt 將dnsmaq用于 DHCP 和 DNS,并為每個(gè)網(wǎng)絡(luò)運(yùn)行一個(gè) dnsmasq 實(shí)例。
[root@CentOS-72-64-minimal?~]#?ps?aux?|?grep?dns
nobody?10600?0.0?0.0?15548?856???S?Apr01?0:02?/sbin/dnsmasq?--conf-file=/var/lib/libvirt/dnsmasq/default.conf?--leasefile-ro?--dhcp-script=/usr/libexec/libvirt_leaseshelper
root?10601?0.0?0.0?15520?312???S?Apr01?0:00?/sbin/dnsmasq?--conf-file=/var/lib/libvirt/dnsmasq/default.conf?--leasefile-ro?--dhcp-script=/usr/libexec/libvirt_leaseshelper
現(xiàn)在我們可以查看?DHCP?表,它會(huì)顯示分配的地址:
[root@loclahost]#?virsh?net-dhcp-leases?default
?Expiry?Time?MAC?address?Protocol?IP?address?Hostname?Client?ID?or?DUID
------------------------------------------------------------------------------------------------------------------------
?2016-04-29?16:31:19?52:54:00:05:36:e6?ipv4?192.168.122.212/24?-?-
注意52:54:00:05:36:e6
是我們虛擬機(jī) eth0 接口的 MAC 地址。
NAT
有一個(gè)問題:即使我們將網(wǎng)絡(luò)分成許多塊,IP 地址的總數(shù)也不會(huì)增加。其實(shí),我們平時(shí)所用的IP都是私有地址和公共地址的組合。通常,一個(gè)公共地址隱藏了很多機(jī)器,每臺(tái)機(jī)器都有自己的私有地址。
對(duì)于我們的 VM 也是如此。每個(gè)都有來(lái)自塊的私有 IP 地址192.168.122.0/24
,并且所有這些都隱藏在主機(jī)的公共地址后面。
VM的私有地址在局域網(wǎng)內(nèi)部可以相互通信的,比如與它的宿主機(jī)(就是裝有虛擬機(jī)的物理機(jī))肯定屬于一個(gè)局域網(wǎng),那么它們就是可以相互通信的,但是你在家時(shí)沒有辦法和你基友的虛擬機(jī)進(jìn)行通信的,因?yàn)槟慊训奶摂M機(jī)屬于一個(gè)私有地址,外界網(wǎng)絡(luò)無(wú)法感知。這個(gè)就像你在你們村的外號(hào)叫二狗子,然后遠(yuǎn)在美國(guó)的某個(gè)小妞想要認(rèn)識(shí)你,通過(guò)一些手段搜索中國(guó)xx省xx市xx縣xx村二狗子,這不可能找到的。有人抬杠了,可以問人呀!大哥,計(jì)算機(jī)不是人,怎么個(gè)問人法。
NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換)將解決這個(gè)問題,它是一種解析網(wǎng)絡(luò)包中 IP 地址的機(jī)制。通常,發(fā)送方和接收方的 IP 地址都包含在一個(gè)包中,NAT 可以動(dòng)態(tài)更改這些地址并保存更改地址表。
還有 SNAT(源 NAT),我們的 VM 使用它來(lái)訪問 Internet。發(fā)送包時(shí),其源地址將替換為主機(jī)地址,當(dāng)來(lái)自目標(biāo)服務(wù)器的響應(yīng)返回時(shí),地址從主機(jī)地址更改為 VM 地址,改變地址的是路由器。
DNAT(目標(biāo) NAT)的作用幾乎相同,但反之亦然:這是當(dāng)您請(qǐng)求某個(gè)隱藏私有本地地址的公共地址時(shí)。
NAT 是虛擬機(jī)與外界通信的默認(rèn)方式。但是 libvirt 是一個(gè)靈活的東西,例如,您可以將 VM 直接連接到主機(jī)的物理接口而不是虛擬交換機(jī)。
Libvirt 使用 iptables 進(jìn)行 NAT。簡(jiǎn)而言之,這是一個(gè)負(fù)責(zé)過(guò)濾網(wǎng)絡(luò)包的工具,iptables 是在特殊規(guī)則的幫助下配置的,這些規(guī)則組合在鏈中。通過(guò)添加這些規(guī)則,libvirt 允許我們的虛擬機(jī)使用 NAT 訪問 Internet。當(dāng)我們談?wù)撘话愕陌踩詴r(shí),我們將回到 iptables。
此外,必須在核心設(shè)置中啟用 ip_forward 選項(xiàng)才能使包重定向在主機(jī)上工作。啟用它非常容易:echo 1 > /proc/sys/net/ipv4/ip_forward
tcpdump
網(wǎng)絡(luò)出現(xiàn)問題的時(shí)候,終極大招就是調(diào)試,調(diào)試最常用的工具就是tcpdump。知道如何使用它非常重要,例如,在重新啟動(dòng) VM 時(shí),我們的 virbr0 上發(fā)生了什么。
讓我們?cè)谥鳈C(jī)上打開一個(gè)控制臺(tái)并運(yùn)行tcpdump -i virbr0
.
打開單獨(dú)的窗口并運(yùn)行virsh reboot #{number_of_VM}
.
查看第一個(gè)窗口中的結(jié)果,看看哪些請(qǐng)求來(lái)自哪里。
tcpdump:?verbose?output?suppressed,?use?-v?or?-vv?for?full?protocol?decode
listening?on?virbr0,?link-type?EN10MB?(Ethernet),?capture?size?262144?bytes
12:57:31.339135?IP6?::?>?ff02::16:?HBH?ICMP6,?multicast?listener?report?v2,?1?group?record(s),?length?28
12:57:31.397937?IP?0.0.0.0.bootpc?>?255.255.255.255.bootps:?BOOTP/DHCP,?Request?from?52:54:00:e0:06:54?(oui?Unknown),?length?300
12:57:31.398182?IP?linux.fritz.box.bootps?>?192.168.122.209.bootpc:?BOOTP/DHCP,?Reply,?length?301
12:57:31.590332?ARP,?Request?who-has?linux.fritz.box?tell?192.168.122.209,?length?28
12:57:31.590373?ARP,?Reply?linux.fritz.box?is-at?52:54:00:7e:33:23?(oui?Unknown),?length?28
12:57:31.590409?IP?192.168.122.209.38438?>?linux.fritz.box.domain:?61342+?A??0.centos.pool.ntp.org.?(39)
12:57:31.590458?IP?192.168.122.209.38438?>?linux.fritz.box.domain:?25671+?AAAA??0.centos.pool.ntp.org.?(39)
12:57:31.590618?IP?linux.fritz.box.domain?>?192.168.122.209.38438:?25671?0/0/0?(39)
###?And?so?on
這里是,例如,從VM廣播:12:57:31.397937 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 52:54:00:e0:06:54 (oui Unknown), length 300
。
另外,讓我們看看ARP表:
Address?HWtype?HWaddress?Flags?Mask?Iface
#?...
192.168.122.209?ether?52:54:00:e0:06:54?C?virbr0
#?...
虛擬專用網(wǎng)(VPN)
有時(shí)(說(shuō)實(shí)話,很多時(shí)候)有必要讓客戶端和服務(wù)器看起來(lái)都在一個(gè)私有網(wǎng)絡(luò)中。例如,當(dāng)所有公司服務(wù)都在專用網(wǎng)絡(luò)中時(shí),該網(wǎng)絡(luò)只能從辦公室訪問,但您需要為公司員工提供遠(yuǎn)程訪問權(quán)限。或者當(dāng)一家公司有多個(gè)辦公室或數(shù)據(jù)中心時(shí),它們需要以這樣的方式相互連接。
VPN 本身就是將一個(gè) tcp/ip 包放入另一個(gè)包并加密內(nèi)容。因此,有一個(gè)虛擬網(wǎng)絡(luò)在真實(shí)網(wǎng)絡(luò)內(nèi)部工作。虛擬網(wǎng)絡(luò)設(shè)備 (tun/tap) 是為虛擬網(wǎng)絡(luò)創(chuàng)建的,他們擁有只能在我們的虛擬加密網(wǎng)絡(luò)中訪問的虛擬 IP 地址。
關(guān)于虛擬專用網(wǎng),我可以后面多出一些文章詳細(xì)介紹,在本文就不多闡述了,這個(gè)課題太大了,講的話不是一篇文章就能講明白的。
自學(xué)
我們剛剛介紹了網(wǎng)絡(luò)的最基本知識(shí),但是,當(dāng)然還有近十幾種技術(shù)值得一看。自己google VXLAN,學(xué)習(xí)TCP和UDP(搞清楚什么時(shí)候用哪個(gè)),看看IMCP。你會(huì)不斷遇到新術(shù)語(yǔ),但與往常一樣,最重要的是學(xué)習(xí)基礎(chǔ)知識(shí)。
我們還沒有接觸到更高的 OSI 層,也沒有研究 Web 應(yīng)用程序使用的不同協(xié)議:HTTP(S)、FTP、SSH、NTP 和許多其他協(xié)議。
不要忘記查看RFC。這是在你學(xué)習(xí)網(wǎng)絡(luò)的第一站。