Linux小课堂: 网络配置详解之DHCP动态分配与静态IP地址设置

公网 IP 与内网 IP 的核心差异

  • 公网 IP 是互联网唯一标识符,如云服务器(ECS)的公网 IP 可通过 SSH 直接访问(示例:ssh root@公网IP
  • 内网 IP 用于局域网设备通信,如 VirtualBox 虚拟机环境中的服务器(vitserver)与客户机(sentencegunclient)通过内网 IP 互联(示例:ssh root@192.168.0.106

DHCP 动态 IP 分配机制

1 )协议原理

  • DHCP(Dynamic Host Configuration Protocol)基于 UDP 协议

其核心机制为:

  • 动态分配:DHCP服务器为设备分配带租约期限的IP地址(如24小时)
  • IP 地址具有租约期限,到期后地址可能被重新分配(如 192.168.0.106192.168.0.102
  • 参数自动化管理:自动分配IP地址、子网掩码、网关、DNS等参数,无需手动配置

2 ) 配置文件解析

网卡配置文件路径:/etc/sysconfig/network-scripts/ifcfg-<接口名>(如 ifcfg-ens33

关键参数:

bash 复制代码
BOOTPROTO=dhcp    # 启用 DHCP 模式 
ONBOOT=yes        # 开机自动激活网卡

3 ) 关键验证命令

bash 复制代码
ifconfig ens33  # 查看当前IP地址 
cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep BOOTPROTO  # 检查协议类型 

静态 IP 配置实践

为固定服务器IP地址,需切换为静态分配模式。以下提供两种配置方式:

1 ) 方案 1:直接编辑配置文件

修改配置

BOOTPROTO 改为 static,并手动指定参数:

bash 复制代码
# /etc/sysconfig/network-scripts/ifcfg-ens33 
BOOTPROTO=static         # 从dhcp改为static
IPADDR=192.168.0.106     # 静态 IP 地址 
NETMASK=255.255.255.0    # 子网掩码(等价 /24)
GATEWAY=192.168.0.1      # 网关地址(必需)
DNS1=192.168.1.1         # DNS 服务器(必需)
ONBOOT=yes               # 确保开机自启

补充网关与DNS(否则无法上网):

ini 复制代码
GATEWAY=192.168.0.1       # 网关地址(需与主机网关一致)
DNS1=192.168.1.1          # 主DNS服务器

重启网络服务

bash 复制代码
systemctl restart network
ifconfig ens33           # 验证 IP 是否生效 
ping www.baidu.com         # 测试网络连通性

2 )方案2:使用 nmtui 文本界面工具

  • 执行命令进入交互界面:

    bash 复制代码
    nmtui 
  • 操作路径,选择 Edit a connection → 选择网卡(如ens33):

    • IPv4 CONFIGURATION 改为 Manual
    • Addresses中输入IP及子网掩码
      • 格式:IP地址/子网掩码位数,如 192.168.0.106/24
    • GatewayDNS servers中填入对应地址
      • Gateway: 192.168.0.1
      • DNS servers: 192.168.1.1
  • 保存退出并重启网络服务:

    bash 复制代码
    systemctl restart NetworkManager

注意事项:

  • 网关与DNS必填:缺失将导致无法访问外网(如 ping: baidu.com: Name or service not known
  • 子网掩码格式:NETMASK=255.255.255.0 等价于 PREFIX=24(二进制24位掩码)

关键点:

  • 静态IP必须配置网关和DNS,否则无法访问外部网络
  • 网关(GATEWAY)是跨网段通信的出口,通常是路由器IP(如192.168.0.1
  • DNS(如192.168.1.1)用于域名解析,可通过本地/etc/hosts或公共DNS(如8.8.8.8)替代

网关与DNS的获取与配置

静态IP需手动指定网关和DNS,可通过以下方式查询:

1 ) 查询网关地址

  • Linux/Windows命令:

    bash 复制代码
    ip route show default  # Linux 
    ipconfig /all          # Windows(查看"默认网关")
  • 图形界面:

    • Windows:控制面板 → 网络状态 → 连接详情 → "默认网关"
    • macOS:系统偏好设置 → 网络 → 高级 → TCP/IP → "路由器"

2 ) 查询DNS服务器

  • Linux命令:

    bash 复制代码
    netstat -nr | grep default  # 查看网关 
    cat /etc/resolv.conf  # 查看nameserver字段 
  • Windows/macOS:同网关查询路径,定位"DNS服务器"字段

