linux day26(路由实验)

路由:帮你决定下一条路该往哪走。

如果只是在局域网里发,需要经过交换机,想要往外发,需要经过路由器。

linux内核都集成了路由功能,所以可以做成一个路由器来使用。当它只是一个linux系统的时候,它会发包,收包,但是不能转发包。现在要让它可以转发包。

 

 操作系统内核占用的空间就是Kernel space空间(内核空间),应用软件占用的空间就是user space空间(用户空间)。

包先走到网卡,crc没问题,送到网卡缓冲区,产生硬件中断,送到操作系统的内核空间,操作系统做一个路由判决,决定送到哪,如果ip是自己,就送到用户空间,根据端口送到对应的应用程序,如果应用程序只是单纯的收包,就结束,如果应用程序产生数据要反馈给别人,应用程序无法调网卡,所以会把数据包送到内核,内核要再次做路由判决,分析目标到底是谁。

 

 

route -n(路由表)

 

 第一列是目标ip     

第二列指定网关,如果指定了,直接发,没有指定就是广播。 

第三列,子网掩码

第四列,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

 

posted @ 2021-04-08 22:02  sagelasi  阅读(212)  评论(0编辑  收藏  举报