liunx基础七

1、列举常见的内核参数以及参数的意义

Linux内核参数配置

Linux在系统运行时修改内核参数(/proc/sys与/etc/sysctl.conf),而不需要重新引导系统,这个功能是通过/proc虚拟文件系统实现的。
在/proc/sys目录下存放着大多数的内核参数,并且设计成可以在系统运行的同时进行更改, 可以通过更改/proc/sys中内核参数对应的文件达到修改内核参数的目的(修改过后,保存配置文件就马上自动生效),不过重新启动机器后之前修改的参数值会失效,所以只能是一种临时参数变更方案。(适合调试内核参数优化值的时候使用,如果设置值有问题,重启服务器还原原来的设置参数值了。简单方便。)

但是如果调试内核参数优化值结束后,需要永久保存参数值,就要通过修改/etc/sysctl.conf内的内核参数来永久保存更改。但只是修改sysctl文件内的参数值,确认保存修改文件后,设定的参数值并不会马上生效,如果想使参数值修改马上生效,并且不重启服务器,可以执行下面的命令:
#sysctl –p
/proc/sys下内核文件与配置文件sysctl.conf中变量的对应关系:
由于可以修改的内核参数都在/proc/sys目录下,所以sysctl.conf的变量名省略了目录的前面部分(/proc/sys)。

即将/proc/sys中的文件转换成sysctl中的变量依据下面两个简单的规则:
1.去掉前面部分/proc/sys
2.将文件名中的斜杠变为点
这两条规则可以将/proc/sys中的任一文件名转换成sysctl中的变量名。

例如:
/proc/sys/net/ipv4/ip_forward =》 net.ipv4.ip_forward
/proc/sys/kernel/hostname =》 kernel.hostname

可以使用下面命令查询所有可修改的变量名
sysctl –a

一、 icmp相关内核配置参数

概述:通常我们使用icmp包来探测目的主机上的其它协议(如tcp和udp)是否可用。比如包含“destination unreachable”信息的icmp包就是最常见的icmp包。

1.icmp_destunreach_rate:设置内容为“Destination Unreachable”icmp包的响应速率。设置值应为整数。

应用实例:

假设有A、B两部主机,首先我们在主机A上执行以下ipchains语句:ipchains -A input -p icmp -j REJECT。这里的REJECT和DENY不同,DENY会丢掉符合条件的包如同没有接收到该包一样,而REJECT会在丢掉该包的同时给请求主机发回一个“Destination Unreachable”的icmp。

然后在主机B上ping主机A,这时候我们会发现“Destination Unreachable”icmp包的响应速度是很及时的。接着我们在主机A上执行:
echo "1000" > /proc/sys/net/ipv4/icmp_destunreach_rate
也即每10秒钟响应一个“Destination Unreachable”的icmp包。这时候再从主机B上ping主机A就会发现“Destination Unreachable”icmp包的响应速度已经明显变慢,我很好奇的测试了一下,发现刚好是每10秒响应一次。

2.icmp_echo_ignore_broadcasts:设置是否响应icmp echo请求广播,设置值应为布尔 值,0表示响应icmp echo请求广播,1表示忽略。注意:windows系统是不响应icmp echo请求广播的。

应用实例:
在我的RedHat6.x和RedHat7上该值缺省为0,这样当有个用ping我的服务器所在的网段的网络地址时,所有的linux服务器就会响应,从而也能让让该用户得到我的服务器的ip地址,可以执行:
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
来关闭该功能。从而防止icmp风暴,防止网络阻塞。

3.icmp_echoreply_rate:设置系统响应icmp echo请求的icmp包的响应速度,设置值为整数。

应用实例:

假设有A、B两部主机,首先我们在主机B上ping主机A,可以看到响应很正常,然后在主机A上执行:
echo "1000" > /proc/sys/net/ipv4/icmp_echoreply_rate
也即每10秒钟响应一个icmp echo请求包。然后再ping主机A就可以看到响应速度已经变成10秒一次。最好合理的调整该参数的值来防止icmp风暴。

4.icmp_echo_ignore_all:设置系统是否忽略所有的icmp echo请求,如果设置了一个非0值,系统将忽略所有的icmp echo请求。其实这是icmp_echoreply_rate的一种极端情况。参数值为布尔值,1表示忽略,0表示响应。

  1. icmp_paramprob_rate:当系统接收到数据报的损坏的ip或tcp头时,就会向源发出一个包含有该错误信息的icmp包。这个参数就是用来设置向源发送这种icmp包的速度。当然,在通常情况下ip或tcp头出错是很少见的。参数值为整数。

