COMMENTS

邻居发现(Neighbor Discovery)协议及攻击防范

<转载请注明出处>

1. ND协议介绍

邻居发现协议(Neighbor Discovery Protocol,以下称ND协议)是IPv6的一个关键协议,可以说,ND协议是IPv4某些协议在IPv6中综合起来的升级和改进,如ARP、ICMP路由器发现和ICMP重定向等协议。当然,作为IPv6的基础性协议,ND还提供了其他功能,如前缀发现、邻居不可达检测、重复地址检测、地址自动配置等。

1.1 IPv6协议格式

NDP-graphic1

Version(4-bit):IP版本,该字段值为6

Traffic Class(8-bit):流量分类,与IPv4包头的TOS类似

Flow Label(20-bit):流标签,用来标记IPv6数据包的一个流

Payload Length(16-bit):有效载荷的长度,有效载荷为紧跟IPv6包头的数据包的其他部分

Next Header(8-bit):处理选项字段,分段,安全,移动性,松散源路由,记录路由等的新方式。该字段在承载ND报文时字段值为58(ICMPv6)。该字段详细字段值对应如下表

Value Type of Header
0 Hop-by-Hop Options Header
6 TCP
17 UDP
41 Encapsulated IPv6 Header
43 Routing Header
44 Fragment Header
50 Encapsulating Security Payload
51 Authentication Header
58 ICMPv6
59 No next header
60 Destination Options Header

Hop Limit:(8-bit):定义IP数据包所能经过的最大跳数,每跳一次将此值减1

Source Address(128-bit):IP数据包的源地址

Destination Address(128-bit):IP数据包的目的地址

继续阅读

位运算实现的基本操作收集

收集于网络 

/* base.h:基本操作的位运算实现 */ 
#ifndef BASE_H  
#define BASE_H  
#define word   int  
#define uword  unsigned int  
/* 将最右侧的1位改成0位 */ 
#define right1to0(x)  ((x)&((x)-1))  
/* 向右传播最右侧的1位 */ 
#define right1torig(x)  ((x)|((x)-1))  
/* 将最右侧的连续1位串改成0位串 */ 
#define right1sto0s(x)  (((x)|(x)-1)+1 & (x))  
/* 检查无符号整数x是否为2的幂,注意&的优先级低于==,需要括号 */ 
#define powof2u(x)  (((x)&((x)-1))==0)  
/* 检查无符号整数x是否为2**n-1的形式 */ 
#define pow2sub1u(x)  (((x)&((x)+1))==0)  
/* 检查无符号整数x是否为2**j-2**k形式 */ 
#define pow2subpow2u(x)  ((((x)|(x)-1)+1 & (x))==0)  
 
/* 下列掩码直接析出字中指定的位 */ 
/* 析出最右侧的1位 */ 
#define right1(x)  ((x) & -(x))  
/* 析出最右侧的0位 */ 
#define right0(x)  (~(x)&((x)+1))  
/* 析出后缀0 */ 
#define suffix0(x)  (((x)&-(x))-1)  
/* 析出最右侧的1位和后缀0(即后缀10…0) */ 
#define suffix10s0(x)  ((x) ^ (x)-1)  
/* 下列掩码与字做&运算,可以析出字中指定的字段 */ 
/* 析出高阶n位(注意n的值不能大于int型的宽度) */ 
#define high_ones(n) (-1<<32-(n))  
/* 析出低阶n位 */ 
#define low_ones(n) (~(-1<<(n)))  
/* 析出低阶offset位和高阶32-offset-width位 */ 
#define mid_zeros(width,offset)    \  
        (-1<<(width)+(offset) | ~(-1<<(offset)))      
/* 析出中间width位,它右侧有offset位 */ 
#define mid_ones(width,offset)     \  
        (~(-1<<(width)+(offset)) & (-1<<(offset)))  
 
