Linux下客户端MAC地址控制

iptables squid相结合的方法

Linux作为服务器操作系统,具有服务稳定、功能强大的特点。自Linux 2.4内核以来,其中又内置了NetFilter包过滤架构。它从而具有强大的数据包过滤功能,保证用作软件路由器时更得心应手。例如,很多中小企业使用 Linux软件路由器将内部网络接入Internet,其效果并不比某些专有系统逊色,而且在功能定制、应用扩展等方面更有优势。

在接入Internet中,不同的用户应当拥有不同的权限,为了防止权限盗用问题,对用户的识别非常重要。目前,常见的识别方法有用户名/密码识别、用户IP地址识别和用户网卡物理地址(MAC地址)识别等。

基于用户名/密码的认证是传统的识别方法。它在管理和使用上都比较繁琐,客户端也需要进行配置,大部分办公用户不能独立完成此类配置,对密码的保护也不够。这种方法往往是既加重了网络管理员的负担,又达不到认证的目的。

IP地址识别虽然可以做到客户端零设置,但是由于IP地址修改方便,无法杜绝IP地址盗用的情况,所以基本无安全性可言。

再来看网卡的物理地址。由于普通用户无法修改网卡的MAC地址,并且它和IP地址一样都是惟一的,完全可以用来识别用户,不需要客户端进行任何配置。即便是网络发生了变化,如扩容、改建等,导致客户端IP地址或用户名改变也不会影响到MAC地址。因此,通过判断客户端MAC地址的方法来识别用户,实现所谓的透明认证是一种简单、有效的选择。

下面我们来讨论当Linux被用作Internet网关,并集成代理服务时的MAC地址透明认证方法。目前,通过MAC地址识别用户的方法主要有使用iptables的mac匹配模块、使用代理服务器自身的mac地址检查功能和利用静态ARP表进行控制三种。



使用iptables的MAC匹配模块


在Linux 2.4内核中,包过滤模块发生了根本性的变化,完全由内核控制,效率得到了很大的提高。控制内核包过滤的工具,也用iptables取代了 ipchains。在iptables的标准发布中,就带有MAC地址匹配的模块。我们可以通过iptables -m mac 命令来装载它。

假设局域网通过一Linux网关接入Internet,我们为拥有上网权限的A用户分配了IP地址192.168.1.25/32,其MAC地址为00: 02:01:50:bb:53。根据TCP/IP原理,最终封装后的IP数据包实际上有一个包含网卡MAC地址的字段。因此,我们可以通过检查这一字段来达到防止盗用IP的目的。在这个例子中,就是在Linux网关上检查来自192.168.1.25/32的包,看看这些包的MAC地址是不是00:02: 01:50:bb:53。具体命令如下:

# 设置PREROUTING链的默认规则为丢弃,以禁止所有包通过。iptables -t nat -P PREROUTING DROP# 检查IP地址为192.168.1.25/32的用户的MAC地址。如果与指定的MAC地址不匹配,说明源自192.168.1.25的包并不是从该网卡上发出的,即是非法用户,就应当丢弃这些包。iptables -t nat -A PREROUTING -s 192.168.1.25 -m mac -mac-source ! 00:02:01:50:bb:53 -j DROP# 如果MAC地址匹配,包才能到达这里,并被允许通过。iptables -t nat -A PREROUTING -s 192.168.1.25 -j ACCEPT



这样,即使有一个未授权用户B自己设置了IP地址为192.168.1.25(由于本机设置始终优先于DHCP,所以这种情况是很普遍的),当包通过网关时由于MAC地址不匹配,他仍然不能拥有A用户的权限。这样就达到了识别用户的目的。



使用代理服务器自身的MAC地址检查功能


Linux 下使用较多的代理服务器是Squid和Socks5。此处以Squid为例,说明如何检查客户端MAC地址。由于Squid的RPM发布版通常没有启用这一特性,这种版本使用MAC匹配会提示错误的acl类型,所以我们必须手工编译源代码。首先下载squid-2.x-src.tar.gz,然后用tar xvfz squid....tar.gz命令解开源代码,并进入展开后的子目录,用./configure配置编译选项。除了启用自己需要的特性外,再加上参数 -enable-arp-acl,即允许设置acl(Access Control List)为arp(MAC地址匹配)方式。然后执行make, make install。

安装完成后,就可以修改squid.conf来匹配MAC地址了,如下所示:

# 设置一个accept_group列表,该用户的MAC地址为00:02:01:50:bb:53。acl access_group arp 00:02:01:50:bb:53# 根据最低安全要求,设置all列表,包含源IP地址为0/0,即所有用户。acl all src 0/0 # 允许accept_group组正常访问 http_access allow accept_group # 禁止其他所有未经授权的访问 http_access deny all



