二十五、网卡丢包与数据管理
今日内容:
1、ifconfig查询结果解析
2、解决网卡丢包问题
3、路由管理
了解:
1、什么是交换
指网络访问, 几台计算机连在同一个交换机上, 配置同一个网段的不同 IP ;
2、什么是路由
指的是跨网络访问的路径选择;
一、Linux数据包处理过程
当外界数据从网卡流入后,需要对它进行路由决策;
根据其目标决定流入本机空间,还是在内核空间直接转发给其他主机
情况1:如果是流入本机空间的数据:
则该数据会从内核空间进入到用户空间,接着被应用程序接受、处理
1>此时若本机用户空间的应用程序不需要产生新的数据,那边不涉及从某个网卡流出数据;
2>若本机空间的应用程序需要产生新的数据包对外发送,那就需要从某个网卡流出数据;
3>在流出之前,则要做路由决策:根据目标决定从哪个网卡里流出;
情况二:如果仅仅是经过本机穿法数据包:
则必然涉及到从某个网卡流出,此时数据包必须从流入网卡完整地转发给流出网卡;
但Linux主机默认未开启ip_forward转发功能,这使得数据包无法转发而被丢弃;
一台Linux主机能被当成路由器用,有三大前提:
1、至少有两块网卡,分别连接两个不同的网段;
2、开启路由转发功能;
临时开启
echo 1 > /proc/sys/net/ipv4/ip_forward 方式1
sysctl -w net.ipv4.ip_forward=1 方式2
永久开启
Centos6:
vim /etc/sysctl.conf文件,net.ipv4.ip_forward=1
Centos7:
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/ip_ward.conf
查看是否开启:
sysctl net.ipv4.ip_forward
sysctl -a |grep ip_forward
cat /proc/sys/net/ipv4/ip_ward
如果Linux主机有多块网卡,若不开启数据包转发功能,那么这些网卡之间是无法互通的!
未开启转发功能可ping通的:
IP地址是属于内核的(不仅如此,整个tcp/ip协议栈都属于内核,包括端口号);
只要能和其中一个地址通信,就能和另一个地址通信,而不需要开启数据包转发功能;
3、在该Linux主机上添加正确的路由规则/策略;
网关概念:把包交给它,他会帮你往外转发;
路由概念:到达地址后,该走哪条路;
route命令
选项
-n 查看当前路由的路由表
add / del | 添加或删除路由条目 |
---|---|
-host | 主机路由 |
-net | 网络路由 |
default | 默认路由 |
gw | 指定下一跳 |
dev | 强制将路由条目关联到指定接口, 一般内核会自动判断 |
netmask | 明确使用关键字指定掩码,可不用此选项,直接IP/MASK |
Flags 列所代表的的含义
U | (route is up)开启 |
---|---|
H | (target is a host) 是一个主机路由 |
G | (user gateway) 设置了下一跳 |
4、添加和删除
添加例:
route add -host 192.168.181.8/32 dev eth0 #添加添加主机路由
route add -net 网段/24(小于32即可) dev 网卡 #添加网络路由
route add -host 0.0.0.0/0(0代表所有网段) #添加默认路由/网关
删除例:将add改为del即可
route del default #删除网关
route del -host ip/网关 #删除主机路由
PS:若有多条默认路由, 后面加上"gw"地址就可以唯一删除指定条目
若不知道下一跳给谁,那么指定本机接口也是可以的:
route add -net 172.16.10.0/24 dev eth0
大多数时候可以偷懒,前提是你知道删除的是那条路由:
route del -net 172.16.10.0/24
二、网关、路由
1、Linux上分为三种路由:
主机路由:掩码32位,目标精确到某一台主机;
所以主机路由是直接指明到某台具体的主机怎么走,主机路由也就是所谓的静态路由
网络路由:掩码小于32位,目标精确到某一个网段的主机;
所以网络路由指明到某类网络怎么走
默认路由:掩码通常为0;
不步走主机路由、网络路由的,全都走默认路由,操作系统上设置的默认路由一般也称为网关
2、路由的优先级区分
若Linux上到某台主机有多条路由可以选择,这时候就会挑选优先级高的路由;
前提:主机范围越小、越精细、优先级越高,而缩小主机范围的恰恰是子网掩码,掩码越长,即范围就越小、越精准、优先级越高!
优先级区分:
1、在Linux中,路由条目的优先级确定方式是,先匹配掩码位的长度,掩码越长,优先级就越高,则优先级从高到低为:
主机路由>>>同网段的网络路由>>>网络路由>>>默认路由(即网关)
echo 1 > /proc/sys/net/ipv4/icpm_echo_ignore_all #禁止别人ping自己
Ethernet eth0 9000
2、若路由长度的掩码长度相通,则比较节点之间的距离,管理距离短的生效;
三、配置永久路由
1、根据接口创建路由配置文件:
vim /etc/sysconfig/network-scripts/ifcfg-ethX #X为哪个网卡文件
2、配置格式
每行一个路由条目,先是要到达的目标,然后是via关键字,最后是下一跳地址,要求下一跳必须能到达,且一般都和eyhX同网段!
目标IP via 下一跳IP
10.0.0.0 via 192/168.10.222
3、配置举例
例如主机路由、默认路由、网段路由示例如下。其中dev是可以省略的,因为没有任何用处,配置在哪个eth文件中就会从哪个接口出去:
默认路由:
default via 192.168.100.1
0.0.0.0/0 via 192.168.100.1
网络路由:
192.168.10.0/24 via 192.168.100.1
主机路由:
192.168.100.52/32 via 192/168.100.33 dev eth0
配置完后,重启network服务即可生效
4、配置永久路由注意三点
1、route-ethX的对应网卡配置文建ifcfg-ethX必须存在,否则路由无效!
#PS:对于虚拟机,通常新添加的网卡都没有对应的ifcfg-ethX文件,但ifcfg却能找到该网卡;
2、如果在文件中配置永久默认路由,则必须保证所有使用了dhcp服务的网卡配置文件ifcfg-ethX中的defroute指令设置为no,表示dhcp不设置默认路由!
3、如果在route-ethX文件中配置永久路由,并且该网卡使用了dhcp服务分来配地址,也需要同第二条一样,把defroute值设为0,表示dhcp设置的路由允许被覆盖!
四、练习
为了排除外界网络环境的干扰,就选用仅主机模式,自己跟自己玩:
1、首先创建仅主机模式的四个交互机:
vmnet1 vmnet2 vmnet3 vmnet4
打开虚拟网络编辑器,进行以下配置,保存之后重启虚拟机;
2、精简网卡配置文件
当前实验环境下,网卡精简后的配置文件:
TYPE=Ethernet
BOOT=static
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=2.2.2.2(自定)
PREFIX=24(也可为:NETMASK=255.255.255.255)
3、通过上图总结网卡交互依赖过程:
格式:
目标IP via(通过谁) 网关(通过谁谁就是网关,且是唯一一个) dev(出口) eth0(出口网卡名)
简化原则:当前只是临时生效,简化后禁止重启网卡,不然会恢复!
1>via(网关)和dev(eth端口)一致,删除一致的行,再进行添加即可
删除命令:route del -net 2.2.2.0/24 #逐个删除,删除所有重复的行
添加命令:route add default gw 1.1.1.2 #添加同名的网关,只加一次即可
2>0.0.0.0代表所有网段
永久生效:
修改对应的route-ethX配置文件,重启网络服务即可
vim /etc/sysconfig/network-scripts/route-ethX
#删除重复via(网关)与eth(端口,看配置文件名)的行
#添加0.0.0.0 via 0.0.0.0 dev ethX
systemctl restart network
修改完配置文件后,跨虚拟机交互,需要开启路由转发功能,每台机器都执行一遍以下命令:
echo 1 > /proc/sys/net/ipv4/ip_forward 开启路由转发,最后执行
setenforce 0
iptables -F