1.安装并配置 DHCP 服务器

# 1. 安装 DHCP 服务器软件
dnf install -y dhcp-server

# 2. 配置 DHCP 服务器
cat > /etc/dhcp/dhcpd.conf << 'EOF'
# 全局配置
authoritative;
default-lease-time 600;
max-lease-time 7200;

# 日志配置
log-facility local7;

# 子网配置
subnet 192.168.10.0 netmask 255.255.255.0 {
    # IP 地址池范围
    range 192.168.10.30 192.168.10.200;
    
    # 网关地址
    option routers 192.168.10.254;
    
    # 广播地址
    option broadcast-address 192.168.10.255;
    
    # DNS 服务器配置
    option domain-name-servers 192.168.10.30, 192.168.10.40;
    option domain-name "dns.linux.cn";
    
    # 默认租约时间
    default-lease-time 600;
    max-lease-time 7200;
}
EOF

# 3. 配置 DHCP 服务监听的网卡
# 首先查看网卡名称(通常是 ens33、eth0 等)
ip addr show

# 编辑 DHCP 服务配置文件,假设网卡是 ens33
sed -i 's/^#DHCPDARGS=/DHCPDARGS=ens33/' /etc/sysconfig/dhcpd
# 或者手动编辑文件,在 DHCPDARGS 行指定网卡名称
echo 'DHCPDARGS="ens33"' >> /etc/sysconfig/dhcpd

# 4. 启动 DHCP 服务并设置为开机自启
systemctl start dhcpd
systemctl enable dhcpd
systemctl status dhcpd

# 5. 配置防火墙允许 DHCP 服务
firewall-cmd --permanent --add-service=dhcp
firewall-cmd --reload

2. 配置 DNS 服务器

# 由于需要 DNS 服务器,我们可以配置一个简单的 DNS 服务器
# 安装 bind DNS 服务器
dnf install -y bind bind-utils

# 配置主配置文件
cat > /etc/named.conf << 'EOF'
options {
    listen-on port 53 { any; };
    listen-on-v6 port 53 { ::1; };
    directory       "/var/named";
    dump-file       "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
    recursing-file  "/var/named/data/named.recursing";
    secroots-file   "/var/named/data/named.secroots";
    allow-query     { any; };
    recursion yes;

    dnssec-enable yes;
    dnssec-validation yes;

    managed-keys-directory "/var/named/dynamic";
    geoip-directory "/usr/share/GeoIP";

    pid-file "/run/named/named.pid";
    session-keyfile "/run/named/session.key";

    /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
    include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
    channel default_debug {
        file "data/named.run";
        severity dynamic;
    };
};

zone "." IN {
    type hint;
    file "named.ca";
};

