正向代理与反向代理的区别

正向代理的概念

正向代理,也就是传说中的代理,他的工作原理就像一个跳板,
简单的说,
我是一个用户,我访问不了某网站,但是我能访问一个代理服务器
这个代理服务器呢,他能访问那个我不能访问的网站
于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容
代理服务器去取回来,然后返回给我

从网站的角度,只在代理服务器来取内容的时候有一次记录
有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站

结论就是 正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

反向代理的概念

继续举例:
例用户访问 http://ooxx.me/readme
但ooxx.me上并不存在readme页面
他是偷偷从另外一台服务器上取回来,然后作为自己的内容吐给用户

但用户并不知情
这很正常,用户一般都很笨

这里所提到的 ooxx.me 这个域名对应的服务器就设置了反向代理功能

结论就是 反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容 原本就是它自己的一样。

两者区别

从用途上来讲:

正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。反向代理的典型用途是将 防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。

另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。

从安全性来讲:

正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。

反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
原文:http://ooxx.me/reverse-proxy.orz

DNS查询原理讲解

1、客户端需要访问devops.webres.wang网站,首先查找本地dns缓存是否存在devops.webres.wang的IP记录。
2、如果本地缓存没有记录,则向本地首选DNS服务器发送devops.webres.wang的DNS查询请求。
3、本地DNS服务器接收查询请求后,首先查询缓存是否存在此域名的dns记录,如果找不到记录,则向根DNS服务器发送DNS解析请求。
4、根DNS服务器向本地DNS服务器返回此域名的NS记录(即此域名的DNS服务器)。
5、本地DNS服务器向此域名的DNS服务器发送DNS解析请求。
6、此域名的DNS服务器查找此域名的IP解析,并返回给本地DNS服务器。
7、本地DNS服务器对此记录进行缓存,并返回给客户端此域名的DNS解析结果。
DNS原理演示:

子网的划分

什么是子网掩码

子网掩码是一个32位地址,。是与IP地址结合使用的一种技术。用4个字节的点分二进制数来表示时,其网络地址部分全置为1,它的主机地址部分全置为0。它的主要作用有两个,一是用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。二是用于将一个大的IP网络划分为若干小的子网络。
根据子网掩码与IP计算出网络地址:
  IP地址 192.168.0.254
  子网掩码 255.255.255.0
  转化为二进制进行运算:
  I P 地址 11000000.10101000.00000000.11111110
  子网掩码 11111111.11111111.11111111.00000000
  AND运算
  11000000.10101000.00000000.00000000
  转化为十进制后为:
  192.168.0.0

子网的划分

