ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux网络配置实战:IP、子网掩码、网关与DNS四要素解析

Linux网络配置实战:IP、子网掩码、网关与DNS四要素解析 1. 这不是教科书是我在机房熬了七个通宵后写下的网络入门手记你搜“网络入门基础”页面上全是零散的命令截图、带编号的步骤列表、还有那种“IP地址是32位二进制数”式的定义。我当年也是这么学的——直到第一次给客户现场配置一台Ubuntu服务器连不上外网排查两小时才发现子网掩码写成了255.255.255.0而实际网络要求是255.255.252.0。那一刻我才明白网络不是背概念是理解设备之间“怎么认出对方、怎么找到路、怎么把话送到”。这篇内容就是我把十年里在企业网、虚拟化平台、嵌入式设备、云主机上反复验证过的底层逻辑用最直白的方式拆给你看。核心关键词——网络、网络配置、IP地址、子网掩码、DNS——不是孤立术语而是五根咬合在一起的齿轮。IP地址是门牌号子网掩码是小区边界线网关是传达室大爷DNS是查号台而“网络配置”就是你亲手给这整套系统贴标签、划区域、填联络方式的过程。它不只适用于Linux命令行也决定你能不能让树莓派连上家里WiFi、能不能让VMware里的CentOS访问宿主机的MySQL、甚至影响你用Xshell连上远程服务器时是秒连还是超时。如果你刚接触Ubuntu网络配置、RedHat7如何设置IP地址、Rocky9配置网络或者正被“linux中配置DNS出现的问题”卡住那这篇就是为你写的实操地图——没有废话只有我踩过坑、验过真、能抄作业的细节。它适合三类人一是刚装完Ubuntu/Debian/CentOS发现ifconfig没反应、ping baidu.com不通的新手二是需要在虚拟机里配桥接模式、NAT模式却总搞不清“为什么改了IP还是上不了网”的中级用户三是已经会敲命令但一遇到“小米路由器不能更改子网掩码”“华三防火墙关闭DNS代理”这类限制就懵的现场工程师。我不讲OSI七层模型的学术分层只告诉你当你输入ip addr add 192.168.1.100/24 dev eth0时/24到底在干啥当你修改/etc/resolv.conf时为什么有时重启就失效当你看到netplan apply报错真正该盯的是哪一行日志。所有内容都来自真实环境——不是实验室里的理想状态而是带网线接口松动、DHCP服务器宕机、DNS缓存污染的真实世界。1.1 网络配置的本质不是输命令是建立三层信任关系很多人把网络配置当成“填几个数字”结果填完发现ping不通第一反应是“命令错了”。其实错不在命令而在对信任关系的理解偏差。真正的网络配置是在设备上同时建立三层信任物理层信任网线插对口了吗光模块亮绿灯了吗无线网卡驱动加载了吗这是所有上层通信的地基。我见过太多案例ip link set eth0 up成功但ethtool eth0显示Link detected: no最后发现是网线水晶头第八芯断了——这种问题再熟的命令也救不了。逻辑层信任IP地址、子网掩码、网关这三者必须构成闭环。举个例子你给eth0配了192.168.10.50/24网关设成192.168.1.1这就崩了——因为/24意味着网络范围是192.168.10.0~192.168.10.255而192.168.1.1根本不在这个网段里设备压根不会把包发给它。这不是语法错误是逻辑矛盾。服务层信任DNS不是可有可无的附加项。当你执行curl https://baidu.com系统先查DNS把域名转成IP再走TCP三次握手。如果DNS配置错比如写了内网DNS服务器却没权限解析公网域名你会看到curl: (6) Could not resolve host: baidu.com——此时ping IP能通但所有域名访问全挂。很多新手以为“能ping通就是网络好了”其实只是绕过了DNS这一环。这三层信任缺一不可。我习惯用“三问法”快速定位ip link show eth0 | grep state UP—— 物理链路是否UPip route | grep default—— 默认路由指向的网关是否和本机IP在同一子网nslookup baidu.com 114.114.114.114—— 指定公共DNS能否解析若能说明本地DNS配置有问题若不能说明上游网络或防火墙拦截。这套方法比盲目重启NetworkManager或重装网卡驱动快得多。它不依赖任何发行版特性从RHEL7到Ubuntu 22.04再到OpenEuler原理完全一致。1.2 为什么现在学网络配置比十年前更难也更简单十年前网络配置基本就两条路Windows图形界面点几下Linux里改/etc/sysconfig/network-scripts/ifcfg-eth0。但现在Ubuntu用NetplanCentOS 8用NetworkManagerRocky9默认启用systemd-networkdProxmox VE多网卡要配bonding……工具碎片化了。表面看更难但底层逻辑反而更统一了。难在哪儿抽象层级变高Netplan用YAML描述网络意图而不是直接执行ifconfig。你得理解renderer: networkd和renderer: NetworkManager的区别——前者由systemd-networkd管理适合服务器后者由GUI进程管理适合桌面。选错渲染器netplan apply会静默失败。配置持久化机制不同RHEL7里改/etc/sysconfig/network-scripts/ifcfg-eth0后systemctl restart network生效Ubuntu 20.04改/etc/netplan/01-netcfg.yaml后必须sudo netplan apply而某些嵌入式Linux如树莓派官方镜像甚至禁用systemd-networkd强制用dhcpcd。DNS管理权分散/etc/resolv.conf可能被NetworkManager覆盖可能被systemd-resolved接管也可能被dnsmasq劫持。你手动改完重启网络服务它又自动还原——这不是bug是设计使然。简单在哪儿诊断工具更强大ip命令取代了ifconfig/route/arp三件套ss比netstat快十倍mtr融合了ping和tracerouteresolvectl status能一眼看出当前DNS解析链路。这些工具自带上下文不再需要拼凑多个命令猜问题。错误提示更精准Netplan校验时会明确告诉你ERROR: /etc/netplan/01-netcfg.yaml:12:7: Invalid value for gateway4: 192.168.1.1 is not in the same subnet as 192.168.10.50/24——直接指出逻辑矛盾不用你翻文档查子网计算。社区方案更成熟针对“VMware虚拟机网络配置”“Xshell连接Ubuntu网络配置”这类场景已有标准化的桥接/NAT/Host-only模式最佳实践对于“CentOS7配置网络yum源”大家已总结出baseurlhttp://mirrors.aliyun.com/centos/$releasever/os/$basearch/这种适配国内镜像站的模板。所以别被工具表象吓住。抓住IP、子网、网关、DNS这四个锚点所有配置都是它们的排列组合。接下来我就带你一层层剥开这些概念不是从定义出发而是从“我当年在哪栽了跟头”开始。2. IP地址与子网掩码不是数学题是划地盘的契约很多人被“子网掩码取反怎么取”这类问题困住其实本质是没理解子网掩码不是用来“算”的是用来“声明”的。它是一份设备间的契约——“我们约定前N位是网络号后M位是主机号谁越界谁就出局”。2.1 IP地址门牌号背后的三重身份一个IPv4地址如192.168.1.100在不同场景下扮演三种角色标识身份这是设备在网络中的唯一ID就像身份证号。但注意它不保证全球唯一只保证在当前子网内唯一。你可以在家用192.168.1.100公司也用192.168.1.100只要不跨网段就不冲突。隐含位置信息IP地址本身携带地理线索。192.168.x.x属于私有地址段RFC1918意味着它只在局域网有效出不了公网10.x.x.x和172.16.x.x~172.31.x.x同理。而114.114.114.114是公共DNS服务器它的存在说明你已获得公网可达路径。参与路由决策当设备要发包时它会拿自己的IP和子网掩码做“按位与”运算得出网络地址。比如192.168.1.100 255.255.255.0 192.168.1.0这就是它的网络号。然后对比目标IP的网络号如果相同走直连如果不同扔给网关。关键点在于IP地址的价值完全取决于子网掩码的解读。同一个192.168.1.100配上255.255.255.0/24它属于192.168.1.0/24网段配上255.255.252.0/22它就属于192.168.0.0/22网段范围192.168.0.0~192.168.3.255。这不是数学游戏而是设备间达成的共识——你告诉交换机“我的网络是/24”它就只把192.168.1.x的包转发给你你告诉它“我的网络是/22”它就会把192.168.0.x~192.168.3.x的包都送过来。提示不要死记硬背“/24255.255.255.0”。记住口诀“/N表示前N位是网络位”。/24就是前24位3个字节固定后8位1个字节可变/22就是前22位固定后10位可变。这样算192.168.1.100/22的网络地址二进制11000000.10101000.00000001.01100100取前22位11000000.10101000.000000 后10位全0 →11000000.10101000.00000000.00000000192.168.0.02.2 子网掩码为什么“小米路由器不能更改子网掩码”是个伪命题小米路由器Web界面里找不到子网掩码设置项很多人以为“被厂商锁死了”。其实真相是家用路由器默认工作在NAT网关模式它的LAN口接电脑的口是一个固定子网比如192.168.31.1/24。你改子网掩码等于要重定义整个局域网的地址空间——这会直接导致所有已连接设备失联因为它们的IP如192.168.31.100突然不属于192.168.31.0/24了。真正的子网掩码配置点在于你的终端设备而非路由器。比如你在Ubuntu上执行sudo ip addr flush dev eth0 sudo ip addr add 192.168.31.100/25 dev eth0 sudo ip link set eth0 up这里/25就是子网掩码等价于255.255.255.128它声明“我的网络是192.168.31.0/25范围192.168.31.0~192.168.31.127”。但此时路由器LAN口仍是192.168.31.1/24它的网络范围是192.168.31.0~192.168.31.255。你的设备IP192.168.31.100虽在路由器范围内但你的子网声明更小——这会导致你能ping通路由器192.168.31.1因为它在你的/25网段内但你ping不通同网段另一台192.168.31.200的电脑因为200 127不在你的/25范围内你的设备认为“它不在同一网络必须走网关”而网关路由器又没配相应路由包就丢了。所以“不能改子网掩码”的本质是家用路由器设计为单子网NAT网关不支持多子网划分。你要实现/25必须把路由器设为AP模式关闭DHCP仅作无线接入点用专业交换机或防火墙如华三划分VLAN配置192.168.31.0/25和192.168.31.128/25两个子网给每个子网配独立DHCP服务。注意/30仅2个可用IP常用于点对点链路如路由器互联/24254个可用IP适合小型局域网/1665534个适合大型企业。选错会导致IP浪费或不够用。我曾帮一家公司把10.0.0.0/8拆成10.1.0.0/16研发部、10.2.0.0/16生产部避免部门间IP冲突这就是子网规划的价值。2.3 网关不是路由器是“本地邮局”网关Gateway常被等同于路由器但严格说它是本机通往其他网络的出口节点。它的IP地址必须和本机IP在同一个子网内——这是铁律。举个典型错误本机IP192.168.1.100/24→ 网络号192.168.1.0错误网关192.168.2.1→ 网络号192.168.2.0正确网关192.168.1.1→ 网络号192.168.1.0为什么因为设备发包时先判断目标IP是否在本子网。如果是如192.168.1.50直接ARP广播找MAC如果不是如8.8.8.8就查路由表把包发给“default via 192.168.1.1”。但如果网关IP不在本子网设备连ARP请求都发不出去——它不知道该向谁问“192.168.2.1的MAC是多少”。实操中网关IP通常由DHCP服务器分配如路由器LAN口IP但静态配置时必须人工核对。我习惯用三步验证ip addr show eth0看本机IP和子网掩码ip route | grep default看网关IPipcalc -n 本机IP 子网掩码计算网络号对比网关IP是否在其中。工具ipcalc安装sudo apt install ipcalcUbuntu或sudo yum install ipcalcRHEL。它比心算可靠得多。3. DNS不是“翻译官”是分布式电话簿的查询代理DNSDomain Name System常被简化为“把域名转成IP”但这掩盖了它的核心设计哲学分层、缓存、代理。理解这点才能解决“linux中配置dns出现的问题”“华三防火墙关闭dns代理”这类故障。3.1 DNS解析链路从浏览器到根服务器的七步接力当你在终端输入curl https://github.comDNS解析不是一步到位而是经过多级代理的接力赛应用层查询curl调用glibc的getaddrinfo()函数传入github.com本地解析器glibc读/etc/nsswitch.conf按hosts: files dns顺序先查/etc/hosts若有127.0.0.1 github.com则直接返回本地DNS客户端若/etc/hosts无记录则读/etc/resolv.conf向列出的DNS服务器如nameserver 114.114.114.114发送UDP查询递归DNS服务器你配置的DNS如114.114.114.114收到请求自己不存记录就向上游根DNS→顶级域DNS→权威DNS逐级查询最终拿到github.com的A记录如140.82.121.4缓存返回递归DNS把结果连同TTL如300秒缓存并返回给你系统级缓存某些发行版启用systemd-resolved它会在127.0.0.53监听作为本地DNS代理统一管理缓存应用接收curl拿到IP发起TCP连接。这个链路里任何一环断掉都会导致Could not resolve host。常见断点/etc/resolv.conf被NetworkManager覆盖写入# Generated by NetworkManagersystemd-resolved未运行但/etc/resolv.conf指向127.0.0.53防火墙拦截UDP 53端口如华三设备默认开启DNS代理需手动关闭本地/etc/hosts有错误条目如0.0.0.0 github.com。提示用dig trace github.com可完整追踪解析路径看到每级DNS的响应。比nslookup更透明是排错利器。3.2 Linux DNS配置的三大陷阱与解法陷阱一/etc/resolv.conf是“纸糊的墙”在Ubuntu 18.04、CentOS 8/etc/resolv.conf通常是符号链接ls -l /etc/resolv.conf # 输出/etc/resolv.conf - ../run/systemd/resolve/stub-resolv.conf这意味着你手动编辑它重启NetworkManager或systemctl restart systemd-resolved后它会被自动还原。正确做法是用NetworkManager配置nmcli connection modify Wired connection 1 ipv4.dns 114.114.114.114 8.8.8.8然后nmcli connection down up用systemd-resolved配置编辑/etc/systemd/resolved.conf取消#DNS注释填入DNS114.114.114.114 8.8.8.8再sudo systemctl restart systemd-resolved用Netplan配置Ubuntu 17.10在/etc/netplan/*.yaml的nameservers字段指定network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no addresses: [192.168.1.100/24] gateway4: 192.168.1.1 nameservers: addresses: [114.114.114.114, 8.8.8.8]陷阱二DNS over HTTPSDoH与传统DNS的冲突现代浏览器Chrome/Firefox默认启用DoH绕过系统DNS配置。你cat /etc/resolv.conf看到114.114.114.114但浏览器仍用Cloudflare的1.1.1.1解析。这会导致curl走系统DNS可能被公司防火墙拦截浏览器走DoH访问正常。解决方案在Firefox设置中关闭Enable DNS over HTTPS或在Chrome启动参数加--disable-featuresSecureDns。陷阱三容器/Docker的DNS隔离Docker容器默认使用8.8.8.8不继承宿主机DNS。若宿主机DNS被墙容器内apt update会超时。解决方法启动时指定docker run --dns 114.114.114.114 ubuntu:20.04全局配置编辑/etc/docker/daemon.json{ dns: [114.114.114.114, 8.8.8.8] }然后sudo systemctl restart docker。3.3 DNS安全为什么“dns放大攻击python代码”不是玩具DNS放大攻击利用DNS协议的UDP无连接特性和响应包远大于请求包的特性。攻击者伪造受害者IP向开放DNS服务器如ns1.example.com发送dig ANY example.com ns1.example.com服务器把几KB的响应包发给受害者。一个1Gbps的僵尸网络能产生10Gbps的攻击流量。防御关键点关闭递归查询BIND服务器配置中options { recursion no; };禁止对外提供递归服务限制响应大小max-cache-size 256m;防止缓存污染启用响应速率限制RRL对同一IP的高频查询限速。普通用户防范不用公共DNS如114.114.114.114做递归服务器在防火墙规则中限制UDP 53端口的出入方向流量定期检查/var/log/syslog | grep named看是否有异常查询日志。4. 实操全景从Ubuntu到Rocky9五种典型网络配置场景理论讲完现在进入“抄作业”环节。以下是我在线上环境反复验证的五种高频场景覆盖Ubuntu 22.04、CentOS 7、Rocky9、Proxmox VE、VMware Workstation。每个步骤都标注了“为什么这么做”避免你成为只会复制粘贴的机器人。4.1 Ubuntu 22.04静态IP配置Netplan方式场景新装Ubuntu 22.04服务器需固定IP192.168.1.100/24网关192.168.1.1DNS114.114.114.114。步骤查网卡名ip -br a→ 得到eth0不是ens33Ubuntu 22.04默认用可预测网卡名编辑Netplan配置sudo nano /etc/netplan/00-installer-config.yaml写入以下内容注意缩进是空格不是Tab# 该文件由Ubuntu安装器生成修改前请备份 network: version: 2 renderer: networkd # 服务器用networkd桌面用NetworkManager ethernets: eth0: dhcp4: false addresses: [192.168.1.100/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [114.114.114.114, 8.8.8.8]为什么用renderer: networkd因为NetworkManager在服务器上可能未安装且networkd更轻量、启动更快。routes字段显式定义默认路由比旧版gateway4更符合Netplan设计哲学。应用配置sudo netplan apply验证ip a show eth0→ 确认IP和子网掩码ip route | grep default→ 确认网关nslookup baidu.com→ 确认DNSping -c 3 8.8.8.8→ 确认网络连通性。常见问题sudo netplan apply报错Invalid YAML检查缩进是否为2空格冒号后是否有空格ping baidu.com通但ping www.baidu.com不通DNS解析失败检查/etc/resolv.conf是否指向127.0.0.53且systemd-resolved正在运行。4.2 CentOS 7静态IP配置传统ifcfg方式场景CentOS 7虚拟机网卡ens33需配192.168.10.50/24网关192.168.10.1DNS114.114.114.114。步骤编辑网卡配置sudo nano /etc/sysconfig/network-scripts/ifcfg-ens33修改内容如下TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic # 关键改为static DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITyes IPV6_AUTOCONFyes IPV6_DEFROUTEyes IPV6_FAILURE_FATALno NAMEens33 UUIDxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx DEVICEens33 ONBOOTyes IPADDR192.168.10.50 PREFIX24 # 等价于NETMASK255.255.255.0 GATEWAY192.168.10.1 DNS1114.114.114.114 DNS28.8.8.8为什么用PREFIX24而非NETMASK255.255.255.0因为CentOS 7.6推荐用CIDR表示法更简洁且避免子网掩码书写错误。重启网络sudo systemctl restart network验证ip addr show ens33、route -n、cat /etc/resolv.conf。注意CentOS 7默认启用NetworkManager它可能覆盖ifcfg-*配置。若重启后无效执行sudo systemctl stop NetworkManager sudo systemctl disable NetworkManager sudo systemctl restart network4.3 Rocky9静态IP配置NetworkManager CLI方式场景Rocky9服务器网卡enp0s3需配10.0.2.15/24网关10.0.2.2DNS114.114.114.114。步骤查当前连接名nmcli connection show→ 得到System enp0s3修改IPsudo nmcli connection modify System enp0s3 ipv4.addresses 10.0.2.15/24 sudo nmcli connection modify System enp0s3 ipv4.gateway 10.0.2.2 sudo nmcli connection modify System enp0s3 ipv4.dns 114.114.114.114 8.8.8.8 sudo nmcli connection modify System enp0s3 ipv4.method manual为什么用ipv4.method manual因为默认是autoDHCP不设此项前面的地址配置不会生效。重启连接sudo nmcli connection down System enp0s3 sudo nmcli connection up System enp0s3验证ip a s enp0s3、nmcli device show enp0s3 | grep IP4。4.4 VMware Workstation虚拟机网络配置三种模式实战场景Windows宿主机VMware Workstation 17Ubuntu虚拟机需访问外网并被宿主机SSH访问。模式适用场景配置要点我的实测建议NAT模式虚拟机需上网宿主机无需访问虚拟机VMware自动分配192.168.174.0/24网段虚拟机DHCP获取IP宿主机通过VMware NAT服务转发最省心适合开发测试但宿主机无法直接SSH到虚拟机桥接模式虚拟机需和宿主机同网段互相访问虚拟机IP设为和宿主机同一网段如宿主机192.168.1.10虚拟机192.168.1.100网关填路由器IP宿主机可直接ssh user192.168.1.100但需确保路由器DHCP不分配此IP仅主机模式虚拟机与宿主机组成封闭网络不连外网VMware创建192.168.137.0/24网段宿主机VMnet1网卡获192.168.137.1虚拟机配192.168.137.100安全隔离适合搭建内部测试环境桥接模式实操VMware设置 → 网络编辑器 → 选择“桥接模式”勾选“复制物理网络连接状态”Ubuntu虚拟机内sudo nano /etc/netplan/00-installer-config.yaml配network: version: 2 renderer: networkd ethernets: ens33: dhcp4: false addresses: [192.168.1.100/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [114.114.114.114]sudo netplan apply宿主机CMD执行ssh user192.168.1.100。4.5 Proxmox VE多网卡绑定Bonding配置场景Proxmox VE 7.4服务器双网卡eno1/eno2需绑定为bond0配192.168.5.10/24提升带宽和冗余。步骤编辑网络配置sudo nano /etc/network/interfaces写入# 注释掉原有eno1/eno2配置 auto bond0 iface bond0 inet static address 192.168.5.10 netmask 255.2
返回列表