Linux系统的route命令用于显示和操作IP路由表(show / manipulate the IP routing table)。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的IP地址设置为Linux机器的默认路由。要注意的是,直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了;可以在/etc/rc.local中添加route命令来保证该路由设置永久有效。

CentOS7,Ubnutu16.04,Debian9,openSUSE15等以后版本系统已经默认不再集成这个命令,需要安装相应的软件net-tools

默认网关就是数据包不匹配任何设定的路由规则,最后流经的地址关口!网关按字面意思就是网络的关口,就相当于我们家里房子的门一样,如果外出就要经过房门,数据包也是一样。

概念:

网关:大家都知道,从一个房间走到另一个房间,必然要经过一扇门。同样,从一个网络向另一个网络发送信息,也必须经过一道“关口”,这道关口就是网关。顾名思义,网关(Gateway)就是一个网络连接到另一个网络的“关口”。也就是网络关卡。 由于历史的原因,许多有关TCP/IP的文献曾经把网络层使用的路由器称为网关,在今天很多局域网采用都是路由来接入网络,因此通常指的网关就是路由器的一个接口的IP地址!需要这个路由器进行转发的主机就需要与这个接口相连,同时相连的两个接口需要配置成同一网段的iP地址,也就是可以二层互通。一个路由器可以有多个接口因此可以给多个主机提供网关。

路由:是指路由器从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个接口的过程。路由通常与桥接来对比,在粗心的人看来,它们似乎完成的是同样的事。它们的主要区别在于桥接发生在OSI参考模型的第二层(数据链路层),而路由发生在第三层(网络层)。这一区别使二者在传递信息的过程中使用不同的信息,从而以不同的方式来完成其任务。

默认网关就是数据包不匹配任何设定的路由规则,最后流经的地址关口!注意,一台主机只能有一个默认网关。

一、命令格式格式如下:

route [查看参数]

route add [-net|-host] [网域或主机] netmask [mask] [gw|dev]

route del [-net|-host] [网域或主机] netmask [mask] [gw|dev]

查看参数:

-n      :以数字的方式显示路由表中的主机

-e     :使用netstat的输出格式显示路由表

-ee         :显示路由表的所有参数

增加 (add) 与删除 (del) 路由的相关参数:

-net      :表示后面接的路由为一个网段;

-host      :表示后面接的为连接到单台主机的路由;

netmask     :与网段有关,可以设定 netmask 决定网段的大小;

gw           :gateway 的简写,后续接的是 IP 的数值喔,与 dev 不同;

dev      :如果只是要指定由那一块网路卡连线出去,则使用这个设定,后面接 eth0 等

二、举例:

1、查看主机路由信息

-------------------------------------------------------------------------------------

[root@CentOS ~]# route

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

192.168.1.0 * 255.255.255.0 U 0 0 0 eth0

10.10.10.0 * 255.255.255.0 U 0 0 0 eth1

link-local * 255.255.0.0 U 1002 0 0 eth0

link-local * 255.255.0.0 U 1003 0 0 eth1

default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0

[root@CentOS ~]# route -n    #以数字的形式显示

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

192.168.1.0 255.255.255.0 U 0 0 0 eth0

10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1

169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0

169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1

0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0

[root@CentOS ~]# route -ee

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface MSS Window irtt

192.168.1.0 * 255.255.255.0 U 0 0 0 eth0 0 0 0

10.10.10.0 * 255.255.255.0 U 0 0 0 eth1 0 0 0

link-local * 255.255.0.0 U 1002 0 0 eth0 0 0 0

link-local * 255.255.0.0 U 1003 0 0 eth1 0 0 0

default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0 0 0 0

[root@CentOS ~]#

-------------------------------------------------------------------------------------

上面的每一行就是一条路由信息,路由信息也被称为一个路由项或一个路由条目,数据包的转发就是由这些路由条目决定的,下面对每一行的名称进行解释:

Destination    #目标网络或目标主机,0.0.0.0表示默认网关

Gateway     #网关地址,’*’表示没有设置,如果显示为0.0.0.0(-n选项的显示)表示该路由是直连路由,所谓直连路由就是指该路由对应的接口就在这个网络中,可以直接与这个网络中的设备进行二次互通

Genmask      #目标网络的网络掩码(也被称作子网掩码)

Flags

可能的flag值有

U,路由已经起来

H,目标是一台主机,而非一个网段

G,使用网关

R,用于动态路由的恢复路由

D,由守护进程动态安装或重定向

M,从路由守护进程或重定向中修改

A,由addrconf安装

C,缓存项

!,拒绝路由

Metric      #到目标的“距离”(通常以跳为单位)。它不被最近的内核使用,但可能需要路由守护进程。

Ref        #引用此路由的次数。(不在Linux内核中使用。)