企业或者机关从连接服务商ISP那里申请的IP地址是网络地址,如179.130.0.0,企业或机关的网络管理员需要将在这个网络地址上为本单位的主机分配IP地址。在分配IP地址之前,首先需要根据本单位的行政关系、网络拓朴结构划分网,为各个子网分配子网地址。然后才能在子网地址的基础上为各个子网中的主机分配IP地址。
我们从ISP那里申请得到的网络地址也称为主网地址,这是一个没有挪用主机位的网络地址。单位自己划分出的子网地址需要挪用主网地址中的主机位来为各个子网编址。网络地址或主网地址不用掩码也可以计算出来,只需要看出它是哪一类IP地址。A类主网地址是255.0.0.0,B类主网地址是255.255.0.0,C类主网地址是255.255.255.0。
下面我们从一个例子来学习完整的IP地址设计。
设某单位申请得到一个C类地址200.210.95.0,需要划分出6个子网。我们需要为这6个子网分配子网地址,然后计算出本单位子网的子网掩码、各个子网中IP地址的分配范围、可用IP地址数量和广播地址。
步骤1:计算机需要挪用的主机位数的位数。
需要多少主机位需要试算。借1位主机位可以分配出21=2个子网地址;借2位主机位可以分配出22=4个子网地址;借3位主机位可以分配出23=8个子网地址。因此我们决定挪用3位主机位作为子网地址的编码。
步骤2:用二进制数为各个子网编码。
子网1的地址编码:200.210.95.00000000
子网2的地址编码:200.210.95.00100000
子网3的地址编码:200.210.95.01000000
子网4的地址编码:200.210.95.01100000
子网5的地址编码:200.210.95.10000000
子网6的地址编码:200.210.95.10100000
步骤3:将二进制数的子网地址编码转换为十进制数表示,成为能发布的子网地址。
子网1的子网地址:200.210.95.0
子网2的子网地址:200.210.95.32
子网3的子网地址:200.210.95.64
子网4的子网地址:200.210.95.96
子网5的子网地址:200.210.95.128
子网6的子网地址:200.210.95.160
步骤4:计算出子网掩码
先计算出二进制的子网掩码:11111111.11111111.11111111.11100000
(下划线的位是挪用的主机位)
转换为十进制表示,成为对外发布的子网掩码:255.255.255.224
步骤5:计算出各个子网的广播IP地址
先计算出二进制的子网广播地址,然后转换为十进制:200.210.95.00011111
子网1的广播IP地址:200.210.95. 00011111 / 200.210.95.31
子网2的广播IP地址:200.210.95. 00111111 / 200.210.95.63
子网3的广播IP地址:200.210.95. 01011111 / 200.210.95.95
子网4的广播IP地址:200.210.95. 01111111 / 200.210.95.127
子网5的广播IP地址:200.210.95. 10011111 / 200.210.95.159
子网6的广播IP地址:200.210.95. 10111111 / 200.210.95.191
实际上,简单地用下一个子网地址减1,就得到本子网的广播地址。我们列出二进制的计算过程是为了让读者更好地理解广播地址是如何被编码的。
步骤6:列出各个子网的IP地址范围
子网1的IP地址分配范围:200.210.95.1至200.210.95.30
子网2的IP地址分配范围:200.210.95.33至200.210.95.62
子网3的IP地址分配范围:200.210.95.65至200.210.95.94
子网4的IP地址分配范围:200.210.95.97至200.210.95.126
子网5的IP地址分配范围:200.210.95.129至200.210.95.158
子网6的IP地址分配范围:200.210.95.161至200.210.95.190
步骤7:计算出每个子网中的IP地址数量
被挪用后主机位的位数为5,能够为主机编址的数量为2^5-2=30。
减2的目的是去掉子网地址和子网广播地址。

划分子网会损失主机IP地址的数量。这是因为我们需要拿出一部分地址来表示子网地址、子网广播地址。另外,连接各个子网的路由器的每个接口也需要额外的IP地址开销。但是,为了网络的性能和管理的需要,我们不得不损失这些IP地址。

十进制数与二进制数的转换

一、二进制数转换成十进制数

由二进制数转换成十进制数的基本做法是,把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为”按权相加”法。
例1105 把二进制数110.11转换成十进制数。
网络基础

二、十进制数转换为二进制数

十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。
1. 十进制整数转换为二进制整数
十进制整数转换为二进制整数采用”除2取余,逆序排列”法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
例1107 把 (173)10 转换为二进制数。
解:
网络基础
2.十进制小数转换为二进制小数
十进制小数转换成二进制小数采用”乘2取整,顺序排列”法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。
【例1108】把(0.8125)转换为二进制小数。
解:
网络基础
例1109 (173.8125)10=( )2
解: 由[例1107]得(173)10=(10101101)2
由[例1108]得(0.8125)10=(0.1101)2
把整数部分和小数部分合并得: (173.8125)10=(10101101.1101)2
原文:http://zyk.thss.tsinghua.edu.cn/29/elecTec/resource/knowledge/zsd11/z1103.htm

TCP三次握手及四次挥手详细图解

相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助.

而且对于有网络协议工程师之类笔试,几乎是必考的内容.企业对这个问题热情之高,出乎我的意料:-)。有时上午面试前强调这个问题,并重复讲一次,下午几乎每一个人都被问到这个问题。

因此在这里详细解释一下这两个过程。

TCP三次握手

所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。
网络基础
第一次握手:
客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。
网络基础
第二次握手:
服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。
网络基础

第三次握手.
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1
网络基础
SYN攻击
在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.
Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击
netstat -n -p TCP | grep SYN_RECV
一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.
但是不能完全防范syn攻击。
TCP 四次挥手
TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

