Linux 网络命令具体有哪些呢

67次阅读
没有评论

共计 4337 个字符,预计需要花费 11 分钟才能阅读完成。

这篇文章给大家介绍 Linux 网络命令具体有哪些呢,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

 

看着 kali linux 上百个网络命令,我陷入了沉思。专业的网络命令实在是太多了,如果要罗列,上千个也是有的。个人不是渗透测试工作者,大部分功能只知皮毛。所以本文是非常浅显的技术总结,仅聚焦工作中常用到的一些 Linux 命令。

由于 nio 的普及,ck10k 的问题已经成为过去式。现在随便一台服务器,就可以支持数十万级别的连接了。那么我们来算一下,100 万的连接需要多少资源。

首先,每一个连接都是文件句柄,所以需要文件描述符数量支持才行,每一个 socket 内存占用 15k-20k 之间,这样,仅维护相应 socket,就需要 20G 内存;而广播一个 1KB 的消息需要占用的带宽为 1000M!

查看当前系统的连接

如何看当前系统有多少连接呢?可以使用 netstat 结合 awk 进行统计。如下脚本,统计了每一种状态的 tcp 连接数量

# netstat -antp | awk  {a[$6]++}END{ for(x in a)print x,a[x]}  LISTEN 41 CLOSE_WAIT 24 ESTABLISHED 150 Foreign 1 TIME_WAIT 92

但如果你在一台有上万连接的服务器上执行这个命令,你可能会等上很长时间。所以,我们有了第二代网络状态统计工具:netstat = ss。

# ss -s Total: 191 (kernel 220) TCP: 5056 (estab 42, closed 5000, orphaned 3, synrecv 0, timewait 5000/0), ports 3469 ...

netstat 属于 net-tools 工具集,而 ss 属于 iproute。其命令对应如下,是时候和 net-tools 说 Bye 了。

ss 命令

基本使用

我们按照使用场景来看下 ss 的用法。

查看系统正在监听的 tcp 连接

ss -atr ss -atn # 仅 ip

查看系统中所有连接

ss -alt

查看监听 444 端口的进程 pid

ss -ltp | grep 444

查看进程 555 占用了哪些端口

ss -ltp | grep 555

显示所有 UDP 连接

ss -u -a

查看 TCP sockets,使用 -ta 选项

查看 UDP sockets,使用 -ua 选项

查看 RAW sockets,使用 -wa 选项

查看 UNIX sockets,使用 -xa 选项

和某个 IP 的所有连接

ss dst 10.66.224.130 ss dst 10.66.224.130:http ss dst 10.66.224.130:smtp ss dst 10.66.224.130:443

显示所有的 HTTP 连接

ss dport = :http

查看连接本机最多的前 10 个 IP 地址

netstat -antp | awk  {print $4}  | cut -d  :  -f1 | sort | uniq -c | sort -n -k1 -r | head -n 10

Recv-Q 和 Send-Q

注意 ss 的执行结果,我们说明一下 Recv- Q 和 Send-Q。

这两个值,在 LISTEN 和 ESTAB 状态分别代表不同意义。一般,正常的应用程序这两个值都应该为 0(backlog 除外)。数值越大,说明问题越严重。

LISTEN 状态

Recv-Q:代表建立的连接还有多少没有被 accept,比如 Nginx 接受新连接变的很慢

Send-Q:代表 listen backlog 值

ESTAB 状态

Recv-Q:内核中的数据还有多少 (bytes) 没有被应用程序读取,发生了一定程度的阻塞

Send-Q:代表内核中发送队列里还有多少 (bytes) 数据没有收到 ack,对端的接收处理能力不强

查看网络流量

查看流量

有很多工具可以看网络流量,但我最喜欢 sar。sar 是 linux 上功能最全的监控软件。如图,使用 sar -n DEV 1 即可每秒刷新一次网络流量。

watch cat /proc/net/dev

查看占流量最大的 IP

有时候我们发现网络带宽占用非常高,但我们无法判断到底流量来自哪里。这时候,iftop 就可以帮上忙了。如图,可以很容易的找出流量来自哪台主机。

当你不确定内网的流量来源,比如有人在压测,api 调用不合理等,都可以通过这种方法找到他。

抓包

tcpdump

当我们需要判断是否有流量,或者调试一个难缠的 netty 应用问题,则可以通过抓包的方式去进行进一步的判断。在 Linux 上,可以通过 tcpdump 命令抓取数据,然后使用 Wireshark 进行分析。

tcpdump -i eth0 -nn -s0 -v port 80

-i 指定网卡进行抓包

-n 和 ss 一样,表示不解析域名

-nn 两个 n 表示端口也是数字,否则解析成服务名

-s 设置抓包长度,0 表示不限制

-v 抓包时显示详细输出,-vv、-vvv 依次更加详细

1)加入 - A 选项将打印 ascii,- X 打印 hex 码。