/* 对无符号整数x,求比x大且与x中的位1个数相同的下一个整数: 
    例如对nnn0 1111 0000,则下一个整数为nnn1 0000 01111。 
    可以用这个函数来遍历一个集合的所有子集 */ 
#define nextsame1u(x)  (right1(x)+(x) |      \  
      (((x)^right1(x)+(x))>>2)/right1(x))  
/* 字的绝对值函数:注意x>>31为0或-1,而x^0=x,x^-1=~x */ 
#define abs(x)  (((x)^((x)>>31))-((x)>>31))  
/* 绝对值的负值 */ 
#define nabs(x)  (((x)>>31)-((x)^((x)>>31)))   
/* 符号扩展:将第7位向左传播(位编号从0开始) */ 
#define prop7thtolef(x)  ((((x) & 0×000000FF) ^ 0×00000080)-0×00000080)  
/* 对无符号整数实现算术右移:也可用更简单的((signed)(x)>>n) */ 
#define arithrshiftu(x,n)  ((((x)^0×80000000)>>(n))-(0×80000000>>(n)))       
/* 对有符号整数实现逻辑右移:也可用更简单的((unsigned)(x)>>n) */ 
#define logicrshift(x,n)  ((((x)^0×80000000)>>(n))+(1<<31-(n)))   
/* 符号函数:x>0返回1,x=0返回0,x<0返回-1 */ 
#define sign(x)  (((x)>0)-((x)<0))  
/* 三值比较函数:x>y返回1,x=y返回0,x<y返回-1 */ 
#define cmp(x,y)  (((x)>(y))-((x)<(y)))  
/*  符号传递函数:返回采用y的符号后的x */ 
#define copysign(x,y)  ((abs(x)^((y)>>31))-((y)>>31))   
/* 比较谓词:带符号整数 */ 
#define equal(x,y)     (~((x)-(y)|(y)-(x))>>31)  
#define noteq(x,y)     (((x)-(y)|(y)-(x))>>31)  
#define less(x,y)      ((((x)^(y)) & ((x)-(y)^(x)) ^ (x)-(y))>>31)  
#define larger(x,y)    ((((y)^(x)) & ((y)-(x)^(y)) ^ (y)-(x))>>31)  
#define lesseq(x,y)    ((((x)|~(y)) & ((x)^(y) | ~((y)-(x))))>>31)  
#define largereq(x,y)  ((((y)|~(x)) & ((y)^(x) | ~((x)-(y))))>>31)  
/* 比较谓词:无符号整数 */       
#define equalu(x,y)     (~((x)-(y)|(y)-(x))>>31)  
#define notequ(x,y)     (((x)-(y)|(y)-(x))>>31)  
#define lessu(x,y)      ((~(x) & (y) | ~((x)^(y)) & (x)-(y))>>31)  
#define largeru(x,y)    ((~(y) & (x) | ~((y)^(x)) & (y)-(x))>>31)  
#define lessequ(x,y)    (((~(x)|(y)) & (((x)^(y)) | ~((y)-(x))))>>31)  
#define largerequ(x,y)  (((~(y)|(x)) & (((y)^(x)) | ~((x)-(y))))>>31)  
/* 溢出检测:带符号运算 */ 
#define addovf(x,y)  ((~((x)^(y))&(((x)+(y))^(x)))>>31)  
#define subovf(x,y)  ((((x)^(y))&(((x)-(y))^(x)))>>31)  
#define mulovf(x,y)  ((y)<0 && (x)==0×80000000 || (y)!=0 && (x)*(y)/(y)!=(x))  
#define divovf(x,y)  ((y)==0 || (x)==0×80000000 && (y)==-1)  
/* 溢出检测:无符号运算 */ 
#define addovfu(x,y)  (~(x)<(y))  /* 也可用less(~(x),y) */  
#define subovfu(x,y)  ((x)<(y))   /* 也可用less(x,y) */  
#define mulovfu(x,y)  ((y)!=0 && (x) > 0xffffffff/(y))  
#define divovfu(x,y)  ((y)==0)  
/* 循环移位:带符号整数 */ 
/* 循环左移n位 */ 
#define rotlshift(x,n)  ((x)<<(n) | (unsigned)(x)>>32-(n))  
/* 循环右移n位 */ 
#define rotrshift(x,n)  ((unsigned)(x)>>(n) | (x)<<32-(n))  
/* 循环移位:无符号整数 */ 
#define rotlshiftu(x,n)  ((x)<<(n) | (x)>>32-(n))  
#define rotrshiftu(x,n)  ((x)>>(n) | (x)<<32-(n))  
/* 正差函数:x>=y时返回x-y,x<y时返回0。注意&优先级高于^,无需要括号 */ 
#define doz(x,y)  ((x)-(y)&~((x)-(y)^((x)^(y))&((x)-(y)^(x)))>>31)  
/* 大值函数 */ 
#define max(x,y)  ((y)+doz(x,y))  
/* 小值函数 */ 
#define min(x,y)  ((x)-doz(x,y))  
/* 下面是无符号版本 */ 
#define dozu(x,y)  ((x)-(y)& arithrshiftu(((x)|~(y))&((x)^(y)|~((x)-(y))) ,31))  
#define maxu(x,y)  ((y)+dozu(x,y))  
#define minu(x,y)  ((x)-dozu(x,y))  
/* 交换变量的值 */ 
#define swap(x,y)      \  
    do { x=x^y; y=y^x; x=x^y; } while(0)  