启动Squid,并配置正确的缓存目录和端口转发。

当Squid 收到请求时,无论请求用户来自哪个IP地址或主机,它都会检查其MAC地址,并且只允许MAC地址为00:02:01:50:bb:53的请求通过。这样也可以实现客户端零配置的用户识别。对于使用iptables + Squid做透明代理的Linux网关来说,可以选择iptables或Squid来识别用户。



利用静态ARP表进行控制


我们知道,ARP(Address Resolution Protocol,地址转换协议)被当作底层协议,用于IP地址到物理地址的转换。在以太网中,所有对IP的访问最终都转化为对网卡MAC地址的访问。

不妨设想一下,如果主机A的ARP列表中,到主机B的IP地址与MAC地址对应不正确,由A发往B数据包就会发向错误的MAC地址,当然无法顺利到达B,结果是A与B根本不能进行通信。Linux可以通过arp命令控制ARP转换,即IP到MAC的转换。因此,也能利用这一功能对用户MAC地址进行匹配。下面我们就来看看arp命令的用法。

输入arp将显示当前所有ARP转换记录,类似于这样:



Address HWtype HWaddress Flags Mask Iface
www.myhome.net ether 00:06:29:57:16:F5 C eth0
218.200.80.177 ether 00:01:30:F4:32:40 C eth1
ntc9.myhome.net ether 00:02:1E:F1:92:C2 C eth0
192.168.1.25 ether 00:02:1E:F1:92:C2 C eth0



由此可以看到,当前系统保留的IP地址与MAC地址一一对应,并指明了硬件类型(Hwtype)和通信所使用的接口(Iface)。不过这些都是动态生成的,无需手工干预。我们要做的恰恰是手工干预这一过程。

我们需要用到arp命令的另一重要功能,就是手工更改这一对应关系。此外,该命令还可以读取文本文件中的ARP记录,其默认文件是/etc/ethers。也就是说,当输入ARP-f的时候,系统就会读取/etc/ethers这个文件,并以其中的项目取代系统当前的ARP记录。假设/etc/ethers 文件内容如下:

192.168.1.25 00:02:01:50:bb:53



然后执行命令arp -f。

这时,我们查看系统ARP表,会发现无论192.168.0.25原来对应的MAC地址是什么,都会被新的所取代:



Address HWtype HWaddress Flags Mask Iface
www.myhome.net ether 00:06:29:57:16:F5 C eth0
218.200.80.177 ether 00:01:30:F4:32:40 C eth1
ntc9.myhome.net ether 00:02:1E:F1:92:C2 C eth0
192.168.1.25 ether 00:02:01:50:bb:53 C eth0



此时,本机发往192.168.1.25的数据包目标MAC地址将由原来的00:02:1E:F1:92:C2改为00:02:01:50:bb:53。显然,如果192.168.1.25所在网卡的MAC地址并非00:02:01:50:bb:53,数据包就无法到达正确的目的地,那么它们也就无法通信了。这样也达到了识别非法用户的目的。

当然,控制MAC地址的方法还不止这些,例如可以利用交换机的端口管理功能识别用户。根据交换机的原理,它是直接将数据发送到相应端口,那么就必须保有一个数据库,包含所有端口所连网卡的MAC地址,由此可见,控制每个端口使用的MAC地址理论上是完全可行的。大部分中高端交换机如3Com SuperStack系列等,都具有这种功能。具体操作与交换机型号有关,这里就不赘述。

最后,提醒一下,MAC地址控制并非绝对保险。正如这个世界上没有绝对解不开的密码一样,所谓安全都是相对于特定的环境而言。现在,很多网卡都支持MAC地址的软件修改,Linux和Windows本身也都有办法修改这一物理地址。不过由于这种方式相对稳定,摒弃了繁琐的客户端设置,对用户完全透明,而且具备很强的可操作性,所以在某种程度上说是安全的。

一:使用CentOS常用命令查看cpu

more /proc/cpuinfo | grep "model name"
grep "model name" /proc/cpuinfo
[root@localhost /]# grep "CPU" /proc/cpuinfo
model name      : Intel(R) Pentium(R) Dual CPU E2180 @ 2.00GHz
model name      : Intel(R) Pentium(R) Dual CPU E2180 @ 2.00GHz
如果觉得需要看的更加舒服
grep "model name" /proc/cpuinfo | cut -f2 -d:

二:使用CentOS常用命令查看内存

grep MemTotal /proc/meminfo  grep MemTotal /proc/meminfo | cut -f2 -d:  free -m |grep "Mem" | awk '{print $2}'

三:使用CentOS常用命令查看cpu是32位还是64位

查看CPU位数(32 or 64)
getconf LONG_BIT