网络基础

参见wireshark抓包,实测的抓包结果并没有严格按挥手时序。我估计是时间间隔太短造成。
网络基础
来源:http://blog.chinaunix.net/space.php?uid=20587912&do=blog&id=405055

数据通讯封装解封装详细流程

网络基础

一、pc1与pc2的通信过程

pc1 telnet pc2

1 从pc1的应用层向pc2发出一个telnet请求

2 该请求下到pc1的传输层,传输层在上层数据前面加上tcp报头,报头中包括目标端口为23,以及一个大于1024,小于65535的随机端口作为源端口。

3 传输层数据下到网络层,pc1在网络层封装,源ip地址为pc1的地址,目标ip地址为pc2的地址。

4 pc1将pc2的ip地址和子网掩码与自己做比对,可以发现pc2与自己处于相同的子网。所以数据传输不必经过网关设备。

5 数据包下到pc1的数据链路层进行封装,源mac地址为pc1的mac地址,目标mac地址查询自己的arp表。

6 如果pc1 arp表里没有pc2对应的mac地址,pc1发出一个arp广播查找pc2的mac地址,arp报文直接封装在2层之上,发送者(sender)的mac地址为pc1的mac地址,sender ip为pc1的ip地址。指向(target)mac为全0,target ip为pc2的ip。二层数据帧的目标指向二层广播地址(12个F)。
网络基础

7 交换机sw1收到pc1的arp报文后,若mac地址表不存在pc1的mac地址,就会将pc1的mac地址和pc1所连端口号记录到mac地址表,pc1的mac地址对应的端口号为1。然后将其做除发送端口外的泛洪处理。若存在的pc1-mac与端口的对应关系,则复位其老化计时器。并按mac地址表所记录的接口发送出该报文

8 局域网所有其他pc,包括网关设备都能接收到pc1的arp广播,并拆封二层帧头,target ip地址,target ip地址是否为自己。因为target ip是pc2的ip地址,此时pc2会将pc1与其mac的对应关系写入自己的ARP缓存表,这样减少了pc2发送arp广播请求pc1的mac的广播报文,提高了网络效率。之后pc2会以单播的方式给pc1回应消息,消息内包括pc2的mac地址作为sender mac地址,pc1的mac地址作为target地址。pc2的ip地址作为sender ip地址,pc1的ip地址作为target ip地址。(具体ARP Reply报文如下)

网络基础

9 交换机sw1收到pc2的回复帧后,读取二层的目标mac地址,并在自己的mac地址表里查询,mac地址表里有pc1的mac地址和端口的对应关系,所以sw1直接将报文从该端口发送出去,同时读出这个二层帧的源mac地址,记录pc2的mac地址和端口2的对应关系到mac地址表中。

10 pc1收到pc2的arp回复后将pc2的ip地址和mac地址对应关系写到自己的arp表中,并将pc2的mac地址作为目标mac地址写到待发送的帧内。

11 pc1把帧转换成bit流,从物理接口发出。

12 sw1收到这段bit流,读前6个字节的目标MAC地址,然后查看自己的mac地址表,表中有这个目标mac地址和端口的对应关系,并且和源mac地址不在同一个端口上。于是sw1把这个二层帧从对应的端口转发出去,其他端口不会转发该帧。

13 pc2接收到这个二层数据帧,查看帧的目标mac地址,和自己相等,说明该帧是发送给自己的,于是将二层帧头解开。

14 pc2查看三层包头,只要目标ip地址和自己匹配,即解开第三层封装。

15 pc2查看传输层报头,目标端口为23,pc2向上层应用查看自己是否开启了端口为23的上层服务。若开启则把传输层报头解封装后将数据送往上层。

二、pc1与pc4的通信

pc1 telnet pc4

1 从pc1的应用层向pc4发出一个telnet请求

2 该请求下到pc1的传输层,传输层在上层数据前面加上tcp报头,报头中包括目标端口为23,以及一个大于1024,小于65535的随机端口作为源端口。

3 传输层数据下到网络层,pc1在网络层封装,源ip地址为pc1地址,目标ip地址为pc4地址。