/* 根据掩码来交换变量的相应字段: 
    当m的第i位为1时,交换x,y的第i位;当m的第i位为0时,保留x,y的第i位不变  */ 
#define swapbits(x,y,m)     \  
    do { x=x^y; y=y^(x&(m)); x=x^y; } while(0)      
/* 2个常量的循环赋值:当x为a时赋值b,当x为b时赋值a */ 
#define rottwo(x,a,b)  do{ x=(a)^(b)^x; }while(0)  
/* 3个常量的循环赋值 */ 
#define rotthree(x,a,b,c)     \  
    do{ x=(-(x==c)&(a-c))+(-(x==a)&(b-c))+c; }while(0)  
#endif 
本文来自CSDN博客,原文出处:http://blog.csdn.net/zhoudaxia/archive/2010/03/28/5425619.aspx#

C的位运算及常见用法

收集于网络
位运算
    位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果。
位运算符有:
    &(按位与)、|(按位或)、^(按位异或)、~ (按位取反)。
    其中,按位取反运算符是单目运算符,其余均为双目运算符。
    位运算符的优先级从高到低,依次为~、&、^、|,
    其中~的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符。
   (1)按位与运算符(&)
    按位与运算将两个运算分量的对应位按位遵照以下规则进行计算:
     0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。
即同为 1 的位,结果为 1,否则结果为 0。
    例如,设3的内部表示为
     00000011
    5的内部表示为
     00000101
    则3&5的结果为
     00000001
    按位与运算有两种典型用法,一是取一个位串信息的某几位,如以下代码截取x的最低7位:x & 0177。二是让某变量保留某几位,其余位置0,如以下代码让x只保留最低6位:x = x & 077。以上用法都先要设计好一个常数,该常数只有需要的位是1,不需要的位是0。用它与指定的位串信息按位与。
   (2)按位或运算符(|)
    按位或运算将两个运算分量的对应位按位遵照以下规则进行计算:
     0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1
即只要有1个是1的位,结果为1,否则为0。
    例如,023 | 035 结果为037。
    按位或运算的典型用法是将一个位串信息的某几位置成1。如将要获得最右4为1,其他位与变量j的其他位相同,可用逻辑或运算017|j。若要把这结果赋给变量j,可写成:
     j = 017|j
   (3)按位异或运算符(^)
    按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算:
     0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0
