Ubuntu/Debian Linux:为您的网络设置一个ISC DHCP服务器

时间:2020-01-09 10:40:45  来源:igfitidea点击:

如何使用在IBM硬件上运行的Debian Linux 6或Ubuntu Linux服务器为局域网(LAN)设置DHCP服务器?
动态主机配置协议(DHCP)允许客户端(例如台式机,笔记本电脑和移动设备)从服务器请求并获取IP地址和许多其他参数。

ISC DHCP服务器软件

ISC的DHCP软件是Internet上使用最广泛的开源DHCP实现。
相同的软件也可以用于LAN。
它是满足主机配置需求的运营商和企业级解决方案。

安装DHCP服务器

以root用户身份执行以下apt-get命令以安装DHCP服务器:

# apt-get install isc-dhcp-server

输出示例:

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Suggested packages:
  isc-dhcp-server-ldap
The following NEW packages will be installed:
  isc-dhcp-server
0 upgraded, 1 newly installed, 0 to remove and 11 not upgraded.
Need to get 0 B/411 kB of archives.
After this operation, 938 kB of additional disk space will be used.
Preconfiguring packages ...
Selecting previously deselected package isc-dhcp-server.
(Reading database ... 281728 files and directories currently installed.)
Unpacking isc-dhcp-server (from .../isc-dhcp-server_4.1.1-P1-15+squeeze8_amd64.deb) ...
Processing triggers for man-db ...
Setting up isc-dhcp-server (4.1.1-P1-15+squeeze8) ...
Generating /etc/default/isc-dhcp-server...
Starting ISC DHCP server: dhcpdcheck syslog for diagnostics. ... failed!
failed!
invoke-rc.d: initscript isc-dhcp-server, action "start" failed.

配置DHCP服务器

dhcpd的配置文件称为/etc/dhcp/dhcpd.conf
该文件带有许多全局配置选项。
执行以下命令以编辑文件:

# vi /etc/dhcp/dhcpd.conf

您必须阻止DHCP服务器从客户端接收DNS信息,并设置以下全局选项(这是一项安全功能):

ddns-update-style none;

您需要设置域名和名称服务器:

## Set a domain name for your LAN ##
option domain-name "theitroad.com";
 
## Set DNS server IP address, you can set to your ISP's dns server too or use Google DNS server##
option domain-name-servers 192.168.1.2, 192.168.1.3;

增加租约时间。
时间以秒为单位设置:

### Set the length in seconds that will be assigned to a lease if the client requesting the lease does not ask for a specific  expiration time.   ##
### This is used for both DHCPv4 and DHCPv6 leases (it is also known as the "valid lifetime" in DHCPv6). ###
default-lease-time 86400;
 
## Set the maximum length in seconds that will be assigned to a lease ##
max-lease-time 604800;

权威性指令应不加注释:

authoritative;

" authoritative"指令指示DHCP服务器应向错误配置的客户端发送DHCPNAK消息。
如果不这样做,则在更改子网之后,客户端将无法获得正确的IP地址,直到其旧租约到期为止,这可能需要很长时间。
最后,使用您的子网更新配置文件,如下所示:

subnet 192.168.1.0 netmask 255.255.255.0 {
        ## dhcp start  and end IP range ##
        range 192.168.1.100 192.168.1.200;
        option subnet-mask 255.255.255.0;     ## subnet 
        option broadcast-address 192.168.1.255; ## broadcast
        option routers 192.168.1.254; ## router IP
}