4 pc1将pc4的ip地址和子网掩码与自己做比对,可以发现pc4和自己不处于相同的子网。对于不处于相同子网的通信,是要通过网关处理的。本例中pc1的网关为r1的E0接口。

5 数据包下到pc1的数据链路层进行封装,源mac地址为pc1的mac地址,目标mac也就是网关mac地址,通过查询自己的arp表获取。

6 如果pc1 arp表里没有网关对应的mac地址,pc1发出一个arp广播查找网关的mac地址,arp报文直接封装在2层之上,发送者(sender)的mac地址为pc1的mac地址,sender ip为pc1的ip地址。指向(target)mac为全0,target ip为网关的ip。二层数据帧的目标指向二层广播地址(12个F)。

7 交换机sw1收到pc1的arp报文后,若mac地址表不存在pc1的mac地址,就会将pc1的mac地址和pc1所连端口号记录到mac地址表,之后将其做除发送端口外的泛洪处理。若存在该条目,则复位其aging timer老化计时器,之后按mac地址表所记录的接口发送出该报文。

8 局域网所有其他pc,包括网关设备都能接收到pc1的arp广播,并拆封二层帧头,查看target ip地址,target ip地址是否为自己。因为target ip是网关的ip地址,此时网关设备会将pc1与其mac的对应关系写入自己的ARP缓存表,这样减少了网关设备发送arp广播请求pc1的mac的广播报文,提高了网络效率。之后网关会以单播的方式给pc1回应消息,消息内包括网关的mac地址作为sender mac地址,pc1的mac地址作为target地址。网关的ip地址作为sender ip地址,pc1的ip地址作为target ip地址。

9 交换机sw1收到网关的回复帧后,读取二层的目标mac地址,并在自己的mac地址表里查询,mac地址表里有pc1的mac地址和端口的对应关系,所以sw1直接将报文从该端口发送出去,不再泛洪到其他端口。同时读出这个二层帧的源mac地址,记录路由器e0口的mac地址和端口4的对应关系到mac地址表中。

10 pc1收到网关的arp回复后将网关的ip地址和mac地址对应关系写到自己的arp表中,并将网关的mac地址作为目标mac地址写到待发送的帧内。

11 pc1把帧转换成bit流,从物理接口发出。

12 sw1收到这段bit流,读前6个字节的目标MAC地址,然后查看自己的mac地址表,表中有这个mac地址和端口的对应关系,并且和源mac地址不在同一个端口上。于是sw1把这个二层帧从对应的端口转发出去。

13 网关路由器接收到这个二层数据帧,查看帧的目标mac地址,和自己相等,说明该帧是发送给自己的,于是将二层帧头解开。

14 路由器R1查看三层包头,目标ip地址自己的e0口不匹配,也不等同于自己其他接口的ip地址,说明这不是一个给自己的包,而是一个去往其他网段的包,所以网关不再往上解封装。

15 路由器R1在自己的路由表里查询和数据包的目标ip地址匹配的路由,找出一条去往pc4所在网段的路由,该路由以自己的E1口为出口,下一跳路由器是r2。

16 路由器r1对数据包的三层数据不做任何改动,并封装上二层帧头,源mac地址是r1的e1口的mac地址,目标地址是r2的e1口的mac地址。(此处省略路由器r1获得r2的e1口mac地址的arp流程。)

17 路由器r1将这个二层帧转换成bit流从e1口发送出去。

18 路由器r2的e1口接收到这段bit流,并整合成帧,查看帧的目标mac地址,和自己的mac地址相等,说明这个帧是发送给自己的,于是路由器r2将该二层帧的帧头解掉。

19 路由器r2读取数据包的第三层信息。目标ip地址自己的e1口不匹配,也不等同于自己其他接口的ip地址,说明这不是一个给自己的包。于是不再往上解封装。

20 路由器R2在自己的路由表里查询和报文的目标ip地址匹配的路由,找出一条直连路由和数据包的目标网络匹配,于是认定该数据包是发往自己一个直连网段。

21 路由器R2对数据包的三层数据不做任何改动,并封装上二层帧头,源mac地址是r2的e0口的mac地址,目标地址是pc4的mac地址。

