需要在Linux下开发一个监控程序,其利用网络登陆到另外一台Linux服务器A上执行一些命令并获取命令执行结果,然后对数据进行分析
因为没有Linux的电脑,只能利用vmware安装Linux虚拟机B,如ubuntu 12.04LTS
因为局域网的网络安全问题 Linux虚拟机B无法直接和Linux服务器A通信,因此二者不能通过交换机接到共用网络里因此考虑将二者网线直连构成私有局域网
虚拟机同外界通信有多种方式如NAT、bridged(http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html),因为Linux服务器A需要频繁更换而且其网络默认为DHCP方式,为了避免手动配置IP耽误时间,因此考虑在虚拟机B上搭建DHCP服务器,自动给Linux服务器A分配IP,并且自动获悉Linux服务器A的IP,在这种模式下虚拟机的网络模式只能采用bridged模式
安装软件时需要访问外部网络,因此先设置虚拟机的模式为NAT(最容易的上网方式)
Ubuntu一个非常好的特性是如果你执行一个命令 此命令不存在时,其会推荐相关的软件包提示你安装 因此只要输入一个模糊匹配的命令即可找到你要安装的软件
sailing@ubuntu:~$ ping -c 1 baidu.com
PING baidu.com (220.181.111.86) 56(84)bytes of data.
64 bytes from 220.181.111.86: icmp_req=1ttl=128 time=6.18 ms
--- baidu.com ping statistics ---
1 packets transmitted, 1 received, 0%packet loss, time 0ms
rtt min/avg/max/mdev = 6.180/6.180/6.180/0.000ms
sailing@ubuntu:~$ dhcp
No command 'dhcp' found, did you mean:
Command 'dhcpx' from package 'irpas'(multiverse)
Command 'dhcpd' from package 'isc-dhcp-server'(main)
Command 'dhcpd' from package'isc-dhcp-server-ldap' (universe)
Command 'hcp' from package 'lam4-dev'(universe)
Command 'chcp' from package 'nilfs-tools'(universe)
Command 'dccp' from package 'dcap' (universe)
Command 'dicp' from package 'dish' (universe)
dhcp: command not found
sailing@ubuntu:~$ dhcpd
The program 'dhcpd' can be found in thefollowing packages:
*isc-dhcp-server
*isc-dhcp-server-ldap
Try: sudo apt-get install
sailing@ubuntu:~$ sudo apt-get install dhcp3-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will beinstalled:
isc-dhcp-server
Suggested packages:
isc-dhcp-server-ldap
The following NEW packages will beinstalled:
dhcp3-server isc-dhcp-server
0 upgraded, 2 newly installed, 0 to removeand 57 not upgraded.
Need to get 431 kB of archives.
配置文件是isc-dhcp-server而不是dhcp3-server 可能是因为12.04版本的问题
INTERFACES指定监控的网卡 其可以根据ifconfig命令得到
sailing@ubuntu:~/rmc_diag/release-v3$ifconfig | grep "Link encap"
eth0 Link encap:Ethernet HWaddr 00:0c:29:da:44:87
lo Link encap:Local Loopback
virbr0 Link encap:Ethernet HWaddr6e:81:a5:7c:24:cf
sailing@ubuntu:~/rmc_diag/release-v3$ cat/etc/default/isc-dhcp-server
# Defaults for dhcp initscript
# sourced by /etc/init.d/dhcp
# installed at /etc/default/isc-dhcp-serverby the maintainer scripts
。。。。。。
# On what interfaces should the DHCP server(dhcpd) serve DHCP requests?
# Separatemultiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="eth0"
sailing@ubuntu:~/rmc_diag/release-v3$ ll/etc/default/isc-dhcp-server
-rw-r--r-- 1 root root 323 Sep 22 07:49/etc/default/isc-dhcp-server
sailing@ubuntu:~/rmc_diag/release-v3$ ll/etc/default/dhcp3-server
ls: cannot access/etc/default/dhcp3-server: No such file or directory
DHCP的配置目录到底是哪个?众说纷纭 后面会讲到到底怎么确定 暂时认为是/etc/dhcp3
sailing@ubuntu:~$ ls /etc/dhcp*
/etc/dhcp:
dhclient.conf dhclient-exit-hooks.d dhclient-enter-hooks.d
/etc/dhcp3:
dhclient-enter-hooks.d
DHCP配置文件的具体语法可以参考http://www.linuxmanpages.com/man8/dhcpd.8.php
除下面这些内容外其他全部用#注释掉
# If this DHCP server is the official DHCPserver for the local
# network, the authoritative directiveshould be uncommented.
authoritative;
# A slightly different configuration for aninternal subnet.
subnet 192.168.2.0 netmask 255.255.255.0 {
range 192.168.2.10 192.168.2.255;
option domain-name-servers192.168.2.1,192.168.2.2;
option domain-name "ubtw.net";
option routers 192.168.2.3;
option broadcast-address 192.168.2.255;
default-lease-time 600;
max-lease-time 7200;
}
DHCP服务器不能给自己分配IP 因此其自己的IP需要静态配置 并且要在启动dhcp服务之前配置完毕
网上都介绍通过下面的配置文件改过IP 但我没有成功过发现其和图形界面有冲突故只用图形界面配置
sailing@ubuntu:~$ cat/etc/network/interfaces
auto lo
iface lo inet loopback
通过图形界面如下 配置完成后 要通过右上角的ON OFF开关 先关闭 再打开 才能生效
启动dhcp的命令是sudo /etc/init.d/isc-dhcp-serverstart而不是sudo /etc/init.d/dhcp3-server start
sailing@ubuntu:~$ sudo/etc/init.d/isc-dhcp-server start
Rather than invoking init scripts through/etc/init.d, use the service(8)
utility, e.g. service isc-dhcp-server start
Since the script you are attempting toinvoke has been converted to an
Upstart job, you may also use the start(8)utility, e.g. start isc-dhcp-server
isc-dhcp-server start/running, process28781
提示应该用service命令 OK 那就换一个吧
sailing@ubuntu:~$ sudo serviceisc-dhcp-server start
isc-dhcp-server start/running, process28867
从log看貌似启动成功了那看下进程列表确认下
sailing@ubuntu:~$ ps aux | grep dhcp
116 1226 0.0 0.0 3352 880 ? S Sep22 0:00 /usr/sbin/dnsmasq -ulibvirt-dnsmasq --strict-order --bind-interfaces--pid-file=/var/run/libvirt/network/default.pid --conf-file= --except-interfacelo --listen-address 192.168.122.1 --dhcp-range 192.168.122.2,192.168.122.254--dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases --dhcp-lease-max=253--dhcp-no-override
sailing 28952 0.0 0.0 4388 828 pts/1 S+ 07:40 0:00 grep --color=autodhcp
没有啊也没有什么异常log啊为什么呢 为什么呢?????? 原来相关log在l/var/log/syslog中记录着
sailing@ubuntu:~$ tail /var/log/syslog
Sep23 07:43:35 ubuntu dhcpd: No subnet declaration for eth0 (192.168.2.1).
Sep 23 07:43:35 ubuntu dhcpd: ** Ignoringrequests on eth0. If this is not what
Sep 23 07:43:35 ubuntu dhcpd: you want, please write a subnet declaration
Sep 23 07:43:35 ubuntu dhcpd: in your dhcpd.conf file for the networksegment
Sep 23 07:43:35 ubuntu dhcpd: to which interface eth0 is attached. **
Sep 23 07:43:35 ubuntu dhcpd:
Sep 23 07:43:35 ubuntu dhcpd:
Sep 23 07:43:35 ubuntu dhcpd: Notconfigured to listen on any interfaces!
Sep23 07:43:35 ubuntu kernel: [38761.728278] init: isc-dhcp-server main process(29266) terminated with status 1
Sep23 07:43:35 ubuntu kernel: [38761.728307] init: isc-dhcp-server respawning toofast, stopped
原来如此啊 dhcpd启动后又退出了为什么说没有subnet啊我可是在/etc/dhcp3/dhcpd.conf中配置过啊 莫非用的不是/etc/dhcp3/dhcpd.conf??发现还有一个默认的/etc/dhcp/dhcpd.conf其确实没有定义subnet域经过测试才发现正确的配置文件是/etc/dhcp/dhcpd.conf
若/etc/dhcp/dhcpd.conf有任何语法错误启动dhcp时都可以在/var/log/syslog中发现相关log 调试直至不报错且进程列表里有dhcp的服务
sailing@ubuntu:~$ tail /var/log/syslog
。。。。。。。。
Sep 23 07:53:54 ubuntu dhcpd: Wrote 0leases to leases file.
sailing@ubuntu:~$ ps aux | grep dhcp
116 1226 0.0 0.0 3352 880 ? S Sep22 0:00 /usr/sbin/dnsmasq -ulibvirt-dnsmasq --strict-order --bind-interfaces--pid-file=/var/run/libvirt/network/default.pid --conf-file= --except-interfacelo --listen-address 192.168.122.1 --dhcp-range 192.168.122.2,192.168.122.254--dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases --dhcp-lease-max=253--dhcp-no-override
dhcpd 29381 0.0 0.2 4944 2840 ? Ss 07:53 0:00 /usr/sbin/dhcpd -f -q -4 -pf /run/dhcp-server/dhcpd.pid -cf/etc/dhcp/dhcpd.conf eth0
sailing 29394 0.0 0.0 4388 832 pts/1 S+ 07:55 0:00 grep --color=autodhcp
至此 DHCP服务器已经启动正常了 下一步就是测试了
虚拟机一个非常好的特性是直接copy就能安装一个新的虚拟机
如配置DHCP服务器的IP一样也采用图形界面配置
关闭后再打开即可看到分配的IP
在服务器和客户端两端ping测试通过
sailing@ubuntu:~$ ping 192.168.2.10
PING 192.168.2.10 (192.168.2.10) 56(84)bytes of data.
64 bytes from 192.168.2.10: icmp_req=1ttl=64 time=0.820 ms
。
^C
--- 192.168.2.10 ping statistics ---
3 packets transmitted, 3 received, 0%packet loss, time 2001ms
rtt min/avg/max/mdev =0.498/0.608/0.820/0.149 ms
Host主机有两个网卡 一个无线网卡 一个有线网卡 需要利用有线网卡和linux服务器A通信
将本地连接所代表的有线网卡配置为dhcp模式可是无法分配到IP啊尝试配置为静态IP还是不行难不成当前host主机的有线网卡没有和linux服务器A连接端口处于down状态?对接之后还是无法分配到IP 即使配置为静态IP也无法ping通dhcp服务器
Host到底通过什与提供dhcp服务的虚拟机桥接呢?虚拟机配置选项里是auto啊没法配
在网上搜索终于找到了能够设置的地方 vmware的编辑选项》 虚拟网络编辑器 >VMnet0 其中桥接到的网卡选择有线网卡
更改后终于dhcp分配到IP了但是host可以ping通虚拟机而虚拟机不能ping通host 没道理啊 host能ping通虚拟机说明链路是通的啊 莫非是虚拟机里面的路由有问题?检查再三 觉得不像是路由问题 因为dhcp服务器所在的虚拟机和另外一个虚拟机可以相互ping通啊 莫非是host上的ping报文被屏蔽了 比如防火墙?
在win7上如下设置:控制面板》系统和安全》windows防火墙》 高级设置 》 入站规则 》 文件和打印机共享(ICMPv4回显请求),选择是,使能
至此,host和虚拟机终于ping通了
将外部服务器A配置为dhcp模式其和虚拟机所在的host主机网线直接对连 linux服务器A很顺利的就分配到IP了并且二者可以相互ping通
至此linux服务器A和虚拟服务器B的通信链路搭建完毕
如何自动得知分配给linux服务器A的IP
分配出去的ip地址都记录在/var/lib/dhcp/dhcpd.leases中
linux服务器A会频繁更新 因此其每次分配的地址都会变
尝试将可分配的ip地址池配置为2个 host占用一个频繁变化的linux服务器A占用一个但是失败
linux服务器A之前分配的ip地址在租约期内无法自动释放 因此导致新的linux服务器A无法分配到可用的IP
仔细分析发现每一个分配出去的ip里面有属性client-hostname,据此属性查找最后一个lease item就可以得到对应的IP
sailing@ubuntu:~$ cat/var/lib/dhcp/dhcpd.leases
# The format of this file is documented inthe dhcpd.leases(5) manual page.
# This lease file was written byisc-dhcp-4.1-ESV-R4
lease 192.168.2.10 {
starts 1 2013/09/23 15:11:01;
ends 1 2013/09/23 15:21:01;
tstp 1 2013/09/23 15:21:01;
cltt 1 2013/09/23 15:11:01;
binding state active;
next binding state free;
hardware ethernet 00:0c:29:c1:95:39;
client-hostname "ubuntu";
}
server-duid"\000\001\000\001\031\322}\273\000\014)\332D\207";
lease 192.168.2.10 {
starts 1 2013/09/23 15:14:44;
ends 1 2013/09/23 15:24:44;
cltt 1 2013/09/23 15:14:44;
binding state active;
next binding state free;
hardware ethernet 00:0c:29:c1:95:39;
client-hostname "ubuntu";
}
sailing@ubuntu:~$ ll/var/lib/dhcp/dhcpd.leases
-rw-r--r-- 1 dhcpd dhcpd 2554 Sep 23 08:45/var/lib/dhcp/dhcpd.leases
sailing@ubuntu:~$ tail /var/log/syslog
Sep 22 10:31:13 ubuntu dhcpd: DHCPREQUESTfor 192.168.2.10 from 00:0c:29:c1:95:39 (ubuntu) via eth0
Sep 22 10:31:13 ubuntu dhcpd: DHCPACK on192.168.2.10 to 00:0c:29:c1:95:39 (ubuntu) via eth0
Sep 22 10:36:00 ubuntu dhcpd: DHCPREQUESTfor 192.168.2.10 from 00:0c:29:c1:95:39 (ubuntu) via eth0
Sep 22 10:36:00 ubuntu dhcpd: DHCPACK on192.168.2.10 to 00:0c:29:c1:95:39 (ubuntu) via eth0
Sep 22 10:40:08 ubuntu dhcpd: DHCPREQUESTfor 192.168.2.10 from 00:0c:29:c1:95:39 (ubuntu) via eth0
Sep 22 10:40:08 ubuntu dhcpd: DHCPACK on192.168.2.10 to 00:0c:29:c1:95:39 (ubuntu) via eth0
Sep 22 10:44:32 ubuntu dhcpd: DHCPREQUESTfor 192.168.2.10 from 00:0c:29:c1:95:39 (ubuntu) via eth0
Sep 22 10:44:32 ubuntu dhcpd: DHCPACK on192.168.2.10 to 00:0c:29:c1:95:39 (ubuntu) via eth0
Sep 22 10:48:58 ubuntu dhcpd: DHCPREQUESTfor 192.168.2.10 from 00:0c:29:c1:95:39 (ubuntu) via eth0
Sep 22 10:48:58 ubuntu dhcpd: DHCPACK on192.168.2.10 to 00:0c:29:c1:95:39 (ubuntu) via eth0