公网 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.106→192.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 文本界面工具
-
执行命令进入交互界面:
bashnmtui -
操作路径,选择
Edit a connection→ 选择网卡(如ens33):- 将
IPv4 CONFIGURATION改为Manual - 在
Addresses中输入IP及子网掩码- 格式:
IP地址/子网掩码位数,如192.168.0.106/24
- 格式:
- 在
Gateway和DNS servers中填入对应地址- Gateway:
192.168.0.1 - DNS servers:
192.168.1.1
- Gateway:
- 将
-
保存退出并重启网络服务:
bashsystemctl 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命令:
baship route show default # Linux ipconfig /all # Windows(查看"默认网关") -
图形界面:
- Windows:控制面板 → 网络状态 → 连接详情 → "默认网关"
- macOS:系统偏好设置 → 网络 → 高级 → TCP/IP → "路由器"
2 ) 查询DNS服务器
-
Linux命令:
bashnetstat -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 Gateway和DNS Servers -
macOS/Linux:
bashroute -n | grep 'UG' # 查看网关 cat /etc/resolv.conf # 查看 DNS
-
-
无法访问外网:
- 检查网关、DNS是否配置(静态IP必需)
- 验证网络服务状态:
systemctl status network - 测试网关连通性:
ping 192.168.0.1 - 静态 IP 必须配置
GATEWAY和DNS,否则导致域名解析失败(ping: baidu.com: Name or service not known)
-
IP冲突:确保静态IP未被其他设备占用
-
配置文件生效:修改后必须执行
systemctl restart network -
终极验证命令:
bashping 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.com→117.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}`);
}
}
}
核心总结
- DHCP 适用场景:
适合动态环境(如移动设备),但 IP 变化可能导致服务不可达。 - 静态 IP 必要性:
服务器需固定 IP 确保服务稳定性(如 Web 服务、SSH 连接)。 - 配置完整性:
静态 IP 必须指定网关和 DNS,否则网络功能不全。 - 工具选择:
- 快速修改 →
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:需手动配置
IPADDR、NETMASK、GATEWAY、DNS,适用于服务器等固定设备 - 核心要点:网关与DNS是静态IP联网的必要参数,缺失将导致网络中断
- 通过编辑配置文件或
nmtui工具均可实现配置,后者提供更友好的交互界面