22 路由器查找自己的arp表,找寻和pc4对应的mac地址。如果arp表中没有和pc4对应的条目,就从e0口向该网段发起一个arp广播。arp报文直接封装在2层之上,sender mac地址为路由器e0口的mac地址,sender ip为路由器e0口的ip地址。Target mac为全0,target ip为pc4的ip。二层数据帧的目标指向二层广播地址(12个F)。

23 交换机sw2收到r2 e0口的arp报文后,若mac地址表不存在pc4的mac地址,就会将r2 e0口的mac地址和r2 e0所连端口号记录到mac地址表,之后将其做除发送端口外的泛洪处理。若存在该条目,则复位其aging timer老化计时器,之后按mac地址表所记录的接口发送出该报文。

24局域网所有其他pc,都能接收到路由器(网关)的arp广播,并拆封二层帧头,查看target ip地址,target ip地址是否为自己。因为target ip是pc4的ip地址,此时pc4会将网关e0口与其mac的对应关系写入自己的ARP缓存表,这样减少了设备发送arp广播请求网关e0口的mac的广播报文,提高了网络效率。之后pc4会以单播的方式给网关e0口回应消息,消息内包括pc4的mac地址作为sender mac地址,网关e0口的mac地址作为target地址。Pc4的ip地址作为sender ip地址,网关的ip地址作为target ip地址。

25 交换机sw2收到pc4的回复帧后,读取二层的目标mac地址,并在自己的mac地址表里查询,mac地址表里有该mac地址和端口的对应关系,所以sw2直接将报文从该端口发送出去,同时读出这个二层帧的源mac地址,记录pc4的mac地址和端口1的对应关系到mac地址表中(若原来不存在的话)。

26 路由器的e0口收到pc4的arp回复后将pc4的ip地址和mac地址对应关系写到自己的arp表中,并将pc4的mac地址作为目标mac地址写到待发送的帧内。

27 路由器e0口把帧转换成bit流,在物理从物理接口发出。

28 sw2收到这段bit流,读前6个字节的目标MAC地址,然后查看自己的mac地址表,表中有这个mac地址和端口的对应关系,并且和源mac地址不在同一个端口上。于是sw2把这个二层帧从对应的端口转发出去。

29 pc4接收到这个二层数据帧,查看帧的目标mac地址,和自己相等,说明该帧是发送给自己的,于是将二层帧头解开。

30 pc4查看三层包头,目标ip地址和mask和自己也是相等,于是解开第三层封装。

31 pc4查看传输层报头,目标端口为23,pc4向上层应用查看自己是否开启了端口为23的上层服务。若开启则把传输层报头解封装后将数据送往上层。

来源:http://www.12090603.com

使用nagios nrpe监控远程Linux主机

监控linux本地主机时,我们可以直接更改配置文件进行监控,如果需要监控的主机与nagios不在同一机器上,即监控远程linux主机时,我们需要借助NRPE插件实现。
nrpe工作原理图:
监控

远程主机的操作

下载Nagios Plugins和NRPE

  1. cd /tmp
  2. wget http://iweb.dl.sourceforge.net/project/nagios/nrpe-2.x/nrpe-2.13/nrpe-2.13.tar.gz
  3. wget http://iweb.dl.sourceforge.net/project/nagiosplug/nagiosplug/1.4.16/nagios-plugins-1.4.16.tar.gz

创建nagios帐号

  1. useradd nagios
  2. passwd nagios

安装nagios-plugin

  1. cd /tmp
  2. tar xvfz nagios-plugins-1.4.16.tar.gz
  3. cd nagios-plugins-1.4.16
  4. export LDFLAGS=-ldl
  5.  
  6. ./configure –with-nagios-user=nagios –with-nagios-group=nagios –enable-redhat-pthread-workaround
  7. make
  8. make install
  9.  
  10. chown nagios.nagios /usr/local/nagios
  11. chown -R nagios.nagios /usr/local/nagios/libexec/