tcpdump -A -s0 port 80

2)抓取特定 IP 的相关包

tcpdump -i eth0 host 10.10.1.1 tcpdump -i eth0 dst 10.10.1.20

3)- w 参数将抓取的包写入到某个文件中

tcpdump -i eth0 -s0 -w test.pcap

4)tcpdump 支持表达式,还有更加复杂的例子,比如抓取系统中的 get,post 请求(非 https)

tcpdump -s 0 -v -n -l | egrep -i  POST /|GET /|Host:

更多参见

https://hackertarget.com/tcpdump-examples/

抓取的数据,使用 wireshark 查看即可。

HTTP 抓包

抓包工具将自身当作代理,能够抓取你的浏览器到服务器之间的通讯,并提供修改、重放、批量执行的功能。是发现问题,分析协议,攻击站点的利器。常用的有以下三款:

Burpsuite(跨平台)

Fiddle2 (Win)

Charles (Mac)

流量复制

你可能需要使你的生产环境 HTTP 真实流量在开发环境或者预演环境重现,这样就用到了流量复制功能。

有三个工具可供选择,个人倾向于 Gor。

Gor

TCPReplay

TCPCopy

连接数过多问题

根据 TCP/IP 介绍,socket 大概包含 10 个连接状态。我们平常工作中遇到的,除了针对 SYN 的拒绝服务攻击,如果有异常,大概率是 TIME_WAIT 和 CLOSE_WAIT 的问题。

TIME_WAIT 一般通过优化内核参数能够解决;CLOSE_WAIT 一般是由于程序编写不合理造成的,更应该引起开发者注意。

TIME_WAIT

TIME_WAIT 是主动关闭连接的一方保持的状态,像 nginx、爬虫服务器,经常发生大量处于 time_wait 状态的连接。TCP 一般在主动关闭连接后,会等待 2MS,然后彻底关闭连接。由于 HTTP 使用了 TCP 协议,所以在这些频繁开关连接的服务器上,就积压了非常多的 TIME_WAIT 状态连接。

某些系统通过 dmesg 可以看到以下信息。

__ratelimit: 2170 callbacks suppressed TCP: time wait bucket table overflow TCP: time wait bucket table overflow TCP: time wait bucket table overflow TCP: time wait bucket table overflow

通过 ss - s 命令查看,可以看到 timewait 已经有 2w 个了。

ss -s Total: 174 (kernel 199) TCP: 20047 (estab 32, closed 20000, orphaned 4, synrecv 0, timewait 20000/0), ports 10785

sysctl 命令可以设置这些参数,如果想要重启生效的话,加入 /etc/sysctl.conf 文件中。

#  修改阈值  net.ipv4.tcp_max_tw_buckets = 50000 #  表示开启 TCP 连接中 TIME-WAIT sockets 的快速回收  net.ipv4.tcp_tw_reuse = 1 # 启用 timewait  快速回收。这个一定要开启,默认是关闭的。net.ipv4.tcp_tw_recycle= 1 #  修改系統默认的 TIMEOUT 时间, 默认是 60s net.ipv4.tcp_fin_timeout = 10

测试参数的话,可以使用 sysctl -w net.ipv4.tcp_tw_reuse = 1 这样的命令。如果是写入进文件的,则使用 sysctl - p 生效。

CLOSE_WAIT

CLOSE_WAIT 一般是由于对端主动关闭,而我方没有正确处理的原因引起的。说白了,就是程序写的有问题,属于危害比较大的一种。

我们拿”csdn 谐音太郎”遇到的一个典型案例来说明。

代码是使用 HttpClient 的一个使用片段。在这段代码里,通过调用 in.close()来进行连接资源的清理。但可惜的是,代码中有一个判断:非 200 状态的连接直接返回 null。在这种情况下,in 连赋值的机会都没有,当然也就无法关闭,然后就发生了连接泄漏。

所以,HttpClient 的正确关闭方式是使用其 api:abort()。

其他常用命令

应用软件

#  断点续传下载文件  wget -c $url #  下载整站  wget -r -p -np -k $url #  发送网络连接(常用) curl -XGET $url #  传输文件  scp sftp #  数据镜像备份  rsync

检测工具

#  连通性检测  ping google.com #  到对端路由检测  tracepath google.com #  域名检测  dig google.com nslookup google.com #  网络扫描工具  nmap #  压力测试  iperf #  全方位监控工具(好东西) nmon

配置工具

#  停止某个网卡  ifdown #  开启某个网卡  ifup #  多功能管理工具  ethtool

压力测试

wrk ab webbench http_load

多功能工具

#  远程登录  telnet ssh nc #  防火墙  iptables -L

除了基本的工具,本文提到的很多网络命令,都不是预装的,需要使用 yum 自行安装。

关于 Linux 网络命令具体有哪些呢就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计4337字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)