优化-网络

网络子系统
网络的监测是所有 Linux 子系统里面最复杂的,有太多的因素在里面,
比如:延迟、阻塞、冲突、丢包等,更糟的是与 Linux 主机相连的路由器、
交换机、无线信号都会影响到整体网络并且很难判断是因为 Linux 网络子系统的问题还是别的设备的问题,
增加了监测和判断的复杂度。现在我们使用的所有网卡都称为自适应网卡,
意思是说能根据网络上的不同网络设备导致的不同网络速度和工作模式进行自动调整。
线序:
568B 橙白--橙--绿白--蓝--蓝白--绿--棕白--棕
568A 1,3对换,2,6对换 【绿白--绿--橙白--蓝--蓝白--橙--棕白--棕】
    交换机
|
|--------------|
| |
PC1 PC2
PC1 ------------ PC2
1、检查是否通电
# mii-tool eth0
eth0: negotiated 100baseTx-FD, link ok --看到link ok,说明网线连接正常,但并不代表网线完全正常(可能水晶头松了或信号线接触不良等)
2、检查网卡的工作模式和修改
# ethtool eth0
# ethtool -s eth0 speed 10 duplex half autoneg off --把网卡改成10M/s的速率,半双工,关闭自动协商
# ethtool -s eth0 speed 1000 duplex full autoneg on --把网卡改成1000M/s的速率,全双工,打开自动协商
3,用一些工具扫描内网用户,如arp-scan
软件包路径在 笔记目录/arch/arp_scan_soft/
arp-scan-1.6.tar.gz
libpcap-1.4.0-1.20130826git2dbcaa1.el6.x86_64.rpm
libpcap-devel-1.4.0-1.20130826git2dbcaa1.el6.x86_64.rpm
安装步骤:(有epel源则直接yum install arp-scan)
先安装libpcap,libpcap-devel依赖包
解压
./configure
make
make install
# arp-scan -l --interface br0 --查看局域网内所有机器的IP和MAC地址的对应
# arp -a --查看所有和本机联系过并且仍然保存在arp缓存列表里的机器的IP和MAC地址的对应
# ip neigh --类似arp -a或arp -n
4、检测网卡的当前负载
# sar -n DEV 2
02:09:37 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
02:09:39 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:09:39 PM eth0 659.69 255.10 40.16 344.18 0.00 0.00 0.00
02:09:39 PM br0 659.69 255.10 31.14 344.18 0.00 0.00 2.55
02:09:39 PM vmnet1 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:09:39 PM vmnet2 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:09:39 PM virbr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:09:39 PM virbr0-nic 0.00 0.00 0.00 0.00 0.00 0.00 0.00
rxpck/s 每秒收到的数据包数
txpck/s 每秒发送的数据包数
rxkB/s 每秒收到的kb
txkB/s 每秒发送的kb
# cat /proc/net/dev
5,两台主机之间有网线(或无线)、路由器、交换机等设备,
测试两台主机之间的网络性能的一个办法就是在这两个系统之间互发数据并统计结果,看看吞吐量、延迟、速率如何。
iptraf 就是一个很好的查看本机网络吞吐量的好工具,支持文字图形界面,很直观。
yum install iptraf (本地镜像yum源,centos7里叫iptraf-ng)
# iptraf --直接打开,选择你要查看统计数据
# iptraf -d eth0 --直接看eth0的统计数据
6,netperf 运行在 client/server 模式下,比 iptraf 能更多样化的测试终端的吞吐量。
笔记目录/arch/arp_scan_soft/netperf-2.7.0.tar.gz
解压
./configure
make
make install
安装完成后会有netserver(服务器端命令)和netperf(客户端命令)这两个命令
# which netserver
/usr/local/bin/netserver
# which netperf
/usr/local/bin/netperf
测试方法:服务器和客户端都要安装此软件
在服务器上
# netserver
Starting netserver with host 'IN(6)ADDR_ANY' port '12865' and family AF_UNSPEC
# netstat -ntlup |grep 12865 --端口为12865
tcp 0 0 :::12865 :::* LISTEN 18366/netserver
在客户端上
# netperf -H 10.1.1.8 -l 30 --这里表示一次测试时间为30秒
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.1.1.8 (10.1.1.8) port 0 AF_INET
# netperf -H 10.1.1.8 -l 30
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 30.39 87.39 --这里的87.39的单位是10^6bits,所以要算每秒多少MB就应该$[87.39*1000000/8/1000/1000]算得多少MB/s大概为10M多/s(因为百M局域网理论值为12.5MB/s)
===========================================================
client ---》 server
tcp/ip连接过程及状态
见笔记目录里的图
笔记目录/arch/png/tcp-state
笔记目录/arch/png/tcp-state2
连接过程大概分为三大部分
1,三次握手
知识点: syn,ack,syn_flood攻击;
相关状态:LISTEN,SYN_SENT,SYN_RCVD,ESTABLISHED
2,数据传输
知识点:超时重传,快速重传,流量控制,拥塞控制(慢启动,拥塞避免,拥塞发生,快速恢复);
相关状态:ESTABLISHED
3,四次挥手
知识点:主动关闭,被动关闭,MSL(Maximum Segment Lifetime);
相关状态:
FIN_WAIT_1;CLOSE_WAIT,FIN_WAIT_2;LAST_ACK;TIME_WAIT;CLOSING;CLOSED
syn 同步序列号 synchronous
ack 确认号 acknowledgement
syn_flood攻击
syn_flood攻击属于DDos攻击(分布式拒绝服务攻击distributed deny of service)
原理:利用发送大量伪造的TCP连接请求,但只做三次握手的第一次SYN包,当服务器回应第二次syn+ack包,所以不回应第三次握手,造成服务器会有大量的SYN_RCVD状态,并且会重试5次继续回应syn+ack包,直到塞满TCP连接等待队列,耗尽资源.
syn_flood的基本诊断:
1,服务器突然连接不够用了,大量客户反映无法连接服务器
2,服务器相比平常多出大量的SYN_RCVD状态的连接
# ss -s --用此命令查出有大量的不正常的timewait和synrecv
# netstat -n |grep ^tcp |awk '{print $NF}' |sort |uniq -c |awk BEGIN'{print "状态\t\t连接数"} {print $2"\t"$1}' --查出有大量的不正常的SYN_RCVD状态
应急处理
写shell脚本使用iptables将攻击嫌疑IP给禁止,过一段时间再解禁。但这种做法容易把正常客户给禁掉,只做应急处理
比如:写一个类似我下面的脚本
#!/bin/bash
touch /tmp/denyiplist.txt
netstat -nt |awk '$NF~"SYN_RECV" {print $0}' | grep :80 |awk -F: '{print $8}' |sort |uniq -c |awk '$1>10 {print $2}' |while read ip
do
grep $ip /tmp/denyiplist.txt &> /dev/null
if [ $? -ne 0 ];then
iptables -A INPUT -p tcp --dport 80 -s $ip -j REJECT
echo "$ip" >> /tmp/denyiplist.txt
at now + 1 days << EOF
iptables -D INPUT -p tcp --dport 80 -s $ip -j REJECT
sed -i "/$ip/"d /tmp/denyiplist.txt
EOF
fi
done
--把上面的脚本放到时间任务里,过一段时间(自定义)就执行一次
如果你是一个小网站,经常会受到同行的攻击。你可以加httpd上加防DDOS模块来做一下辅助防护。
如:Apache防DDOS模块mod_evasiv
============================================================
调整内核参数做微调(syn_flood相关)
1,net.ipv4.tcp_synack_retries = 1 --默认为5,改小(1-2),极端就暂时改为0,表示减小服务器回应syn+ack包的重试次数
2,net.ipv4.tcp_max_syn_backlog = 4096 --默认为2048,可以适当调大,此参数表示syn的等待队列长度,加大队列长度,可以支持更多的连接,但队列长度的设定与内存大小也有关系
3,net.ipv4.tcp_abort_on_overflow = 1 --改为1,表示如果tcp连接实在太多,处理不过来,就直接拒绝
4,net.ipv4.tcp_syncookies = 1 --连接实在太多,队列满了,tcp会使用一种特殊的cookies的方法来处理连接.(防syn_flood有一定效果,但是高负载并且没有受到syn_flood攻击,建议关闭)
调整内核参数做微调(keep_alive相关)
tcp面向连接的 (但这个连接因为是通过网络,所以并不是把client到server整个连接路线都去监测和检测,所以才需要两端来维护tcp_ip的11状态来确认整个连接线路的情况)
深圳 --》 北京
client server
tcp keep_alive
如果client端因为非正常原因(如断电这种)掉线,server端过一段时间后会去探测client是否alive
空连接攻击
1,net.ipv4.tcp_keepalive_time = 1800 --默认为7200秒(两小时),server在7200秒没有收到客户端信息,会发送探测包确认它是否alive.适当调小,如调成1800秒
2,net.ipv4.tcp_keepalive_probes = 3 --默认9次,表示server需要9次探测client是否alive,9次都没回应,就断开这个tcp连接。可以适当调小
3,net.ipv4.tcp_keepalive_intvl = 20 --75秒,表示server探测的时间间隔。适当调小
超时重传
快速重传
流量控制
拥塞控制(慢启动,拥塞避免,拥塞发生,快速恢复)
net.ipv4.tcp_fack = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_dsack = 1
net.ipv4.tcp_window_scaling = 1
在四次挥手时,大量的time_wait状态会影响你的新的连接进来
net.ipv4.ip_local_port_range = 1024 65535 --tcp连接本地分配的端口号范围,可以把随机端口全部分配给它
net.ipv4.tcp_timestamps = 1 --默认为1,不用调,主要是配合下面的tw_reuse和rw_recycle使用的(打开tw_reuse和rw_recycle必须要打开这个参数)
net.ipv4.tcp_tw_reuse = 1 --默认为0,改为1表示打开time_wait状态连接的快速重用
net.ipv4.tcp_tw_recycle = 1 --默认为0,改为1表示打开time_wait状态连接的快速回收
net.ipv4.tcp_max_tw_buckets = 262144 --服务能维护的最大time_wait数量,在内存足够可以再适当调大
net.ipv4.tcp_fin_timeout =30 --默认为60,表示FIN-WAIT-2状态的时间,适当调小
======================================================
roundrobin activebackup
LB(load banlancer) HA(high availablity)
通过linux下双网卡绑定加强网卡性能和高可用性
准备一台kvm虚拟机,双网卡同网段(centos7.3平台,team技术)
linux双网卡绑定(七种模式)
这里使用一台kvm虚拟机来测试(两张网卡物理上要同网段
注意:如果使用vmware workstation版本来测试的话,在做网卡切换时有可能会造成虚拟机死机等情况(所以用kvm做比较容易实现效果)
第一步:开启NetworkManager服务
# nmcli connection show
Error: NetworkManager is not running.
# systemctl start NetworkManager
# systemctl status NetworkManager
# systemctl enable NetworkManager
第二步:将要绑定的两个网卡的连接先删除(如果网卡正在使用,是不能绑定成team的)
# nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 35f32c08-767d-3633-8d49-f56af92a8765 802-3-ethernet eth1
eth0 ed27a852-68f5-481d-9db3-e7f816b4468a 802-3-ethernet eth0
virbr0 6f99bfcd-ca52-4d31-a6c1-af64fe3aef5b bridge virbr0
# nmcli connection delete 35f32c08-767d-3633-8d49-f56af92a8765 ed27a852-68f5-481d-9db3-e7f816b4468a
# nmcli connection show  ----查看是否删除干净,没有的话,继续再delte
NAME UUID TYPE DEVICE
Wired connection 1 2e21b854-ce5c-349f-b0e5-85ac1c419898 802-3-ethernet eth0
virbr0 6f99bfcd-ca52-4d31-a6c1-af64fe3aef5b bridge virbr0
# nmcli connection delete 2e21b854-ce5c-349f-b0e5-85ac1c419898
# nmcli connection show  
NAME UUID TYPE DEVICE
virbr0 6f99bfcd-ca52-4d31-a6c1-af64fe3aef5b bridge virbr0
第三步:创建team网卡,并指定模式为activebackup
# nmcli connection add type team con-name team0 ifname team0 config '{"runner":{"name":"activebackup"}}'
指定team0网卡的ip,gateway,非dhcp模式(你还可以指定dns等等其它属性)
# nmcli connection modify team0 ipv4.addresses "172.16.2.10/16" ipv4.gateway "172.16.254.254" ipv4.method manual
第四步:把要绑定成team的两张网卡加入到team中,并启动team0网卡
# nmcli connection add type team-slave con-name team0-port1 ifname eth0 master team0
# nmcli connection add type team-slave con-name team0-port2 ifname eth1 master team0
# nmcli connection up team0
第五步:查看绑定是否ok
# ifconfig team0 --查看ip是否ok
team0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.2.10 netmask 255.255.0.0 broadcast 172.16.255.255
inet6 fe80::45ac:1a68:5a8c:4a80 prefixlen 64 scopeid 0x20<link>
ether 52:54:00:ed:6d:07 txqueuelen 1000 (Ethernet)
RX packets 150220 bytes 54043196 (51.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 762 bytes 88302 (86.2 KiB)
TX errors 0 dropped 2 overruns 0 carrier 0 collisions 0
# teamdctl team0 state --查看team的绑定状态
setup:
runner: activebackup
ports:
eth0
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 1
eth1
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 0
runner:
active port: eth0 --这里显示的是主网卡
第六步:测试activebackup模式
把主网卡ifconfig eth0 down掉,发现仍然连接ok(也可以通过iptraf-ng命令查看流量来验证)
第七步:把activebackup模式换成roundrobin模式
# nmcli connection show team0 |grep team.config  --查看team0网卡原属性为activebackup
team.config: {"runner":{"name":"activebackup"}}
# nmcli connection modify team0 team.config '{"runner":{"name":"roundrobin"}}' --修改为roundrobin
# nmcli connection show team0 |grep team.config --确认为roundrobin
team.config: {"runner":{"name":"roundrobin"}}
# nmcli connection up team0 --启动网卡,这里不用down掉再up,直接up就可以 
# teamdctl team0 state   
setup:
runner: roundrobin --变成了roundrobin模式了
ports:
eth0
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 0
eth1
link watches:
link summary: up
instance[link_watch_0]:
name: ethtool
link: up
down count: 0
第8步:测试roundrobin模式
使用iptraf-ng看到两个网卡流量平均,如果down掉一个,另一个网卡会仍然正常工作
posted @   Sky-wings  阅读(293)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示