
经过一番思索,确定了初步的构思。首先,用Linux Shell的循环方法生成一张包含从10.0.0.1到10.0.3.254的无效MAC地址匹配表,称之为全局表。然后根据DHCP服务器的数据得到一 张合法用户的IP和MAC地址表,称之为合法表。接着,读取合法表中每个用户的IP,并在全局表中寻找匹配的IP,如果找到的话就用合法用户的MAC地址 替换原来无效的MAC地址。最后,这张全局表中的合法用户匹配正确MAC地址,而非法用户匹配无效的MAC地址。只要用户把这张表写入系统ARP缓存,非 法用户就不能通过简单的盗取IP方法来通过网关了。
实现
首先生成一张初始的全局表。它包含所有IP地址,每个IP地址与一个非法的MAC地址匹配。它的格式必须是arp命令能够识别的。初始化全局表的脚本为init,内容如下:
#!/bin/bash
ipprefix=10.0.
count1=0
while (( $count1 <4 ))
do
count2=1
while (( $count2 <255 ))
do
echo“$ipprefix$count1.$count2 00e000000001”
let $count2+=1
done
let $count1+=1
done
写好后存档,用“chmod +x init”命令使得脚本可执行。然后运行脚本init >arp,就可以将结果保存到当前目录的arp文件中。该文件就是10.0.0.1到10.0.3.254所有IP地址与MAC地址 00e000000001绑定的ARP表,看上去该文件类似于下面这样:
10.0.0.1 00e000000001
10.0.0.2 00e000000001
10.0.0.3 00e000000001
10.0.0.4 00e000000001
10.0.0.5 00e000000001
... ...
需要注意的是,Shell脚本语法虽然和C语言类似,但对格式要求很严格,有些地方不能加空格,有些地方则必须加空格。比如let $count1+=1就不能写成let $count1 += 1;相反,while (( $count1 <4 )) 也不能写成while (($count1<4)),括号与语句之间必需有空格。
接下来通过DHCP服务器得到合法用户的IP与MAC地址匹配表(即合法用户表),假设是valid.arp文件。编写一个脚本一行一行地读取该表,每得 到一个IP地址记录,就在前面生成的arp文件中查找同样的IP。如果找到的话,那么就用valid.arp中该IP的MAC地址替换arp文件中该IP 的MAC地址。 valid.arp文件可能像下面这样:
10.0.0.2 00e00a0f1d2c
...
10.0.1.25 00e0b2c3d5c1
...
查找替换脚本为replace,内容如下:
#!/bin/bash
# 定义并初始化三个变量,分别是合法用户表、全局表和作交换用的表
validArp=valid.arp
globalArp=arp
tmpArp=tmp.arp
count=1
# 371是合法用户的总数,也就是valid.arp表的记录数,然后加1
while (( count <371 ))
do
#“ sed -n‘“$count”p’$validArp”命令将每次打印valid.arp文件中的第$count个记录
# 例如,当$count=1的时候,该命令将打印: 10.0.0.2 00e00a0f1d2c2
# eval $getValid将会执行$getValid变量所包含的语句,并将结果赋给变量$curRec
getValid=“sed -n‘“$count”p’$validArp”
curRec=‘eval $getValid’
# echo $curRec awk‘{print $1}’命令将打印$curRec内容的第一个字段,也就是IP地址
# 然后我们将这个IP地址赋值给$curIP变量
getIP=“echo $curRec awk‘{print \$1}’”
curIP=‘eval $getIP’
# 这样我们就得到了合法用户的IP及IP和MAC地址对,接下来是最关键的一步
# 下面两条语句在全局表中查找与得到的IP匹配的项目,找到后就在该记录后面添加合法用户的IP
和MAC地址对,然后删除旧的非法IP和MAC地址对,并将结果存入一个新的文件tmp.arp
replace=“sed -e‘/$curIP\>/a\ $curRec’ -e‘/$curIP\>/d’$globalArp >$tmpArp”
eval $replace然后用新的文件覆盖全局表文件,并将计数器加1,供下次循环
cp -f $tmpArp $globalArp
let count+=1
done
到此脚本结束。需要注意的地方有两个:第一,所有包含“eval”命令的语句,使用的都是反引号,也就是通常位于Tab键上面的那个引号,这样变量才能得 到语句执行的结果,而非语句本身;第二,如果出现变量和其它字母在一起的情况,用双引号将变量包含,否则会出现错误的变量名,例如下面这条语句:
getValid=“sed -n‘“$count”p’$validArp”
如果不用双引号把变量$count包起来,Shell会认为用户的变量是$countp,而不是$count。
在执行完replace后,再查看arp文件,会发现其中所有在valid.arp文件中存在的IP和MAC地址对,其中的初始化MAC地址已被替换为正确的MAC地址。
最后,将得到的arp文件拷贝为/etc/ethers,在系统启动时运行“arp -f”,就可以实现IP和MAC地址匹配了。
使用who命令可以查看当前登录用户,使用w命令可以看到所有登录用户信息。 1、命令who 显示当前登录用户,登录时间和登录IP地址。参考下图 2、命令w 按照标题显示:当前时间、机器运行时间、登录用户数量、系统负载信息。出现错误的原因是由于我突发奇想写了一个reboot集群的脚本,导致集群非法关机,然后就炸了。。。
在我使用上述reboot脚本后,发现MobaXterm(远程工具)ssh死活连不上了。
赶紧检查集群,发现如下报错:
由于心急没有管报错(第一次见看不懂),直接输密码进入界面(我的是无可视化界面的CentOS 6.5)。
进界面后首先尝试ssh其他节点。报错。
尝试从宿主机ping虚拟机,也ping不通。
那么首先确定网络问题,查看/etc/sysconfig/network-scripts/ifcfg-eth0下的ip配置。
没有问题。
输入命令查看ip:
发现只有127.0.0.1,此时基本确定网络服务故障或未自启动。
输入命令启动网络服务:
可以看到ip正常了。
测试宿主机ping虚拟机也正常了。
测试虚拟机ping虚拟机也正常了。
测试ssh本机也正。。。等等!
ssh没通,报错如下:
和最开始的报错是一样的,有了经验,大致也猜测的出很有可能sshd服务也没有自启动。
输入sshd启动命令:
控制台报错信息:
/var/lock/subsys/sshd not group or world-writable
出现此报错,整个系统问题已经初现端倪。
虽然启动sshd服务报错了,但尝试ssh本机却正常了。
此时试着启动集群的各个进程。
果然,大量报错。
只读文件系统 几个大字摧毁我幼小的心灵
想起解决的网络、ssh问题,明白了罪恶的源头就在....
就是它!万恶之源!
首先查看挂载的分区:
又有报错,不过看不懂。猜测是mount命令相关的文件也被修改成只读了。
开机报错的/dev/sda1分区并没有挂载,而/dev/sda3是正常的rw(读写)状态。
我有点晕。
尝试修复/dev/sda3分区:
第一次使用fsck命令,看不太明白,不过该命令没起到什么作用。
有点绝望,随手尝试了修改/dev/sda3分区的状态:
居然不报错了!
至此报错全部消失,网络服务和ssh服务也正常开机自启了。
留下懵逼的我,具体原理日后学习再补充。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)