网络基本概述
为何需要网络
- 假设没有网络:(也就是将所有的计算机网络都关闭)
- 如果我的计算机上有非常不错的电影,想要进行传输,就比较费劲了
- 因为我们可能处在不同的城市、或者不同的国家
- 但如果有了网络:(也就是将所有计算机通过网线连接在一起)
- 打破了地域上数据传输的限制
- 提高信息之间的传输效率,以便更好的实现资源的共享
什么是网络
- 网络是由若干节点和连接这些节点的链路构成,表示诸多对象及其相互联系。
- 网络是信息传输、接收、共享的虚拟平台,通过它把各个信息联系到一起,从而实现这些资源的共享
- 网络将节点连接在一起,需要实现信息传输(信息通信)有几个大前提:
- 使用物理连接的介质将所有计算机连接在一起(网卡、网线、交换机、路由器)
- 双方在通信过程中,必须使用统一的通信标准,也就是通信协议(互联网通信协议)
互联网通讯协议
- 协议其实就是规定了一堆标准,用来定义计算机如何接入
internet
以及接入internet
的计算机通信的标准;所有计算机都需要学习此标准、遵循此标准来进行信息传输(信息通信) - 国际标准化组织:推出了
OSI
七层参考模型,将互联网通讯协议分成了不同的层,每一层都有专门的标准,以及组织数据的格式- (应、表、会、传、网、数、物)
- 对于写程序来说,通常会将七层归纳为五层协议:
- (应、传、网、数据、物)
物理层
物理层:定义物理设备的标准,如网卡网线,传输速率;最终实现数据转成电信号传输;
问题:如果只是单纯发送电信号是没有意义的,因为没有规定开头也没有规定结尾;要想变得由意义就必须对电信号进行分组;比如:xx位为一组这样的方式去传输,这就需要数据链路层来完成了
数据链路层
- 数据链路层定义:定义了电信号的分组的标准方式,一组数据称之为一个数据帧,这个标准遵循
ethernet
以太网协议,以太网规定了如下几件事: - 1.数据帧分为
head
和data
两部分组成;其中head
长度固定14字节;另有4字节的尾部head
:发送者源mac
地址、接收者目的mac
地址(源地址6字节、目标地址6字节、数据类型2字节)data
:主要存放网络层整体的数据,最长1500字节,超过最大限制就由网络层分片发送
- 2.但凡接入互联网的主机必须有一块网卡,网卡烧制了全世界唯一的
mac
地址 - 3.有了以太网协议以后,它能对数据分组,也可以区分数据的意义,还能找到目标主机的地址,就可以实现计算机通信;但是计算机以及集线器是瞎的,所以以太网通信采用的是广播方式
- 那什么是广播:
- 假设我们都在一个小黑屋里面,大家互相通信靠吼,假设
aa
让bb
买包烟
1.数据:买烟(类型:干粮)
2.源地址:aa
3.目标地址:bb
- 此时屋子里所有人都收到了该数据包,但只有
bb
会接收执行,其他人收到后会丢弃
- 假设我们都在一个小黑屋里面,大家互相通信靠吼,假设
- 如果我们将全世界的计算机都接入在一起,理论上是不是就可以实现全世界通信
- 首先:无法将全世界的计算机放在一个交换机上,因为没有这样的设备
- 其次:就是放在同一设备上,每台计算机都广播以下,那设备也无法正常工作
- 所以:我们应该将主机划区域,隔离在一个又一个的区域中,然后将多个区域通过网关/路由连接在一起。
网络层
- 网络层定义:用来划分广播域,如果广播域内主机要往广播域外的主机发送数据,一定要有一个“网关/路由”帮其将数据转发到外部计算机;网关和外界通信走的是路由协议。网络层协议规定了如下几件事:
- 规定1:数据包分成:
head
和data
两部分组成
head
:发送者/源地址、接收者/目标地址,该地址为IP地址
data
:主要存放传输层整体的数据 - 规定2:
IP
地址来划分广播域,主要用来判断两台主机是否在同一广播域中
一个合法的IPv4
地址=ip
地址/子网掩码
如果计算出两台地址的广播域一样,说明两台计算机处在同一个区域中
- 规定1:数据包分成:
- 计算两台计算机是否在同一局域网(决定了数据如何发送):
- 如果它们处于同一网络(局域网)
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
)
- 如果它们处于同一网络(局域网)
传输层
- 传输层的由来:网络层帮我们区分子网和找到主机,数据链路层帮我们找到链路,但一个主机有多个进程,进程之间进行不同的网络通信,那么当收到数据时,如何区分数据是哪个进程的呢;其实是通过端口来区分,端口即应用程序与网卡关联的编号
- 传输层的定义:提供进程之间的逻辑通信
- 传输层也分成:
head
和data
两部分组成head
:源端口、目标端口、协议(tcp、udp
)data
:主要存放的是应用层整体的数据
应用层
- 应用层定义:为终端应用提供的服务,如我们的浏览器交互时候需要用到的
http
协议,邮件发送的snmtp
,文件传输的ftp
等。
TCP协议
tcp
可靠数据传输协议,为了实现可靠传输,在通信之前需要先建立连接,也叫双向通路,就是说客户端与服务端要建立连接,服务端与客户端也需要建立连接,当然建立的这个双向通路它只是一个虚拟的链路,不是用网线将两个设备真实的捆绑在一起- 虚拟链路的作用:由于每次通信都需要拿到
ip
和port
,那就意味着每次都需要查找,建立好虚拟通路,下次两台主机之间就可以直接传递数据
三次握手
- 第一次:客户端要与服务端建立连接,需要发送请求连接信息
- 第二次:服务端接收到数据后,返回一个确认操作(至此客户端到服务端链路建立成功)
- 第三次:服务端还需要发送要与客户端建立连接的请求
- 第四次:客户端接收到数据后,返回一个确认的操作(至此服务端到客户端的链路建立成功)
- 由于建立连接时没有数据传输,所以第二次确认和第三次请求可以合并为一次发送
tcp
协议为了实现可靠传输,通信双方需要判断自己已经发送的数据包是否都被接收方收到,如果没收到,就需要重发。为了实现这个需求,就引出序号(seq
)和确认号(ack
)的使用- 举例:发送方在发送数据包时,序列号(假设为123),那么接收方收到这个数据包以后,就可以回复一个确认号(123=123+1)告诉发送方我已经收到了你的数据包,你可以发送下一个数据包,序号从124开始,这样发送方就可以知道哪些数据被收到,哪些数据没被接收到,需要重发
四次挥手
- 第一次挥手:客户端(服务端也可以主动断开)项服务端说明想要关闭连接
- 第二次挥手:服务端会回复确认。但不是立马关闭,因为此时服务端可能还有数据在传输中
- 第三次挥手:待到服务端数据传输都结束后,服务端向客户端发出消息,我要断开连接了
- 第四次挥手:客户端收到服务端的断开信息后,给予确认。服务端收到确认后正式关闭
转换状态
- 三次握手状态转换:
- 1.客户端发送
syn
包向服务端请求建立tcp
连接,客户端进入syn_send
状态 - 2.服务端收到请求之后,向客户端发送
syn+ack
,同时自身进入syn_recv
状态 - 3.客户端收到回复之后,发送
ack
信息,自身进入established
状态 - 4.服务端收到
ack
数据之后进入established
状态
- 四次挥手状态转换
- 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
包,然后客户端继续确认
- 问题1:网络是不稳定的,可能服务端发送的一些数据包,比服务端发送的
- 所以客户端如果
ack
后立即关闭连接,会导致数据不完整、也可能造成服务端无法释放连接。所以此时客户端需要等待2个报文生存最大时长,确保网络中没有任何遗留报文了,再关闭连接 - 如果机器
time_wait
过多,会造成端口耗尽,可以修改内核参数tcp_tw_reuse=1
端口重用
- 为什么必须要等待
2msl
?而不是4msl
?8msl
? - 一个
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
参数
2.增加内核参数:net.ifnames=0 biosdevname=0
3.检查是否修改成功,成功后可继续安装系统
配置网络地址
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
高可用,两个网卡,其中一个若断线,另外的一个将会自动顶替
- 模式0:
配置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
主机添加相关路由
环境准备
- 实验环境
- 虚拟机网段配置
虚拟机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地址互通
- 答:不能,因为数据包到达
vm2
,vm2
发现目标地址不是自己,丢弃;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网段的路由
- 1.在
# 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地址互通
- 答:不能,因为数据包到达
vm3
,vm3
发现目标地址不是自己,丢弃;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_REVD
的TCP
最大连接数,当处于SYN_REVD
状态的TCP
连接数超过tcp_max_syn_backlog
后,会丢弃后续的SYN
报文(也就是半连接池最大可接受的请求)
当服务器收到一个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,对于生产环境而言,肯定是不够用的
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
留言