Closed 0XFF-96 closed 4 years ago
sar -n DEV 1
# -i eth0 只抓取eth0网卡,-n不解析协议名和主机名# t
tcp port 80表示只抓取tcp协议并且端口号为80的网络帧
tcpdump -i eth0 -n tcp port 80
-n: 不解析名字。
-p: 表示显示连接所属进程。
netstat -n -p | grep SYN_REC
netstat -n -p | grep SYN_REC | wc -l
iptables -I INPUT -s 192.168.0.2 -p tpc -j REJECT
# 限制syn并发数为每秒1次
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
# 限制单个IP在60秒新建立的连接数为10
iptables -I INPUT -p tcp --dport 80 --syn -m recent --name SYN_FLOOD --update --seconds 60 --hitcount 10 -j REJECT
解决办法2 :
TCP SYN Cookies 也是一种专门防御 SYN Flood 攻击的方法。SYN Cookies 基于连接信息(包括源地址、源端口、目的地址、目的端口等)以及一个加密种子(如系统启动时间),计算出一个哈希值(SHA1),这个哈希值称为 cookie
可能的原因有:
ICMP 通常会被服务器禁用。
hping3 -c 3 -S -p 80 baidu.com
traceroute --tcp -p 80 -n baidu.com
测试 80 / 8080 端口延迟
hping3 -c 3 -S -p 80 192.168.0.30
wrk 测试 80 / 8080 端口延迟
# wrk --latency -c 100 -t 2 --timeout 2 http://192.168.0.30/
wrk --latency -c 100 -t 2 --timeout 2 http://localhost:80
- ? 为什么抓不了包?
tcpdump -nn tcp port 8080 -w nginx.pcap
- 为了确认 wrk 的行为, 可以用 strace 来观察 wrk 为套接字设置 TCP 选项。
strace -f wrk --latency -c 100 -t 2 --timeout 2 http://192.168.0.30:8080/ ... setsockopt(52, SOL_TCP, TCP_NODELAY, [1], 4) = 0 ...
### 排查
- 使用 hping3 以及 wrk 等工具🔧, 确认单词请求和并发请求情况的网络延迟是否正常
- 使用 traceroute 确认路由是否正确,并查看路由中每一跳网关的延迟
- tcpdump 和 wireshark 确认网络包的收发是否正常
- 使用 strace 等,观察应用程序对网络套接的调用情况是否正常。
> 第一次见到了 Nagle 算法。也知道了服务端关闭icmp时怎么用tcp/udp测试网络延迟
Linux 中的 NAT, 基于捏合的连接跟踪模块实现。 它维护每个连接状态的同时,对网络性能有一定影响。
SystemTap 是 Linux 的一种动态追踪框架,它把用户提供的脚本,转换为内核模块来执行,用来监测和跟踪内核的行为
https://mp.weixin.qq.com/s/VYBs8iqf0HsNg9WAxktzYQ:(多个容器snat时因为搜索本地可用端口(都从1025开始,到找到可用端口并插入到conntrack表是一个非事务并且有时延--第二个插入会失败,进而导致第一个syn包被扔掉的错误,扔掉后重传找到新的可用端口,表现就是时延偶尔为1秒或者3秒)
其实遇到很多问题的时候多看看内核日志就知道了,linux很智能的,很多报错信息都在日志里面,越遇到系统优化层面,就多要看看内核日志,我一般是使用journalctl -k -f来查看,有报错信息就Google,线上遇到nf_conntrack: table full,就是这样排查出来的,查看内核日志真的很重要,特别应用日志没看出什么来的时候
确定优化目标。
降低网络延迟 RTT、提高吞吐量 BPS、PPS 。 对于数据库、缓存等系统。快速完成网络收发,低延迟等目标。
按照协议栈的每一层进行测试。
每个套接字都收一个读写缓存取。
套接字配置选项,修改网络连接的行为:
cat /proc/sys/net/ipv4/tcp_mem 查看配置
cat /proc/net/sockstat 查看当前tcp的统计
然后可以通过 sysctl -w net.ipv4.tcp_mem=新配置 来增大
TCP 有三个需要优化的场景:
网络层,负责网络包的封装、寻址和路由,包括 IP、ICMP 等常见协议。在网络层,最主要的优化,其实就是对路由、 IP 分片以及 ICMP 等进行调优
链路层负责网络包在物理网络中的传输,比如 MAC 寻址、错误侦测以及通过网卡传输网络帧等。自然,链路层的优化
开启网络接口的多队列功能。这样,每个队列就可以用不同的中断号,调度到不同 CPU 上执行,从而提升网络的吞吐量
NAT 网络地址转换。 NAT 可以冲写 IP 数据包的源 IP 或者目的 IP
NAT 技术能够重写 IP 数据包的源 IP 或目的 IP,所以普遍用来解决公网 IP 地址短缺的问题。它可以让网络中的多台主机,通过共享同一个公网 IP 地址,来访问外网资源。同时,由于 NAT 屏蔽了内网网络,也为局域网中机器起到安全隔离的作用
1)iptalbes的三个表
filter 这个表主要用于过滤包的,是系统预设的表,这个表也是阿铭用的最多的。内建三个链INPUT、OUTPUT以及FORWARD。INPUT作用于进入本机的包;OUTPUT作用于本机送出的包;FORWARD作用于那些跟本机无关的包。
nat 主要用处是网络地址转换,也有三个链。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。该表阿铭用的不多,但有时候会用到。
mangle 这个表主要是用于给数据包打标记,然后根据标记去操作哪些包。这个表几乎不怎么用。除非你想成为一个高级网络工程师,否则你就没有必要花费很多心思在它上面
sk_buff、套接字缓冲、连接跟踪等,都通过 slab 分配器来管理。你可以直接通过 /proc/slabinfo,来查看它们占用的内存大小
Linux 协议栈,通过五元组来标志一个连接(即协议,源 IP、源端口、目的 IP、目的端口) 上面这些因素,哪个是变的,哪个是不变的.....
对于客户端, 是。
对于服务端, 不是。
socket连接是通过五元组唯一确定的,但实际写服务端程序时,还是会根据经验限定到65530。
服务器端单进程同时打开的文件数限制,平常限制的也是65535(可以继续调大)。一个进程默认还会打开2个文件,stdout stderr,所以需要再减2,如果有监听一个端口,还需要再减1。 有一次在生产环境中,同时连接数限制的是65535,结果到65533个连接时,把监听的端口给关闭了。(可能是所用框架导致的)虽然已有的连接未受影响,但之后就无法再接受新连接了。
[x] 案例篇:怎么缓解 DDoS 攻击带来的性能下降问题?
[x] 案例篇:网络请求延迟变大了,我该怎么办?
[x] 案例篇:如何优化 NAT 性能?(上)
[x] 案例篇:如何优化 NAT 性能?(下)
[x] 套路篇:网络性能优化的几个思路(上)
[x] 套路篇:网络性能优化的几个思路(下)
[x] 答疑(五):网络收发过程中,缓冲区位置在哪里?
github blog 被攻击: https://github.blog/2018-03-01-ddos-incident-report/
书籍📚推荐: effective Tcp/ip programming
iptables原理和写法
相关参考
Iptables