路由:幫你決定下一條路該往哪走。linux
若是隻是在局域網裏發,須要通過交換機,想要往外發,須要通過路由器。shell
linux內核都集成了路由功能,因此能夠作成一個路由器來使用。當它只是一個linux系統的時候,它會發包,收包,可是不能轉發包。如今要讓它能夠轉發包。vim
操做系統內核佔用的空間就是Kernel space空間(內核空間),應用軟件佔用的空間就是user space空間(用戶空間)。網絡
包先走到網卡,crc沒問題,送到網卡緩衝區,產生硬件中斷,送到操做系統的內核空間,操做系統作一個路由判決,決定送到哪,若是ip是本身,就送到用戶空間,根據端口送到對應的應用程序,若是應用程序只是單純的收包,就結束,若是應用程序產生數據要反饋給別人,應用程序沒法調網卡,因此會把數據包送到內核,內核要再次作路由判決,分析目標究竟是誰。ssh
route -n(路由表)優化
第一列是目標ip 網站
第二列指定網關,若是指定了,直接發,沒有指定就是廣播。 ui
第三列,子網掩碼spa
第四列,ug表明指定網關,去往172.16.0.0經歷多少設備,多少跳,操作系統
第五列,端口的意思,意思是從哪一個端口發出去的。
結合路由表,收包流程:
數據包送到機器後,這個包先被分析到三層,看目標地址是否是在路由表內,若是發現是本機地址,那麼往用戶空間送,若是應用程序給反饋數據,那麼在往內核空間送,再進行一次路由判決,內核調網卡發,仍是對照路由表。
可是linux系統也能夠單純當作一個路由器來用,只是轉發,而不是放到用戶空間內,那就須要開啓路由轉發功能。今天主要講路由轉發功能。
倆種方式開啓路由轉發功能。
方式1:
echo 1 > /proc/sys/net/ipv4/ip_forward
方式2:
sysctl -w net.ipv4.ip_forward=1
這倆都是臨時開啓,若要永久生效,應該寫入配置文件。
方式3:永久開啓
vim /etc/sysctl.conf
在最後一行輸入:net.ipv4.ip_forward=1
sysctl -p 就能使配置文件馬上生效
sysctl -a | grep ip_forword 查看是否生效。
一臺linux主機能當路由器,必須知足三個條件。
1,必須開啓路由轉發功能。
2,其次它要把網關指向我,平時網關都是指向路由器,因此路由器再能給它轉發,現想讓我幫它轉發,就須要把網關指向我。
3,該linux主機必須有對應的路由轉發條目
假如主機1,ip是192/.168.12.46/24 , 主機2 ip192.168.12.42/24 這是倆是鏈接在一個交換機上,同時主機2,還有一塊網卡鏈接另外一臺交換機,ip 172.16.10.24/24 ,這時候主機1網卡,是能夠ping通,172.16.10.24/24 的,由於當數據進入內核,進行路由判決,發現目標是本身,對的上路由策略,就能夠ping通。能收包回包,一切都取決於路由策略,也就是路由表。下面詳細講解。
轉發是linux內核的功能。
6,路由分爲三種
1,主機路由,子網掩碼設置成32位,直接把範圍縮小到最小,就一個地址。(由於假如是24位子網掩碼,一個網絡裏有253個主機位,子網掩碼越大,網絡越多,主機數越少。)
route add -host 172.16.13.11/32 dev eth0
2,網絡路由,子網掩碼不足32位,所包含的地址是一個範圍,子網掩碼越大容納的範圍越小。
route add -net 172.16.11.0/24 dev eth0
3,默認路由,目標地址位0.0.0.0/0,所包含的範圍最大的
route add default dev eth0
注意:以上三個都沒有指定網關,就會廣播。若是想加上就須要在子網掩碼後面加上 gw 1.1.1.1/24 dev eht0。
指定了網關,gw,那麼意思就是經過指定的網關往外轉發,而沒有指定,就是在本身局域網內廣播。
刪除一條路由條目:
route del -host 172.16.13.11/32 dev eth0(也就是把添加的add,改爲del,刪除的時候要看刪除的路由條目的類型是什麼。)
路由的優先級,越精確優先級越高,首先對目標ip有沒有,若是好幾個都涵蓋了, 那麼看子網掩碼,子網掩碼越大,越精確。
範圍從大到小:默認路由>網絡路由>主機路由,
精確和優先度:主機路由>網絡路由>默認路由,若是主機路由(也就是32位子網掩碼的)和網絡路由(不到32位子網掩碼的)沒有對應的路由條目,那麼由默認路由兜底,也就是目標0.0.0.0/0 默認地址通常都指定了網關,不加網關也行,可是一般都搭配網關,就好比如今給百度發包,ping百度網站,能夠ping通,而路由條目裏其實根本沒有百度的ip地址,靠的就是默認路由,指定網關後,靠網關往外發數據包。
開始作實驗。
首先添加虛擬網絡,4個,子網ip和上面vmnet同樣,子網掩碼24,dhcp都是2-254
而後建立四個虛擬機,都執行這些命令,iptables -F setenforce 0 systemctl stop NetworkManager。。1號機器去掉第二塊網卡,eth0鏈接到虛擬網卡1,2號機器,1.1.1.2連到虛擬網卡1,2.2.2.2鏈接到虛擬網卡2,以此類推。
而後修改虛擬機的eth0的ip地址,ifconfig eth0 1.1.1.8,以此類推,每一個虛擬機的eth0都改爲左側地址。
而後打開xshell,打開四個窗口,分別使用ssh root@1.1.1.8連上,以此類推都連上。
首先把每一個打開的xshell窗口,輸入systemctl stop firewalld , setenforce 0 ,關閉防火牆,作項目的基礎。
而後把ip地址都改爲靜態ip地址,cd /etc/sysconfig/network-scripts/ ,vim ifcfg-eth0,修改固定ip地址爲1.1.1.8,子網掩碼24,網關刪除,dns都刪除uuid也刪除。而後執行systemctl restart network,重啓配置文件,也會重啓eth1,可是由於eth1被移除,因此報錯,這時候執行,mv ifcfg-eth1 ifcfg-eth1.bak,而後執行systemctl restart network。其餘機器也是以此類推。 注:sysetmctl status Networkanager 關閉網絡服務。
所有配置好
查看每一個虛擬機的路由表信息,route -n,會發現每配一個ip地址,路由表就以這個ip地址所在網段加一條網絡路由,用來給本身網段的進行通訊。第一臺虛擬機加一條,由於只配一個網卡,其餘都是本身加了兩個對應網段的網絡路由條目。
提需求。(看網絡拓撲)
首先虛擬機1號,ping虛擬機2號1.1.1.2,成功,說明他們能夠互通,緣由就是虛擬機1號的路由條目裏,有1.1.1.0/24,沒有指定網關,就說明沒有指定ip來作後續的轉發,那就等於從eth0出去,到交換機(虛擬網卡1)內,而後交換機廣播,虛擬機2號收到。(正常來講,先匹配目標的ip,看看都有誰涵蓋它,而後再看子網掩碼,來判斷它們的優先級,這裏只有一個因此不須要比對)
拓展:1.1.1.8和1.1.1.2是一個網段的,可是若是刪除了1.1.1.8這臺機器的1.1.1.0的路由條目,route del -net 1.1.1.0/24 ,這樣即便1.1.1.8和1.1.1.2是一個網段的,鏈接在一個交換機上,也沒法ping通。(若是把1.1.1.2這臺機器的1.1.1.0路由條目刪除掉,那麼1.1.1.8,ping1.1.1.2,包能夠出去,可是回不來了)
1.1.1.8 ping 2.2.2.2 是ping不通,由於路由條目沒有2.2.2.0/24,加上route add -net 2.2.2.0/24 dev eth0 ,這裏沒有指定別人幫它轉發,那就是廣播,而後1.1.1.8就能夠ping通2.2.2.2,緣由是2.2.2.2機器的路由條目有1.1.1.0/24,爲何有,由於設置2號主機的eth0網卡是1.1.1.2,默認就本身生成了1.1.1.0/24這個路由條目,因此只須要1.1.1.8機器添加一條2.2.2.0/24 dev eth0就能夠成功。
如今1.1.1.8能不能ping通2.2.2.3,不能,由於雖然路由條目有2.2.2.0/24可是虛擬機2號,不會幫你轉發,首先須要開啓轉發功能 echo 1 > /proc/sys/net/ipv4/ip_forward ,目前能夠送包,不能回包,那就說明虛擬機3沒有1.1.1.0/24這個路由條目,route add -net 1.1.1.0/24 dev eth0 ,而後仍是ping不通,由於虛擬機1和虛擬機3沒有直接鏈接在一個交換機上,這時候須要中間的虛擬機2來充當路由器,目前虛擬機具有路由器轉發功能的,3個其中的2個,有對應的路由條目,開啓了轉發功能,就差一個,就是沒有把虛擬機2指定成網關,先把舊的沒有指定網關的2.2.2.0/24 刪除,route del -net 2.2.2.0/24 ,而後再添加指定網關的 route add -net 2.2.2.0/24 gw 1.1.1.2 dev eth0 (這裏爲何不指定2.2.2.2,由於就像現實裏,指定網關的地址,確定是和本身在一個局域網內的,而不是網關對外的地址,這樣,網關才能幫你轉發數據。)在虛擬機3裏,也把以前的1.1.1.0/24的刪除掉,而後route add -net 1.1.1.0/24 gw 2.2.2.2 dev eth0 而後就能夠ping通了。這裏虛擬機2分別有1.1.1.0和2.2.2.0 這裏不須要設定網關,由於它不須要別人幫它轉發。若是須要,虛擬機2號也能夠指定網關。
1.1.1.8,ping3.3.3.3 ,首先在虛擬機1加上路由條目,並指定網關,route add -net 3.3.3.0/24 gw 1.1.1.2 dev eth0 而後還須要虛擬機2號擔任轉發功能的,必須有對應路由條目,route add -net 3.3.3.0/24 dev eth1,這裏不須要轉一手,就是給3.3.3.3的,因此不須要指定網關,
小總結:1.1.1.8ping通3.3.3.3,虛擬機1路由條目,須要有3.3.3.0/24 指定網關是1.1.1.2 eth0出去,而後虛擬機2須要的路由條目,3.3.3.3 不須要指定,eth1出去,保證了1.1.1.8給3.3.3.3發包的流程,而後3.3.3.3給1.1.1.8回包,虛擬機3須要有1.1.1.0/24 指定網關是2.2.2.2 eth0,虛擬機2須要有1.1.1.0 不須要指定網關,eth0
如今1.1.1.8 ping 1.1.1.2 2.2.2.2 2.2.2.3 3.3.3.3 均可以ping通。
新需求,如今須要1.1.1.8ping 3.3.3.4 虛擬機2,須要讓虛擬機3幫忙轉發一次,才能送到虛擬機4,否則只能到虛擬機3,route add -net 3.3.3.0/24 gw 2.2.2.3 dev eth1,這時候虛擬機3,被當成路由器使用,那麼首先開啓轉發功能,echo 1 > /proc/sys/net/ipv4/ip_forward,目前能夠送的包能夠到了,還須要回的包,就須要設定虛擬機4,route add -net 1.1.1.0/24 gw 3.3.3.3 dev eth0
如今就1.1.1.8 到 3.3.3.4了
如今1.1.1.8就差4.4.4.3沒有ping通,那麼首先增長路由條目,還須要指定網關進行轉發,route add -net 4.4.4.0/24 gw 1.1.1.2 dev eth0,開始沿途檢查。開始看2號虛擬機,route add -net 4.4.4.0/24 gw 2.2.2.3 dev eth1,而後看3號虛擬機,route add -net 4.4.4.0/24 dev eth1,目前來回都通了。
全通了。。。。指定路由器是怎麼一回事。
路由優化(路由表進行精簡)
route add default gw 1.1.1.2 dev eth0
就目前這個圖來講,1.1.1.0,他前面不須要別人給它轉發,而其餘的都須要被1.1.1.2的轉發,那麼這個默認路由0.0.0.0指定網關是1.1.1.2能夠匹配2.2.2.0 3.3.3.0 4.4.4.0的均可以匹配上。一條能夠代替它們。route del -net 2.2.2.0/24 等等把這是三個都刪除了。
只有網卡配置好,路由條目就會默認設置出來。本段的,沒有網關的,保證能夠訪問同網段的機器,不須要走網關了,直接在廣播域本身轉發就好了。但凡不是本機同網段的,都要進行網關轉發。
網關轉發條件,必須有網關轉發功能,必須有去往地址的路由條目,還有可能設置網關。
優化,只留下本機同網段的,其餘網關一樣的所有刪掉,而後route add default gw 1.1.1.2 dev eth0