关于讲课

  今天扮演了一下内部认证讲师评审的学员,我几乎没有关心讲课的内容,只是在观察一些讲课的技巧和注意事项。每次讲完,评委都会给出一些意见和建议,对我来讲也是一次难得的学习机会,在观察别人的授课的过程中,我也深深地发现自己授课的水平简直就是烂到家了,以后要多学习,多锻炼。
  这次听课使我有幸看到了传说中的邹立巍老师的讲课的风范,他的授课水平我很是赞叹;这次授课,他没有将太多深奥的东西,但就一点点linux的权限的知识便非常好地体现出了他讲课的水平。回头想想我当时将的东西,虽然比他讲的内容有深度,也更实用,但是我讲的就缺点多多,问题多多;所以说,像这样的内部讲师评审不需要讲太NB的东西,重要的是你对授课技巧的掌握。
  下面简要地列几点注意事项:

  1. 不要总是随意地走动(也不要一动不动)
  2. 要面带微笑
  3. 要会使用道具
  4. 衣着要整洁
  5. 要让听众知道所讲的东西对他们有用
  6. 不要总是说这个东西对自己多么的有用,自己总是怎么做的(在你没有被公认之前,这些属于自大)
  7. 语调要根据内容的需要做到抑扬顿挫,如果一堂课下来都是一个音调,学生会睡觉的

windows通过netsh设置防火墙

netsh advfirewall firewall>add rule

提供的许多参数无效。请查看帮助获取正确语法。

用法: add rule name=<string>
      dir=in|out
      action=allow|block|bypass
      [program=<program path>]
      [service=<service short name>|any]
      [description=<string>]
      [enable=yes|no (default=yes)]
      [profile=public|private|domain|any[,…]]
      [localip=any|<IPv4 address>|<IPv6 address>|<subnet>|<range>|<list>]
      [remoteip=any|localsubnet|dns|dhcp|wins|defaultgateway|
         <IPv4 address>|<IPv6 address>|<subnet>|<range>|<list>]
      [localport=0-65535|<port range>[,…]|RPC|RPC-EPMap|IPHTTPS|any (default=any)]
      [remoteport=0-65535|<port range>[,…]|any (default=any)]
      [protocol=0-255|icmpv4|icmpv6|icmpv4:type,code|icmpv6:type,code|
         tcp|udp|any (default=any)]
      [interfacetype=wireless|lan|ras|any]
      [rmtcomputergrp=<SDDL string>]
      [rmtusrgrp=<SDDL string>]
      [edge=yes|deferapp|deferuser|no (default=no)]
      [security=authenticate|authenc|authdynenc|authnoencap|notrequired
         (default=notrequired)]

备注:

      – 将新的入站或出站规则添加到防火墙策略。
      – 规则名称应该是唯一的,且不能为 "all"。
      – 如果已指定远程计算机或用户组,则 security 必须为
        authenticate、authenc、authdynenc 或 authnoencap。
      – 为 authdynenc 设置安全性可允许系统动态协商为匹配
        给定 Windows 防火墙规则的通信使用加密。
        根据现有连接安全规则属性协商加密。
        选择此选项后,只要入站 IPSec 连接已设置安全保护,
        但未使用 IPSec 进行加密,计算机就能够接收该入站连接的第一个 TCP 或
        UDP 包。
        一旦处理了第一个数据包,服务器将重新协商连接并对其进行升级,以便所
        有后续通信都完全加密。
      – 如果 action=bypass,则 dir=in 时必须指定远程计算机组。
      – 如果 service=any,则规则仅应用到服务。
      – ICMP 类型或代码可以为 "any"。
      – Edge 只能为入站规则指定。
      – AuthEnc 和 authnoencap 不能同时使用。
      – Authdynenc 仅当 dir=in 时有效。
      – 设置 authnoencap 后,security=authenticate 选项就变成可选参数。

示例:

      为不具有封装的 messenger.exe 添加入站规则:
      netsh advfirewall firewall add rule name="allow messenger"
      dir=in program="c:\programfiles\messenger\msmsgs.exe"
      security=authnoencap action=allow

      为端口 80 添加出站规则:
      netsh advfirewall firewall add rule name="allow80"
      protocol=TCP dir=out localport=80 action=block

      为 TCP 端口 80 通信添加需要安全和加密的入站规则:
      netsh advfirewall firewall add rule
      name="Require Encryption for Inbound TCP/80"
      protocol=TCP dir=in localport=80 security=authdynenc
      action=allow

      为 messenger.exe 添加需要安全的入站规则:
      netsh advfirewall firewall add rule name="allow messenger"
      dir=in program="c:\program files\messenger\msmsgs.exe"
      security=authenticate action=allow

      为 SDDL 字符串标识的组 acmedomain\scanners 添加
     经过身份验证的防火墙跳过规则:
     netsh advfirewall firewall add rule name="allow scanners"
      dir=in rmtcomputergrp=<SDDL string> action=bypass
      security=authenticate

      为 udp- 的本地端口 5000-5010 添加出站允许规则
      Add rule name="Allow port range" dir=out protocol=udp localport=5000-5010 action=allow