安装NRPE

  1. cd /tmp
  2. tar xvfz nrpe-2.13.tar.gz
  3. cd nrpe-2.13
  4.  
  5. ./configure
  6. make all
  7. make install-plugin
  8. make install-daemon
  9. make install-daemon-config
  10. yum install xinetd
  11. make install-xinetd

配置NRPE以守护进程运行

1、更改/etc/xinetd.d/nrpe文件,设置允许nagios服务器连接,如nagios服务器的ip为192.168.1.2:

  1. only_from       = 127.0.0.1 192.168.1.2

2、在/etc/services结尾增加:

  1. nrpe 5666/tcp # NRPE

3、启动xinetd

  1. service xinetd restart

4、验证nrpe是否监听

  1. netstat -at | grep nrpe

5、测试nrpe是否正常运行

  1. /usr/local/nagios/libexec/check_nrpe -H localhost
  2. NRPE v2.13

6、更改 /usr/local/nagios/etc/nrpe.cfg
nrpe.cfg文件里包含需要监控远程主机的命令,如:

  1. command[check_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10
  2. command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20

nagios服务器的操作

首先安装nagios,参考:http://devops.webres.wang/2012/02/centos-install-nagios/

下载安装NRPE

  1. cd /tmp
  2. wget http://iweb.dl.sourceforge.net/project/nagios/nrpe-2.x/nrpe-2.13/nrpe-2.13.tar.gz
  3. tar xvfz nrpe-2.13.tar.gz
  4. cd nrpe-2.13
  5. ./configure
  6. make all
  7. make install-plugin

测试是否正常:

  1. /usr/local/nagios/libexec/check_nrpe -H 192.168.1.3
  2. NRPE v2.13

为监控远程主机定义host和service

1、定义check_nrpe命令
在文件/usr/local/nagios/etc/objects/commands.cfg后面增加:

  1. # ‘check_nrpe’ command definition
  2. define command{
  3. command_name check_nrpe
  4. command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -t 30 -c $ARG1$
  5. }

2、创建/usr/local/nagios/etc/objects/remotehost.cfg
host定义示例:

  1. define host{
  2. use linux-server
  3. host_name remotehost
  4. address 192.168.1.3
  5. }

Service定义示例:

  1. define service{
  2. use generic-service
  3. service_description Root Partition
  4. check_command check_nrpe!check_disk
  5. }

之后重载nagios配置文件使其生效

  1. service nagios reload

参考:http://www.thegeekstuff.com/2008/06/how-to-monitor-remote-linux-host-using-nagios-30/

Linux启动过程详解

Linux启动过程简述

1、加载bios硬件信息,并获取第一个启动设备的代号
2、读取第一个启动设备的mbr到物理内存,物理内存的内容就是Boot Loader了。
3、运行Boot Loader(如grub,lilo等),初始化硬件设备,建立内存空间映射图。
4、根据Boot Loader设定的内核映像路径,系统读取内存映像,解压内核,尝试驱动所有硬件设备。
5、运行第一个程序/sbin/init。
6、执行第一个/etc/rc.d/rc.sysinit脚本程序
7、依据/etc/modules.conf装载内核模块。
8、执行不同运行级别的脚本程序
9、执行/etc/rc.d/rc.local脚本程序
10、执行/bin/login,进入等待用户登录状态。

Linux启动过程详解

启动第一步--加载BIOS

当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。

启动第二步--读取MBR

众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,别看地方不大,可里面却存放了预启动信息、分区表信息。

系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0x7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。

启动第三步--Boot Loader

Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。

Boot Loader有若干种,其中Grub、Lilo和spfdisk是常见的Loader。

我们以Grub为例来讲解吧,毕竟用lilo和spfdisk的人并不多。

系统读取内存中的grub配置信息(一般为menu.lst或grub.lst),并依照此配置信息来启动不同的操作系统。

启动第四步--加载内核

根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。

系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。

启动第五步--用户层init依据inittab文件来设定运行等级

内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。

其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。Linux的运行等级设定如下:

0:关机

1:单用户模式

2:无网络支持的多用户模式

3:有网络支持的多用户模式

4:保留,未使用

5:有网络支持有X-Window支持的多用户模式

6:重新引导系统,即重启

关于/etc/inittab文件的学问,其实还有很多,在后序文章中设计到的,卖个关子,敬请期待,呵呵

启动第六步--init进程执行rc.sysinit

在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。如果你有兴趣,可以到/etc/rc.d中查看一下rc.sysinit文件,里面的脚本够你看几天的:P

启动第七步--启动内核模块

具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。

启动第八步--执行不同运行级别的脚本程序

根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。

启动第九步--执行/etc/rc.d/rc.local

你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:

# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.

rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。

启动第十步--执行/bin/login程序,进入登录状态

此时,系统已经进入到了等待用户输入username和password的时候了,你已经可以用自己的帐号登入系统了。:)
转自:http://roclinux.cn/?p=1301

