转至CU

                            IP/MAC捆绑原理及ARP

链路层用mac,网络层用ip:

网络中传输的是IP地址--三层32位地址,终端需要的是MAC地址--两层48位地,

ARP(RARP)都属于3层协议


    网络通信中,两个节点想要通信,必须先知道源与目标的MAC地址。为了让系  

统能快速地找到远程节点的MAC,每一个本地的内核都保存有一个即时的查询表  

(ARP缓存)。  

    ARP中有映射远程主机的IP--->对应的MAC地址的一个列表。地址解析协议  

(ARP)缓存是一个TSR的数据结构,由本地的内核来管理的。Default ARP缓  

存中留有last 10 mins本地系统与之通信的节点的IP地址(和对应的MAC地址)。  

当一个远程MAC存在于本地ARP 缓存中,转换远程节点的IP地址为MAC地址  

no problem。然而,系统在知道一个远程IP,但MAC不在本地ARP缓存中时,是这  

样来获取远程MAC的:本地主机发送一个Broadcast package,询问各节点是否有对  

应的IP。回应是唯一的。在回应包中就包含此MAC。在收到返回包后,本地节点就  

会在本地ARP缓存中记录远程MAC。  

   如果将IP/MAC对应关系中那些合法IP地址建立静态的MAC/IP绑定,那么即使  

非法用户盗用IP地址,linux路由器在回应这些IP发出的连接请求时则不会通过arp协  

议询问其MAC,而是使用Linux建立的静态MAC, 发出应答数据,这样.......  


两种方法
1.
建立/etc/ether,指定正确的IP/MAC对应关系:  

168.192.12.6 XX:AS:YOUR:MAC:WISH:XX  

在/etc/rc.d/rc.local中加:  

arp -f  


2.  

# arp -i eth0 -s 168.192.12.6 XX:AS:YOUR:MAC:WISH:XX  

_____________________________________________________


理智告诉我们:缺憾同优点孪生

                       IP/MAC捆绑缺陷

这种方法本意是用来管理内网的IP,但无心插柳........不过,

缺陷随之表现:即router对发出的包不检查,即使网卡MAC 是未登记的,也可以向外发数据包,而且

可以用伪造的IP,(有的路由器检查源IP范围), 这时候伪造的IP也必须属于子网内的IP.  

还有的server是这样做的:把没有登记的IP对应的MAC一致设为XXXXXXXXXX,这种方法很危险,只要

把网卡的MAC改成XXXXXXXXXX, 就能以任何没有登记的IP出去.......

采用IP/MAC来防止IP盗用不是根本办法:因为不仅所有的网卡MAC都可以修改,而且网卡发

出包的源MAC地址并不是网卡本身write的,而由驱动或APP提供的:他们先从网卡上得到了MAC地址,

每次发送包的时候用此MAC地址,所以等于没有!配置程序修改MAC仅仅靠修改其driver就可以

(Win下利用NDIS就可以).  

注:但基于Link的TCP来说,伪造IP就不是"太"容易,需要TCP连接序号的预测的知识--大有学问呀.

  如有兴趣,到安全网站上去看看,尤其是国外的  

_____________________________________________________


                         软件修改MAC的原理


MAC写在ROM中,在网卡组帧时需要将MAC写入帧中,其并不是直接从ROM中写入帧的,
 
而是从网卡的ARegs中读出,然后由硬件写入帧中,ARegs的内容是Driver在网卡  

初始化时从ROM中读入的.
 
So,我们可以截取NC Driver中相关代码,进而修改MAC.  

在linux下简单实现

#/sbin/ifconfig eth0 down

#/sbin/ifconfig eth0 hw ether 00:AS:YOU:WISH:00

#/sbin/ifconfig eht0 up  

_____________________________________________________


                          关于Switch/MAC/Port

    一般的局域网采用HUB连接,如果换用Switch, 某些Switch可以锁定端口和MAC, 某个端口

只允许指定MAC接入,再加上IP/MAC绑定(还要将Switch加锁), 情况会好许多. 这时  

如有人盗用IP除了要改IP,改MAC,还要将机器搬过来换网线(只要在雇两个保安就可以解决:))

 
这是Linux的ifconfig后一般没有信息(除了log).关键在于合法IP的MAC地址是在router处定好的,

router不会发ARP查询MAC, 因此至少从router外来的包,ARP不会乱:IP的MAC合法,

而非法盗用的IP相当于进入promisc模式, 从合法IP机包中取出属于自己的IP包(port不对的丢弃).

ping, traceroute等ICMP双方(合法非法IP机)可以用, UDP也可以. 但TCP不行(telnet, ftp等),

即合法IP机TCP可用, 盗用者不可用(要是TCP也可以了, 那盗用IP就非常简单了, 根本不用改MAC,

ifconfig/route就可以了)