netsh advfirewall firewall>

更多参考资料: http://technet.microsoft.com/zh-cn/library/cc776229%28WS.10%29.aspx

windows 上通过netsh设置端口代理

实例一:   在windows上启动一个8181端口来代理phpor.net的80端口的服务

删除端口代理:

当然,你可能记不住这么长的命令,可以如下方式使用:
>netsh
>?   // 查看可以使用的命令

>interface   // 这里你可以不拼写完,只要不会和其他命令产生歧义就行,如: interf
>?  // 查看可以使用的命令

>portproxy
>?

>set v4tov4 listenport=8181 connectaddress=phpor.net connectport=80
>show all

注意: 目前只支持tcp的端口代理。

这里又意外发现一处windows的错误:

=================================================
netsh还可以完成很多东西,有时间再看

通过ssldump来分析ssl协议过程

ssldump下载: http://www.rtfm.com/ssldump/ssldump-0.9b3.tar.gz
ssldump安装:
./configure  && make && make install

make的时候可能会有错误:
net/bpf.h 找不见 ; 通过 ldconfig -p | grep pcap 发现已经安装了pcap的so文件, 使用rpm查了一下该so文件所属的rpm包,再通过rpm -ql libpcap-0.8.3-12.el4_6.1  发现存在类似头文件: /usr/include/pcap-bpf.h

于是,修改ssldump代码中包含的头文件:
<net/bpf.h> 修改为  <pcap-bpf.h>
于是,编译成功

使用:
./ssldump -i eth0 -k /etc/ssl/crt/private.key  -nn -d  port 443
..

apache 的任务分配模型

我们知道,Apache可以同时接受很多请求,在Apache的pre-fork模型中,有m个Apache的子进程随时等待着处理请求,这时,有n个请求过来了,那么,这n个请求是如何分配到m个进程来处理的呢?

首先,即使是n个请求同时到达,到操作系统层也会串行化后再提交到应用程序的。

情况一:
假设我们的Apache只listen一个IP:port, 则:
第一步:
父进程在fork子进程之前,会:
socket(…) = s;
listen(s,…) = 0;
这样就产生了一个listen指定ip:port 的文件描述符fd(s); Apache父进程在fork子进程时会将该fd(s)遗传给每一个子进程
第二步:
每个子进程都会处于:  accept(s,…) 状态,等待接受请求,这些子进程在s上排队,先到先得,得到请求后,开始处理请求,处理完请求后继续accept(s,…) 等待请求; 这样,如果每个请求的处理时间相同,则,每个子进程能处理的任务基本是平均分配的。

情况二:
假设我们的Apache同时listen了同一个IP上的80和443端口,则:
第一步:
父进程在fork子进程之间,会:
socket(…) = s80;
listen(s89,…) = 0;

socket(…) = s443;
listen(s443,…) = 0;

semget(…) = semaphore;
产生s80, s443 两个fd (如果是epoll模型,则是创建一个epoll)和一个信号量semaphore

第二步:
因为accept不能同时在两个socket上排队,所以直接进入accept状态就不行了,所以就用到了“同步IO多路技术”,一般有三种实现: select、poll、epoll,其中epoll是最为高效的一种,这里已epoll为例说明。因为epoll只能同时accept多个socket,但是没法让多个进程在epoll的多个socket上排队;所以还得引入一个信号量的概念,信号量是解决同步与互斥问题的,常用的一种实现为semop(…); 这样多个Apache的子进程通过semop在父进程产生的信号量semaphore上排队,这样,保证同时只有一个进程处于可以接受请求的状态,接受到请求之后,退出队列,然后由下一个子进程接受请求。基本流程如下:

shell + awk 做日志监控

今天使用shell + awk 写了一个日志监控脚本,主要功能如下:
1. 没10分钟分析1次, 分析前10分钟的日志
2. 分析前10分钟日志中各种错误的数量及占比,来决定是否发送报警短信,很多错误号需要做特殊处理,有些错误号还要忽略

主要温习了下面知识:
1. shell中函数的定义
  参考资料: http://www.cnblogs.com/chengmo/archive/2010/10/17/1853356.html

2. awk按照比较漂亮的格式写在shell文件中,不需要单独写awk脚本,使得一个shell脚本就可以干活了
3. awk中的数组似乎不能明确初始化一个空数组,awk中的数组都是关联数组
4. awk错误调试,这个是最有意义的了,如下图:
  
5. shell中的函数必须在调用前定义,但是我们不喜欢先看到一堆函数后才能看到主流程,办法为:
   第一: 要么将函数定义到其他文件中,然后主流程的文件包含该函数文件
   第二: 要么定义一个main函数,只需把main函数的调用放在文件尾部就行了,main的定义写在文件开始