即相应位的值相同的,结果为 0,不相同的结果为 1。
    例如,013^035结果为026。
    异或运算的意思是求两个运算分量相应位值是否相异,相异的为1,相同的为0。按位异或运算的典型用法是求一个位串信息的某几位信息的反。如欲求整型变量j的最右4位信息的反,用逻辑异或运算017^j,就能求得j最右4位的信息的反,即原来为1的位,结果是0,原来为0的位,结果是1。

继续阅读

以太网帧格式,IP包头,TCP头格式说明

本文转自网络,感谢原作者!
frame-0圖三、乙太網路的 MAC 訊框
在這個 MAC 當中,最重要的就是那個 6 Bytes 的目的與來源位址了! 事實上,在所有的乙太網路卡當中都有一個獨一無二的網路卡卡號, 那就是上頭的『目的與來源位址』,這個位址是硬體位址( hardware address ), 共有 6 bytes ,分別由 00:00:00:00:00:00 到 FF:FF:FF:FF:FF:FF, 這 6 bytes 當中,前 3bytes 為廠商的代碼,後 3bytes 則是該廠商自行設定的裝置碼了。 在 Linux 當中,你可以使用 ifconfig 這個指令來查閱你的網路卡卡號喔! 不過,由於 MAC 主要是與網路卡卡號有關,所以我們也常常將 MAC 作為網路卡卡號的代稱。 特別注意,在這個 MAC 的傳送中,他僅在區域網路內生效, 如果跨過不同的網域 (這個後面 IP 的部分時會介紹),那麼來源與目的的位址就會跟著改變了。 這是因為變成不同網路卡之間的交流了嘛!所以卡號當然不同了!如下所示:

frame-1
圖四、在不同主機間持續傳送相同資料的 MAC 訊框變化
例如上面的圖示,我的資料要由電腦 A 通過 B 後才送達 C ,而 B 電腦有兩塊網路卡, 其中 MAC-2 與 A 電腦的 MAC-1 互通,至於 MAC-3 則與 C 電腦的 MAC-4 互通。 但是 MAC-1 不能與 MAC-3 與 MAC-4 互通,為啥?因為 MAC-1 這塊網路卡並沒有與 MAC-3 及 MAC-4 使用同樣的 switch/hub 相接嘛!所以,資料的流通會變成:

  1. 先由 MAC-1 傳送到 MAC-2 ,此時來源是 MAC-1 而目的地是 MAC-2;
  2. B 電腦接收後,察看該訊框,發現目標其實是 C 電腦,而為了與 C 電腦溝通, 所以他會將訊框內的來源 MAC 改為 MAC-3 ,而目的改為 MAC-4 ,如此就可以直接傳送到 C 電腦了。

也就是說,只要透過 B (就是路由器) 才將封包送到另一個網域 (IP 部分會講) 去的時候, 那麼訊框內的硬體位址就會被改變,然後才能夠在同一個網域裡面直接進行 frame 的流通啊!
MAC包大小:旧为1900bytes,大为9000bytes

IP 封包的表頭
現在我們知道 IP 這個資料封包 (packet) 是需要放置在 MAC 訊框裡面的,所以當然不能比 MAC 所能容許的最大資料量還大!但是 IP 封包其實可以到 65535 bytes 那麼大的吶! 那麼 IP 封包除了資料之外,他的表頭資料 (head) 是長怎樣呢? 在圖三的 MAC 訊框表頭裡面最重要的莫過於那個網路卡硬體位址, 那麼在 IP 表頭裡面當然就以來源與目標的 IP 位址為最重要囉! 除此之外, IP 表頭裡面還含有哪些重要資料呢?如底下所示:(下圖第一行為每個欄位的 bit 數)
frame-2
圖八、IP 封包的表頭資料
在上面的圖示中有個地方要注意,那就是『每一行所佔用的位元數為 32 bits』, 也就是說, IP 封包的表頭資料是 32 bits 的倍數喔!那各個表頭的內容分別介紹如下:

