jinhucheung / blog

学习笔记

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Linux 学习之服务器篇 路由概念与路由器协议

jinhucheung opened this issue · comments

commented

1. 路由

路由是规划我们数据包在网络上的传输路径以及方式

1.1 路由表产生的类型

我们每台主机都有自己的路由表,我们可以使用route来查看,那设置路由表有以下方式:

  • 直接设置网络接口的路由配置文件
  • /etc/network/interfaces(Ubuntu)/etc/sysconfig/network-scripts/route-eth0(CentOS)
  • 手动或预设路由
  • 通过route来设置
  • 预设路由指的是网段的网关IP
  • 动态路由的学习
  • 通过让路由器间自主学习动态更新路由表

1.2 网卡虚拟网络接口:IP Alias的测试用途

让一个网卡虚拟出多个网络接口,其形式如eth0:0,这可以供我们设置IP参数,方便我们测试
但要注意的是实体网卡需要启动,虚拟出来网络接口才能使用

同样的,我们也可以通过建议其配置文件来开机启动该网络接口,比如/etc/sysconfig/network-scripts/ifcfg-eth0:0

1.3 重复路由的问题

这里有个问题,就是如果我用两张网卡都设置成同一个目标网域的路由,比如像下面

Destination     Gateway   Genmask         Flags Metric Ref   Use Iface
192.168.0.0     0.0.0.0   255.255.255.0   U     0      0       0 eth1
192.168.0.0     0.0.0.0   255.255.255.0   U     0      0       0 eth0

会出现什么问题?

嘿嘿,我们知道数据包查看路由表是由上到下进行的,所以说数据包如果要传送到192.168.0.0/24这个网段的数据包,其实都是通过eth1,eth0没作用

commented

2. 路由器架设

我们知道,同一个网段内主机可以通过广播来传递数据包,而不同网段内数据包的传递就需要通过路由器来转交了

2.1 什么是路由器与IP分享器

1) 什么是路由器?

上面我们了解到,路由器主要是转递数据包,它通过分享数据包IP表头,获取目标IP,通过其本身的路由表来转递,所以路由器要有两个网络接口以上.

要达成路由器功能,有以下两种方式:

  • 硬件功能 比如TP-Link等厂商生产的硬件路由器,其内嵌嵌入式操作系统,负责不同网段间的数据包转递与IP转译
  • 软件功能 比如使用Linux的内核功能就能提供上面的功能了