6.icmp_timeexceed_rate:数据报在网络上传输时,其生存时间(time to live)字段会不断减少,当生存时间为0时,正在处理该数据报的路由器就会丢弃该数据报,同时给源主机发送一个“time to live exceeded”的icmp包。该参数就是用来设置这种icmp包的发送的速度。当然,这通常用于充当路由器的linux主机。

二、ip相关内核配置参数

linux内核网络参数中关于ip的配置参数通常是用来定义或调整ip包的一些特定的参数,除此之外还定义了系统的一些网络特性。

1.ip_default_ttl:设置从本机发出的ip包的生存时间,参数值为整数,范围为0~128,缺省值为64。在windows系统中,ip包的生存时间通常为128。如果你的系统经常得到“Time to live exceeded”的icmp回应,可以适当增大该参数的值,但是也不能过大,因为如果你的路由的环路的话,就会增加系统报错的时间。

2.ip_dynaddr:该参数通常用于使用拨号连接的情况,可以使系统动能够立即改变ip包的源地址为该ip地址,同时中断原有的tcp对话而用新地址重新发出一个syn请求包,开始新的tcp对话。在使用ip欺骗时,该参数可以立即改变伪装地址为新的ip地址。该参数的参数值可以是:

1:启用该功能

2:使用冗余模式启用该功能

0:禁止该功能

应用实例:

在使用ipchains配置ip欺骗带动局域网共享一个ppp连接上网时,有时会出现刚开时连接一个站点连不通,再次刷新又可以连接的情况,这时候就可以设置该参数的值为1,从而立即改变伪装地址为新的ip地址,就可以解决这类问题。命令为:

echo "1" > /proc/sys/net/ipv4/ip_dynaddr

3.ip_forward:可以通过该参数来启用包转发功能,从而使系统充当路由器。参数值为1时启用ip转发,为0时禁止ip转发。注意,我们可以在单网卡或双网卡的主机上实现ip转发。

应用实例:

假设我们使用一部装有双网卡的linux主机充当防火墙,这时候我们就必须执行以下命令来打开ip转发功能:

echo "1" > /proc/sys/net/ipv4/ip_forward

  1. ip_local_port_range:设置当本地系统向外发起tcp或udp连接请求时使用的端口范围。设置值为两个整数,缺省为“1024 4999”。

应用实例:

echo "1450 6000" > /proc/sys/net/ipv4/ip_local_port_range

三、 tcp相关内核配置参数

通过tcp配置参数可以控制tcp会话过程中的各个方面。

a) tcp_fin_timeout:在一个tcp会话过程中,在会话结束时,A首先向B发送一个fin包,在获得B的ack确认包后,A就进入FIN WAIT2状态等待B的fin包然后给B发ack确认包。这个参数就是用来设置A进入FIN WAIT2状态等待对方fin包的超时时间。如果时间到了仍未收到对方的fin包就主动释放该会话。参数值为整数,单位为秒,缺省为180秒。

b) tcp_syn_retires:设置开始建立一个tcp会话时,重试发送syn连接请求包的次数。
参数值为小于255的整数,缺省值为10。假如你的连接速度很快,可以考虑降低该值来提高系统响应时间,即便对连接速度很慢的用户,缺省值的设定也足够大了。

3.tcp_window_scaling:设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。Tcp/ip通常使用的窗口最大可达到65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力。

四、 有关防止ip欺骗攻击的内核网络参数

假设有如下的情景:

1.1.1.1 2.2.2.2

在缺省状态下,路由器根据包的目的地址进行转发,所以路由器缺省是对来自任何地方

的包进行转发的。如上图所示,假如路由器的2.2.2.2接口(也即广域网接口)接收到一个包,该包的源地址为1.1.1.100(也即为Intranet地址),虽然这是不可能或者说是不合理的,但是由于路由器的特性,路由器还是会将这个不合法的包转发到Intranet。从而让黑客有了可乘之机,为其进行ip欺骗攻击打开了方便之门。

幸好,我们可以通过Linux的内核系统参数“反向路径过滤”来防止这种情况,该参数位于/proc/sys/net/ipv4/conf/下的各个子目录中的rp_filter文件。参数值为整数,可能的值有:

2 - 进行全面的反向路径过滤,推荐在边缘路由器上使用。但是要注意,在复杂的网络环境中,如果使用了静态路由或rip、ospf路由协议时,不推荐使用该值。

1 - 是该参数的缺省值,它只对直接连接的网络进行反向路径过滤。

0 - 不进行反向路径过滤。

应用实例:

建立如下的脚本,文件名为rp.sh

#/bin/bash for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 2 > $i done

然后更改文件权限chmod 755 rp.sh,最后执行 ./rp.sh。

五、 针对每一网络接口的内核网络参数

通过针对每一网络接口的内核网络参数,你可以为诸如eth0、eth1等具体的网络接口指定响应的内核网络参数。注意:/proc/sys/net/ipv4/conf/all/下的参数将应用于所有的网络接口。

