分类 Linux运维 下的文章

其他参考:tcpdump的基本用法

1. 抓取指定网卡上的数据

tcpdump默认抓系统第一块网卡,-i参数可以指定网卡,any表示抓所有网卡:

tcpdump -i eth0 # 抓取eth0上的数据
tcpdump -i any # 抓取所有网卡上的数据

2. 抓取指定IP的数据

抓取来自eth0网卡上IP为192.168.10.1的数据:

tcpdump -i eth0 host 192.168.10.1

3. 抓取指定端口的数据

抓取HTTPS(443端口)的数据:

tcpdump -i eth0 tcp port 443

4. 抓取一个网段的数据

抓取192.168.10.0/24网段的数据:

tcpdump -i eth0 net 192.168.10.0/24

5. 多条件组合

tcpdump可以使用and/or/not来进行多条件组合抓包,当开启组合抓包时,建议使用双引号将语句包起来(否则当条件语句中存在括号等字符时会报错):

tcpdump -i eth0 "host 192.168.10.1 and (tcp port 443 or tcp port 80)" 

抓取来自192.168.10.1的443端口或80端口的数据。

6. 其他选项

  • -n:打印IP地址而不是主机名
  • -v:显示抓到的包的数量
  • -w file:将抓到的包写入文件
  • -c n:只抓取n个包,抓满后程序自动退出

把证书拷贝到:/usr/local/share/ca-certificates/

然后执行:

update-ca-certificates

注意事项

  1. curl命令不会使用这种机制,使用curl命令的时候要手动指定--insecure参数,否则依然会报证书不受信任的错误。
  2. wget不用单独再加参数。

一、问题现象

ubuntu上启动ssh时,报错:

 * Starting OpenBSD Secure Shell server sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key

截图信息:

image916886a7b54ba239.png

错误信息是说密钥不存在,查看目录确实是不存在:

root@maqianos:~# ll /etc/ssh/
total 552
drwxr-xr-x 1 root root   4096 May 21 22:41 ./
drwxr-xr-x 1 root root   4096 Sep 16 12:26 ../
-rw-r--r-- 1 root root 553122 Mar  4  2019 moduli
-rw-r--r-- 1 root root   1580 Mar  4  2019 ssh_config
-rw-r--r-- 1 root root    338 May 21 22:41 ssh_import_id
-rw-r--r-- 1 root root   3262 May 21 22:41 sshd_config

虽然有错误信息,但是从提示上看ssh服务是启动成功了,ps看进程也起来了。

不过客户端是不能远程上来的,连接时报错:

Connecting to 127.0.0.1:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Connection closing...Socket close.

Connection closed by foreign host.

Disconnected from remote host(127.0.0.1:22) at 10:13:57.

同时使用wireshark抓包看,可以发现连接被服务端断开了:

二、解决方案

2.1 生成rsa_key

命令:

ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

输出:

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /etc/ssh/ssh_host_rsa_key.
Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub.
The key fingerprint is:
SHA256:HCF6EzKhpOZAk6vDO1wABnPVtckUYoIOazXqEc9SgfA root@maqianos
The key's randomart image is:
+---[RSA 2048]----+
|*o=+Bo=.=.       |
|+@o= *.* +       |
|==E o o =        |
|=B.o . o .       |
|=.+     S        |
|oo .             |
|..o              |
| +               |
|  .              |
+----[SHA256]-----+

2.2 生成ecdsa_key

使用命令:

ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key

输出:

Generating public/private ecdsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /etc/ssh/ssh_host_ecdsa_key.
Your public key has been saved in /etc/ssh/ssh_host_ecdsa_key.pub.
The key fingerprint is:
SHA256:XQ+3eH1AXF1TwFPH2/gll/CULXTmIpqHFdhLDvVGF5E root@maqianos
The key's randomart image is:
+---[ECDSA 256]---+
|           +o+=O^|
|          o o*=E*|
|           +=.X+=|
|         . *oBoO+|
|        S = o +++|
|           . .  o|
|                 |
|                 |
|                 |
+----[SHA256]-----+

2.3 生成ed25519_key

命令:

ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

输出

Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /etc/ssh/ssh_host_ed25519_key.
Your public key has been saved in /etc/ssh/ssh_host_ed25519_key.pub.
The key fingerprint is:
SHA256:St4uTjtl3HIt9DYyZhao2KNRQQthguqE2WJLYhSBHpU root@maqianos
The key's randomart image is:
+--[ED25519 256]--+
|.+=.=o.          |
|oo E ...         |
|=o.   .. .       |
|**.   . . o      |
|B..  +.oSo +     |
| o  oo+o= X =    |
|     o++.* = .   |
|    ..oo         |
|     .oo.        |
+----[SHA256]-----+

2.3 重启ssh

执行/etc/init.d/sshd restart重启ssh服务,无报错信息:

imagec2f7ea1f2b5cee27.png

