Nginx安全指南

Nginx后端服务指定的Header隐藏状态服务配置描述

隐藏Nginx后端服务X-Powered-By头检查提示

–加固建议

隐藏Nginx后端服务指定Header的状态:

1、打开conf/nginx.conf配置文件;

2、在http下配置proxy_hide_header项; 增加或修改为 proxy_hide_header X-Powered-By; proxy_hide_header Server;

应为每个核心站点启用access_log指令

默认情况下启用。检查提示

–加固建议

开启Nginx的WEB访问日志记录:

1、打开conf/nginx.conf配置文件,含主配置文件中include项包含的子配置文件;

2、在http下配置access_log
access_log logs/host.access.log main; 

3、并在主配置文件,及主配置文件下的include文件中 删除off项或配置为适当值

确保NGINX配置文件权限为644文件权限描述

把控配置文件权限以抵御外来攻击检查提示

–加固建议

修改Nginx配置文件权限: 执行chmod 644 <conf_path>来限制Nginx配置文件的权限;(<conf_path>为配置文件的路径,如默认/安装目录/conf/nginx.conf或者/etc/nginx/nginx.conf,或用户自定义,请 自行查找)

检查是否配置Nginx账号锁定策略。身份鉴别描述

1.执行系统命令passwd -S nginx来查看锁定状态 出现Password locked证明锁定成功 如:nginx LK ….. (Password locked.)或nginx L ….

2.默认符合,修改后才有(默认已符合)

3.执行系统命令passwd -l nginx进行锁定检查提示

–加固建议

配置Nginx账号登录锁定策略: Nginx服务建议使用非root用户(如nginx,nobody)启动,并且确保启动用户的状态为锁定状态。可执行passwd -l <Nginx启动用户> 如passwd -l nginx 来锁定Nginx服务的启动用户。命令 passwd -S <用户> 如passwd -S nginx可查看用户状态。 修改配置文件中的nginx启动用户修改为nginx或nobody 如: user nobody; 如果您是docker用户,可忽略该项(或添加白名单)

检查Nginx进程启动账号。服务配置描述

Nginx进程启动账号状态,降低被攻击概率检查提示

–加固建议

修改Nginx进程启动账号:

1、打开conf/nginx.conf配置文件;

2、查看配置文件的user配置项,确认是非root启动的;

3、如果是root启动,修改成nobody或者nginx账号; 备注:

4、修改完配置文件之后需要重新启动Nginx。

隐藏Nginx服务的Banner服务配置描述

Nginx服务的Banner隐藏状态检查提示

–加固建议

Nginx后端服务指定的Header隐藏状态隐藏Nginx服务Banner的状态:

1、打开conf/nginx.conf配置文件;

2、在server栏目下,配置server_tokens项 server_tokens off; 如出现多项不支持,执行ln <conf_path> /etc/nginx/nginx.conf

针对Nginx SSL协议进行安全加固服务配置描述

Nginx SSL协议的加密策略进行加固检查提示

–加固建议

Nginx SSL协议采用TLSv1.2:

1、打开conf/nginx.conf配置文件(或主配置文件中的inlude文件);

2、配置

server { 
               ...
              ssl_protocols TLSv1.2;
               ...
}