继续阅读

IPv4组播通信原理

摘自网络,感谢原作者
摘要:
本文试图成为学习TCP/IP网络组播技术的入门材料。文中介绍了组播通信的概念及原理,以及用于组播应用编程的Linux API的详细资料。为了使读者更加完整的了解Linux 组播的整体概念,文中对实现该技术的核心函数也做了介绍。在文章的最后给出了一个简单的C语言套接字编程例子,说明如何创建组播应用程序。

一、导言

在网络中,主机间可以用三种不同的地址进行通信:

单播地址(unicast):即在子网中主机的唯一地址(接口)。如IP地址:192.168.100.9或MAC地址:80:C0:F6:A0:4A:B1。

广播地址:这种类型的地址用来向子网内的所有主机(接口)发送数据。如广播IP地址是192.168.100.255,MAC广播地址:FF:FF:FF:FF:FF。

组播地址:通过该地址向子网内的多个主机即主机群(接口)发送数据。

如果只是向子网内的部分主机发送报文,组播地址就很有用处了;在需要向多个主机发送多媒体信息(如实时音频、视频)的情况下,考虑到其所需的带宽,分别向每一客户端主机发送数据并不是个好办法,如果发送主机与某些接收端的客户主机不在子网之内,采用广播方式也不是一个好的解决方案。

继续阅读

网络桥接的使用方法

连接两个局域网的方法除了路由外,比较简单的一个方法就是网络桥接了。这里将列出linux下创建网络桥接的一般步骤。

如下图的所示的网络环境中,中间的桥接计算机具有无线和有线网卡各一块,连接了两个局域网。在这个网络环境中两个局域网处于同一个网段,它可能是由桥接计算机上的DHCP自动分配的地址。这样做,最终产生的情况将是无线终端连接到了桥接计算机的无线网卡ath0(ath0工作在AP模式),有线网局域网通过交换机连接到了桥接计算机的eth0(有线网卡),连接在不同的两个物理网络上,通过桥接,使他们工作在同一个局域网中,同时,可以隔离两个物理网络,这是网络隔离中比较常见的手段。

brctllinux下使用桥接功能必须确保已经安装了bridge-utils,桥接方法如下:

1.创建br0: brctl addbr br0

2.添加物理网口:brctl addif br0 eth0; brctl addif br0 ath0

3.配置br0 IP: ifconfig br0 192.168.1.100 netmask 255.255.255.0 up

4. 启用物理网络:ifconfig ath0 up; ifconfig eth0 up

5.修改DHCP配置,使之在br0网口上分配地址。

如需要,可以用iptables来隔离两个物理网络。

配置DNS的潦草记录

前几天重装了系统,可惜之前离职的同事为我配置的DNS服务器忘了备份,没有了,只能自己动手来。
DNS的基本理论知识还是知道一些,也知道bind组件,记得在装Linux的时候勾选了DNS,这里就省去了一步安装bind组件了。必须安装的组件应该是bind,bind-libs,bind-chroot,我猜的。其实系统中还装了bind-utils,这个工具集不知道是否必须,ypbind不知道是什么东东,不管它。
其实配置这些服务不算难,一般的帮助文档都能在/usr/share/doc/中能找到。bind也不例外,/usr/doc/bind*/下边就是所有的文档了。而且给了一个sample,这不是很方便么。
值得记下来的是bind-chroot组件,这个东东使得/var/named/chroot变成了bind所认为的根目录,记得好像在哪里见过说涉及安全还是权限问题。所以配置文件中提到的/etc/ /var/***都指的是/var/named/chroot/下的,而不是真正的系统根目录。这一点让我困惑了好一阵子。
sample给的还是很有用意的,稍微想一下就会发现,sample下的etc目录,其实就是指/var/named/chroot下的etc目录,换句话说,/var/named/chroot/etc/里边的东东应该长的和/usr/share/doc/bind*/sample/etc/里差不多。同理,sample下的var目录就对应了/var/named/chroot/var。
不要一股脑的复制sameple到chroot中,最好对比着named.conf中所需要的东西来复制,其实默认的named.conf有些貌似也用不到,在我这里,反而因为一项加密的东西ddns_key而导致bind无法启动,删掉后正常了。
在named.conf中应该添加一个自己的zone,仿照着其他例子来写就OK,有个named.rfc***.zones,可以参照。然后在/var/named/chroot/var/named中建立同名的zone文件,同样的仿照其他的zone文件来写。
下班时间到了,详细的就不记录了,很多东西不懂,照猫画虎的配置出来一个,先应付着。