CU精华文章
路由器的网络地址转换、管理登陆限制、MAC与IP的绑定(作者:xjc1027)

http://chinaunix.net/jh/30/13886.html


_____________________________________________________

几个注意点

1.
攻击方法是把攻击者自己的服务器绑定成攻击目标的IP,这样后者无法正常工作:报警说某一个MAC

地址的IP与其冲突,如何利用这个MAC地址查找到当前的绑定IP?

如果是在同一个网段里的可以发arp请求包,然后再解析arp回复包,即取得mac地址,

至于不在一个网段内的就不能直接取mac了.


2.DHCp&MAC&IP
配置DHCP让一个具体的MAC绑定到一个固定的IP上完全可以,在isc的dhcpd中有一个host字段,

可以定义这个功能,在dhcpd.conf文件中有详细的例子.

自动分配固定内部IP给相应的MAC网卡,对不上MAC的不能上网,但可以强行写上IP,网关,DNS一样

可以上网.修改一下就能实现控制用户上网(不要让人知道你的网关)

 
内网ip最好不要像192.168.0.0/24一样,否则非上网权限用Winxp的用户无需写任何设置一样可以上
-----------------------------------------------------------------
dhcpd.conf  
option domain-name "your";  
option routers 192.168.1.254;  
option domain-name-servers 192.168.1.254;61.144.56.101;  
ddns-update-style none;  
default-lease-time 88600;  
max-lease-time 887200;  

subnet 192.168.1.0 netmask 255.255.255.0 {  
# range 192.168.1.0 192.168.1.0;  

}  
host usr1 { #user1  
hardware ethernet 00:90:99:BD:85:F7;  
fixed-address 192.168.1.21;  
}  
host usr2 { #user2  
hardware ethernet 00:A0:C9:75:A7:45;  
fixed-address 192.168.1.22;  
}  
host usr3 { #user3
hardware ethernet 00:D0:09:59:02:DB;  
fixed-address 192.168.1.23;  
}

当MAC是以上的主机user1.2.3请求分配IP地址时,DHCP会固定的分配相应的IP
--------------------------------------------------------------------

关于用编程获得MAC.IP

CU精华区里有几篇文章很好

1.本地机

http://chinaunix.net/forum/viewtopic.php?t=85716&highlight=MAC

(作者:gadfly)

shell下大致方法:
ifconfig -a  
set - -  
Ip=$..............  
MAC=$..........  



2.子网其他机器

http://chinaunix.net/forum/viewtopic.php?p=870221&highlight=mac#870221

(解答者:gadfly)

---------------------------------------------------------------------

现在防地址盗用的最好方法:

MAC/IP  +   VLAN/PVC

VLAN +  PPPoE
 
Port + MAC/IP
 
-----------------------------------------------------------------------

多个PPTP VPN客户机通过LINUX网关连接VPN服务器

PPTP方式的VPN使用了GRE协议,这个协议跟TCP/UDP是同一级的协议。因为GRE协议没有端口的概念,LINUX不能像TCP/UDP那样IP伪装。所以,LINUX网关后面的pptp vpn客户机连接vpn时总会遇见这种那种的问题。

所以,当只有单个客户机通过linux网关连接VPN的时候,最简单的办法是用iptables把所有GRE协议的包转发给客户机。比如客户机的ip是192.168.0.2,iptables命令是

iptables -t nat -I PREROUTING -p gre -j DNAT --to-destination 192.168.0.2

上面的命令感觉很奇怪,当这个规则输入了,即使立刻删除,也依旧生效,一直过了好久才断掉。

当然,如果客户机连接的vpn ip地址互不相同,还可以根据源ip地址DNAT。但是,当多台机器要连接相同的pptp vpn服务器时,问题就出现了,简单的DNAT规则并不能生效,因为他们都是GRE协议。唯一能分辨的就只有GRE包里面的Class ID。这个ID在默认的linux防火墙上并没有得到支持。解决方法有两个

1,使用2.0版本以上的iptables,里面内置了ip_nat_gre等模块用于支持gre包的ip伪装。这个方案比较复杂,工程浩大,还要给内核打补丁。以后更新内核的时候也更加麻烦。

2,使用pptp proxy(http://www.mgix.com/pptpproxy/)。这是一个用户空间下的gre包转发工具。只要下载源码,编译,得到了pptpproxy。比如你的linux网关内网ip是192.168.0.254,vpn服务器是202.202.202.202,只要运行

pptpproxy -p 192.168.0.254,202.202.202.202

就可以了

这时,vpn客户机只要把192.168.0.254作为vpn服务器ip地址就可以了。

当然,让pptp监听在127.0.0.1,然后配合一些iptables转发规则,甚至可以做成一个透明pptpproxy代理。

pptpproxy还支持多vpn server代理。

如果你运行的是*BSD或者MAC,也许frickin(http://frickin.sourceforge.net/)更符合你的需要

分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]