Use      #查找路线的数量。根据-F和-C的使用情况,这将是路由缓存丢失(-F)或命中(-C)。

Iface          #此路由的数据包将从该接口发送出去。

MSS        #此路由上TCP连接的默认最大分段大小

Window    #此路由上TCP连接的默认窗口大小

irtt       #初始RTT(往返时间)。内核使用它来猜测最佳的TCP协议参数,而无需等待(可能是缓慢的)答案。

HH      #引用缓存路由的硬件头缓存的ARP条目和缓存路由的数量。如果缓存路由的接口不需要硬件地址(例如lo),则为-1。

Arp      #缓存路由的硬件地址是否最新。

2、设置默认网关(如果已经存在默认网关就不要添加了)

------------------------------------------------------

route add default gw 192.168.0.1

------------------------------------------------------

表示设置默认路由,通过eth0网卡,将数据包发送给192.168.0.1那台路由器

3、添加到指定网络的路由规则(两种方式)

------------------------------------------------------

route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0

------------------------------------------------------

这条路由的意思是访问192.56.76.0的网段(子网掩码255.255.255.0),数据包从"eth0"这个接口出去

------------------------------------------------------

route add -net 192.56.76.0 netmask 255.255.255.0 gw 192.168.1.1

------------------------------------------------------

这条路由的意思是访问192.56.76.0的网段(子网掩码255.255.255.0),数据包从这个网关出去,这个网关就是与主机相连的对端路由器接口的IP地址

其实上面的两种作用是相同的,因为路由器与eth0连接的接口的IP地址就是192.168.1.1,也就是eth0的IP地址与路由器的接口直接连接在同一个网段,这个必须条件

如果你的数据包都不能通过二层到达路由器,路由器怎么帮你转发。这俩条的最终目的是一样的要去往192.56.76.0网段,就得先找到去这个网段的路由器,到了以后路由器再帮我转发。

4、设置到指定网络为不可达,避免在连接到这个网络的地址时程序过长时间的等待,直接就知道该网络不可达

------------------------------------------------------

route add -net 10.10.0.0 netmask 255.255.0.0 reject

------------------------------------------------------

5、删除指定网络的路由

------------------------------------------------------

route del -net 192.56.76.0 netmask 255.255.255.0 gw 192.168.1.1

------------------------------------------------------

如果路由条目里面有Gateway设置就用上面的命令,没有就用下面这个,下面的也可以删除带Gateway的只是这个网段如果有多个路由信息s时就会从上往下顺序删除,不精确。

------------------------------------------------------

route del -net 192.56.76.0 netmask 255.255.255.0 dev eth0

------------------------------------------------------

上面这个动作可以删除掉 1192.56.76.0/24 这个网段!请注意,在删除的时候,需要将路由表上面出现的参数都写上,包括netmask , dev 等等参数喔!注意注意

6、删除默认网关

------------------------------------------------------

route del default gw 192.168.0.1

------------------------------------------------------

三、设置永久路由的方法(CentOS系统下,没有验证):

1.在/etc/rc.local里添加

------------------------------------------------------

route add -net 192.168.3.0/24 dev eth0


route add -net 192.168.2.0/24 gw 192.168.2.254

------------------------------------------------------

2.在/etc/sysconfig/network里添加到末尾

------------------------------------------------------

GATEWAY=gw-ip

或者

GATEWAY=gw-dev

3./etc/sysconfig/static-routes     :#默认不存在此文件

------------------------------------------------------

any net 192.168.3.0/24 gw 192.168.3.254


any net 10.250.228.128 netmask 255.255.255.192 gw 10.250.228.129

------------------------------------------------------

如果在rc.local中添加路由会造成NFS无法自动挂载问题,所以使用static-routes的方法是最好的。无论重启系统和service network restart 都会生效。

解决NFS问题的描述:按照linux启动的顺序,rc.local里面的内容是在linux所有服务都启动完毕,最后才被执行的,也就是说,这里面的内容是在netfs之后才被执行的,那也就是说在netfs启动的时候,服务器上的静态路由是没有被添加的,所以netfs挂载不能成功。

4、在/etc/sysconfig/network-script/route-interface下添加路由(每个接口一个文件,如果没有就创建一个,只能添加针对该接口的路由)

格式如下:

------------------------------------------------------

network/prefix via gateway dev intf

------------------------------------------------------

例如给eth0添加一个默认网关:

------------------------------------------------------

vim /etc/sysconfig/network-scripts/route-eth0

------------------------------------------------------

#添加如下内容(可以省略dev eth0)

------------------------------------------------------

0.0.0.0/0 via 172.16.10.2 dev eth0

------------------------------------------------------

ps:注意这里的掩码是0而不是32,因为这里是网段而不是路由。

保存退出后,service network restart。