再次使用客户端连接可以连上!

linux环境配置新添加的网卡

linux设备在安装的时候会自动添加网卡,并初始化当前已有的网卡配置,安装完成后通过命令或者配置文件修改网络配置即可使用。但是当系统安装好后,再次添加网卡系统不会自动生成所需要的配置文件,使用ifconfig命令也不能直接看到网卡。要自己手动添加文件并修改配置才可以,流程繁琐,直接复制现有配置也容易配错。

这时候可以通过nmtui命令来配置,这个命令能自动识别出当前系统所有的的网卡,编辑后保存自动生成配置文件。

执行nmtui命令会进入到一个类似windows的图形化的界面:

选择Edit a connection进入到网卡配置页面:

选择要编辑的网卡后回车即可对指定网卡操作,可以修改网卡名字、IPv4/IPv6地址、修改DNS地址等等:

一、设置resolv.conf文件

配置的文件格式为:

nameserver 8.8.8.8 # 8.8.8.8是DNS服务器的地址

如:

二、修改网卡配置

在对应的网卡配置中加上DNS设置,网卡配置文件一般是cat /etc/sysconfig/network-scripts/ifcfg-网卡名,在里面加上:

DNS1=x.x.x.x
DNS2=x.x.x.x

三、修改hosts文件

和windows下一样,linux也提供了修改hosts文件可以固定死某个域名的IP地址:

静态路由表的配置文件为:/etc/sysconfig/network-scripts/route-网卡名

以网卡eth0为例,如果要针对eth0添加一条静态路由,可以在配置文件/etc/sysconfig/network-scripts/route-eth0中添加以下配置:

200.200.0.0/16 via 10.66.255.254
200.200.24.0/22 via 10.66.255.254

然后重启network服务即可生效!

查看nginx日志,发现有报错信息:

2019/07/16 17:34:42 [crit] 4397#0: *349 open() "/fastcgi_temp/5/00/0000000005" failed (13: Permission denied) while reading upstream

查看对应目录的权限,发现所属用户是nobody,而实际运行nginx的是wwwuser

root      1842  0.0  8.5 410716 332500 ?       Ss   17:10   0:01 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
wwwuser   4397  0.0  8.5 412288 332828 ?       S    17:33   0:00 nginx: worker process
wwwuser   4398  0.0  8.5 411776 332360 ?       S    17:33   0:00 nginx: worker process
wwwuser   4399  0.0  8.5 412800 330336 ?       S    17:33   0:00 nginx: cache manager process

因此问题原因应该是:nginx最初始时以nobody身份启动过,创建了缓存所属用户是nobody,后面改动nginx的运行用户为wwwuser,导致新用户没有权限写入缓存。

解决方案:修改对应目录下的所属用户为当前nginx启动用户。

linux环境下查看系统负载的几种方式

一、uptime和w命令

uptime命令和w命令都可以显示系统当前的负载:

ma@centos7:~$ uptime
 09:37:15 up 19 days, 20 min,  1 user,  load average: 0.00, 0.01, 0.05
ma@centos7:~$ w
 09:37:17 up 19 days, 20 min,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
ma       pts/0    200.200.65.82    09:28    5.00s  0.01s  0.00s w
  • 09:37:15 up 19 days, 20 min:系统启动时间
  • 1 user:当前有一个用户在线
  • load average: 0.00, 0.01, 0.05:1分钟、5分钟和15分钟内的cpu平均负载

关于系统负载

