
1. 从一台“失联”的服务器说起以太网配置到底在配什么很多人第一次接触网络配置是在一台没有图形界面的服务器面前。机架上的机器嗡嗡作响网线插好了指示灯也亮了但你敲下ping命令屏幕上只有一行冰冷的Network is unreachable。这时候你才意识到网线通不代表网络通网卡亮灯也不代表系统知道该把数据包往哪里送。以太网配置IP和网关本质上是在回答操作系统三个问题我是谁本机IP地址、我的网络边界在哪里子网掩码、出远门该找谁问路默认网关。这三个问题答不上来数据包就像一封没写寄件人和收件地址的信邮局只能把它扔进垃圾桶。这篇文章面向的是刚接触Linux网络配置的运维新手、需要给嵌入式设备配网的开发者以及那些在虚拟机里折腾网络却总是连不通的爱好者。我会从最基础的网卡识别讲起一路走到网关路由的验证把每一步背后的“为什么”都掰开揉碎。你不需要有深厚的网络理论基础但需要有一台能敲命令的Linux机器——物理机、虚拟机都行。提示本文所有操作均在Linux环境下进行涉及的命令在主流发行版上通用。如果你用的是Windows图形界面点几下就能完成但理解原理同样重要。2. 动手之前先认脸网卡命名与物理层确认2.1 为什么你的网卡叫enp3s0而不是eth0早期Linux内核用eth0、eth1这种简单粗暴的方式给网卡命名谁先被内核识别谁就是eth0。这在单网卡机器上没问题但在多网卡服务器上就是灾难——今天eth0是板载网卡明天加了一张PCIe网卡eth0可能就变成新卡了你的配置文件全部对不上号。现在的主流发行版采用可预测网络接口名称Predictable Network Interface Names命名规则基于网卡在主板上的物理位置。以enp3s0为例en表示以太网Ethernetp3表示PCI总线3号s0表示插槽0。这样无论系统怎么重启、内核怎么升级只要网卡还插在那个槽里名字就不会变。你可以用下面这条命令查看当前系统的网卡列表ip link show输出里会列出所有网络接口lo是本地回环不用管它。剩下的就是你的物理或虚拟网卡。如果你看到的是ens33、enp0s3这类名字说明系统启用了可预测命名如果还是eth0可能是内核参数里禁用了该特性或者你用的是较老的发行版。2.2 确认网线真的通了在配置IP之前先确认物理层没问题。最直接的信号是网卡状态里的LOWER_UP标志ip link show enp3s0输出中如果看到BROADCAST,MULTICAST,UP,LOWER_UP说明网卡已启用且物理链路已连通。如果只有UP没有LOWER_UP大概率是网线没插好、对端设备没开机或者网线本身有问题。另一个有用的工具是ethtoolethtool enp3s0看Link detected: yes这一行。如果是no别急着配IP先检查硬件。我见过太多人对着一个网线都没插紧的机器折腾了半天IP配置最后发现是物理层的问题。注意虚拟机的网卡状态取决于虚拟化平台的网络设置。如果虚拟机里看不到LOWER_UP先检查虚拟网络编辑器的连接类型是NAT、桥接还是仅主机模式。3. 给网卡一个身份IP地址与子网掩码的配置逻辑3.1 临时配置与永久配置的分水岭Linux下配置IP有两种方式临时生效和永久生效。临时配置用ip addr add命令重启网络服务或重启机器后就没了永久配置需要修改配置文件重启后依然有效。先看临时配置适合调试场景sudo ip addr add 192.168.1.100/24 dev enp3s0 sudo ip link set enp3s0 up这两条命令的意思是给enp3s0网卡添加一个IP地址192.168.1.100子网掩码24位即255.255.255.0然后启用这块网卡。执行完立刻生效不需要重启任何服务。但临时配置有个问题机器一重启就全没了。所以生产环境必须做永久配置。不同发行版的配置文件位置和格式差异很大这是新手最容易踩坑的地方。3.2 主流发行版的永久配置方式对比发行版配置文件位置配置工具生效命令CentOS 7/RHEL 7/etc/sysconfig/network-scripts/ifcfg-网卡名手动编辑nmcli con reload 或 systemctl restart networkUbuntu 16.04/etc/network/interfaces手动编辑systemctl restart networkingUbuntu 18.04/etc/netplan/*.yamlnetplannetplan apply通用现代方案由NetworkManager管理nmcli / nmtuinmcli con up 连接名以CentOS 7为例配置文件内容大致如下TYPEEthernet BOOTPROTOstatic NAMEenp3s0 DEVICEenp3s0 ONBOOTyes IPADDR192.168.1.100 PREFIX24 GATEWAY192.168.1.1 DNS1223.5.5.5这里有几个关键点需要解释。BOOTPROTOstatic表示使用静态IP如果改成dhcp就是自动获取。ONBOOTyes表示开机自动启用这块网卡如果设成no每次开机你都得手动ip link set up这在服务器上几乎是不可接受的。PREFIX24等同于子网掩码255.255.255.0也可以写成NETMASK255.255.255.0两种写法等价。Ubuntu 18.04之后的netplan配置则是YAML格式network: version: 2 renderer: networkd ethernets: enp3s0: dhcp4: no addresses: - 192.168.1.100/24 gateway4: 192.168.1.1 nameservers: addresses: [223.5.5.5, 114.114.114.114]YAML对缩进极其敏感多一个空格少一个空格都会导致解析失败。我建议用netplan try命令而不是直接netplan apply前者会在应用前检查语法如果配置有问题会自动回滚避免你把自己关在门外。3.3 子网掩码到底在掩什么很多人配IP时随手写个/24但说不清24是什么意思。子网掩码的作用是告诉系统IP地址中哪部分是网络号哪部分是主机号。以192.168.1.100/24为例24表示前24位是网络号后8位是主机号。换算成十进制掩码就是255.255.255.0。这意味着192.168.1.0到192.168.1.255属于同一个网段其中.0是网络地址.255是广播地址实际可用的主机地址是.1到.254共254个。如果你把掩码写成/25那就是255.255.255.128网段被一分为二192.168.1.0/25和192.168.1.128/25。这时候192.168.1.100和192.168.1.200就不在同一个网段了它们之间的通信必须经过网关。提示同一个物理网络里所有设备的子网掩码必须一致。如果一台机器是/24另一台是/25它们可能互相ping不通即使IP地址看起来很近。4. 出远门要找对门默认网关的配置与路由验证4.1 网关的本质是一条默认路由配置网关的本质是在系统的路由表里添加一条默认路由。你可以用ip route show查看当前路由表ip route show典型输出如下default via 192.168.1.1 dev enp3s0 proto static metric 100 192.168.1.0/24 dev enp3s0 proto kernel scope link src 192.168.1.100 metric 100第一行就是默认路由意思是所有目标地址不在本地路由表里的数据包统统发给192.168.1.1从enp3s0出去。第二行是直连路由表示192.168.1.0/24这个网段直接通过enp3s0可达不需要经过网关。添加默认网关的命令是sudo ip route add default via 192.168.1.1 dev enp3s0但和IP地址一样这条命令也是临时的。永久配置需要在网卡配置文件里写GATEWAY192.168.1.1或者在netplan里写gateway4: 192.168.1.1。4.2 网关必须和本机IP在同一网段这是新手最容易犯的错误本机IP是192.168.1.100/24网关却写成192.168.2.1。系统会直接拒绝这条路由因为网关地址不在任何直连网段内系统根本不知道怎么到达这个网关。网关地址必须是本机直连网段内的一个可用IP。通常这个IP是路由器的LAN口地址比如192.168.1.1。如果你不确定网关是多少可以看看同网段其他正常机器的路由表或者问网络管理员。4.3 路由验证的完整链路配完IP和网关后不要急着ping外网按下面的顺序逐层验证验证本机IP是否生效ip addr show enp3s0确认IP地址和掩码正确。验证网关是否可达ping 192.168.1.1如果ping不通说明物理层或网关配置有问题。验证DNS是否可用ping 223.5.5.5这是阿里公共DNS的IP能ping通说明路由没问题。验证域名解析ping www.example.com如果上一步通但这步不通说明DNS配置有问题。验证路由路径traceroute 223.5.5.5看数据包第一跳是不是你的网关。这个顺序很重要从近到远逐层排查能快速定位问题出在哪一层。我见过有人一上来就ping百度不通就到处改配置结果只是网线没插。5. 踩坑实录那些年我们配错的IP和网关5.1 配置文件改了但没生效这是最高频的问题。你改了/etc/sysconfig/network-scripts/ifcfg-enp3s0重启了网络服务但ip addr show看到的还是旧IP。原因通常有三个一是改错了文件。系统里可能有多个网卡配置文件你改的是ifcfg-eth0但实际使用的是enp3s0。用ip link show确认当前网卡名再找对应的配置文件。二是NetworkManager和network服务冲突。CentOS 7同时存在这两个服务如果NetworkManager在管理网卡你手动改的ifcfg文件可能被覆盖。用nmcli device status查看网卡由谁管理然后用对应的工具配置。三是配置文件语法错误。比如IPADDR写成了IPADDRS或者等号两边有空格。Linux的配置文件对格式很敏感一个字符错了整个文件可能被忽略。5.2 网关配了但外网不通网关ping得通但ping外网IP不通通常是路由问题。检查ip route show里有没有default路由以及default路由的网关地址是否正确。还有一种情况系统里存在多条默认路由metric值不同。metric越小优先级越高。如果你看到两条default路由metric小的那条生效。用ip route del default via 错误的网关删掉多余的路由。5.3 DNS配置被忽略/etc/resolv.conf是DNS解析的配置文件但在某些发行版上这个文件会被NetworkManager或systemd-resolved自动覆盖。你手动改的内容重启后就没了。正确的做法是在网卡配置文件里写DNS1223.5.5.5让网络管理服务去生成resolv.conf。或者用nmcli con mod 连接名 ipv4.dns 223.5.5.5来配置。注意如果你在resolv.conf里看到Generated by NetworkManager或Do not edit之类的注释说明这个文件是自动生成的手动修改无效。5.4 虚拟机网络模式的坑在虚拟机里配网络首先要搞清楚虚拟化平台用的是哪种网络模式NAT模式虚拟机通过宿主机的网络访问外网虚拟机的网关通常是虚拟网络编辑器中设置的网关地址比如192.168.xxx.2。这种模式下外部机器无法直接访问虚拟机。桥接模式虚拟机直接连接到物理网络和宿主机平起平坐。IP地址需要和物理网络同网段网关就是物理路由器的地址。仅主机模式虚拟机只能和宿主机通信不能访问外网。适合做隔离实验。我见过有人在NAT模式下把网关配成物理路由器的地址怎么都不通。后来发现NAT模式的网关是虚拟化平台自己提供的和物理网络完全是两套体系。6. 配完之后验证、排错与日常维护6.1 一套完整的验证命令清单配置完成后按下面的清单逐项检查# 查看网卡状态和IP ip addr show enp3s0 # 查看路由表 ip route show # 查看DNS配置 cat /etc/resolv.conf # 测试网关连通性 ping -c 3 192.168.1.1 # 测试外网IP连通性 ping -c 3 223.5.5.5 # 测试域名解析 ping -c 3 www.example.com # 查看路由追踪 traceroute 223.5.5.5这一套跑下来基本能定位90%的网络配置问题。6.2 网络配置的备份与恢复在修改网络配置之前先备份原文件sudo cp /etc/sysconfig/network-scripts/ifcfg-enp3s0 /etc/sysconfig/network-scripts/ifcfg-enp3s0.bak如果是远程SSH连接的服务器修改网络配置有把自己关在门外的风险。建议用nohup或screen保持会话或者设置一个定时任务在几分钟后重启网络服务万一配错了还能自动恢复。Ubuntu的netplan提供了netplan try命令应用配置后会等待120秒如果期间没有确认自动回滚到之前的配置。这个机制在远程操作时非常有用。6.3 多网卡场景的注意事项服务器上有多块网卡时每块网卡都需要独立的配置文件。如果两块网卡配了同一个网段的IP路由表会出现冲突系统可能从错误的网卡发包。更常见的是双网卡分别连接内网和外网。这时候需要仔细规划路由内网流量走内网网卡外网流量走外网网卡。默认网关只能有一个所以通常把外网网卡的网关设为默认网关内网网段通过静态路由指定。# 添加内网静态路由 sudo ip route add 10.0.0.0/8 via 192.168.1.254 dev enp4s0这条命令的意思是去往10.0.0.0/8网段的数据包发给192.168.1.254从enp4s0出去。7. 从命令行到配置文件把临时操作固化成永久配置临时命令适合调试但生产环境必须落到配置文件。我习惯的做法是先用ip addr add和ip route add把网络调通确认所有验证命令都通过后再把相同的参数写进配置文件重启网络服务验证一次。这样做的好处是调试阶段用命令行可以快速试错不用反复重启网络服务。等参数确定后再固化减少配置文件改来改去的次数。以CentOS为例完整的ifcfg文件模板如下TYPEEthernet BOOTPROTOstatic NAMEenp3s0 DEVICEenp3s0 ONBOOTyes IPADDR192.168.1.100 PREFIX24 GATEWAY192.168.1.1 DNS1223.5.5.5 DNS2114.114.114.114写完保存执行systemctl restart network或nmcli con reload nmcli con up enp3s0。然后再次运行验证清单确认重启后配置依然生效。Ubuntu的netplan配置写完执行netplan apply。如果用的是netplan try确认无误后按回车接受配置。最后再分享一个实用技巧如果你不确定某个配置项的正确写法可以查man手册。man nm-settings列出了NetworkManager支持的所有配置项man netplan有netplan的完整文档。比在网上搜半天靠谱得多。