Linux要作为路由器,首先需要启动其数据包转递的功能(IP forward),启动方式有以下两种

  • 直接修改内存中的内核功能参数 /proc/sys/net/ipv4/ip_forward (1`为启动 0非)
  • 修改内核功能配置文件 /etc/sysctl.confnet.ipv4.ip_forward=1 之后让其立即生效 sysctl -p

然后就是修改Linux路由器的路由表了,同样分为两种方式

  • 静态路由
    通过直接设置路由配置文件或使用route来修改路由表,缺点就是对应大型网络的架设较困难,而且不易变更
  • 动态路由
    通过使用Quaggazebra来侦测网域的变化,让路由器自主更改路由表

2) 什么是IP分享器?

其实IP分享器本身就是一个路由器,在数据包转递这个功能上加入了IP转译,这也就是NAT服务器

IP转译 通过修改数据包IP表头的来源或目标IP,可以让内部的私有IP转译成公共IP,连接上Internet

所以说NAT服务器可以沟通内部网段与公共网域

3) 何时需要路由器

通常需要架设路由器,都是拥有数百台主机的大型企业内部,通常会这么考虑

  • 布线与效能考量
    • 路由器可以分隔网段,所以数据传播更有效(不可能,让随便一台主机发个包就广播给数百台主机的吧)
  • 部门独立与保护资料的考量
    • 路由器因为可以分隔网段,所以也可以在路由器里加设防火墙,隔断一些数据包
commented

2.2 静态路由架设

前面我们提到,静态路由就是我们手工设置路由表,这有以下步骤:

  1. 规划网段以及路由
  • 规划好网段以及相应路由/主机等
  • 注意:网络传输是双向的,所以路由传递数据包也要双向
  • 比如,192.168.1.0这个网段的数据包,route B会传给route A
  • 192.168.100.0由route A 也传给route B
  • 总之多考虑下
  1. 设置各主机/路由的IP参数以及路由表
  • IP参数直接修改网络接口配置文件
  • 路由表也修改配置文件
  • 主机们就将默认网关设到其直接到达的路由器上
  • 路由器要设置2个以上的网络接口
  1. 路由器启动数据包转递功能
  • 修改/etc/sysctl.conf配置文件,具体查看上2.1部分
  • sysctl -p重新加载内核参数
  1. 重启网络服务,并进行测试连通性
  • service network restart 重启网络服务
  • 通过ping来测试各主机的连通

具体例子,请查看鸟哥私房菜的静态路由部分

commented

2.3 动态路由架设:quagga(zebar+ripd)

静态路由设置上较麻烦,而且需要重新规划时十分痛苦,聪明的人类想到让路由器自己学习路由表的方法(算法),然后就有了动态路由

动态路由架设过程:

1)路由器们要安装quagga软件包

  • quagga 提供了很多动态路由协议,比如RIPv2/OSPF/BGP等,这些协议放置在/etc/quagga/
  • zebra quagga提供的软件,其为daemon,用于更新主机的路由表(插入/删除路由规则)
  • ripd quagga提供的软件,其为daemon,用于向附近的路由器交流路由规则与传送

2)设置所有主机/路由器的网络参数

这个没得说的,注意路由器要启动数据包转递

3)路由器们设置zebra

修改路由器上的zebra配置文件/etc/quagga/zebra.conf,比如下面

hostname www.centos.vbird           <==给予这路由器一个主机名称,随便取!
password linuxz1                    <==给予一个密码!
enable password linuxz1             <==将这个密码生效!
log file /var/log/quagga/zebra.log  <==保存zebar的信息至日志文件

之后重启zebra以及设置开机启动zebra

最后就可以netstat -ntulp | grep zebra查看zebra端口,通过telnet连接测试

注意:zebra也可以设置/查看路由表,通过telnet连接上服务即可进行

3)路由器们设置ripd

首先还是要修改ripd配置文件/etc/quagga/ripd.conf,如下

hostname www.centos.vbird           <==这里设置router主机名
password linuxz1                    <==设置好密码
debug rip events                    <==可以记录较多的错误信息
debug rip packet                    <==通过信息来解决问题
router rip                          <==启动router 的 rip 功能
 version 2                          <==启动RIPv2 的服务 (预设值)
 network 192.168.1.0/24             <==路由器所管理的两个接口
 network 192.168.100.0/24
interface eth0                      <==针对对外接口设置略过身份验证的方式
 no ip rip authentication mode      <==不要验证身份!
log file /var/log/quagga/zebra.log  <==记录日志信息

之后重启guagga以及设置开机启动guagga

最后就是查看路由表啦!!! route或者连接上zebra

commented

2.4 路由器连接同个网段:ARP Proxy

如果我们要强行对同一个网段的主机进行划分出子网(在不改动IP参数等前提下),我们应该怎么做?
我们知道路由器是可以沟通不同网段上的主机,如果让它来分隔同个网段的主机要怎么做?

这就是ARP Proxy,我对其的理解是:

  • 让路由器的网卡MAC伪装成某些主机的MAC,让路由器强行接收发给主机们的数据包(比如路由器上有条规则:对与192.168.1.1主机的数据包都发到我eth0上吧,我会处理的)
  • 然后再通过路由器的数据包转递给主机

我们可以通过arproute实现,具体请看鸟哥关于ARP Proxy部分