Vmware + ubuntu 12.04 LTS虚拟机下提供DHCP服务

来源:互联网 发布:c语言好的书籍 编辑:程序博客网 时间:2024/06/05 03:57

目标

需要在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模式

 

安装DHCP服务

安装软件时需要访问外部网络,因此先设置虚拟机的模式为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 <selectedpackage>

 

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.

 

配置DHCP的监听网卡

配置文件是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服务器

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

DHCP服务器不能给自己分配IP 因此其自己的IP需要静态配置  并且要在启动dhcp服务之前配置完毕

 

网上都介绍通过下面的配置文件改过IP 但我没有成功过发现其和图形界面有冲突故只用图形界面配置

sailing@ubuntu:~$ cat/etc/network/interfaces

auto lo

iface lo inet loopback

 

通过图形界面如下  配置完成后 要通过右上角的ON OFF开关 先关闭 再打开 才能生效

 

启动DHCP服务

启动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服务器已经启动正常了  下一步就是测试了

 

Linux虚拟机测试

虚拟机一个非常好的特性是直接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

 

Windowshost主机测试

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通了

 

外部linux服务器A测试

将外部服务器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

 

原创粉丝点击