vim的配置文件设置--语法高亮、显示行号等

转载自网络
在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号、语法高亮度显示、智能缩进等功能的。为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc。
  在启动vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置甚至脚本,所以,一般情况下把.vimrc文件创建在当前用户的根目录下比较方便,即创建的命令为:
  $vi ~/.vimrc
  设置完后
  $:x 或者 $wq
  进行保存退出即可。
  下面给出一个例子,其中列出了经常用到的设置,详细的设置信息请参照参考资料:

“双引号开始的行为注释行,下同
  “去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
  set nocompatible
  “显示行号
  set nummber
  “检测文件的类型
  filetype on
  “记录历史的行数
   set history=1000
   “背景使用黑色
  set background=dark
  “语法高亮度显示
   syntax on
  “下面两行在进行编写代码时,在格式对起上很有用;
  “第一行,vim使用自动对起,也就是把当前行的对起格式应用到下一行;
  “第二行,依据上面的对起格式,智能的选择对起方式,对于类似C语言编
  “写上很有用
  set autoindent
  set smartindent
  “第一行设置tab键为4个空格,第二行设置当行之间交错时使用4个空格
  set tabstop=4
  set shiftwidth=4
  “设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
  set showmatch
  “去除vim的GUI版本中的toolbar
  set guioptions-=T
  “当vim进行编辑时,如果命令错误,会发出一个响声,该设置去掉响声
  set vb t_vb=
  “在编辑过程中,在右下角显示光标位置的状态行
  set ruler
  “默认情况下,寻找匹配是高亮度显示的,该设置关闭高亮显示
  set nohls
  “查询时非常方便,如要查找book单词,当输入到/b时,会自动找到第一
  “个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的单词,依
  “次类推,进行查找时,使用此设置会快速找到答案,当你找要匹配的单词
  “时,别忘记回车
  set incsearch
  “修改一个文件后,自动进行备份,备份的文件名为原文件名加“~“后缀
  if has(“vms”)
   set nobackup
  else
   set backup
  endif

  如果去除注释后,一个完整的.vimrc配置信息如下所示:
 

继续阅读

linux中开启路由功能

普通家用的路由器可以称之为标准的linux嵌入式设备,所以拥有一台linux主机,也就可以具备路由器的全部功能。所需要的是可能你的linux主机需要至少两块网卡,或者还需要无线网卡。

提及一下简单的思路,具体的软件安装和配置方法可以分别从网上搜索。

编辑/etc/sysctl.conf文件中的net.ipv4.ip_forward值,将其修改为1,保存后再使用sysctl -p命令使配置即时生效。或者使用echo “1″ > /proc/sys/net/ipv4/ip_forward命令临时开启,重启后不生效的。这样就开启了Linux的路由转发功能。

再者安装DHCP,使你的linux主机成为一台DHCP服务器,DHCP的安装很简单,一般linux发行版都带有这个软件,如果默认没有安装使用安装光盘安装,或者从网上下载也可,只是版本众多,所以用光盘里的也是最省事的办法。配置文件为/etc/dhcpd.conf,具体的配置可以参考我的另一篇文章启用dhcp relay为不同子网分配IP, option domain-name-servers需要配置为本机的IP,也就是你DHCP服务器准备分配地址的网卡IP。