1. accept_redirects:该参数位于/proc/sys/net/ipv4/conf/DEV/accept_redirects(DEV表示具体的网络接口),如果你的主机所在的网段中有两个路由器,你将其中一个设置成了缺省网关,但是该网关在收到你的ip包时发现该ip包必须经过另外一个路由器,这时这个路由器就会给你发一个所谓的“重定向”icmp包,告诉将ip包转发到另外一个路由器。参数值为布尔值,1表示接收这类重定向icmp 信息,0表示忽略。在充当路由器的linux主机上缺省值为0,在一般的linux主机上缺省值为1。建议将其改为0,或者使用“安全重定向”(见下文)以消除安全性隐患。

2. log_martians:将包含非法地址信息的ip包记录到内核日志。参数值为布尔值。

应用实例:

上面我们讲过rp_filter反向路径过滤参数,同时我们可以执行下面的语句

echo “1” > /proc/sys/net/ipv4/conf/all/log_martians

然后就可以将进行ip假冒的ip包记录到/var/log/messages。

3. forwarding:启用特定网络接口的ip转发功能。参数值为布尔值,1表示进行记录。

应用实例:

echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding

  1. accept_source_route:是否接受含有源路由信息的ip包。参数值为布尔值,1表?nbsp; Linux内核网络参数的意义及应用。

2、如何通过/proc查看top中展示的进程状态

❶、/proc目录

Linux系统上的/proc目录是一种文件系统,即proc文件系统,与其它常见的文件系统不同的是,/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

❷、/proc/stat与top的cpu信息录

a、/proc/stat
该文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。不同内核版本中该文件的格式可能不大一致,以下通过实例来说明数据该文件中各字段的含义。

[root@benny~]#cat /proc/stat
cpu  2222 4 10321 6522936 232 0 256 0 0 0
cpu0 1075 0 5904 3259672 165 0 202 0 0 0
cpu1 1147 3 4416 3263264 66 0 54 0 0 0
intr 1562774 46 10 0 0 0 0 0 0 1 0 0 0 16 0 0 32070 2 73360 61 73468 0 0 0 .....此处省略n个(0)
ctxt 2282210
btime 1567848389
processes 10909
procs_running 1
procs_blocked 0
softirq 2249318 1 1040221 6549 73468 85883 0 162 808946 0 234088

第一行的数值表示的是CPU总的使用情况,各列参数如下

cpuuse rnicesystemidleiowaitirqsoftirqstealguest
cpu从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间从系统启动开始累计到当前时刻,处于核心态的运行时间从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4)从系统启动开始累计到当前时刻,软中断时间(since 2.6.0-test4)从系统启动开始累计到当前时刻,这是在虚拟环境中运行时在其他操作系统上花费的时间。从系统启动开始累计到当前时刻,在Linux内核的控制下为客户操作系统运行虚拟CPU的时间。
cpu22224103216522936232025600

(jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间)
总的cpu时间:totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest。
可以看出,stat文件中记录的时间是从开机到当前时间积累的所有cpu时间。

b、top的CPU信息
top命令用于实时地对系统处理器状态进行监控,它能够实时地显示系统中各个进程的资源占用状况。该命令可以按照CPU的使用、内存的使用和执行时间对系统任务进程进行排序显示,同时top命令还可以通过交互式命令进行设定显示。

top - 09:44:56 up 16 days, 21:23,  1 user,  load average: 9.59, 4.75, 1.92
Tasks: 145 total,   2 running, 143 sleeping,   0 stopped,   0 zombie
Cpu(s): 99.8%us,  0.1%sy,  0.0%ni,  0.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4147888k total,  2493092k used,  1654796k free,   158188k buffers
Swap:  5144568k total,       56k used,  5144512k free,  2013180k cached

解释:

第一行,任务队列信息,同uptime命令的执行结果

  • top - 09:44:56 当前系统时间
  • up 16 days,21.23 系统已经运行了16天,21小时23分
  • 1 user 目前 一个用户当前登录
  • loadaverage: 9.59, 4.75, 1.92 系统负载,即任务队列的平均长度(5分钟、10分钟、15分钟)

第二行,Task任务进程

  • Tasks: 145 total 总进程数
  • 2running 正在运行的进程数
  • 143 sleeping 睡眠的进程数
  • 0 stopped 停止的进程数
  • 0 zombie 僵尸状态数

第三行,CPU状态信息

  • Cpu(s): 99.8%us 用户空间占用CPU百分比
  • 0.1%sy 内核空间占用CPU百分比
  • 0.0%ni 用户进程空间内改变过优先级的进程占用CPU百分比
  • 0.2%id 空闲CPU百分比
  • 0.0%wa 等待输入输出的CPU时间百分比
  • 0.0%hi 硬中断 ( Hard IRQ )占用百分比
  • 0.0%st 软中断(software Interrupts)占用百分比