四:使用CentOS常用命令查看当前linux的版本

more /etc/redhat-release
cat /etc/redhat-release

五:使用CentOS常用命令查看内核版本

uname -r
uname -a

六:使用CentOS常用命令查看当前时间

date上面已经介绍如何同步时间了

七:使用CentOS常用命令查看硬盘和分区

df -h
fdisk -l
也可以查看分区
du -sh
可以看到全部占用的空间
du /etc -sh
可以看到这个目录的大小

八:使用CentOS常用命令查看安装的软件包

查看系统安装的时候装的软件包
cat -n /root/install.log
more /root/install.log | wc -l
查看现在已经安装了那些软件包
rpm -qa
rpm -qa | wc -l
yum list installed | wc -l
不过很奇怪,我通过rpm,和yum这两种方式查询的安装软件包,数量并不一样。没有找到原因。

九:使用CentOS常用命令查看键盘布局

cat /etc/sysconfig/keyboard
cat /etc/sysconfig/keyboard | grep KEYTABLE | cut -f2 -d=

十:使用CentOS常用命令查看selinux情况

sestatus
sestatus | cut -f2 -d:
cat /etc/sysconfig/selinux

十一:使用CentOS常用命令查看ip,mac地址

在ifcfg-eth0 文件里你可以看到mac,网关等信息。  ifconfig  cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep IPADDR  cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep IPADDR | cut -f2 -d=  ifconfig eth0 |grep "inet addr:" |awk '{print $2}'|cut -c 6-  ifconfig   | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'  查看网关  cat /etc/sysconfig/network  查看dns  cat /etc/resolv.conf  十二:使用CentOS常用命令查看默认语言
echo $LANG $LANGUAGE
cat /etc/sysconfig/i18n

十二:使用CentOS常用命令查看所属时区和是否使用UTC时间

cat /etc/sysconfig/clock

十三:使用CentOS常用命令查看主机名

hostname
cat /etc/sysconfig/network
修改主机名就是修改这个文件,同时最好也把host文件也修改。

十四:使用CentOS常用命令查看开机运行时间

uptime
09:44:45 up 67 days, 23:32, ...

 

dmidecode |more
查看主板信息


 


 

td p { text-align: left; }

查看当前操作系统发行版信息

#cat /etc/issue
Ubuntu 9.10 \n \l

查看cpu型号

# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
2 Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz
(
看到有2个逻辑CPU, 也知道了CPU型号)

查看物理cpu颗数

# cat /proc/cpuinfo | grep physical | uniq -c

2 physical id : 0
(
说明实际上是12核的CPU)

查看cpu运行模式

# getconf LONG_BIT

32

(说明当前CPU运行在32bit模式下, 但不代表CPU不支持64bit)

 查看cpu是否支持64bit

td p { text-align: left; }

# cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l

2

(结果大于0, 说明支持64bit计算. lmlong mode, 支持lm则是64bit)



 

查看cpu信息概要(昨天看aix的时候刚发现的,在ubuntu上竟然也有~):

#lscpu

Architecture: i686 #架构686
CPU(s): 2 #
逻辑cpu颗数是2
Thread(s) per core: 1 #
每个核心线程数是1
Core(s) per socket: 2 #
每个cpu插槽核数/每颗物理cpu核数是2
CPU socket(s): 1 #cpu
插槽数是1
Vendor ID: GenuineIntel #cpu
厂商IDGenuineIntel
CPU family: 6 #cpu
系列是6
Model: 23 #
型号23
Stepping: 10 #
步进是10
CPU MHz: 800.000 #cpu
主频是800MHz
Virtualization: VT-x #cpu
支持的虚拟化技术VT-x(对此在下一博文中解释下http://hi.baidu.com/sdusoul/blog/item/5d8e0488def3a998a5c272c0.html)
L1d cache: 32K #
一级缓存32Kgoogle了下,这具体表示表示cpuL1数据缓存为32k
L1i cache: 32K #
一级缓存32K(具体为L1指令缓存为32K) td p { text-align: left; }

L2 cache: 3072K #二级缓存3072K

最后来个大而全的:

#cat /proc/cpuinfo

processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz
stepping : 10
cpu MHz : 800.000
cache size : 3072 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
td p { text-align: left; }

cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm ida tpr_shadow vnmi flexpriority
bogomips : 4788.60
clflush size : 64
power management:

processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz
stepping : 10
cpu MHz : 800.000
cache size : 3072 KB
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
apicid : 1
initial apicid : 1
fdiv_bug : no
hlt_bug : no
td p { text-align: left; }

f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm ida tpr_shadow vnmi flexpriority
bogomips : 4787.96
clflush size : 64
power management:

查看内存信息
#cat /proc/meminfo