接下来就需要安装DNS服务器了,这里使用DNS并不是需要这台主机解析域名,仅仅是一个转发DNS请求的作用。所以安装后应该不需要配置什么。安装的组件应该是bind,bind-chroot等。 当然,如果DHCP的option domain-name-servers配置了一个可用的公网DNS,那么就不需要安装DNS了。

最后还需要iptables来开启NAT伪装,来做地址转换,开启的命令如下,iptables -t nat -A POSTROUNTING -o eth0 -j MASQUERADE ,具体网口地址就是你的外网口,视具体情况修改。可以将这条命令写入/etc/rc.d/rc.local或者用iptables-save > /root/iptables-saved来保存目前的iptables状态,再将iptables-restore /root/iptables-saved写入/etc/rc.d/rc.local,来使开机配置生效。

这样简单的就成了,工作的原理也很简单了,linux主机为客户端分配IP,分配网关、DNS,网关地址和DNS地址应该都是这台linux主机,这台linux主机的外网口接入了互联网,他的接入方式可能是局域网静态地址,也可能是动态地址,或者是PPPOE拨号接入的,这些都无所谓,我们的linux主机始终会将另一个内网口(dhcp分配地址所在的网卡)的数据转发至外网口上来,从而使客户端看起来在通过一台路由器上网了。

或者还可以安装NTP,PPPOE服务,甚至radius,如果有无线网卡,也许还应该有hostapd来配合无线网卡来加密SSID,总之就是随心所欲了。

所有的安装配置都写的很简单,旨在记录一种思路和方法,以备不时之需了。

kernel,proc,madwifi,sysctl,iwpriv乱七八糟的笔记

具体的关系来历没有研究过,只知道kernel和madwifi在我的编程过程中给我提供了很大的帮助。

sysctl—configure kernel parameters at runtime.看看说明也能知道这个命令有多么强大了,通过sysctl -a 可以查看到可供配置的参数列表,怎能用一个”太多”来形容了,我只是用到了sysctl -w dev.wifi0.maxstation=n指定AP上所能连接的终端个数。(我们随时要养成尝试-h –help man来寻找命令帮助,这样我们就知道 -w是改变设置的意思了),怎么才能知道这一堆的列表都是什么意思,其实我也想知道。

iwpriv搞清是属于kernel还是madwifi,总之我可以用它来开启黑/白名单,相关的帮助的文档在madwifi的wiki http://madwifi-project.org/wiki/UserDocs/iwpriv,额,应该是属于madwifi了。这个wiki我们可以找到很多有帮助的东西了。

创建一个白名单的办法如下

iwpriv ath0 maccmd 3
iwpriv ath0 addmac 00:11:22:33:44:55
iwpriv ath0 addmac aa:aa:aa:aa:aa:aa
iwpriv ath0 maccmd 1
黑名单只需要将
iwpriv ath0 maccmd 1改为2就好了,http://madwifi-project.org/wiki/UserDocs/iwpriv 这里表达的更专业一些。

另外,以下几个proc文件帮助了我

/proc/net/dev/(设备信息),/proc/net/madwifi/ath0(ath0的信息,associated_sta保存了连接到该设备的终端信息)

=============================================

对了,还有一个关于netlink的问题。

当一个终端连接到AP时,最终会被kernel知晓而发出了一个socket信息。hostapd则是监听到了这个socket以后才能对这个socket中包含的WPA密码信息处理。不知道哪位大侠已经帮我们从hostapd里抠出了这段代码,方便我们在自己的程序里来捕捉终端接入这个事件。网上可以下载到喽,传送门在这里(http://blog.chinaunix.net/u1/38994/showart_1353632.html)。 貌似我有些不厚道了,怎么能用抠这个字。

乱七八糟的笔记,但愿下回还能看懂。

Page 1 of 212