内容目录

网络基本概述

为何需要网络

  • 假设没有网络:(也就是将所有的计算机网络都关闭)
    • 如果我的计算机上有非常不错的电影,想要进行传输,就比较费劲了
    • 因为我们可能处在不同的城市、或者不同的国家
  • 但如果有了网络:(也就是将所有计算机通过网线连接在一起)
    • 打破了地域上数据传输的限制
    • 提高信息之间的传输效率,以便更好的实现资源的共享

什么是网络

  • 网络是由若干节点连接这些节点的链路构成,表示诸多对象及其相互联系。
  • 网络是信息传输、接收、共享的虚拟平台,通过它把各个信息联系到一起,从而实现这些资源的共享
  • 网络将节点连接在一起,需要实现信息传输(信息通信)有几个大前提:
    • 使用物理连接的介质将所有计算机连接在一起(网卡、网线、交换机、路由器)
    • 双方在通信过程中,必须使用统一的通信标准,也就是通信协议(互联网通信协议)

互联网通讯协议

  • 协议其实就是规定了一堆标准,用来定义计算机如何接入internet以及接入internet的计算机通信的标准;所有计算机都需要学习此标准、遵循此标准来进行信息传输(信息通信)
  • 国际标准化组织:推出了OSI七层参考模型,将互联网通讯协议分成了不同的层,每一层都有专门的标准,以及组织数据的格式
    • (应、表、会、传、网、数、物)
  • 对于写程序来说,通常会将七层归纳为五层协议:
    • (应、传、网、数据、物)

物理层

物理层:定义物理设备的标准,如网卡网线,传输速率;最终实现数据转成电信号传输;
问题:如果只是单纯发送电信号是没有意义的,因为没有规定开头也没有规定结尾;要想变得由意义就必须对电信号进行分组;比如:xx位为一组这样的方式去传输,这就需要数据链路层来完成了

数据链路层

  • 数据链路层定义:定义了电信号的分组的标准方式,一组数据称之为一个数据帧,这个标准遵循ethernet以太网协议,以太网规定了如下几件事:
  • 1.数据帧分为headdata两部分组成;其中head长度固定14字节;另有4字节的尾部
    • head:发送者源mac地址、接收者目的mac地址(源地址6字节、目标地址6字节、数据类型2字节)
    • data:主要存放网络层整体的数据,最长1500字节,超过最大限制就由网络层分片发送
  • 2.但凡接入互联网的主机必须有一块网卡,网卡烧制了全世界唯一的mac地址
  • 3.有了以太网协议以后,它能对数据分组,也可以区分数据的意义,还能找到目标主机的地址,就可以实现计算机通信;但是计算机以及集线器是瞎的,所以以太网通信采用的是广播方式
  • 那什么是广播:
    • 假设我们都在一个小黑屋里面,大家互相通信靠吼,假设aabb买包烟
      1.数据:买烟(类型:干粮)
      2.源地址:aa
      3.目标地址:bb
    • 此时屋子里所有人都收到了该数据包,但只有bb会接收执行,其他人收到后会丢弃
  • 如果我们将全世界的计算机都接入在一起,理论上是不是就可以实现全世界通信
    • 首先:无法将全世界的计算机放在一个交换机上,因为没有这样的设备
    • 其次:就是放在同一设备上,每台计算机都广播以下,那设备也无法正常工作
    • 所以:我们应该将主机划区域,隔离在一个又一个的区域中,然后将多个区域通过网关/路由连接在一起。

