天天看點

toa 子產品

toa子產品是為了讓後端的realserver能夠看到真實的clientip而不是lvs的dip。

一、編譯centos6

   2、解壓

   3、編輯.config,将CONFIG_IPV6=M改成CONFIG_IPV6=y

   4、編輯Makefile,可以在EXTRAVERSION =處加上自定義的一些說明,将會在uname -r中顯示。比如-shanks.e11.x86_64

   5、make -jn

   6、make modules_install

   7、make install

   8、修改/boot/grub/grub.conf     用第一個核心啟動

   9、reboot

   10、裝個nginx,試試看能不能看見真實的clientip。

二、編譯centos5

   1~4和centos6一樣

   5、可能是由于centos5和6的差別還是很大的,是以在centos5上編譯2.6.32的時候,需要讓核心還是用舊的sysfs,否則會kernel panic。

   在.config中添加這兩行,有的話就直接改,沒有添上

   CONFIG_SYSFS_DEPRECATED=y

   CONFIG_SYSFS_DEPRECATED_V2=y

   之後的操作就和centos6的一樣了(5~10)

<a href="http://ssmax.net/archives/1198.html" target="_blank">http://ssmax.net/archives/1198.html</a>

三、打核心rpm包(适用于centos6)

事先準備:

下載下傳Linux-2.6.32-220.23.1.el6.x86_64.rs.src.tar.gz和kernel-2.6.32-220.23.1.el6.src.rpm到/usr/local/src

1、安裝kernel-2.6.32-220.23.1.el6.src.rpm

<code>rpm -ivh </code><code>/usr/local/src/kernel-2</code><code>.6.32-220.23.1.el6.src.rpm</code>

2、生成核心源碼目錄

<code>rpmbuild -bp ~</code><code>/rpmbuild/SPECS/kernel</code><code>.spec</code>

3、複制一份源碼目錄

<code>cd</code> <code>~</code><code>/rpmbuild/BUILD/kernel-2</code><code>.6.32-220.23.1.el6/</code>

<code>cp</code> <code>-a linux-2.6.32-220.23.1.el6.x86_64/ linux-2.6.32-220.23.1.el6.x86_64_new</code>

4、在複制出來的源碼目錄中打阿裡提供的toa更新檔

<code>cd</code> <code>~</code><code>/rpmbuild/BUILD/kernel-2</code><code>.6.32-220.23.1.el6</code><code>/linux-2</code><code>.6.32-220.23.1.el6.x86_64_new/</code>

<code>patch -p1 &lt; </code><code>/usr/local/src/linux-2</code><code>.6.32-220.23.1.el6.x86_64.rs</code><code>/toa-2</code><code>.6.32-220.23.1.el6.patch</code>

5、編輯.config

<code>#在linux-2.6.32-220.23.1.el6.x86_64_new中</code>

<code>sed</code> <code>-i </code><code>'s/CONFIG_IPV6=m/CONFIG_IPV6=y/g'</code> <code>.config</code>

<code>echo</code> <code>-e </code><code>'\n# toa\nCONFIG_TOA=m'</code> <code>&gt;&gt; .config</code>

6、拷貝.config至SOURCE

<code>#在linux-2.6.32-220.23.1.el6.x86_64_new中,會提示覆寫,直接覆寫即可</code>

<code>cp</code> <code>.config ~</code><code>/rpmbuild/SOURCES/config-x86_64-generic</code>

7、删除原始源碼中的.config

<code>cd</code> <code>~</code><code>/rpmbuild/BUILD/kernel-2</code><code>.6.32-220.23.1.el6</code><code>/linux-2</code><code>.6.32-220.23.1.el6.x86_64</code>

<code>rm</code> <code>-rf .config</code>

8、生成最終的patch

<code>diff</code> <code>-uNr linux-2.6.32-220.23.1.el6.x86_64 linux-2.6.32-220.23.1.el6.x86_64_new/ &gt; ~</code><code>/rpmbuild/SOURCES/toa</code><code>.patch</code>