示例配置:

ini 复制代码
GATEWAY=192.168.0.1     # 网关通常为路由器IP(如192.168.0.1)
DNS1=192.168.1.1         # 主DNS服务器
DNS2=8.8.8.8             # 备用DNS(如Google DNS)

关键故障排查点

  • 网关与 DNS 查询方法:

    • Windows: ipconfig /all → 查看 Default GatewayDNS Servers

    • macOS/Linux:

      bash 复制代码
      route -n | grep 'UG'        # 查看网关 
      cat /etc/resolv.conf        # 查看 DNS 
  • 无法访问外网:

    1. 检查网关、DNS是否配置(静态IP必需)
    2. 验证网络服务状态:systemctl status network
    3. 测试网关连通性:ping 192.168.0.1
    4. 静态 IP 必须配置 GATEWAYDNS,否则导致域名解析失败(ping: baidu.com: Name or service not known
  • IP冲突:确保静态IP未被其他设备占用

  • 配置文件生效:修改后必须执行 systemctl restart network

  • 终极验证命令:

    bash 复制代码
    ping 192.168.0.1      # 测试网关可达性 请使用自己的网关ip
    ping 8.8.8.8          # 测试外网连通性
    ping www.baidu.com    # 测试DNS解析 
  • 常见问题:

    • ping域名失败但IP成功 → 检查DNS配置
    • 若无法访问外部网络 → 确认网关是否匹配主机所在网络段

网络基础概念解析

  • 网关(Gateway):连接不同网络的关口(如局域网与互联网),通常为路由器IP地址(如 192.168.0.1
  • DNS(Domain Name System):将域名解析为IP地址的服务(如 www.imooc.com117.121.101.134
  • 子网掩码(Netmask):标识IP地址的网络部分与主机部分(如 255.255.255.0 表示前24位为网络地址)

技术细节:

  • DHCP租约机制:IP地址临时性导致变更,静态IP通过固定参数规避此问题
  • 桥接模式:虚拟机网卡需设置为桥接(Bridged),使虚拟机与宿主机在同一局域网段获取IP

DHCP与静态IP的应用场景

模式 适用场景 优点
DHCP 动态IP环境(如办公网络、移动设备) 自动管理IP,减少配置负担
Static 服务器、需固定IP的服务(如Web、SSH) IP稳定,便于服务访问与端口映射

运维提示:

对于服务器,静态IP是最佳实践,可避免因IP变更导致的服务中断

若需保留DHCP但固定IP,可在路由器中设置

NestJS 网络配置辅助代码示例

1 ) 方案1

模拟网络控制器

typescript 复制代码
import { Controller, Get } from '@nestjs/common';
import { execSync } from 'child_process';
 
@Controller('network')
export class NetworkController {
  @Get('config')
  getNetworkConfig() {
    // 获取当前网络接口配置(Linux 环境)
    const ifconfig = execSync('ifconfig ens33').toString();
    const gateway = execSync('route -n | grep "UG" | awk \'{print $2}\'').toString().trim();
    const dns = execSync('cat /etc/resolv.conf | grep "nameserver" | awk \'{print $2}\'').toString().trim();
 
    return {
      interface: 'ens33',
      config: ifconfig,
      gateway,
      dnsServers: dns.split('\n')
    };
  }
 
  @Get('restart')
  restartNetwork() {
    // 重启网络服务(需 root 权限)
    try {
      execSync('systemctl restart network', { stdio: 'inherit' });
      return { status: 'Network service restarted' };
    } catch (error) {
      throw new Error(`Restart failed: ${error.message}`);
    }
  }
}

核心总结

  1. DHCP 适用场景:
    适合动态环境(如移动设备),但 IP 变化可能导致服务不可达。
  2. 静态 IP 必要性:
    服务器需固定 IP 确保服务稳定性(如 Web 服务、SSH 连接)。
  3. 配置完整性:
    静态 IP 必须指定网关和 DNS,否则网络功能不全。
  4. 工具选择:
    • 快速修改 → vim /etc/sysconfig/network-scripts/ifcfg-ens33
    • 交互操作 → nmtui

注:虚拟机网络模式(如桥接/NAT)直接影响 IP 分配范围,需与宿主机网络环境匹配

2 )方案2

模拟静态IP配置逻辑,包括网关和DNS验证:

typescript 复制代码
import { Injectable } from '@nestjs/common';
 
@Injectable()
export class NetworkConfigService {
  private ipAddress: string = '192.168.0.106';
  private subnetMask: string = '255.255.255.0';
  private gateway: string | null = null;
  private dnsServers: string[] = [];
 
  // 设置网关和DNS 
  setGatewayAndDns(gateway: string, dns: string[]): void {
    this.gateway = gateway;
    this.dnsServers = dns;
  }
 
  // 验证网络连通性
  validateNetwork(): string {
    if (!this.gateway || this.dnsServers.length === 0) {
      return 'Error: Gateway or DNS not configured. Name or service not known.';
    }
    return `Success: Ping to external domain resolved via DNS ${this.dnsServers[0]}`;
  }
 
  // 获取当前配置
  getCurrentConfig(): object {
    return {
      ipAddress: this.ipAddress,
      subnetMask: this.subnetMask,
      gateway: this.gateway,
      dnsServers: this.dnsServers,
    };
  }
}
 
// 使用示例 
const networkService = new NetworkConfigService();
networkService.setGatewayAndDns('192.168.0.1', ['192.168.1.1']);
console.log(networkService.validateNetwork()); // 输出: Success: Ping to external domain resolved via DNS 192.168.1.1

此代码定义了一个服务类 NetworkConfigService,通过 setGatewayAndDns 方法配置网关和DNS,validateNetwork 方法模拟网络验证逻辑。若未设置网关或DNS,返回错误 Name or service not known;配置正确时返回解析成功消息

总结

  • 动态IP(DHCP):适用于临时设备,自动管理网络参数,但IP可能变化
  • 静态IP:需手动配置 IPADDRNETMASKGATEWAYDNS,适用于服务器等固定设备
  • 核心要点:网关与DNS是静态IP联网的必要参数,缺失将导致网络中断
  • 通过编辑配置文件或 nmtui 工具均可实现配置,后者提供更友好的交互界面
相关推荐
CS Beginner4 小时前
【Linux】Tomcat基本配置
linux·运维·tomcat
黑翼杰克斯6 小时前
如何裁剪u-boot,保留其必要功能,使体积尽可能小
linux·1024程序员节
fat house cat_6 小时前
【netty】基于主从Reactor多线程模型|如何解决粘包拆包问题|零拷贝
java·服务器·网络·netty
天***88966 小时前
HTTP 协议的常用方法有哪些?(GET、POST、PUT、DELETE、PATCH)各自的作用和区别是什么?
网络·网络协议·http
xixixi777778 小时前
信息安全和网络安全的区分在哪
网络·安全·web安全·信息安全
cellurw8 小时前
Day69 SQLite3动态库移植 + BMP图像解析显示 + 进度条控件设计与动态文本管理
linux
上海云盾第一敬业销售9 小时前
游戏盾和高防IP的差异与选择
网络·tcp/ip·游戏
nono牛9 小时前
Linux基础指令大全(快速上手)
linux·服务器·windows·智能手机
<但凡.9 小时前
Linux修炼:库制作与原理(一)
linux·运维·服务器