路由:帮你决定下一条路该往哪走。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