第四行内存状态

  • Mem: 4147888k total 物理内存总量
  • 2493092k used 使用的物理内存总量
  • 1654796k free 空闲内存总量]
  • 158188k buffers 用作内核缓存的内存量

第五行,swap交换分区信息

  • Swap: 5144568k tota交换区总量
  • 56 used使用的交换区总量
  • 5144512k free空闲交换区总量
  • 2013180k cached缓冲的交换区总量

可以看出,top中显示的cpu信息都是实时的各种参数占用的cpu百分比。

❸、 /proc/stat与top的cpu信息的联系与区别
区别:/proc/stat文件显示的是从启动到当前时间,各种cup时间的累计值;而top则是显示实时的cpu使用情况。

联系:top通过读取/proc/stat去计算cpu占用情况。

/proc/stat 就像汽车仪表盘上的里程数,而top显示的cpu信息则是这辆车的速度。

3、分别用while、for循环检测10.0.0.1/24网段存活的IP地址

for循环

[root@benny~]#cat ping_10.0.0.1_check.sh 
#!/bin/bash
#
#********************************************************************
#Author:		benny
#QQ: 			759354304
#Date: 			2019-09-08
#FileName:		ping_10.0.0.1_check.sh
#URL: 			http://www.benny.com
#Description:		The test script
#Copyright (C): 	2019 All rights reserved
#********************************************************************
a=2
while [ ${a} -lt 255 ]
do
  ip=10.0.0.${a}
  if ping -c 3 ${ip} &> /dev/null; then
  echo "${ip} is alive"
  fi
  a=$[$a+1]
done

输出结果

[root@benny~]#bash ping_10.0.0.1_check.sh
10.0.0.10 is alive
10.0.0.50 is alive

for循环

#!/bin/bash
#
#********************************************************************
#Author:		benny
#QQ: 			759354304
#Date: 			2019-09-08
#FileName:		ping_10.0.0.1_test.sh
#URL: 			http://www.benny.com
#Description:		The test script
#Copyright (C): 	2019 All rights reserved
#********************************************************************

for ip in 10.0.0.{2..254};
do
  (
   ping $ip -c 2 &> /dev/null;
	if [ $? -eq 0 ];then
	echo $ip is alive
    fi
  )&
done
wait

输出结果

[root@benny~]#bash ping_10.0.0.1_test.sh
10.0.0.10 is alive
10.0.0.50 is alive
10.0.0.254 is alive

4、说明initrd的作用

initrd的解释是initialized RAM disk,就是启动的时候由uboot来初始化内存,当做disk来使用。在uboot启动的时候,
uboot会将存储介质中(如Flash)的initrd文件加载到内存,内核启动时会在访问挂载的根文件系统前先访问该内存中的
initrd文件系统。在uboot配置了initrd的情况下,文件系统启动被分成两个阶段,第一阶段先执行initrd文件系统中
的"某个可执行文件"(linuxrc或init,完成加载驱动模块等任务。第二阶段是挂载
真正的根文件系统中,然后执行/sbin/init进程。

inited的作用

ⅰ、格式化一个Ramdisk;
ⅱ、加载文件系统到Ramdisk
ⅲ、将Ramdisk作为根文件系统

linux内核支持两种格式的文件系统镜像:传统格式的文件系统镜像image-initrd和cpio-initrd格式的镜像。

cpio-initrd的处理流程:(执行流程可以对照下面博文的代码分析:linux的initrd机制和initramfs机制之根文件挂载流程:代码分析)

1.uboot把内核以及initrd文件加载到内存的特定位置。
2.内核判断initrd的文件格式,如果是cpio格式。
3.将initrd的内容释放到rootfs中。
4.执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。
可见对于cpio-initrd格式的镜像,它执行的是init文件

image-initrd的处理流程

1.uboot把内核以及initrd文件加载到内存的特定位置。
2.内核判断initrd的文件格式,如果不是cpio格式,将其作为image-initrd处理。
3.内核将initrd的内容保存在rootfs下的/initrd.image文件中。
4.内核将/initrd.image的内容读入/dev/ram0设备中,也就是读入了一个内存盘中。
5.接着内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统。
6.如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动。
7.执行initrd上的/linuxrc文件,linuxrc通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动,以及加载根文件系统。
8./linuxrc执行完毕,实际根文件系统被挂载,执行权转交给内核。
9.如果实际根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存在,/dev/ram0将被卸载。
10.在实际根文件系统上进行正常启动过程,执行/sbin/init。
对于image-initrd格式的镜像,它执行的是linuxrc文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值