系统平均负载被定义为在特定时间间隔内运行队列中的平均进程数,如果一个进程满足以下条件则其就会位于运行队列中:

  • 它没有在等待I/O操作的结果
  • 它没有主动进入等待状态(也就是没有调用wait
  • 没有被停止(例如:等待终止)

一般来说,每个CPU内核当前活动进程数不大于3,则系统运行表现良好!当然这里说的是每个cpu内核,如果主机是四核cpu的话,那么只要uptime最后输出的一串字符数值小于12即表示系统负载不是很严重。如果达到20,那就表示当前系统负载非常严重。

二、/proc/loadavg

/proc/loadavg也能显示系统的负载信息:

ma@centos7:~$ cat /proc/loadavg 
0.01 0.02 0.05 1/199 19643

前面三个也是分别表示1分钟、5分钟以及15分钟的系统平均负载。后面的1/199表示系统当前共有199个进程,其中1个进程处于运行状态。19643表示最后一个运行的进程ID。

三、查看CPU负载情况

mpstat命令可以打印出当前系统的cpu信息,统计当前CPU的各项指标信息:

ma@centos7:~$ mpstat 
Linux 3.10.0-862.14.4.el7.x86_64 (centos7)    05/07/19    _x86_64_    (2 CPU)

10:03:33     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10:03:33     all    0.03    0.00    0.03    0.00    0.00    0.07    0.09    0.00   99.78
  • %user:在internal时间段里,用户态的CPU时间(%),不包含nice值为负进程。(usr/total)*100
  • %nice:在internal时间段里,nice值为负进程的CPU时间(%)。(nice/total)*100
  • %sys:在internal时间段里,内核时间(%)。(system/total)*100
  • %iowait :在internal时间段里,硬盘IO等待时间(%)。(iowait/total)*100
  • %irq:在internal时间段里,硬中断时间(%)。(irq/total)*100
  • %soft:在internal时间段里,软中断时间(%)。(softirq/total)*100

常用参数

  • -P CPU:打印指定CPU的信息,默认只打印所有CPU汇总后的统计数据,加上-P ALL会把每个CPU的统计信息都打印出来。
  • interval times:每隔interval统计一次信息,共统计times次。

例如,每1秒打印一次cpu信息,共打印2次:

最后会针对这三次生成一次统计信息。

四、查看内存

free命令可以查看当前的内存:

maqian@os:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          16285        5096       10964          17         223       11057
Swap:         29663           0       29663

Mem表示的是系统的物理内存,Swap是虚拟内存。

五、使用top查看CPU和内存占用

top命令可以查看当前系统下所有进程的CPU和内存占用情况:

输入命令后会进入交互式界面,在交互式页面输入P可以对CPU占用排序,输入M对内存占用排序。

一、问题描述

某天,在QQ空间看到大学同学发了一个求助帖:

求助安装一个ffmpeg软件((linux平台下开源的音视频转码工具),本着助人为乐的想法准备提供一下帮助,了解之后才发现她想做的根本不是安装ffmpeg,而是已经装好了发现命令执行太卡,以为自己装错了,想找个熟人重装一下。再次深入了解才发现最终的问题是这样的:她们用的腾讯云学生机(1C1G配置),平常在上面用ffmpeg做音视频转码的实验,一个10M左右的视频转码需要十几分钟,觉得时间太长了,并且看到的日志显示他们转码并没有消耗CPU资源。

最后排查下来发现系统是被黑客入侵了,排查相当顺利(比起我们公司设备的排查简直容易一百倍),记录下排查过程。

二、排查过程

了解具体问题之后发现了两个不寻常的地方:

  1. 10M的视频转码要10分钟以上-----单核CPU应该也不至于此。
  2. 她们看到的日志显示没有占用CPU资源-----没有GPU,视频转码不耗CPU不太可能。

首先登陆上设备,看CPU占用:发现设备上以ftpuser运行了一个bash64的进程,常年占用CPU在97%以上。

第一眼看上去就很奇怪,为什么ftpuser会运行bash64?而且一般的bash也不叫bash64,为什么CPU占用会这么高?一种不妙的感觉顿时涌上心头,当时感觉就可能是被黑了。

尝试关闭进程,果然,根本关不掉,关了又起来。ps查看文件所在位置之后删除也不行,删除后还会自动创建,进程也还是会起来。

再仔细一看,发现进程执行的程序是放在ftpuser主目录下的一个隐藏文件夹下,同时还有个配置参数,cat这个文件竟然是一串ssh密钥。这明显就是一个挖矿进程了。

。。。于是乎,排查结束!

三、解决方案

结论

系统被黑客入侵,植入了挖矿程序,一直占用CPU导致其他程序无法得到CPU资源,出现了ffmpeg转码卡慢的问题。

解决方案

因为工作太忙(当时已经是晚上快十点了还在公司加班。。。)没有深入分析下去,直接建议重装系统了。

事后发现

腾讯云早已发送告警短信到她手机,她熟视无睹:

修改ssh端口后使用systemctl一直无法启动sshd,报错:

Job for sshd.service invalid.

使用journalctl -xe查看错误信息,发现一串没有权限绑定端口错误信息:

-- Unit sshd.service has begun starting up.
Jun 04 18:58:11 instance-1 sshd[20960]: error: Bind to port 22345 on 0.0.0.0 failed: Permission denied.
Jun 04 18:58:11 instance-1 sshd[20960]: error: Bind to port 22345 on :: failed: Permission denied.
Jun 04 18:58:11 instance-1 sshd[20960]: fatal: Cannot bind any address.
Jun 04 18:58:11 instance-1 systemd[1]: sshd.service: main process exited, code=exited, status=255/n/a
Jun 04 18:58:11 instance-1 systemd[1]: Failed to start OpenSSH server daemon.
-- Subject: Unit sshd.service has failed

很奇怪,服务是使用root身份启动的,端口号也不在1-1024之间,不可能出现端口号无法绑定的问题。

开始怀疑是不是端口号被占用了,但是用netstat命令查看并没有占用,而且如果被占用报错也应该是xx already been used,因此排除端口被占用了。

后来发现是开启了SELinux导致的,使用sestatus查看SELinux当前的状态:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

最后的解决办法就是关闭SELinux了,执行setenforce 0临时关闭。