iptables练习题

反色空白处见答案:
1.1)设定INPUT为ACCEPT
1.2)设定OUTPUT为ACCEPT
1.3)设定FORWARD为ACCEPT
答案:

  1. iptables -P INPUT ACCEPT
  2. iptables -P OUTPUT ACCEPT
  3. iptables -P FORWARD ACCEPT


2)定制源地址访问策略
2.1)接收来自192.168.0.3的IP访问
2.2)拒绝来自192.168.0.0/24网段的访问

  1. iptables -A INPUT -i eth0 -s 192.168.0.3 -j ACCEPT
  2. iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j DROP


3)目标地址192.168.0.3的访问给予记录,并查看/var/log/message

  1. iptables -A INPUT -s 192.168.0.3 -j LOG


4)定制端口访问策略
4.1)拒绝任何地址访问本机的111端口
4.2)拒绝192.168.0.0/24网段的1024-65534的源端口访问SSH

  1. iptables -A INPUT -i eth0 -p tcp –dport 111 -j DROP
  2. iptables -A INPUT -i eth0 -p tcp -s 192.168.0.0/24 –sport 1024:65534 –dport ssh -j DROP


5)定制CLIENT端的防火墙访问状态
5.1)清除所有已经存在的规则;
5.2)设定预设策略,除了INPUT设为DROP,其他为ACCEPT;
5.3)开放本机的lo可以自由访问;
5.4)设定有相关的封包状态可以进入本机;

  1. iptables -F
  2. iptables -X
  3. iptables -Z
  4. iptables -P INPUT DROP
  5. iptables -P OUTPUT ACCEPT
  6. iptables -P FORWARD ACCEPT
  7. iptables -A INPUT -i lo -j ACCEPT
  8. iptables -A INPUT -m state RELATED,ESTABLISHED -j ACCEPT
  9. iptables -A INPUT -m state INVALID -j DROP


6)定制防火墙的MAC地址访问策略
6.1)清除所有已存的规则
6.2)将INPUT设为DROP
6.3)将目标计算机的MAC设为ACCEPT

  1. iptables -F
  2. iptables -X
  3. iptables -Z
  4. iptables -P INPUT DROP
  5. iptables -A INPUT -i eth0 -m MAC –mac-source 00-C0-9F-79-E1-8A -j ACCEPT


7)设定ICMP包,状态为8的被DROP掉

  1. iptables -A INPUT -i eth0 -p icmp –icmp-type 8 -j DROP


8)定制防火墙的NAT访问策略
8.1)清除所有策略
8.2)重置ip_forward为1
8.3)通过MASQUERADE设定来源于192.168.6.0网段的IP通过192.168.6.217转发出去
8.4)通过iptables观察转发的数据包

  1. iptables -F
  2. iptables -X
  3. iptables -Z
  4. echo 1 > /proc/sys/net/ipv4/ip_forward
  5. iptables -t nat -A POSTROUTING -s 192.168.6.0/24 -o eth1 -j MASQUERADE


9)定制防火墙的NAT访问策略
9.1)清除所有NAT策略
9.2)重置ip_forward为1
9.3)通过SNAT设定来源于192.168.6.0网段通过eth1转发出去
9.4)用iptables观察转发的数据包

  1. iptables -F -t nat
  2. iptables -X -t nat
  3. iptables -Z -t nat
  4. echo 1 > /proc/sys/net/ipv4/ip_forward
  5. iptables -t nat -A POSTROUTING -o eth1 -j SNAT –to-source 192.168.6.217
  6. iptables -L -nv