zone "linux.cn" IN {
    type master;
    file "linux.cn.zone";
    allow-update { none; };
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
EOF

# 创建区域文件
cat > /var/named/linux.cn.zone << 'EOF'
$TTL 86400
@   IN  SOA     dns.linux.cn. admin.linux.cn. (
                    2024010101  ; Serial
                    3600        ; Refresh
                    1800        ; Retry
                    604800      ; Expire
                    86400       ; Minimum TTL
            )
@       IN  NS      dns.linux.cn.
@       IN  A       192.168.10.30
dns     IN  A       192.168.10.30
dns     IN  A       192.168.10.40
www     IN  A       192.168.10.50
web     IN  A       192.168.10.50
EOF

# 设置文件权限
chown named:named /var/named/linux.cn.zone

# 启动 DNS 服务
systemctl start named
systemctl enable named

# 配置防火墙允许 DNS 服务
firewall-cmd --permanent --add-service=dns
firewall-cmd --reload

3. 配置网络接口

# 为服务器配置静态 IP 地址
# 编辑网卡配置文件(假设网卡是 ens33)
cat > /etc/sysconfig/network-scripts/ifcfg-ens33 << 'EOF'
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"

# 为 DHCP 服务器配置 IP
IPADDR=192.168.10.20
PREFIX=24
GATEWAY=192.168.10.254
DNS1=192.168.10.30
DNS2=192.168.10.40
EOF

# 为 DNS 服务器添加第二个 IP 地址(192.168.10.30)
cat > /etc/sysconfig/network-scripts/ifcfg-ens33:1 << 'EOF'
DEVICE="ens33:1"
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=192.168.10.30
PREFIX=24
EOF

# 为 WEB 服务器添加第三个 IP 地址(192.168.10.50)
cat > /etc/sysconfig/network-scripts/ifcfg-ens33:2 << 'EOF'
DEVICE="ens33:2"
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=192.168.10.50
PREFIX=24
EOF

# 重启网络服务
systemctl restart NetworkManager

# 或者重启网络(如果使用 network 服务)
# systemctl restart network

4. 配置 WEB 服务器

# 安装 nginx web 服务器
dnf install -y nginx

# 创建测试网页
cat > /usr/share/nginx/html/index.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
    <title>Test Web Server</title>
</head>
<body>
    <h1>Welcome to Test Web Server!</h1>
    <p>Server IP: 192.168.10.50</p>
    <p>Domain: dns.linux.cn</p>
    <p>This is a test page for DHCP and DNS configuration.</p>
</body>
</html>
EOF

# 启动 web 服务
systemctl start nginx
systemctl enable nginx

# 配置防火墙允许 HTTP 服务
firewall-cmd --permanent --add-service=http
firewall-cmd --reload

5. 测试 DHCP 服务

# 在一台客户端机器上测试(需要另一台机器)
# 在客户端执行以下命令:

# 1. 释放当前 IP(如果已有)
sudo dhclient -r

# 2. 获取新 IP
sudo dhclient

# 3. 查看获取的 IP 地址
ip addr show

# 4. 测试网络连接
ping -c 4 192.168.10.254  # 测试网关
ping -c 4 192.168.10.20   # 测试 DHCP 服务器
ping -c 4 192.168.10.30   # 测试 DNS 服务器
ping -c 4 192.168.10.50   # 测试 WEB 服务器

# 5. 测试 DNS 解析
nslookup dns.linux.cn
nslookup web.linux.cn
nslookup www.linux.cn

# 6. 测试 WEB 访问
curl http://192.168.10.50
curl http://web.linux.cn
curl http://www.linux.cn

# 7. 查看 DHCP 租约信息
cat /var/lib/dhclient/dhclient.leases

6. 查看 DHCP 服务器状态和日志

# 在 DHCP 服务器上查看服务状态
systemctl status dhcpd

# 查看 DHCP 分配日志
tail -f /var/log/messages | grep dhcpd
# 或者使用 journalctl
journalctl -u dhcpd -f

# 查看当前的 DHCP 租约
cat /var/lib/dhcpd/dhcpd.leases

# 查看网络接口统计
netstat -anu | grep :67

# 测试 DHCP 服务器配置文件的语法
dhcpd -t -cf /etc/dhcp/dhcpd.conf

7. 故障排除命令

# 如果 DHCP 服务启动失败
# 1. 检查配置文件语法
dhcpd -t -cf /etc/dhcp/dhcpd.conf

# 2. 检查端口是否被占用
netstat -tulpn | grep :67

# 3. 检查 SELinux 状态(openEuler 默认可能开启 SELinux)
getenforce
# 如果 enforcing,可以暂时关闭或设置规则
setenforce 0  # 临时关闭(重启后恢复)
# 或添加 SELinux 规则
setsebool -P dhcpd_use_ldap on

# 4. 检查防火墙规则
firewall-cmd --list-all

# 5. 查看详细错误信息
journalctl -xe | grep dhcpd

完整测试流程

  1. 在服务器端执行:

    • 安装和配置 DHCP、DNS、WEB 服务
    • 配置网络接口
    • 启动所有服务
  2. 在客户端执行:

    # 设置网络为 DHCP 获取
    nmcli con mod "Wired connection 1" ipv4.method auto
    nmcli con down "Wired connection 1"
    nmcli con up "Wired connection 1"
    
    # 或者使用 dhclient
    dhclient -r && dhclient
    
    # 验证 IP 地址是否在 192.168.10.30-200 范围内
    ip addr show
    
    # 测试网络连通性
    ping 192.168.10.254
    ping 192.168.10.50
    
    # 测试 WEB 访问
    curl http://192.168.10.50