linux处理数据过程

当向外界主机发送数据时,在它从网卡流入后需要对它做路由决策,根据其目标决定是流入本机数据还是转发给其他主机。如果是流入本机的数据,则数据会从内核空间进入用户空间(被应用程序接收、处理)。

当用户空间响应(应用程序生成新的数据包)时,响应数据包是本机产生的新数据。在响应包流出之前,需要做路由决策,根据目标决定从哪个网卡流出。

如果不是流入本机的,而是要转发给其他主机的,则必然涉及到另一个流出网卡,此时数据包必须从流入网卡完整地转发给流出网卡,这要求Linux主机能够完成这样的转发。

但Linux主机默认未开启ip_forward功能,这使得数据包无法转发而被丢弃。Linux主机和路由器不同,路由器本身就是为了转发数据包,所以路由器内部默认就能在不同网卡间转发数据包,而Linux主机默认则不能转发。

开启转发功能

临时开启

# echo 1 > /proc/sys/net/ipv4/ip_forward
或者
# sysctl -w net.ipv4.ip_forward=1

永久开启

# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf
# sysctl -p /etc/sysctl.d/ip_forward.conf
或者
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
# sysctl -p

Linux上分为3种路由:

  • 主机路由:直接指明到某台具体的主机怎么走,主机路由也就是所谓的静态路由
  • 网络路由:指明某类网络怎么走
  • 默认路由:不走主机路由的和网络路由的就走默认路由。操作系统上设置的默认路由一般也称为网关。

若Linux上到某主机有多条路由可以选择,这时候会挑选优先级高的路由。在Linux中,路由条目的优先级确定方式是先匹配掩码位长度,再比较管理距离(比如metric)。也就是说,掩码位长的路由条目优先级一定比掩码位短的优先级高,所以主机路由的优先级最高,然后是直连网络(即同网段)的路由(也算是网络路由)次之,再是网络路由,最后才是默认路由。若路由条目的掩码长度相同,则比较节点之间的管理距离,管理距离短的生效。

route

格式

route 选项 参数

选项

  • -A:设置地址类型;
  • -C:打印将Linux核心的路由缓存;
  • -v:详细信息模式;
  • -n:不执行DNS反向查找,直接显示数字形式的IP地址;
  • -e:netstat格式显示路由表;
  • -net:到一个网络的路由表;
  • -host:到一个主机的路由表。

参数

  • Add:增加指定的路由记录;
  • Del:删除指定的路由记录;
  • Target:目的网络或目的主机;
  • gw:设置默认网关,也就是指定下一跳地址,指定下一跳的地址。要求下一跳地址必须是能到达的,且一般是和本网段直连的接口。
  • mss:设置TCP的最大区块长度(MSS),单位MB;
  • window:指定通过路由表的TCP连接的TCP窗口大小;
  • dev:路由记录所表示的网络接口。

显示当前路由

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 enp0s3
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s3
输出字段说明:
Destination:目标网络或目标主机。Destination 为 default(0.0.0.0)时,表示这个是默认网关,所有数据都发到这个网关(192.168.1.1)
Gateway:网关地址,0.0.0.0 表示当前记录对应的 Destination 跟本机在同一个网段,通信时不需要经过网关
Genmask:Destination 字段的网络掩码,Destination 是主机时需要设置为 255.255.255.255,是默认路由时会设置为 0.0.0.0
Flags:
    U Up表示此路由当前为启动状态。
    H Host,表示此网关为一主机。
    G Gateway,表示此网关为一路由器。
    R Reinstate Route,使用动态路由重新初始化的路由。
    D Dynamically,此路由是动态性地写入。
    M Modified,此路由是由路由守护程序或导向器动态修改。
    ! 表示此路由当前为关闭状态。
Metric:路由距离,到达指定网络所需的中转数,是大型局域网和广域网设置所必需的 (不在Linux内核中使用。)
Ref:路由项引用次数 (不在Linux内核中使用。)
Use:此路由项被路由软件查找的次数
Iface:网卡名字

添加网络路由

# route add -net 244.0.0.0 netmask 240.0.0.0 dev enp0s3

屏蔽网络路由

# route add -net 244.0.0.0 netmask 240.0.0.0 reject

删除网络路由

# route del -net 244.0.0.0 netmask 240.0.0.0 reject

添加默认路由

# route add default gw 192.168.1.1

删除默认路由

# route del default gw 192.168.1.1

