Ubuntu/Debian Linux:为您的网络设置一个ISC DHCP服务器
如何使用在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"; }