10)端口转发访问策略
10.1)清除所有NAT策略
10.2)重置ip_forward为1
10.3)通过DNAT设定为所有访问192.168.6.217的22端口,都访问到192.168.6.191的22端口
10.4)设定所有到192.168.6.191的22端口的数据包都通过FORWARD转发
10.5)设定回应数据包,即通过NAT的POSTROUTING设定,使通讯正常

  1. iptables -F -t nat
  2. iptables -X -t nat
  3. iptables -Z -t nat
  4. echo 1 >/proc/sys/net/ipv4/ip_forward
  5. iptables -t nat -A PREROUTING -d 192.168.6.217 -p tcp –dport 22 -j DNAT –to-destination 192.168.6.191:22
  6. iptables -A FORWARD -p tcp -d 192.168.6.191 –dport 22 -j ACCEPT
  7. iptables -t nat -I POSTROUTING -p tcp –dport 22 -j MASQUERADE

shell脚本练习题

这里主要收集一些shell脚本练习题,用于加强shell编程能力。

Q1

分析图片服务日志,把日志(每个图片访问次数*图片大小的总和)排行,也就是计算每个url的总访问大小
说明:本题生产环境应用:这个功能可以用于IDC网站流量带宽很高,然后通过分析服务器日志哪些元素占用流量过大,进而进行优化或裁剪该图片,压缩js等措施。
测试数据
59.33.26.105 – – [08/Dec/2010:15:43:56 +0800] “GET /static/images/photos/2.jpg HTTP/1.1” 200 11299
本题需要输出三个指标: 【被访问次数】 【访问次数*单个被访问文件大小】 【文件名(带URL)】
查看答案

Q2

计算出1+2+3+..+100的结果。可以使用多种方法解答。
查看答案

Q3

分析网站日志,找出在一分钟内打开网页超过60次的ip(排除图片,js和css等静态元素),并用iptables禁止其访问。加入crontab使脚本每分钟执行一次。
查看答案

Q4

teamlist.txt的内容为:

  1. Name,Team,First Test, Second Test, Third Test
  2. Tom,Red,5,17,22
  3. Joe,Green,3,14,22
  4. Maria,Blue,6,18,21
  5. Fred,Blue,2,15,23
  6. Carlos,Red,-1,15,24
  7. Phuong,Green,7,19,21
  8. Enrique,Green,3,16,20
  9. Nancy,Red,9,12,24

编写一个awk脚本用来计算每个人的平均成绩,每次测试的平均成绩和每组队的平均成绩。如果某次成绩为负数,则表示此人错过了测试,那计算平均成绩时排除此人再计算。
输出的结果如下表,在名字的列表中,名字是10个宽度且左对齐(提示printf中使用%-10s格式),而平均值是7个字符宽度,右边两个右对齐的小数。

  1. Name       Average
  2. —-       ——-
  3. Tom          14.67
  4. Joe          13.00
  5. Maria        15.00
  6. Fred         13.33
  7. Carlos       19.50
  8. Phuong       15.67
  9. Enrique      13.00
  10. Nancy        15.00
  11. ——————
  12. Average for Test 1 : 5
  13. Average for Test 2 : 15.75
  14. Average for Test 3 : 22.125
  15. ——————-
  16. Average for Red Team: 16
  17. Average for Blue Team: 14.1667
  18. Average for Green Team: 13.8889

查看答案

Q5

传入至少三个数字参数到脚本file,并计算出最大,最小,平均值。需要判断传入的数字是否足够,否则输出警告信息。平均值保留两位小数。
如执行./file 3 4 6 5,输出结果如下:
max number is:6
min number is:3
average is:4.50
查看答案

Q6

有一列数字如下:
第1次:1
第2次:2
第3次:3
第4次:5
第5次:8
第6次:13
第7次:21
第8次:34
第9次:55
第10次:89
第11次:144
写出100次的数是什么。
查看答案

Q7

文件内容如下:
123abc456
456def123
567abc789
789def567
要求输出:
456ABC123
123DEF456
789ABC567
567DEF789
查看答案