网络层

  • 网络层定义:用来划分广播域,如果广播域内主机要往广播域外的主机发送数据,一定要有一个“网关/路由”帮其将数据转发到外部计算机;网关和外界通信走的是路由协议。网络层协议规定了如下几件事:
    • 规定1:数据包分成:headdata两部分组成
      head:发送者/源地址、接收者/目标地址,该地址为IP地址
      data:主要存放传输层整体的数据
    • 规定2:IP地址来划分广播域,主要用来判断两台主机是否在同一广播域中
      一个合法的IPv4地址=ip地址/子网掩码
      如果计算出两台地址的广播域一样,说明两台计算机处在同一个区域中
  • 计算两台计算机是否在同一局域网(决定了数据如何发送):
    • 如果它们处于同一网络(局域网)10.0.0.1-->10.0.0.100
      1.本地电脑根据数据包检查目标ip如果为本地局域网
      2.直接通过交换机广播mac寻址,将数据包转发出去
    • 如果它们处于不同网络(跨局域网)10.0.0.1-->39.104.16.126
      1.本地根据数据包检查目标ip如果不为本地局域网,则尝试获取网关的mac地址
      2.本地封装数据转发给交换机,交换机拆解发现目标mac是网关,则送往网关设备
      3.网关收到数据包后,拆解至二层发现请求目标mac是网关本机mac
      4.网关则会继续拆解数据包到三层,发现目标地址不为网关本机
      5.网关会重新封装数据包,将源地址替换为网关的wan地址(源nat),目标地址不变
      6.出口路由器根据自身路由表信息将数据包发送出去,直到送到目标的网关
      (应该是先路由在进行源nat

传输层

  • 传输层的由来:网络层帮我们区分子网和找到主机,数据链路层帮我们找到链路,但一个主机有多个进程,进程之间进行不同的网络通信,那么当收到数据时,如何区分数据是哪个进程的呢;其实是通过端口来区分,端口即应用程序与网卡关联的编号
  • 传输层的定义:提供进程之间的逻辑通信
  • 传输层也分成:headdata两部分组成
    • head:源端口、目标端口、协议(tcp、udp
    • data:主要存放的是应用层整体的数据

file

应用层

  • 应用层定义:为终端应用提供的服务,如我们的浏览器交互时候需要用到的http协议,邮件发送的snmtp,文件传输的ftp等。

TCP协议

  • tcp可靠数据传输协议,为了实现可靠传输,在通信之前需要先建立连接,也叫双向通路,就是说客户端与服务端要建立连接,服务端与客户端也需要建立连接,当然建立的这个双向通路它只是一个虚拟的链路,不是用网线将两个设备真实的捆绑在一起
  • 虚拟链路的作用:由于每次通信都需要拿到ipport,那就意味着每次都需要查找,建立好虚拟通路,下次两台主机之间就可以直接传递数据

三次握手

  • 第一次:客户端要与服务端建立连接,需要发送请求连接信息
  • 第二次:服务端接收到数据后,返回一个确认操作(至此客户端到服务端链路建立成功)
  • 第三次:服务端还需要发送要与客户端建立连接的请求
  • 第四次:客户端接收到数据后,返回一个确认的操作(至此服务端到客户端的链路建立成功)
  • 由于建立连接时没有数据传输,所以第二次确认和第三次请求可以合并为一次发送

file

  • tcp协议为了实现可靠传输,通信双方需要判断自己已经发送的数据包是否都被接收方收到,如果没收到,就需要重发。为了实现这个需求,就引出序号(seq)和确认号(ack)的使用
  • 举例:发送方在发送数据包时,序列号(假设为123),那么接收方收到这个数据包以后,就可以回复一个确认号(123=123+1)告诉发送方我已经收到了你的数据包,你可以发送下一个数据包,序号从124开始,这样发送方就可以知道哪些数据被收到,哪些数据没被接收到,需要重发

file

四次挥手

  • 第一次挥手:客户端(服务端也可以主动断开)项服务端说明想要关闭连接
  • 第二次挥手:服务端会回复确认。但不是立马关闭,因为此时服务端可能还有数据在传输中
  • 第三次挥手:待到服务端数据传输都结束后,服务端向客户端发出消息,我要断开连接了
  • 第四次挥手:客户端收到服务端的断开信息后,给予确认。服务端收到确认后正式关闭

file

转换状态

  • 三次握手状态转换:
  • 1.客户端发送syn包向服务端请求建立tcp连接,客户端进入syn_send状态
  • 2.服务端收到请求之后,向客户端发送syn+ack,同时自身进入syn_recv状态
  • 3.客户端收到回复之后,发送ack信息,自身进入established状态
  • 4.服务端收到ack数据之后进入established状态

file

  • 四次挥手状态转换
  • 1.客户端发送完数据之后,向服务器请求断开连接,自身进入fin_wait_1状态
  • 2.服务端收到fin包之后,回复ack包表示已经收到,但此时服务端可能还有数据没发送完成,自身进入close_wait状态``
  • 3.服务端数据发送完成后,发送fin包给客户端,自身进入last_ack状态,等待客户端ack确认
  • 4.客户端收到fin包之后,回复一个ack包,并进入time_wait状态
  • 注意:time_wait状态比较特殊,当客户端收到服务端的fin包时,理想状态下,是可以直接关闭连接了,但是有几个问题
    • 问题1:网络是不稳定的,可能服务端发送的一些数据包,比服务端发送的fin包还晚到
    • 问题2:如果客户端回复的ack包丢失了,服务端就会一直处于last_ack状态,如果客户端没有关闭,那么服务端还会重传fin包,然后客户端继续确认
  • 所以客户端如果ack后立即关闭连接,会导致数据不完整、也可能造成服务端无法释放连接。所以此时客户端需要等待2个报文生存最大时长,确保网络中没有任何遗留报文了,再关闭连接
  • 如果机器time_wait过多,会造成端口耗尽,可以修改内核参数tcp_tw_reuse=1端口重用

file

  • 为什么必须要等待2msl?而不是4msl8msl
  • 一个msl就是报文在网络中的最长生存时间,就是如果存在丢包的话,在msl时间内也会触发重传了,这里2msl,就相当于两次丢包,一次丢包概率是百分之一,连续两次丢包的概率是万分之一,这个概率实在是太小了,所以2msl是足够的。

UDP协议

  • udp是不可靠传输协议,不可靠指的是传输数据时的不可靠
  • udp协议不需要先建立连接,只需要获取服务端的ip+port,发送完毕也无需服务器返回ack
  • udp协议如果在发送数据的过程中丢了数据,那就丢了

网络配置

查询网络信息

ifconfig # configure a network interface
1.使用ifconfig查看当前处于活动状态的网络接口

yum install net-tools
ifconfig
# 仅查看eth0网卡状态信息
ifconfig eth0
# -a display all interfaces which are currently available, even if down
# up:网卡处于活动状态 broadcast:支持广播 running:网线已接入
# multicast:支持组播 mtu:最大传输单元(字节),接口一次所能传输的最大包
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
# inet:显示ipv4地址行
inet blue.yn.cn  netmask 255.255.255.0  broadcast 192.168.99.255
# inet6:显示ipv6地址行
inet6 fe80::924a:3417:af7c:2b9  prefixlen 64  scopeid 0x20<link>
# ether:硬件(mac)地址 txqueuelen:传输缓存区长度大小
ether fa:26:21:09:6d:00  txqueuelen 1000  (Ethernet)
# rx packets:接收到的数据包
RX packets 10811518  bytes 1473811918 (1.3 GiB)
RX errors 0  dropped 0  overruns 0  frame 0
# tx packets:发送的数据包
TX packets 10225204  bytes 2056844673 (1.9 GiB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# errors:总的收包的错误数量
# dropped:拷贝中发生错误被丢弃
# collisions:网络信号冲突情况,值不为0则可能存在网络故障
# overruns:表示这个数据包还没有进入到网卡的接收缓存fifo队列就被丢掉

2.使用ip命令查看当前地址
ip addr # show / manipulate routing, devices, policy routing and tunnels

ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,①UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    ②link/ether fa:26:21:09:6d:00 brd ff:ff:ff:ff:ff:ff
    ③inet blue.yn.cn/24 ④brd 192.168.99.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    ⑤inet6 fe80::924a:3417:af7c:2b9/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
# ①:活动接口为up
# ②:link行设备的mac地址
# ③:inet行显示ipv4地址和掩码
# ④:广播地址、作用域和设备名称
# ⑤:inet6行显示ipv6信息

3.使用ip -s link show eht0命令查看网络性能的统计信息,比如:发送和传送的数据包、错包、丢弃
-s,--stats,--statistics

ip -s link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether fa:26:21:09:6d:00 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    1474771520 10823433 0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    2057715541 10236633 0       0       0       0

修改网卡名称

  • centos6网卡名称是eth0、eth1...
  • centos7网卡名称是ens32、ens33...
  • 由于这种无规则的命名方式给后期维护带来了困难,所以需要将网卡名称修改为eth0、eth1...

场景示例1:已经安装完操作系统,修改网卡命名规则为eth0 eth1
1.修改网卡配置文件

cd /etc/sysconfig/network-scripts/
mv ifcfg-ens32 ifcfg-eth0
vim ifcfg-eth0
NAME=eth0
DEVICE=eth0

2.修改内核启动参数,禁用预测命名规则方案,将net.ifnames=0 biosdevname=0参数关闭

vim /etc/sysconfig/grub
GRUB_CMDLINE_LINUX=" net.ifname=0 biosdevname=0 quiet"
grub2-mkconfig -o /boot/grub2/grub.cfg

3.重启系统,然后检查网卡名称是否修改成功

reboot
ifconfig

场景示例2:在新安装系统时,修改网卡名称规则
1.在安装系统选择install centos7安下tab设定kernel参数
file

2.增加内核参数:net.ifnames=0 biosdevname=0
file

3.检查是否修改成功,成功后可继续安装系统
file

配置网络地址

  • Centos7系统默认采用networkmanager来提供网络服务,这是一种动态管理网络配置的守护进程,能够让网络设备保持连接。networkmanager提供的命令行和图像配置工具对网络进行设定,设备保存的配置文件在/etc/sysconfig/network-scrips目录下,工具有nmcli
  • networkmanager有如下两个概念需要了解:
    • device物理设备,例如:
    • connection连接设置,具体网络配置方案
    • 一个物理设备device可以有多套逻辑连接配置,但同一时刻只能使用一个connection连接配置
nmcli查看网络状态

nmcli # command-line tool for controlling NetworkManager

1.使用nmcli device命令查看设备情况

# 查看所有设备
nmcli device
DEVICE  TYPE      STATE      CONNECTION
eth0    ethernet  connected  eth0
lo      loopback  unmanaged  --

# 指定查看某个设备的详细状态
nmcli dev show eth0

2.使用nmcli connection命令查看连接状态

# 查看连接状态
nmcli connection
NAME  UUID                                  TYPE      DEVICE
eth0  f5b65db0-2443-4660-a1ed-f6a07618d261  ethernet  eth0
# 查看所有活动连接的状态
nmcli connection show --active
# 查看指定连接状态
nmcli connection show eth0
nmcli配置IP地址
  • 使用nmcli创建一个static的连接,配置IP、掩码、网关等
    • 1.添加一个连接配置,并指定连接配置名称
    • 2.将连接配置绑定物理网卡设备
    • 3.配置网卡的类型,网卡是否开机启动
    • 4.网卡使用什么模式配置IP地址(静态、DHCP
    • 5.配置网卡的IP地址、掩码、网关、DNS等等
nmcli connection add con-name eth0-static ifname eth0 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.10/24 ipv4.gateway 192.168.99.1 ipv4.dns 223.5.5.5 +ipv4.dns 8.8.8.8
# 激活eth0-static的连接
nmcli connection up eth0-static
nmcli connection show --active
NAME         UUID                                  TYPE      DEVICE
eth0-static  322133bd-a13d-43e1-9668-4946d8244642  ethernet  eth0
nmcli修改IP地址

1.取消eth0-static连接开机自动激活网络

nmcli connection modify eth0-static autoconnect yes

2.修改eth0-static连接的dns配置

nmcli connection modify eth0-static ipv4.dns 8.8.8.8

3.给连接再增加dns,有些设定值通过+/-可以增加或者移除设定

nmcli connection modify eth0-static +ipv4.dns 239.5.5.5

4.替换连接的静态IP和默认网关

nmcli connection modify eth0-static ipv4.addresses 192.168.99.12/24 ipv4.gateway 192.168.1.254

5.nmcli仅仅修改并保存了配置,要激活更改,需要重激活连接

nmcli connection down eth0-static && nmcli connection up eth0-static

6.删除自建的connection

nmcli connection delete eth0-static

nmcli管理配置文件
  • 使用nmcli管理/etc/sysconfig/network-scripts/配置文件,其实就是自定义一个网卡的配置文件,然后加入至networkmanager服务进行管理
    • 1.新增物理网卡
    • 2.拷贝配置文件(可以和设备名称一致)
    • 3.修改网卡配置文件,
    • 4.重新加载网络配置
    • 5.启用连接,并检查

1.添加一个物理设备,进入/etc/sysconfig/network-scripts/目录拷贝一份网卡配置文件

cp ifcfg-eth0 ifcfg-eth1

2.修改网卡配置文件如下:

cat ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.99.10
PREFIX=24
GATEWAY=192.168.99.1
DNS1=223.5.5.5

3.重载connetction连接,让networkmanager服务能够识别添加自定义网卡配置

nmcli connection  reload
nmcli connection
NAME  UUID                                  TYPE      DEVICE
eth0  f5b65db0-2443-4660-a1ed-f6a07618d261  ethernet  eth0
eth1  9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04  ethernet  eth1

4.eth1连接配置已经关联了eth1物理设备,如果希望修改IP地址,可以有如下两种方式

# 方式1:nmcli modify方式修改
nmcli connection modify eth1 ipv4.address 192.168.99.12/24
nmcli connection down eth1 && nmcli connection up eth1
# 方式2:vim修改,需reload
cat ifcfg-eth1
...
IPADDR=192.168.99.12
...
nmcli connection reload
nmcli connection down eth1 && nmcli connection up eth1

网卡绑定

  • 网卡绑定Bonding
    • 可以实现网络冗余,避免单点故障
    • 可以实现负载均衡,以提升网络的传输能力
  • 网卡绑定实现模式:
    • 模式0:balance-rr负载轮询,两网卡单独是100Mb,聚合为1个网络传输,可提升为200Mb
    • 模式1:active-backup高可用,两个网卡,其中一个若断线,另外的一个将会自动顶替

配置round-robin

eth0网卡配置
cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
DEVICE=eth0
NAME=eth0
ONBOOT=yes
MASTER=bond0
SLAVE=yes
eth1网卡配置
cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
DEVICE=eth1
NAME=eth1
ONBOOT=yes
MASTER=bond0
SLAVE=yes
bond网卡配置
cat /etc/sysconfig/network-scripts/ifcfg-bond0
TYPE=Bond
BOOTPROTO=none
ONBOOT=yes
DEVICE=bond0
NAME=bond0
IPADDR=192.168.99.100
PREFIX=24
GATEWAY=192.168.99.1
DNS1=223.5.5.5
DEFROUTE=yes
BONDING_MASTER=yes
BONDING_OPTS="miimon=200 mode=0"  # 检查间隔时间ms
bond状态检查

查看bond绑定状态

cat /proc/net/bonding/bond0
Ethernet Channel Bonding Drvier: v3.7.1 (April 27,2011)

Bonding Mode: load balancing(round-robin)  # 模式
MII Status:up
MII Polling Interval(ms):200
Up Delay(ms):0
Down Delay(ms):0

Slave Interface:eth0
MII Status:up
Speed:1000 Mbps
Duplex:full
Link Failure Count:0
Permanent HW addr:00:0c:29:aa:8d:2e
Slave queue ID:0

Slave Interface:eth1
MII Status:up
Speed:1000 Mbps
Duplex:full
Link Failure Count:0
Permanent HW addr:00:0c:29:aa:8d:42
Slave queue ID:0

使用ethtool检查网卡传输速率

ethtool bond0
Settings for bond0:
    Speed: 2000Mb/s  # 每秒传输速度
    Duplex: Full
bond网卡删除

删除bond可以使用nmcli命令

nmcli connection delete bond0

配置active-backup

eth0网卡配置
cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
DEVICE=eth0
NAME=eth0
ONBOOT=yes
MASTER=bond1
SLAVE=yes
eth1网卡配置
cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
DEVICE=eth1
NAME=eth1
ONBOOT=yes
MASTER=bond1
SLAVE=yes
bond网卡配置
cat /etc/sysconfig/network-scripts/ifcfg-bond1
TYPE=Bond
BOOTPROTO=none
ONBOOT=yes
DEVICE=bond1
NAME=bond1
IPADDR=192.168.99.200
PREFIX=24
GATEWATE=192.168.99.1
DNS1=223.5.5.5
DEFROUTE=yes
BONDING_MASTER=yes
BONDING_OPTS="miimon=200 mode=1 fail_over_mac=1"
# bond1获取mac地址有两种方式
# 1.从第一个活跃网卡中获取mac地址,然后其余的slave网卡的mac地址都使用该mac地址
# 2.使用fail_over_mac参数,是bond使用当前活跃网卡的mac地址,mac地址随着活跃网卡的转换而变
# fail_over_mac参数在VMWare上是必须配置,物理机可不用配置
bond状态检查
cat /proc/net/bonding/bond1
Ethernet Channel Bonding Drvier: v3.7.1 (April 27,2011)

Bonding Mode: fault-tolerance(active-backup)(fail_over_mac active)
Primary Slave:None
Currently Active Slave:eth0
MII Status:up
MII Polling Interval(ms):200
Up Delay(ms):0
Down Delay(ms):0

Slave Interface:eth0
MII Status:up
Speed:1000 Mbps
Duplex:full
Link Failure Count:0
Permanent HW addr:00:50:56:38:85:72
Slave queue ID:0

Slave Interface:eth1
MII Status:up
Speed:1000 Mbps
Duplex:full
Link Failure Count:0
Permanent HW addr:00:50:56:25:33:ee
Slave queue ID:0
bond故障模拟

关闭活跃网卡eth0

ifdown eth0
成功端口设备 'eth0'

再次检查状态,会发现备用网卡eth1切换为活跃网卡

cat /proc/net/bonding/bond1
Ethernet Channel Bonding Drvier: v3.7.1 (April 27,2011)

Bonding Mode: fault-tolerance(active-backup)(fail_over_mac active)
Primary Slave:None
Currently Active Slave:eth1
MII Status:up
MII Polling Interval(ms):200
Up Delay(ms):0
Down Delay(ms):0

Slave Interface:eth1
MII Status:up
Speed:1000 Mbps
Duplex:full
Link Failure Count:0
Permanent HW addr:00:50:56:25:33:ee
Slave queue ID:0

尝试ping主机,一切正常

网关/路由

什么是路由

  • 路由是指路由器从一个lan接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个wan接口的过程。(跨网络访问的路径选择)
  • 路由工作包含两个基本的动作:
    • 1.确定最佳路径
    • 2.通过网络传输信息(转发)
  • 在路由的过程中,后者也称为(数据)交换。交换相对来说比较简单,而选择路径很复杂

为什么需要路由

  • 如果没有路由,就没有办法实现,不同地域的主机互联互通了

如何配置路由

route # show/manipulate the IP routing table
-n show numerical addresses instead of trying to determine symbolic host names.

  • linux系统配置路由使用route命令,可以使用route命令来显示和管理路由表
  • route命令语法示例
  • route [add|del] [-host|-net|default] [address[/mask]] [netmask] [gw] [dev]
    • [add|del]:增加或删除路由条目
    • -host:添加或删除主机路由
    • -net:添加或删除网络路由
    • default:添加或删除默认路由
    • address:添加要去往的网段地址,由ip+netmask组成
    • gw:指定下一跳地址,要求下一跳地址必须是能到达的,且一般是和本网段直连的接口
    • dev:将添加路由与对应的接口关联,一般内核会自动判断路由应该关联哪个接口
  • route添加路由命令示例
route add -host 1.1.1.1/32 dev eth0
route add -net 1.1.1.1/32 dev eth1
route add -net 1.1.1.1/32 gw 1.1.1.2
route add default gw 1.1.1.2

路由的分类

主机路由
  • 主机路由作用:指明到某台主机具体应该怎么走,destination精确到某一台主机
  • linux上如何配置主机路由:
# 去往1.1.1.1主机,从eth0接口出
route add -host 1.1.1.1/32 dev eth0
# 去往1.1.1.1主机,都交给10.0.0.2转发
route add -host 1.1.1.1/32 gw 10.0.0.2
网络路由
  • 网络路由作用:指明到某类网络怎么走;destination精确到某一个网段的主机
  • linux上如何配置网络路由
    # 去往2.2.2.0/24网段,从eth0接口出
    route add -net 2.2.2.0/24 dev eth0
    # 去往2.2.2.0/24网段,都交给10.0.0.2转发
    route add -net 2.2.2.0/24 gw 10.0.0.2
默认路由
  • 默认路由:如果匹配不到主机路由、网络路由的,全部都走默认路由(网关)
  • linux上如何配置默认路由
route add -net 0.0.0.0 gw 10.0.0.2
route add default gw 10.0.0.2
  • 使用route命令添加的路由,属于临时添加(nmcli connection down后会不生效);那如何添加永久路由条目
  • /etc/sysconfig/network-scripts/目录下创建route-ethx的网卡名称,添加路由条目
cat /etc/sysconfig/network-scripts/route-eth0
10.168.99.0/24 via 192.168.99.8
systemctl restart network
或者 nmcli connection down eth0 && nmcli connection up eth0
route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.99.1    0.0.0.0         UG    100    0        0 eth0
10.168.99.0     192.168.99.8    255.255.255.0   UG    100    0        0 eth0
192.168.99.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0

路由项目案例

  • 一台linux主机能够被当作路由器需要三大前提:
    • 1.至少有两块网卡/虚拟网卡分别连接两个不同的网段
    • 2.开启路由转发功能/proc/sys/net/ipv4/ip_forward
    • 3.在linux主机添加相关路由
环境准备
  • 实验环境

file

  • 虚拟机网段配置

file

虚拟机1网卡配置

1.eth0网卡

cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.100
PREFIX=24

2.eth1网卡

cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=1.1.1.1
PREFIX=24

3.路由信息

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
1.1.1.0         0.0.0.0         255.255.255.0   U     101    0        0 eth1
10.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
虚拟机2网卡配置

1.eth0网卡

cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=1.1.1.2
PREFIX=24

2.eth1网卡

cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=2.2.2.2
PREFIX=24

3.路由信息

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
1.1.1.0         0.0.0.0         255.255.255.0   U     100    0        0 eth0
2.2.2.0         0.0.0.0         255.255.255.0   U     101    0        0 eth1
虚拟机3网卡配置

1.eth0网卡

cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=2.2.2.3
PREFIX=24

2.eth1网卡

cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=3.3.3.3
PREFIX=24

3.路由信息

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
2.2.2.0         0.0.0.0         255.255.255.0   U     100    0        0 eth0
3.3.3.0         0.0.0.0         255.255.255.0   U     101    0        0 eth1
虚拟机4网卡配置

1.eth0网卡

cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=3.3.3.4
PREFIX=24

2.eth1网卡

cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=4.4.4.4
PREFIX=24

3.路由信息

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
3.3.3.0         0.0.0.0         255.255.255.0   U     100    0        0 eth0
4.4.4.0         0.0.0.0         255.255.255.0   U     101    0        0 eth1
场景示例1
  • 问:1.1.1.1地址能否与1.1.1.2互通
  • 可以通,因为本机1.1.1.1与目标主机1.1.1.2两台机器处于一个LAN中,并且两台机器上的路由表具有destination指向对方的网段路由条目(应该不看路由表吧,同网段走二层)
  • 问:1.1.1.1地址能否与2.2.2.2地址互通
  • 答:不能,因为vm1没有去往2.2.2.2的路由,
  • 所以需要添加一条去往2.2.2.0/24网段的路由,从eth1接口发出即可
route add -net 2.2.2.0/24 dev eth1
route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
1.1.1.0         0.0.0.0         255.255.255.0   U     101    0        0 eth1
2.2.2.0         0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
场景示例2
  • 问:1.1.1.1地址能否与2.2.2.3地址互通
  • 答:不能,因为数据包到达vm2vm2发现目标地址不是自己,丢弃;vm3没有去往1.1.1.0的路由
  • 解决方案,在vm2上开启内核ip转发;vm3配置到1.1.1.0的路由;数据包到达vm3主机,但是无法送回来,所以还需要在vm3主机上添加去往1.1.1.0/24网段的数据报走vm2的回程路由
# vm2开启内核转发
echo "1" > /proc/sys/net/ipv4/ip_forward  # 临时开启
# sysctl,configure kernel parameters at runtime
sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
# 永久开启
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
net.ipv4.ip_forward = 1
# vm3添加回程路由
route add -net 1.1.1.0/24 gw 2.2.2.2
route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
1.1.1.0         2.2.2.2         255.255.255.0   UG    0      0        0 eth0
场景示例3
  • 问:1.1.1.1地址能否与3.3.3.3地址互通
  • 答:不能,因为vm1没有到3.3.3.3的路由,vm2没有到3.3.3.3的路由
  • 解决方案:
    • 1.在vm1主机上将去往3.3.3.0/24网段的数据包交给1.1.1.2,由vm2帮我们转发给3.3.3.3
    • 2.在vm2上需要添加到3.3.3.0/24网段的路由
# vm1添加路由
route add -net 3.3.3.0/24 gw 1.1.1.2
route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
3.3.3.0         1.1.1.2         255.255.255.0   UG    0      0        0 eth1
# vm2添加路由
route add -net 3.3.3.0/24 dev eth1
route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
3.3.3.0         0.0.0.0         255.255.255.0   U     0    0        0 eth1
场景示例4
  • 问:1.1.1.1地址能否与3.3.3.4地址互通
  • 答:不能,因为数据包到达vm3vm3发现目标地址不是自己,丢弃;vm4没有到1.1.1.0/24网段的回程路由
  • 解决方案:
    • vm3上开启转发功能
    • 数据包到达vm4主机,但是无法送回来,所以还需要在vm4主机上添加去往1.1.1.0/24网段的数据报走vm3的回程路由
# vim3开启转发
echo "1" > /proc/sys/net/ipv4/ip_forward  # 临时开启
# vim4添加回程路由
route add -net 1.1.1.0/24 gw 3.3.3.3
route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
1.1.1.0         3.3.3.3         255.255.255.0   UG    0      0        0 eth0

路由条目优化

  • 以虚拟机1为例,除了本机的直连路由外,其他的路由条目其实都需要由1.1.1.2来转发
  • 所以我们可以统一用一条路由规则;(配置默认路由)

1.删除vm1上无用的路由

route del -net 2.2.2.0/24
route del -net 3.3.3.0/24

2.配置默认路由

route add -net 0.0.0.0/0 gw 1.1.1.2
或者
route add default gw 1.1.1.2
route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         1.1.1.2         0.0.0.0         UG    0      0        0 eth1

4.其他虚拟机按如上方式进行优化即可

内核参数调优

  • 内核参数的调整是为了更好的利用系统资源,以便程序更好的运行

ip_local_port_range

主动连接方(客户端)会占用本地随机端口,TIME_WAIT状态会占用本地端口,如果占用过多导致本地端口不足,TCP连接不能成功建立,可以通过调整参数来增加本地端口的范围

1.查看客户端默认可用端口范围

sysctl -a | grep ip_local_port_range
net.ipv4.ip_local_port_range = 32768    60999

2.调整端口数量,测试端口不够用情况

sysctl -w net.ipv4.ip_local_port_range="10000 10002"
net.ipv4.ip_local_port_range = 10000 10002

3.准备两台服务器,一台为nginx服务器,另一台做客户端;客户端使用curl来访问服务器并主动关闭连接,在客户端产生TIME_WAIT状态;nginx服务器:blue.yn.cn,客户端:192.168.99.5

# 客户端脚本
cat test.sh
#!/usr/bin/bash
ip=blue.yn.cn
date
for i in `seq 1 3`
do
  echo "第 $i 次 curl "
  curl -s http://$ip/ -o /dev/null
  echo "RETURN: " $?
  ss -ant | grep TIME
done

# 只有当socket距离上次收到数据包已经超过1秒时,tcp_tw_reuse端口才会被重用
sleep 2

echo "第 4 次 curl "
  date
  curl -s http://$ip/ -o /dev/null
  echo "RETURN: " $?
  ss -ant | grep TIME

4.执行脚本,从结果可见第4次curl时的状态为7,失败,无法正常curl,说明端口已经被占用完

sh test.sh
2024年 04月 27日 星期六 19:09:39 CST
第 1 次 curl
RETURN:  0
TIME-WAIT  0      0      192.168.99.5:10000              blue.yn.cn:80
第 2 次 curl
RETURN:  0
TIME-WAIT  0      0      192.168.99.5:10002              blue.yn.cn:80
TIME-WAIT  0      0      192.168.99.5:10000              blue.yn.cn:80
第 3 次 curl
RETURN:  0
TIME-WAIT  0      0      192.168.99.5:10002              blue.yn.cn:80
TIME-WAIT  0      0      192.168.99.5:10000              blue.yn.cn:80
TIME-WAIT  0      0      192.168.99.5:10001              blue.yn.cn:80
第 4 次 curl
2024年 04月 27日 星期六 19:09:41 CST
RETURN:  7
TIME-WAIT  0      0      192.168.99.5:10002              blue.yn.cn:80
TIME-WAIT  0      0      192.168.99.5:10000              blue.yn.cn:80
TIME-WAIT  0      0      192.168.99.5:10001              blue.yn.cn:80

5.通过调整端口效果有限,因为TIME_WAIT需要等待2MSL时长,在这个时长内,最多也就能使用ip_local_port_range定义的端口范围,其实这些是不够的,所以我们还可以使用tcp_tw_reuse参数来重用TIME_WAIT

tcp_tw_reuse

tw_reuse表示端口重用,只有当net.ipv4.tcp_timestamps = 1,net.ipv4.tcp_tw_reuse = 1两个选项同时开启时,并且只有当socket距离上次收到数据包已经超过1秒时,tcp_tw_reuse端口重用才会有效

1.开启tcp_tw_reuse以及tcp_timestamps内核参数

sysctl -w net.ipv4.tcp_timestamps=1
net.ipv4.tcp_timestamps = 1
sysctl -w net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_reuse = 1

2.再次执行脚本测试

sh test.sh
2024年 04月 27日 星期六 19:18:28 CST
第 1 次 curl
RETURN:  0
TIME-WAIT  0      0      192.168.99.5:10000              blue.yn.cn:80
第 2 次 curl
RETURN:  0
TIME-WAIT  0      0      192.168.99.5:10002              blue.yn.cn:80
TIME-WAIT  0      0      192.168.99.5:10000              blue.yn.cn:80
第 3 次 curl
RETURN:  0
TIME-WAIT  0      0      192.168.99.5:10002              blue.yn.cn:80
TIME-WAIT  0      0      192.168.99.5:10000              blue.yn.cn:80
TIME-WAIT  0      0      192.168.99.5:10001              blue.yn.cn:80
第 4 次 curl
2024年 04月 27日 星期六 19:18:30 CST
RETURN:  0
TIME-WAIT  0      0      192.168.99.5:10002              blue.yn.cn:80
TIME-WAIT  0      0      192.168.99.5:10000              blue.yn.cn:80
TIME-WAIT  0      0      192.168.99.5:10001              blue.yn.cn:80

tcp_max_tw_buckets

net.ipv4.tcp_max_tw_buckets参数表示操作系统允许TIME_WAIT数值的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除,该参数默认为4096,可以对其进行调整,确保TIME_WAIT状态不消耗太多的连接,以保证新连接可以正常请求

1.参数调整

sysctl -a | grep tw_buckets
net.ipv4.tcp_max_tw_buckets = 4096
sysctl -w net.ipv4.tcp_max_tw_buckets=2

2.把net.ipv4.ip_local_port_range改回原来的

sysctl -w net.ipv4.ip_local_port_range="32768 60999"

3.测试验证

sh test.sh
2024年 04月 27日 星期六 19:35:40 CST
第 1 次 curl
RETURN:  0
TIME-WAIT  0      0      192.168.99.5:36618              blue.yn.cn:80
第 2 次 curl
RETURN:  0
TIME-WAIT  0      0      192.168.99.5:36618              blue.yn.cn:80
TIME-WAIT  0      0      192.168.99.5:36620              blue.yn.cn:80
第 3 次 curl
RETURN:  0
TIME-WAIT  0      0      192.168.99.5:36618              blue.yn.cn:80
TIME-WAIT  0      0      192.168.99.5:36620              blue.yn.cn:80
第 4 次 curl
2024年 04月 27日 星期六 19:35:42 CST
RETURN:  0
TIME-WAIT  0      0      192.168.99.5:36618              blue.yn.cn:80
TIME-WAIT  0      0      192.168.99.5:36620              blue.yn.cn:80

tcp_max_syn_backlog

一般我们将ESTABLISHED状态的连接称为全连接,而将SYN_REVD状态的连接称为半连接,backlog定义了处于SYN_REVDTCP最大连接数,当处于SYN_REVD状态的TCP连接数超过tcp_max_syn_backlog后,会丢弃后续的SYN报文(也就是半连接池最大可接受的请求)

file

当服务器收到一个SYN后,它创建一个子连接加入到SYN_REVD队列。在收到ACK后,它将这个子连接移动到ESTABLISHED队列。最后当用户调用accept()时,会将连接从ESTABLISHED队列取出。

1.调整服务端参数

# 默认大小为128
sysctl -a | grep max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 128
# 关闭syncookies避免干扰
sysctl -w net.ipv4.tcp_syncookies=0
sysctl -w net.ipv4.tcp_max_syn_backlog=2

2.客户端执行如下操作

# 禁止客户端返回ack,模拟服务端syn_recv状态
iptables -t filter -I OUTPUT -p tcp -m tcp --tcp-flag ACK -j DROP
# 使用telnet连接远程主机
telnet 192.168.99.5 22 &
[1] 11913
telnet 192.168.99.5 22 &
[2] 11916
telnet 192.168.99.5 22 &
[3] 11917
telnet 192.168.99.5 22 &
[4] 12012
Trying 192.168.99.5...

3.检查服务端连接状态

netstat -nt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 192.168.99.5:22         blue.yn.cn:53326     SYN_RECV
tcp        0      0 192.168.99.5:22         blue.yn.cn:53328     SYN_RECV
tcp        0      0 192.168.99.5:22         blue.yn.cn:53330     SYN_RECV
# 内核会提示丢弃了一些请求
dmesg
[68587.209316] TCP: drop open request from blue.yn.cn/53332
[68588.209500] TCP: drop open request from blue.yn.cn/53332
  • 注意:SYN_REVD有3条记录,我们调整的限制时2,怎么多出了一条,是因为系统的判断条件是>而不是>=,所以当达到3条记录时才算超过限制,所以有3条SYN_REVD记录

core.somaxconn

net.core.somaxconn用于定义服务端全连接队列的大小,默认为128,对于生产环境而言,肯定是不够用的

file

1.调整服务端全连接队列大小为3

# 默认大小为128
sysctl -a | grep core.somaxconn
net.core.somaxconn = 128
# 调整为3
sysctl -w net.core.somaxconn=2
net.core.somaxconn = 2

2.服务端脚本

vim server.c
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define BACKLOG 200

int main(int argc, char **argv)
{
    int listenfd;
    int connfd;
    struct sockaddr_in servaddr;

    listenfd = socket(PF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(50001);

    bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

    listen(listenfd, BACKLOG);
    while(1)
    {
        sleep(1);
    }
    return 0;
}

3.编译并启动服务端脚本

gcc server.c -o server
./server &

4.编写客户端脚本

vim client.c
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int sockfd;
    struct sockaddr_in servaddr;

    sockfd = socket(PF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(50001);
    servaddr.sin_addr.s_addr = inet_addr("192.168.99.5");

    if (0 != connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)))
    {
         printf("connect failed!\n");
    }
    else
    {
         printf("connect succeed!\n");
    }
    sleep(30);
    return 1;
}

5.编译并启动客户端脚本

gcc client.c -o client
./client &
[1] 9060
# connect succeed!
./client &
[2] 9062
# connect succeed!
./client &
[3] 9063
# connect succeed!
./client &
[4] 9065
# connect succeed!
./client &
[5] 9067
# connect succeed!

5.检查服务端状态(会发现已建立连接队列就3条,其余都在半连接池中无法进入连接队列)

netstat -ntp | grep   50001
tcp        0      0 192.168.99.5:50001      blue.yn.cn:37986      SYN_RECV    -
tcp        0      0 192.168.99.5:50001      blue.yn.cn:37988      SYN_RECV    -
tcp        0      0 192.168.99.5:50001      blue.yn.cn:37982      ESTABLISHED -
tcp        0      0 192.168.99.5:50001      blue.yn.cn:37978      ESTABLISHED -
tcp        0      0 192.168.99.5:50001      blue.yn.cn:37984      ESTABLISHED -

tcp_syn_retries

net.ipv4.tcp_syn_retries表示应用程序发送SYN包时,在对方不返回SYN + ACK的情况下,内核默认重试发送6次SYN包(net.ipv4.tcp_syn_retries = 6),也就是说如果一直收不到对方返回SYN + ACK,那么应用程序最大的超时时间就是(1+2+4+8+16+32+64=127秒),这对于很多客户端而言是很难以接受的

  • 第1次发送SYN报文后等待1s(2^0),如果超时,则重试
  • 第2次发送后等待2s(2^1),如果超时,则重试
  • 第3次发送后等待4s(2^2),如果超时,则重试
  • 第4次发送后等待8s(2^3),如果超时,则重试
  • 第5次发送后等待16s(2^4),如果超时,则重试
  • 第6次发送后等待32s(2^5),如果超时,则重试
  • 第7次发送后等待64s(2^6),如果超时,则重试

1.服务端配置iptables来丢弃指定端口的SYN报文

# 进来流量如果syn标志位为1则拒绝
iptables -A INPUT -p tcp --dport 22 --syn -j DROP
# 服务端使用tcpdump抓包
tcpdump -i eth0 -n src blue.yn.cn and dst 192.168.99.5 and port 22

2.然后客户端使用telnet连接服务端指定端口

date '+ %F %T'; telnet 192.168.99.5 22; date '+ %F %T';
 2024-04-28 20:51:18  # 开始时间
Trying 192.168.99.5...
telnet: connect to address 192.168.99.5: Connection timed out
 2024-04-28 20:53:25  # 结束时间

3.最后分析抓包结果,从tcpdump的输出也可以看到,一共发了7次SYN包(都是同一个seq号码),第一次是正常请求,后面6次是重试,正是该内核参数设置的值

tcpdump -i eth0 -n src blue.yn.cn and dst 192.168.99.5 and port 22
20:51:18.086602 IP blue.yn.cn.56708 > 192.168.99.5.ssh: Flags [S], seq 73398987, win 29200, options [mss 1460,sackOK,TS val 3465468929 ecr 0,nop,wscale 7], length 0
20:51:19.089440 IP blue.yn.cn.56708 > 192.168.99.5.ssh: Flags [S], seq 73398987, win 29200, options [mss 1460,sackOK,TS val 3465469932 ecr 0,nop,wscale 7], length 0
20:51:21.093456 IP blue.yn.cn.56708 > 192.168.99.5.ssh: Flags [S], seq 73398987, win 29200, options [mss 1460,sackOK,TS val 3465471936 ecr 0,nop,wscale 7], length 0
20:51:25.101449 IP blue.yn.cn.56708 > 192.168.99.5.ssh: Flags [S], seq 73398987, win 29200, options [mss 1460,sackOK,TS val 3465475944 ecr 0,nop,wscale 7], length 0
20:51:33.125469 IP blue.yn.cn.56708 > 192.168.99.5.ssh: Flags [S], seq 73398987, win 29200, options [mss 1460,sackOK,TS val 3465483968 ecr 0,nop,wscale 7], length 0
20:51:49.157471 IP blue.yn.cn.56708 > 192.168.99.5.ssh: Flags [S], seq 73398987, win 29200, options [mss 1460,sackOK,TS val 3465500000 ecr 0,nop,wscale 7], length 0
20:52:21.189475 IP blue.yn.cn.56708 > 192.168.99.5.ssh: Flags [S], seq 73398987, win 29200, options [mss 1460,sackOK,TS val 3465532032 ecr 0,nop,wscale 7], length 0

4.修改客户端后重试次数,在测试

sysctl -w net.ipv4.tcp_syn_retries=2
# 再次测试
 date '+ %F %T'; telnet 192.168.99.5 22; date '+ %F %T';
 2024-04-28 21:00:32  # 起始时间
Trying 192.168.99.5...
telnet: connect to address 192.168.99.5: Connection timed out
 2024-04-28 21:00:39  # 结束时间
  • 注意:作为代理服务器这个值就应该调整

内核参数示例

vim /etc/sysctl.conf
# tcp优化
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 5000

net.ipv4.tcp_syncookies = 1  # 防止SYN Flood攻击,开启后max_syn_backlog理论上没有最大值
net.ipv4.tcp_max_syn_backlog = 8192  # SYN半连接队列可存储的最大值
net.core.somaxconn = 32768  # SYN全连接队列可存储的最大值

# 修改TCP TIME-WAIT超时时间(默认60s)
net.ipv4.tcp_tw_timeout = 5  # centos改不了

# 重试
net.ipv4.tcp_syn_retries = 2  # 发送SYN包重试次数,默认6
net.ipv4.tcp_synack_retries = 2  # 返回syn+ack重试次数,默认5

# 其他
# net.ipv4.ip_forward = 1  # 支持转发功能
# net.ipv4.ip_nonlocal_bind = 1  # 如果我的应用程序需要绑定端口,需要指明不配置在本机的IP地址
# net.ipv4.tcp_keepalive_time = 600
# 当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可更快的清理无效连接

# 系统中运行存在文件句柄最大数目(系统级)
fs.file-max = 204800
#
vm.swappiness = 0
最后修改日期: 2024年10月5日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。