9、編輯KERNEL.SPEC

<code>vim ~</code><code>/rpmbuild/SPECS/kernel</code><code>.spec</code>

<code>    </code><code>%define distro_build rs.shanks</code>

<code>    </code><code>Patch999999: toa.patch</code>

<code>    </code><code>ApplyOptionalPatch toa.patch</code>

10、打rpm包

<code>rpmbuild -bb --with baseonly --without kabichk --with firmware --without debuginfo --target=x86_64 ~</code><code>/rpmbuild/SPECS/kernel</code><code>.spec</code>

11、加載toa子產品

<code>vim </code><code>/etc/sysconfig/modules/toa</code><code>.modules</code>

<code>    </code><code>#!/bin/bash</code>

<code>    </code><code>modprobe toa &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>chmod</code> <code>u+x </code><code>/etc/sysconfig/modules/toa</code><code>.modules</code>

<code>reboot</code>

<code>[root@localhost ~]</code><code># lsmod |grep toa</code>

<code>toa                     4203  0</code>

done

***********************************

例如:我想知道請求 dx-xxx-xxx 03 這台機器11300端口的源IP資訊?

方式:

1、抓目的端口為11300的SYN包

<code>tcpdump </code><code>-</code><code>i eth0 </code><code>"tcp[tcpflags] &amp; (tcp-syn) != 0 and dst port 11300"</code>  <code>-</code><code>c </code><code>1000</code> <code>&gt;&gt; </code><code>/</code><code>home</code><code>/</code><code>user</code><code>/</code><code>11300.ni</code>

2、編譯以下代碼

toa.c

<code>#include &lt;stdio.h&gt;</code>

<code>#include &lt;string.h&gt;</code>

<code>#include &lt;arpa/inet.h&gt;</code>

<code>#include &lt;stdlib.h&gt;</code>

<code> </code> 

<code>int</code> <code>main(</code><code>int</code> <code>argc, char </code><code>*</code><code>argv[])</code>

<code>{</code>

<code>    </code><code>struct in_addr addr;</code>

<code>    </code><code>const char </code><code>*</code><code>toaHex </code><code>=</code> <code>argv[</code><code>1</code><code>];</code>

<code>    </code><code>char </code><code>*</code><code>ip </code><code>=</code> <code>NULL;</code>

<code>    </code><code>unsigned short port </code><code>=</code> <code>0</code><code>;</code>

<code>    </code><code>addr.s_addr </code><code>=</code> <code>htonl(strtol(&amp;toaHex[strlen(toaHex) </code><code>-</code> <code>8</code><code>], NULL, </code><code>16</code><code>));</code>

<code>    </code><code>port </code><code>=</code> <code>htonl(strtol(&amp;toaHex[strlen(toaHex) </code><code>-</code> <code>12</code><code>], &amp;toaHex[strlen(toaHex) </code><code>-</code> <code>9</code><code>], </code><code>16</code><code>));</code>

<code>    </code><code>ip </code><code>=</code> <code>inet_ntoa(addr);</code>

<code>    </code><code>printf(</code><code>"%s %u\n"</code><code>, ip, port);</code>

<code>}</code>

3、執行該腳本進行轉換

<code>cat</code> <code>11300.ni|</code><code>awk</code> <code>'{print $15}'</code><code>|</code><code>awk</code> <code>-F </code><code>','</code> <code>'{system("./toa "$1)}'</code> <code>&gt;&gt; </code><code>/home/user/result</code><code>.txt</code>

參考:

<a href="http://www.just4coding.com/blog/2015/11/16/toa/" target="_blank">LVS FULLNAT模式下用戶端真實位址的傳遞</a>

本文轉自 Tenderrain 51CTO部落格,原文連結:http://blog.51cto.com/tenderrain/1982343

繼續閱讀