备注:配置此项请确认nginx支持OpenSSL,运行nginx -V 如果返回中包含built with OpenSSL则表示支持OpenSSL。 如不支持,可能需要增加配置ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 如果尚未配置ssl协议,请尽快配置(参考连接https://www.nginx.cn/doc/optional/ssl.html)

确保已禁用自动索引模块访问控制描述

自动索引模块处理以斜杠字符结尾的请求。此功能启用目录列表,这在攻击者侦察中可能很有用,因此应将其禁用。检查提示

–加固建议

执行以下操作以禁用自动索引模块: 搜索NGINX配置文件(NGINX.conf和任何包含的配置文件)以查找autoindex指令。
egrep -i '^\s*autoindex\s+' <main_config_path> egrep -i '^\s*autoindex\s+' <sub_config_path> 在location下删除或者修改为 autoindex off;

提高安全性的最佳 Nginx 配置

网络安全 渗透测试 知识汇总

常见攻击方式和漏洞

DDOS 和 CC 攻击

什么是 DDoS 攻击?-知乎

DDoS话题 -知乎

DDOS攻击和CC攻击分别是怎样的?-知乎

DDOS百度百科,ddos在传输层使用各种方式,挤兑占用服务器资源,造成正常用户无法访问。

CC攻击百度百科,cc攻击是ddos攻击的一种方式,在应用层,使用代理方式对服务器资源进行占用挤兑,造成正常用户无法访问。

防御

DDOS 攻击的防范教程 – 阮一峰

付费产品

游戏盾 WAF CloudFlare BGP高防IP

WEB常见漏洞

汇总一些常用的渗透测试方法和工具,用于安全测试

kail linux 渗透测试专用操作系统

渗透测试

https://github.com/GoVanguard/legion

https://github.com/secforce/sparta

sqlmap sql注入扫描工具

DNSLog

是一种回显机制,攻击者可以通过DNS的解析日志来读取漏洞执行的回显结果。  

http://www.dnslog.cn/

http://ceye.io

网络安全应急响应实战手册

服务器挖矿木马[kthreaddi]处理记录

参考

[kthreaddi]挖矿病毒处理,终于解决了!

Linux – kthreaddi 进程导致CPU超高问题 处理记录

处理服务器恶意程序 kthreaddi挖矿

记服务器被入侵挖矿病毒kthreaddi处理解决过程思路

第一次处理

使用参考链接2方式,清除了定时任务,kill -s 9 进程之后正常了。由于同事离职没有收到反馈并继续观察。

第二次处理

后续接手项目,发现又有了继续按原方法清理定时任务,发现一条特别的定时任务,路径在/data/wwwroot/default/phpmyadmin 下,[kthreaddi]进程用户是www可能是通过php web方式注入的。看了一下使用oneinstack脚本后没有删除默认工具目录,于是删除default目录。然后禁用nginx默认虚拟主机使其无法通过ip访问,使用安全组关闭其他端口只开放常用端口。

kill 进程,发现没有用还是会自动重启,看了参考链接1的方式,得到灵感猜想可能有另一个进程负责重启[kthreaddi]进程。使用netstat -ltnp命令发现了一个非法进程监听 52281端口

于是kill 掉 非法进程,然后kill 掉 [kthreaddi] 进程,top命令观察发现正常了。

总结

此类木马通过定时任务重启,也可能结合systemd 或init脚本开机自启, 也可能使用其它伪装的正常进程来重启

延展阅读,更复杂案例top查看不到进程

应急响应:记一次花样贼多的挖矿病毒

Linux挖矿木马的技术演进探讨

【漏洞预警】Laravel <= 8.4.2 Debug模式 _ignition 远程代码执行漏洞

https://help.aliyun.com/noticelist/articleid/1060782748.html

2021年1月13日,阿里云应急响应中心监控到国外某安全研究团队披露了Laravel <= 8.4.2 存在远程代码执行漏洞。

漏洞描述

Laravel 是一个免费的开源 PHP Web 框架,旨在实现的Web软件的MVC架构。2021年1月13日,阿里云应急响应中心监控到国外某安全研究团队披露了 Laravel <= 8.4.2 存在远程代码执行漏洞。当Laravel开启了Debug模式时,由于Laravel自带的Ignition功能的某些接口存在过滤不严,攻击者可以发起恶意请求,通过构造恶意Log文件等方式触发Phar反序列化,从而造成远程代码执行,控制服务器。漏洞细节已在互联网公开。阿里云应急响应中心提醒 Laravel 用户尽快采取安全措施阻止漏洞攻击。

影响版本

Laravel 框架 < 8.4.3

facade ignition 组件 < 2.5.2

安全版本

Laravel 框架 >= 8.4.3

facade ignition 组件 >= 2.5.2

安全建议

建议将 Laravel 框架升级至8.4.3及其以上版本,或者将 facade ignition组件升级至 2.5.2 及其以上版本。

相关链接

https://github.com/facade/ignition/pull/334

https://www.ambionics.io/blog/laravel-debug-rce

PHP解决跨域 常用方法

前置知识

接口站点 nginx 配置 添加请求头 和 自动响应

#表示允许这个域跨域调用(客户端发送请求的域名和端口) 
#$http_origin动态获取请求客户端请求的域,不用*的原因是带cookie的请求不支持*号
add_header Access-Control-Allow-Origin $http_origin;

#表示请求头的字段 动态获取
add_header Access-Control-Allow-Headers $http_access_control_request_headers;

#指定允许跨域的方法,* 代表所有
add_header Access-Control-Allow-Methods "GET,POST,PUT,PATCH,DELETE,OPTIONS";

#带cookie请求需要加上这个字段,并设置为true
add_header Access-Control-Allow-Credentials true;

#预检命令的缓存,如果不缓存每次会发送两次请求 单位s
add_header Access-Control-Max-Age 3600;

#自动响应options请求
if ($request_method = OPTIONS){
    return 204;
}

页面站点 nginx 配置 使用反向代理请求接口

通过代理将页面站点和接口站点变成同域

前置条件:页面的路由不能和接口路由存在冲突,否则路由无法代理到接口

ex: 所有接口的前缀都是/api 且页面路由中不存在 /api前缀

location = /api {
  proxy_pass http://apihost;
}

PHP响应增加请求头

此方法也可用于不支持自动跨域php框架,在框架入口文件 或者 路由文件 最上方增加 header

header("Access-Control-Allow-Origin: *"); //允许请求来源
header("Access-Control-Allow-Credentials : true"); //允许携带cookies
header("Access-Control-Allow-Headers: *");//允许请求头
header("Access-Control-Allow-Methods: GET,POST,PUT,PATCH,DELETE,OPTIONS");//允许请求方法
header("Access-Control-Max-Age: 3600");//预检请求缓存时间

Laravel 框架

使用laravel-cors 扩展包

laravel 7.0 以后版本 官方集成了 laravel-cors 扩展包 文档

return [
    'paths' => ['api/*', 'sanctum/csrf-cookie'], //触发cors的路由前缀

    'allowed_methods' => ['*'],//允许请求方法

    'allowed_origins' => ['*'], //允许请求来源

    'allowed_origins_patterns' => [],//允许请求来源,正则表达式匹配

    'allowed_headers' => ['*'], //允许请求头

    'exposed_headers' => [], //排除的请求头

    'max_age' => 0, //预检请求缓存时间

    'supports_credentials' => false, //是否允许携带cookie
];

参考

MDN文档 跨域资源共享

网络基础知识

网络协议 百科

是程序(人)与计算机,计算机与计算机交流(通讯)的基础,通俗的比喻,人与人之间交流需要同一种语言,计算机的网络通讯需要协议。

协议的三要素

语法:一断内容要符合一定的规则和格式,例如http协议的开头是http://xxx.com

语义:这一段内容规则代表的含义,例如http开头就表示http协议

顺序:先干啥后干啥

网络分层

7层是指OSI七层协议模型,主要是:应用层(Application)表示层(Presentation)会话层(Session)传输层(Transport)网络层(Network)数据链路层(Data Link)物理层(Physical)

5层只是OSI和TCP/IP的综合,是业界产生出来的非官方协议模型,但是很多具体的应用。实际应用还是TCP/IP的四层结构。为了方便可以把下两层称为网络接口层。五层体系结构包括:应用层运输层网络层数据链路层物理层。 

4层是指TCP/IP四层模型,主要包括:应用层运输层网际层网络接口层

网络为什么要分层

复杂的程序都要分层,这是程序设计的要求

个人理解,分层相当于人类社会的分工协作,目的是提升效率便于管理,很多网络程序都是采用这种模型,不同的进程做不同的事情。

复杂的事情简单化就要拆分。

域名

百度百科 维基百科

IP地址

IP(英语:Internet Protocol Address)是一种在Internet上的给主机编址的方式,也称为网际协议地址。常见的IP地址,分为IPv4IPv6两大类。

通俗的比喻,就相当于我们的通讯地址(你住哪),邮件快递都需要通讯地址。

MAC地址

MAC地址也叫物理地址、硬件地址,由网络设备制造商生产时烧录在网卡(Network lnterface Card)的EPROM(一种闪存芯片,通常可以通过程序擦写)

通俗的比喻,相当于我们的身份证,身份证号是唯一的不能不变。但是可以造假,操作系统识别出来的mac地址是可以更改的,它只不过是一个字符串。我们常说的修改mac指的是修改电脑中记录的既注册表中的记录

为什么需要两种地址

送快递的时候,既要验证地址对不对,又要验证人对不对,ip4地址不够用,很多网络对外是一个公网IP

公有地址 百科

公有地址(Public address)由Inter NIC(Internet Network Information Center因特网信息中心)负责。
这些IP地址分配给注册并向Inter NIC提出申请的组织机构。通过它直接访问因特网。即常说的公网IP查询

私有地址 百科

在现在的网络中,IP地址分为公网IP地址和私有IP地址。公网IP是在Internet使用的IP地址,而私有IP地址则是在局域网中使用的IP地址。私有IP地址是一段保留的IP地址。只使用在局域网中,无法在Internet上使用。即内网IP

地址范围

无类型域间选路(CIDR)百科

产生原因:地址划分不合理

C 类地址能包含的最大主机数量实在太少了,只有 254 个。当时设计的时候恐怕没想到,现在估计一个网吧都不够用吧。而 B 类地址能包含的最大主机数量又太多了。6 万多台机器放在一个网络下面,一般的企业基本达不到这个规模,闲着的地址就是浪费。

将 32 位(说的是二进制形式)的 IP 地址一分为二,前面是网络号,后面是主机号。从哪里分呢?你如果注意观察的话可以看到,10.100.122.2/24,这个 IP 地址中有一个斜杠,斜杠后面有个数字 24。这种地址表示形式,就是 CIDR。后面 24 的意思是,32 位中,前 24 位是网络号,后 8 位是主机号。

一般云主机的安全组白名单设置使用这种规则。 反爬虫笔记

特殊地址

广播地址 百科

广播地址(Broadcast Address)是专门用于同时向网络中(通常指同一子网)所有工作站进行发送的一个地址。

任何第一个字节大于223小于240的IP地址(范围224.0.0.1-239.255.255.254)是多点广播地址

网络通讯方式有单播,广播,组播。广播应用,有线电视,DHCP服务

通俗的比喻,老师需要对全班发送相同通知(信息),如果一个一个叫到办公室里说,非常好使,直接在教师里通知大家效率高。

子网掩码 百科

子网掩码(subnet mask)又叫网络掩码地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址主机地址两部分。

作用

子网掩码是在IPv4地址资源紧缺的背景下为了解决lP地址分配而产生的虚拟lP技术,通过子网掩码将A、B、C三类地址划分为若干子网,从而显著提高了IP地址的分配效率,有效解决了IP地址资源紧张的局面。另一方面,在企业内网中为了更好地管理网络,网管人员也利用子网掩码的作用,人为地将一个较大的企业内部网络划分为更多个小规模的子网,再利用三层交换机的路由功能实现子网互联,从而有效解决了网络广播风暴和网络病毒等诸多网络管理方面的问题

0.0.0.0 百科

代表当前主机

127.0.0.1 百科

127.0.0.1是回送地址,指本地机,一般用来测试使用。回送地址(127.x.x.x)是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回,不进行任何网络传输。

网关 百科

网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。同层–应用层

通俗比喻,大家都知道,从一个房间走到另一个房间,必然要经过一扇门。同样,从一个网络向另一个网络发送信网关息,也必须经过一道“关口”,这道关口就是网关。顾名思义,网关(Gateway [1] 就是一个网络连接到另一个网络的“关口”。也就是网络关卡

TIPS 由于历史的原因,许多有关TCP/IP的文献曾经把网络层使用的路由器称为网关,在今天很多局域网采用都是路由来接入网络,因此通常指的网关就是路由器的IP

网关实质上是一个网络通向其他网络的IP地址。

DNS 百科

域名系统(服务)协议(DNS)一种分布式网络目录服务,主要用于域名与 IP 地址的相互转换

通俗的解释,即使访问网站如果让用户输入ip地址,太麻烦,不好记(缺少语义),于是发明了URL来定位站。

DNS是就是URL和IP的映射关系,通过URL查询到对应服务器的IP,然后访问。

查找IP地址的过程,这个过程就是域名解析

域名注册后,注册商为域名提供免费的静态解析服务。
一般的域名注册商不提供动态解析服务,如果需要用动态解析服务,需要向动态域名服务商支付域名动态解析服务费。

本机的DNS是hosts文件,操作系统网络程序会优先查询hosts

Hosts文件 百科

Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析

路由 百科

路由(routing)是指分组从源到目的地时,决定端到端路径的网络范围的进程 [1] 。路由工作在OSI参考模型第三层——网络层数据包转发设备。路由器通过转发数据包来实现网络互连。虽然路由器可以支持多种协议(如TCP/IP、IPX/SPX、AppleTalk等协议),但是在我国绝大多数路由器运行TCP/IP协议路由器通常连接两个或多个由IP子网或点到点协议标识的逻辑端口,至少拥有1个物理端口。路由器根据收到数据包中的网络层地址以及路由器内部维护的路由表决定输出端口以及下一跳地址,并且重写链路层数据包头实现转发数据包。路由器通过动态维护路由表来反映当前的网络拓扑,并通过网络上其他路由器交换路由和链路信息来维护路由表。

静态路由 百科

静态路由(英语:Static routing),一种路由的方式,路由项(routing entry)由手动配置,而非动态决定。与动态路由不同,静态路由是固定的,不会改变,即使网络状况已经改变或是重新被组态。一般来说,静态路由是由网络管理员逐项加入路由表

动态路由 百科

动态路由是指路由器能够自动地建立自己的路由表,并且能够根据实际情况的变化适时地进行调整

网络协议

UDP协议

UDP协议介绍,无状态,无响应,不保证可靠性会丢包

场景:

1.需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用

2.不需要一对一沟通,建立连接,而是可以广播的应用

3.需要处理速度快,时延低,可以容忍少数丢包,但是要求即便网络拥塞,也毫不退缩,一往无前的时候

TCP协议

TCP消息类型

信息描述
Syn用于启动和建立连接。它还可以帮助您在设备之间同步序列号。
ACK帮助对方确认它已收到SYN。
SYN-ACK来自本地设备的SYN消息和先前数据包的ACK。
FIN (鳍)用于终止连接。

三次握手

三次握手时序图

开始,客户端和服务端都处于 CLOSED 状态。

先是服务端主动监听某个端口,处于 LISTEN 状态。然后客户端主动发起连接 SYN,之后处于 SYN-SENT 状态 (第一次)

服务端收到发起的连接,返回 SYN,并且 ACK 客户端的 SYN,之后处于 SYN-RCVD 状态(第二次)

客户端收到服务端发送的 SYN 和 ACK 之后,发送 ACK 的 ACK,之后处于 ESTABLISHED 状态,因为它一发一收成功了(第三次)

服务端收到 ACK 的 ACK 之后,处于 ESTABLISHED 状态,因为它也一发一收了

四次挥手

四次挥手时序图

第一次挥手, A发送FIN,进入FIN_WAIT1状态,B收到FIN 进入CLOSED_WAIT状态,

第二次挥手,A收到ACK,进入FIN_WAIT_2状态(如果此时B断开,则A将永远留在这个状态,TCP协议没有对这个状态的处理,linux有,可以通过tcp_fin_timeout草书,设置超时

第三次挥手,B发送FIN,ACK到达A,

第四次挥手,A发送ACK给B,进入TIME_WAIT时间(这个时间足够长,足够B重新发送第三方次挥手,然后A重新进行第四次挥手,可以防止产生混乱,如端口被新应用占领,等到原先的包都失效,在空出新端口)

协议规定等待时间为 2MSL(2分钟),MSL 是 Maximum (最大) Segment (段) Lifetime (一生) ,报文最大生存时间。任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。实际应用中常用的是30秒,1分钟和2分钟。

TCP状态机

DNS 协议

这个协议就像是个地址簿,主要负责 “域名” => “IP 地址” 的查询。每次我们要邮寄信件之前都要拿出来查一查。

DHCP 协议

DHCP 全称叫动态主机配置协议(Dynamic Host (主机) Configuration Protocol (协议) ),主要负责计算机接入网络时的初始化。计算机刚开始就只有网卡的 MAC 地址,通过 DHCP 可以给它分配 IP 地址,并得到默认网关地址(这很重要,不知道网关就上不了网)和 DNS 服务器的地址。有了这些东西,这台计算机就可以和外界通讯了

ARP 协议

IP => Mac 根据ip地址获取mac地址

ARP 全称叫地址解析协议( Address (地址) Resolution Protocol),它服务于现在局域网中最流行的以太网协议。在以太网中,ARP 协议负责解析远程主机 IP 地址对应的 MAC 地址。之所以需要 ARP 协议,是因为我们平常应用程序连接目标计算机进行网络通讯时,都是提供了域名或 IP 地址。但对以太网来说,要想发信件出去,它要的是对方的 MAC 地址

RARP 协议

RARP 全称叫反向地址转换协议(Reverse Address (地址) Resolution Protocol (协议) )。顾名思义,它和 ARP 协议相反,负责的是 MAC 地址到 IP 地址的转换。RARP 协议已经被上面的 DHCP 协议所取代,平常用不太到了。

ICMP 协议

ICMP 全称叫互联网控制报文协议(Internet Control Message Protocol),它能够检测网路的连线状况,以保证连线的有效性。基于这个协议实现的常见程序有两个:ping 和 traceroute,它们可以用来判断和定位网络问题。

IGMP 协议

IGMP 全称叫互联网组管理协议(Internet Group Management Protocol (协议) ),它负责 IP 组播(Multicast)成员管理


数据传输过程

笔记参考

极客时间 趣谈网络协议

网络配置要素 https://www.cnblogs.com/guojun-junguo/p/9966412.html

网络分层 https://blog.csdn.net/cc1949/article/details/79063439

网络通讯模式 https://www.cnblogs.com/hnrainll/archive/2011/09/01/2161839.html

极客时间 许式伟架构课 IP网络:连接世界的桥梁

TCP协议(上):因性恶而复杂,先恶后善反轻松

TCP协议(下):西行必定多妖孽,恒心智慧消磨难

TCP 三次握手(SYN,SYN-ACK,ACK)

漏洞修复

参考

 允许Traceroute探测

本插件使用Traceroute探测来获取扫描器与远程主机之间的路由信息。攻击者也可以利用这些信息来了解目标网络的网络拓扑。


在防火墙中禁用Time Exceeded类型的ICMP包

Iptales防火墙

sudo iptables -A INPUT -p ICMP --icmp-type time-exceeded -j DROP
sudo iptables -A OUTPUT -p ICMP --icmp-type time-exceeded -j DROP
sudo service iptables save
sudo service iptables restart

可通过HTTP获取远端WWW服务信息

nginx

配置 server_tokens off

apache

  1. ServerSignature off;  
  2. ServerToken Prod;  

php

配置 expose_php off https://www.php.net/manual/zh/ini.core.php#ini.expose-php

目标主机rpcinfo -p信息泄露

检测到远端RPCBIND/PORTMAP正在运行中(CVE-1999-0632)

探测到SSH服务器支持的算法

无法处理。ssh协议协商过程就是服务端要返回其支持的算法列表。

SSH版本信息可被获取

无法处理。sshd_config中的Banner项只是ssh主机前输出的信息,源码处理机制就是telnet其端口就会返回版本信息。

Ubuntu下Wireshark普通权限不足之解决方案

参考https://blog.csdn.net/wilsonpeng3/article/details/47209915

安装后打开wireshark 提示权限不足消息:

Couldn’t run /usr/bin/dumpcap in child process: Permission denied

解决方案

~$ sudo groupadd wireshark
groupadd: group 'wireshark' already exists
~$ sudo usermod -a -G wireshark you-user-name
~$ newgrp wireshark
~$ sudo chgrp wireshark /usr/bin/dumpcap
~$ sudo chmod 754 /usr/bin/dumpcap
~$ sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap

Restful Api 风格规范研究

状态码用http status code 还是 在response body 中自定义code

列举总结一下各大厂的API的设计风格

总结

  • 国内资讯类大厂出于兼容性考虑 以及杀毒软件和安全浏览器 拦截404 页面 等并未采用REST API
  • 业务复杂度高的开放平台也未采用Rest API 如支付宝,微信,微博
  • 国外API多采用REST API 包括很多框架的设计(PHP Laravel)

百度手机站

jsonp http status code 200

百度PC站

jsonp ,收集搜索数据接口 http status code 200

今日头条PC

json,使用message区分状态 http status code 200

今日头条手机站

json http status code 200 has_more 区分

新浪微博PC

json http status code 200 直接返回html

微博手机站

Google手机站

restful api

极光推送

RestFul API HTTP STATUS CODE + Response Body 自定义CODE

GitHub

Restful API https://developer.github.com/v3/#client-errors

个人结论

遵守RFC规范,遵守业内标准,融入生态,工业技术是要标准化的。

更详细的论述看左耳朵耗子的文章 “一把梭: REST API 全用 POST”

应用案例

laravel框架默认的错误信息返回风格

去掉最外层data数据包裹 文档

参考

Linux网络调试 常用命令和分析工具 排查方法

查看/配置网络

ifconfig 查看IP地址

https://wangchujiang.com/linux-command/c/ifconfig.html

enx00e04cf0a10c: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.5  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 2408:8207:305c:1c30:b48f:56c7:81bb:bb9  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::2c1b:1b85:35cd:9642  prefixlen 64  scopeid 0x20<link>
        inet6 2408:8207:305c:1c30:e49b:195a:eeaa:1e44  prefixlen 64  scopeid 0x0<global>
        ether 00:e0:4c:f0:a1:0c  txqueuelen 1000  (Ethernet)
        RX packets 29715  bytes 31484642 (31.4 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 22107  bytes 3794564 (3.7 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 4003  bytes 2920205 (2.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4003  bytes 2920205 (2.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
wlp4s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.111  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::6e92:514f:2d68:1da1  prefixlen 64  scopeid 0x20<link>
        ether 14:4f:8a:60:f2:2a  txqueuelen 1000  (Ethernet)
        RX packets 106  bytes 9074 (9.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 129  bytes 19965 (19.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

e开头的一般是有线网卡 例eth

lo 全称是 loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现

wlp开头表示无线网卡

flags = 4163 没有搜到什么意思

UP表示接口启用

BROADCAST 表示主机支持广播

RUNNING 表示接口正在工作

MULTICAST 主机支持多播

MTU:1500 最大传输单元 1500字节 百科

inet 网卡的IP地址

netmask 网络掩码

broadcast 广播地址

inet6 fe80::2aa:bbff:fecc:ddee prefixlen 64 scopeid 0x20<link> IPv6地址

ether 00:e0:4c:f0:a1:0c 连接类型:Ethernet (以太网) HWaddr (硬件mac地址)

txqueuelen (网卡设置的传送队列长度)

RX packets 接收时,正确的数据包数

RX bytes 接收的数据量

RX errors 接收时,产生错误的数据包数

RX overruns 接收时,由于速度过快而丢失的数据包数

RX dropped 接收时,丢弃的数据包数

RX frame 接收时,发生frame错误而丢失的数据包数

TX carrier 发送时,发生carrier错误而丢失的数据包数

TX collisions 冲突信息包的数目

mii-tool 配置网络设备协商方式的工具

https://wangchujiang.com/linux-command/c/mii-tool.html

是用于查看、管理介质的网络接口的状态,有时网卡需要配置协商方式,比如10/100/1000M的网卡半双工、全双工、自动协商的配置。但大多数的网络设备是不用我们来修改协商,因为大多数网络设置接入的时候,都采用自动协商来解决相互通信的问题。不过自动协商也不是万能的,有时也会出现错误,比如丢包率比较高,这时就要我们来指定网卡的协商方式。mii-tool就是能指定网卡的协商方式。下面我们说一说mii-tool的用法。

sudo mii-tool -v enx00e04cf0a10c
enx00e04cf0a10c: negotiated 100baseTx-FD, link ok
product info: vendor 00:07:32, model 0 rev 0
basic mode: autonegotiation enabled
basic status: autonegotiation complete, link ok
capabilities: 1000baseT-FD 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD
advertising: 1000baseT-FD 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD flow-control
link partner: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD

link ok 表示网线连接ok

basic mode: autonegotiation enabled 启用自动协商

route 查看网关

https://wangchujiang.com/linux-command/c/route.html

显示并设置Linux中静态路由表

常用方式 route -n 不执行DNS反向查找,直接显示数字形式的IP地址

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 enx00e04cf0a10c
0.0.0.0         192.168.0.1     0.0.0.0         UG    600    0        0 wlp4s0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 wlp4s0
192.168.0.0     0.0.0.0         255.255.255.0   U     600    0        0 wlp4s0
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enx00e04cf0a10c

ip 网络配置工具

https://wangchujiang.com/linux-command/c/ip.html

用来显示或操纵Linux主机的路由、网络设备、策略路由和隧道

支持信息的object

OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm | netns | l2tp | macsec | tcp_metrics | token }

nc 全称netcat

用于设置路由器。它能通过 TCP 和 UDP 在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。

https://wangchujiang.com/linux-command/c/nc.html

查看端口实例

nc -vz xiaoyuapi.zcoming.com 443 -w2
Connection to xiaoyuapi.zcoming.com 443 port [tcp/https] succeeded!

故障排除

ping 测试主机之间网络的连通性

https://wangchujiang.com/linux-command/c/ping.html

执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常

traceroute 显示数据包到主机间的路径

https://wangchujiang.com/linux-command/c/traceroute.html

用于追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字节。

通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。

traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其ip地址。

traceroute www.58.com
traceroute to www.58.com (211.151.111.30), 30 hops max, 40 byte packets
 1  unknown (192.168.2.1)  3.453 ms  3.801 ms  3.937 ms
 2  221.6.45.33 (221.6.45.33)  7.768 ms  7.816 ms  7.840 ms
 3  221.6.0.233 (221.6.0.233)  13.784 ms  13.827 ms 221.6.9.81 (221.6.9.81)  9.758 ms
 4  221.6.2.169 (221.6.2.169)  11.777 ms 122.96.66.13 (122.96.66.13)  34.952 ms 221.6.2.53 (221.6.2.53)  41.372 ms
 5  219.158.96.149 (219.158.96.149)  39.167 ms  39.210 ms  39.238 ms
 6  123.126.0.194 (123.126.0.194)  37.270 ms 123.126.0.66 (123.126.0.66)  37.163 ms  37.441 ms
 7  124.65.57.26 (124.65.57.26)  42.787 ms  42.799 ms  42.809 ms
 8  61.148.146.210 (61.148.146.210)  30.176 ms 61.148.154.98 (61.148.154.98)  32.613 ms  32.675 ms
 9  202.106.42.102 (202.106.42.102)  44.563 ms  44.600 ms  44.627 ms
10  210.77.139.150 (210.77.139.150)  53.302 ms  53.233 ms  53.032 ms
11  211.151.104.6 (211.151.104.6)  39.585 ms  39.502 ms  39.598 ms
12  211.151.111.30 (211.151.111.30)  35.161 ms  35.938 ms  36.005 ms

记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,我们看到每行有三个时间,单位是ms,其实就是-q的默认参数。探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;如果用traceroute -q 4 www.58.com,表示向每个网关发送4个数据包。

有时我们traceroute一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。

有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台DNS出现问题时,不能解析主机名、域名时,也会 有延时长的现象;您可以加-n参数来避免DNS解析,以IP格式输出数据。

如果在局域网中的不同网段之间,我们可以通过traceroute 来排查问题所在,是主机的问题还是网关的问题。如果我们通过远程来访问某台服务器遇到问题时,我们用到traceroute 追踪数据包所经过的网关,提交IDC服务商,也有助于解决问题;但目前看来在国内解决这样的问题是比较困难的,就是我们发现问题所在,IDC服务商也不可能帮助我们解决。

mtr My traceroute

https://www.cnblogs.com/alexyuyu/articles/2811346.html

Linux 网络诊断工具MTR(My traceroute) 结合了ping跟tracert的一个工具

首先看最后一行,目标服务器有没有丢包,有的话再往前分析。

测试指定端口实例

sudo mtr -P 443 -i 0.5 -rwc 50 xiaoyuapi.zcoming.com

nslookup

是常用域名查询工具,就是查DNS信息用的命令。

https://wangchujiang.com/linux-command/c/nslookup.html

非交互模式直接加域名

nslookup xiaoyuapi.zcoming.com
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	xiaoyuapi.zcoming.com
Address: 47.92.203.163

telnet 登录远程主机和管理(测试ip端口是否连通)

https://wangchujiang.com/linux-command/c/telnet.html

telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了。但仍然有很多别的系统可能采用了telnet方式来提供远程登录,因此弄清楚telnet客户端的使用方式仍是很有必要的

检测端口,如下表示端口正常

telnet xiaoyuapi.zcoming.com 443
Trying 47.92.203.163...
Connected to xiaoyuapi.zcoming.com.
Escape character is '^]'.

tcpdump

https://wangchujiang.com/linux-command/c/tcpdump.html

 是一款抓包,嗅探器工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析

netstat 查看Linux中网络系统状态信息

https://wangchujiang.com/linux-command/c/netstat.html

可以查看网络协议tcp/udp ip地址监听状态 程序进程id等

netstat -ltnp //查看监听中的进程

ss socket统计信息

https://wangchujiang.com/linux-command/c/ss.html

比 netstat 好用的socket统计信息,iproute2 包附带的另一个工具,允许你查询 socket 的有关统计信息

命令安装

有些发行版可能没有这些命令需要自己安装

net-tools包含以下常用的命令:apt-get install net-tools

  • ifconfig:显示和配置网络接口的信息。
  • netstat:显示网络连接、路由表和网络统计信息。
  • arp:显示和操作ARP缓存。
  • route:显示和操作IP路由表。
  • hostname:显示或设置系统的主机名。

iproute2包含以下常用的命令: apt-get install iproute2

  • ip:用于配置和管理网络接口、路由表、策略路由、隧道、桥接等各种网络参数。
  • ss:显示套接字统计信息,包括网络连接、监听端口、进程关联的套接字等。
  • bridge:用于配置和管理网络桥接。
  • tc:配置和管理流量控制策略。
  • ipset:管理iptables使用的IP集合。
  • nstat:显示网络统计信息。
  • rtacct:显示路由表统计信息。

traceroute命令需要 apt-get install traceroute

网络监控工具

nethogs https://wangchujiang.com/linux-command/c/nethogs.html

//安装
sudo apt install nethogs
sudo yum install nethogs

//使用
sudo nethogs -d 1
sudo nethogs eth0 -d 1
GUI

网络问题排查思路

1.查看服务器服务是否正常,你的网络能否正常访问

当用户反馈APP或网站无法访问或卡顿的时候,首先用你的网络测试一下能否正常访问,

然后排查服务器是否有问题CPU,内存,网络,指标是否正常,进程数量,TCP连接数量 平均负载

各种日志,负载均衡日志,nginx日志,程序日志

2.客户端排查,收集详细的用户反馈

先让用户访问一些常用的网站和app,比如百度等,排除是否是用户的网络问题

收集问题用户数据,手机型号, 操作系统,网络类型(3G,4G,wifi) 运营商(移动,联通,电信),点击哪个模块哪个功能出现的网络故障提示,什么时间点,最好能录屏或者截个图。

或者在程序中增加功能,网络不好的时候弹窗提示用户反馈信息,用户点击反馈按钮收集客户端的ip操作系统型号,上报给服务器并记录下来,通过ip可以获取网络运营商的信息。

3.通过第三方测试平台,模拟用户的网络环境

站长之家测速工具

云服务提供商也用类似站点监控的工具 通过以上工具测试否为运营商问题

4.APP(移动测试)远程真机调试

参考

手机远程真机调试平台汇总
有哪些好用的App云测试平台

目前对移动App的测试主要指的是下面几部分:

兼容性测试——App对不同手机、操作系统版本的兼容性测试,包括安装、启动、卸载等。
功能测试——遍历应用的每一个角落,查看应用的功能、逻辑是否正常,完整。
性能测试——应用的性能怎样,如启动时间、反应时间、CPU占用率,内存占用率等。
稳定性测试——在一定时间内对App进行持续地测试,测试App运行的稳定性。
网络场景测试——测试不同网络环境中App的运行状况,如2G&3G,弱网络等。

Testin:Testin云测|全球领先的App及手游测试平台

腾讯优测:优测网-让测试更简单

贯众云测试:贯众云测试

百度MTC:百度移动云测试中心

阿里MQC:MQC 阿里移动质量中心

参考