其中:

  • subnet 192.168.1.0 netmask 255.255.255.0 {subnet语句用于向dhcpd提供足够的信息,以告诉该IP地址是否在该子网上。它也可以用于提供特定于子网的参数,并指定可以动态分配给在该子网中引导的客户端的地址。这些地址是使用范围声明指定的。在此示例中,192.168.1.0是子网号,并且应该是解析为所描述子网的子网号的IP地址或域名。网络掩码255.255.255.0应该是解析为所描述子网的子网掩码的IP地址或域名。子网号以及网络掩码足以确定指定子网中是否有任何给定的IP地址。
  • range 192.168.0.100 192.168.0.200;对于要动态分配地址的任何子网,必须至少有一个range语句。 range语句给出范围内的最低和最高IP地址。范围内的所有IP地址都应在声明范围声明的子网中。 192.168.1.100是该池中的起始IP地址,而192.168.1.200是该池中的结束IP地址。
  • option subnet-mask 255.255.255.0;使用此子网掩码。
  • option broadcast-address 192.168.1.255;使用此广播地址。
  • option routers 192.168.1.254;使用此网关地址,即连接到Internet的路由器的地址。

保存并关闭文件。
要检查dhcpd.conf文件的语法是否存在错误,请运行:

# dhcpd -t

或者

# dhcpd -t /etc/dhcp/dhcpd.conf

如何启动/停止/重启DHCP服务器?

执行以下命令:

service isc-dhcp-server start
service isc-dhcp-server stop
service isc-dhcp-server restart
service isc-dhcp-server status

输出示例:
Debian Linux:启动/停止/重新启动DHCPD服务器命令

如何验证dhcpd是否打开了DHCP服务器UDP端口67?

执行以下任一命令

# netstat -tulpn | grep --color "dhcp"

或者

# ps aux | grep --color "
- hcpd"

或者

# pgrep dhcpd

排除DHCP服务器问题

默认情况下,dhcpd将使用syslog函数记录所有输出,并将日志工具设置为LOG_DAEMON,即/var/log/syslog文件:

# tail -f /var/log/syslog
# grep dhcpd /var/log/syslog

您可以使用dhcpdump命令在Linux/UNIX下转储DHCP数据包,以进行监视或调试,如下所示:

# dhcpdump -i eth0

或者使用旧的好tcpdump程序:

# tcpdump -lenx -i eth0 -s 1500 port bootps or port bootpc

cd到/var/lib/dhcp目录以查看有关dhcp服务器已分配给客户端的租约的更多信息:

# cd /var/lib/dhcp/
# ls -l
# vi dhcpd.leases
# cat dhcpd.leases
# grep 'something' dhcpd.leases

保护DHCP服务器

禁用动态DNS:

ddns-update-style none;

设置"拒绝拒绝"消息,以避免再次对您的DHCP服务器进行DoS攻击。
客户端设备可以多次发送DHCPDECLINE消息,这将耗尽DHCP服务器的IP地址池,从而导致DHCP服务器忘记旧的地址分配:

deny declines;

禁用对较早的BOOTP客户端的支持:

deny bootp;

您必须为以下所有操作指令设置有效和正确的值。
如果您未使用NIS域或ntp服务器,请确保未定义以下选项。

## see dhcpd.conf man page for more info on the directives ##
option domain-name  
option domain-name-servers
option nis-domain
option nis-servers
option ntp-servers
option routers
option time-offset

在大多数情况下,您只需要域名,域名服务器和路由器指令,应删除其余部分以最小化dhcp服务器提供的信息。

如何配置iptables以允许访问DHCP服务器?

编辑您的iptables脚本并添加以下行

## Make sure you use an appropriate network block,  ##
## and network mask, representing the machines on your ## 
## network which should operate as clients of the dhcp serve. ##
## Syntax: ##
## /sbin/iptables -A INPUT -s net/mask -i $LAN_IFACE -p udp --dport 67:68 --sport 67:68 -j ACCEPT ##
## Adjust rules as per your setup ##
 
/sbin/iptables -A INPUT -s 192.168.1.0/24 -i eth0 -p tcp --sport 68 --dport 67 -j ACCEPT
/sbin/iptables -A INPUT -s 192.168.1.0/24 -i eth0 -p udp --sport 68 --dport 67 -j ACCEPT

内部子网的配置略有不同

以下是一个特殊的子网,该子网允许使用192.168.0.5处的tftpd服务器进行pxe网络引导(请注意,您需要单独安装和配置tftpd服务器):

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.20 192.168.0.50;
  ## openbsd pxe boot file ##
  filename "openbsd/pxeboot";
 
  ## Debian 6 pxe boot file ##
  ## filename "debian6/pxelinux.0";
 
  ## Freebsd pxe boot file ##
  ## filename "freebsd/pxeboot";
 
  ## our boot server ##
  next-server 192.168.0.5; 
  option subnet-mask 255.255.255.0;
  option broadcast-address 192.168.0.255;
  option routers 192.168.0.5;
}

如何添加BOOTP支持?

必须在dhcpd.conf文件中显式声明每个BOOTP客户端。

## bootp my headless home router ##
host router {
     hardware ethernet 08:00:2b:4c:59:23;
     fixed-address 192.168.0.21;
     filename "debian6/pxelinux.0";
}