添加主机路由

# route add -host 192.168.2.100 gw 192.168.1.1

删除主机路由

# route del -host 192.168.2.100

实例

环境

主机网卡IPgw
server01enp0s3192.168.1.11192.168.1.1
server02enp0s3---enp0s8192.168.1.12---172.25.0.4192.168.1.1---172.25.0.1
server03enp0s3---enp0s8 172.25.0.5---10.0.3.15172.25.0.1---10.0.3.2

目标

server01和server02可以访问server03的10.0.3.15

路由流程:
(1)server01--enp0s3-->enp0s3--server02--enp0s8-->enp0s3--server03--enp0s8
(2)server03--enp0s3-->enp0s8--server02--enp0s3-->enp0s3--server01

初始路由表

[[email protected] ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 enp0s3
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s3

[[email protected] ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 enp0s3
0.0.0.0         172.25.0.1      0.0.0.0         UG    101    0        0 enp0s8
172.25.0.0      0.0.0.0         255.255.255.0   U     101    0        0 enp0s8
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s3

[[email protected] ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.3.2        0.0.0.0         UG    101    0        0 enp0s8
0.0.0.0         172.25.0.1      0.0.0.0         UG    102    0        0 enp0s3
10.0.3.0        0.0.0.0         255.255.255.0   U     101    0        0 enp0s8
172.25.0.0      0.0.0.0         255.255.255.0   U     102    0        0 enp0s3

配置路由

[[email protected]server01 ~]# route add -host 172.25.0.4 gw 192.168.1.12 dev enp0s3 
[[email protected]server01 ~]# route add -host 10.0.3.15 gw 192.168.1.12 dev enp0s3 

[[email protected]server02 ~]# route add -host 10.0.3.15 gw 172.25.0.5 dev enp0s8

[[email protected]server03 ~]# route add -host 192.168.1.11 gw 172.25.0.4 dev enp0s8

配置路由转发

[[email protected]server02 ~]# sysctl -w net.ipv4.ip_forward=1
因为server01到server03需要在server01中转,所以配置server02即可

查看路由表

[[email protected] ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 enp0s3
10.0.3.15       192.168.1.12    255.255.255.255 UGH   0      0        0 enp0s3
172.25.0.4      192.168.1.12    255.255.255.255 UGH   0      0        0 enp0s3
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s3

[[email protected] ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 enp0s3
0.0.0.0         172.25.0.1      0.0.0.0         UG    101    0        0 enp0s8
10.0.3.15       172.25.0.5      255.255.255.255 UGH   0      0        0 enp0s8
172.25.0.0      0.0.0.0         255.255.255.0   U     101    0        0 enp0s8
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s3

[[email protected] ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.3.2        0.0.0.0         UG    101    0        0 enp0s8
0.0.0.0         172.25.0.1      0.0.0.0         UG    102    0        0 enp0s3
10.0.3.0        0.0.0.0         255.255.255.0   U     101    0        0 enp0s8
172.25.0.0      0.0.0.0         255.255.255.0   U     102    0        0 enp0s3
192.168.1.11    172.25.0.4      255.255.255.255 UGH   0      0        0 enp0s3

验证

ping -c 1 10.0.3.15 && echo "connect success" || echo "connect fail"

静态路由永久配置

(1)/etc/rc.local文件中配置

在/etc/rc.local文件下添加相关route命令,系统重启后会自动运行,但是手动重启网络后会失效

(2)新编辑网络设备配置文件

文件名格式:/etc/sysconfig/network-script/route-网卡接口名,需要从哪个网卡出去则以其作为尾缀。重启网络不会失效。

文件格式:

192.168.1.0/24 via 192.168.1.105 dev ens33
#目标网络 via 下一跳地址 dev 网卡接口

需要注意几点:

  • route-x的对应网卡配置文件ifcfg-x必须存在,否则路由无效。(对于虚拟机,通常新添加的网卡都没有对应的ifcfg-x文件,但ifconfig却能找到该网卡)
  • 如果在文件中配置永久默认路由,则必须保证所有使用了DHCP服务的网卡配置文件ifcfg-x中的DEFROUTE指令设置为”no”,表示DHCP不设置默认路由。
  • 如果在route-x文件中配置永久路由,且该网卡使用了DHCP服务分配地址,则必须保证该网卡的ifcfg-x文件中的PEERROUTES指令设置为”no”,表示DHCP设置的路由允许被覆盖。