干Linux这一行,网络配置是绕不过去的一道坎。不管你是做软件编程、运维还是嵌入式开发,只要跟Linux打交道,总得跟IP地址、网关、DNS这些概念打交道。我记得刚接触Linux那会儿,最头疼的就是网络配置——明明在Windows下面点几下鼠标就能上网,到了Linux下面却要面对一堆配置文件和命令行工具,稍不留神就把系统网络搞得乱七八糟。
这个话题表面上叫“网络的概念和配置”,实际上覆盖的是一套完整的基础能力:理解网络是怎么通信的、知道Linux下有哪些配置途径、能动手把网络搭起来、出了问题能快速定位。这篇文章我就把自己这些年积累的经验整理一下,从概念到实操,从命令到排错,尽量一次讲透。写到这里已经准备了很多内容,先从最容易被忽略的概念说起。
1. 先把网络基础概念理清楚
1.1 网络分层模型,别急着背协议栈
很多人一上来就背OSI七层模型,背完就忘。我的建议是:不要死背,要理解“分层”到底解决什么问题。
网络通信本质上是两个进程之间交换数据,但数据要从一台机器的网卡出发,经过交换机、路由器,到达另一台机器的网卡,再交给对应的进程。这个过程里要解决很多个问题:数据怎么切分、怎么寻址、怎么路由、怎么保证不丢包、怎么判断数据该交给哪个应用……如果把这些逻辑全揉在一起,系统根本没法定制维护。
分层模型的思路,就是把这一大堆问题拆成几个互相独立的层,每一层只管自己那部分。你不必每一层都精通,但对程序员和运维来说,至少要清楚这几点:
- 链路层解决“同一段物理网络里设备之间怎么传数据”,最典型的是MAC地址和以太网帧。交换机就是工作在二层的设备。
- 网络层解决“数据怎么从源机器一路走到目标机器”,核心是IP地址和路由。路由器就是工作在三层的设备。
- 传输层解决“数据怎么可靠地交给目标机器上的某个应用”,核心是端口和TCP/UDP协议。
- 应用层就是HTTP、SSH、DNS这些你天天在用的协议。
实际排错的时候,分层思路特别有用。比如“网页打不开”,你按顺序查:先ping网关(链路层通不通)、再ping外网IP(网络层通不通)、再ping域名(DNS解析正不正常)、最后看端口(应用层通不通)。这就是典型的分层排查法,能把一个大问题切成几个小问题,逐个击破。
1.2 IP地址、子网掩码、网关:这三件套必须搞懂
配置Linux网络的第一步,就是理解IP地址、子网掩码、网关这三个参数。它们三个缺一不可,而且相互关联。
IP地址是设备在网络里的唯一标识,相当于门牌号。但IP地址本身只是“号码”,它还需要配合子网掩码,才能确定哪些IP跟我“住在同一个小区”。
子网掩码的作用是划分网络号和主机号。举个例子:IP 192.168.1.100,子网掩码255.255.255.0,也就是/24。这意味着前24位是网络号(192.168.1),后8位是主机号(100)。判断两台机器是否在同一个子网,方法就是把各自的IP和子网掩码做“与”运算,结果相同就在同一子网。
网关是什么?如果你要访问的目标IP跟你不在同一个子网,数据就不能直接发出去,得先交给网关,让网关帮你转发。网关通常是路由器的一个接口地址,比如家用路由器的192.168.1.1。
我见过不少新手把这三个概念搞混,最典型的错误是:网关填错、子网掩码填错导致跨网段不通、或者干脆不填网关导致只能访问局域网不能访问外网。记住一个检查顺序:IP和掩码决定你“住在哪”,网关决定你“出门往哪走”,DNS决定你“知道目的地的名字怎么翻译成门牌号”。
1.3 端口与socket:程序员视角的网络
搞软件编程的人,跟网络打交道最多的其实是端口和socket。你写一个服务端程序,要监听某个端口;写一个客户端程序,要连接对方的某个端口。
端口是一个16位的数字(0到65535),用来在同一台机器上区分不同的应用。IP地址确定“哪台机器”,端口确定“哪个应用”。比如一台服务器上可以同时跑着SSH(22)、HTTP(80)、MySQL(3306),数据包到了这台机器之后,内核根据目标端口号把数据分发给对应的进程。
这里有个常用的排错思路:一个服务“连接不上”,先看进程有没有监听端口,用 ss -tlnp 看监听状态;再看防火墙有没有放行;最后再看是不是连错了端口。我在排查问题的时候,经常发现服务其实起来了,但监听在127.0.0.1上,外部根本访问不到——这就是把“监听地址”和“端口”没配合好导致的。
socket这个概念,简单理解就是“网络通信的文件接口”。Linux下一切皆文件,socket也是一种文件描述符。你调用socket()创建套接字,bind()绑定地址和端口,listen()开始监听,accept()接受连接,read/write收发数据。把这些概念理解了,后面看网络编程代码就不会一头雾水。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Linux网络配置的核心文件与工具
2.1 网卡命名规则:先搞清楚你的网卡叫什么
动手配置之前,第一步是搞清楚系统里有哪些网卡、它们叫什么名字。早期Linux用eth0、eth1这种命名,后来因为设备枚举顺序不稳定,改成了基于硬件位置的命名规则,比如eno1、ens33、enp0s3这种。
在CentOS/RHEL系统里,常见的命名规律是:en代表以太网(Ethernet),后面的字母和数字代表物理位置。Ubuntu 18.04之后的命名也类似。不过不同发行版、不同虚拟机环境可能不一样,所以不要背名字,要用命令去看。
查看网卡我习惯用这几个命令:
bash复制# 查看所有网卡及IP地址
ip addr
# 查看网卡链路状态
ip link
# 查看路由表
ip route
注意 ip addr 里的 lo 是回环接口,代表本机自己,地址永远是127.0.0.1,不要动它。UP/DOWN 表示链路状态,没有IP地址的网卡说明还没配置。另外,新系统里一般还分 ether 和 loopback 两种设备类型,别把lo当成普通网卡配置。
2.2 CentOS/RHEL体系的配置文件:ifcfg-*文件详解
CentOS 7/8这类系统,传统配置方式是编辑 /etc/sysconfig/network-scripts/ifcfg-<网卡名> 文件。这个文件是纯文本的键值对格式,我贴一个典型配置:
bash复制TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=114.114.114.114
DNS2=8.8.8.8
几个关键字段解释一下:
BOOTPROTO:取值 static(静态)或 dhcp(自动获取),这是最核心的开关。写成none也表示静态,但不如static直观。ONBOOT=yes:开机自动启用网卡。很多新手改了配置不生效,就是因为ONBOOT是no。IPADDR/NETMASK/GATEWAY:静态IP三件套,配静态时必须写全。DNS1/DNS2:DNS服务器地址,不写的话域名解析会出问题。
修改完配置文件之后,重启网络服务让配置生效:
bash复制# CentOS 7/RHEL 7
systemctl restart network
# 如果不行,也可以重启NetworkManager
systemctl restart NetworkManager
注意:CentOS 8开始,network服务默认被NetworkManager取代,所以更推荐用 nmcli 工具来管理网络。而且手动编辑ifcfg文件以后,NetworkManager不一定立刻感知,需要借助 nmcli connection reload 重新加载。
2.3 Ubuntu体系的netplan配置
Ubuntu从18.04开始用netplan替代了以前的 /etc/network/interfaces。netplan的配置文件在 /etc/netplan/ 目录下,通常是 01-network-manager-all.yaml 或 00-installer-config.yaml。
netplan的格式是YAML,缩进非常严格,一个空格错了就会报错。我贴一个静态IP的配置:
yaml复制network:
version: 2
ethernets:
ens33:
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
注意几个点:
addresses那里直接写192.168.1.100/24,用CIDR表示法替代了子网掩码,这里的/24就等同于255.255.255.0。- 默认网关写在
routes里,写成to: default, via: 192.168.1.1。 nameservers就是DNS配置。- 改完配置先运行
netplan try,它会在几秒钟后自动回滚,防止你把网络配置坏了导致连不上机器。确认没问题再运行netplan apply。
netplan try 是个好设计,我强烈建议每个人都用,尤其是远程操作服务器的时候。万一IP写错了,试一下发现连不上还能自动回滚;要是直接apply,那就只能跑机房或者靠带外管理了。
2.4 DNS与hosts文件:排查域名解析问题的关键
配置完IP和网关,网络可能还是不通——因为域名解析没配好。Linux下DNS相关的东西有这几个:
/etc/resolv.conf:系统DNS配置,内容很简单,就是nameserver一行一个IP。/etc/hosts:本地主机名映射表,优先于DNS解析。/etc/nsswitch.conf:控制解析顺序,默认是files dns,先查hosts再查DNS。
这里有个坑:在CentOS如果用NetworkManager管理网络,/etc/resolv.conf 会被动态改写,你手动改了重启网络又变回去。正确做法是去ifcfg文件里改DNS1/DNS2,或者用nmcli设置,让NetworkManager去生成resolv.conf,而不是跟它对着干。
/etc/hosts 在开发调试时特别好用。比如你改了后端服务的域名指向,但DNS还没生效,临时在hosts里加一条记录就能先测起来:
code复制192.168.1.200 api.example.com
排查域名解析问题,用 dig 或 nslookup 查,不要用ping。ping不通可能是ICMP被禁,不代表DNS有问题。用 dig api.example.com 能直接看到解析结果和耗时,还能指定DNS服务器查询,比如 dig @114.114.114.114 api.example.com,这一步能帮你判断是不是本地DNS缓存出了问题。
3. 实战:从零配置一个可用网络
3.1 规划网络参数:IP、掩码、网关到底怎么填
配置静态IP前先做规划,不要随手填。假设你的局域网网段是 192.168.1.0/24,网关是 192.168.1.1,要给一台新服务器分配固定IP。要先避开路由器的DHCP地址池,否则可能冲突,造成两台设备抢同一个IP。
我的习惯做法是:
- 先确认本地网络环境:查路由器的管理页面,看DHCP地址池范围是多少。
- 选择地址池之外的IP作为静态IP,比如池子是100-200,就选192.168.1.10。
- 确认没有其他设备占用这个IP,可以用
ping 192.168.1.10测试,不通说明大概率没人用。不过要注意,有些设备禁ping,所以更严谨的做法是查ARP表:ip neigh。 - 一次性配置好DNS,不要只配IP不配DNS,否则后面域名解析会卡住。国内环境我习惯用114.114.114.114,备选8.8.8.8或223.5.5.5(阿里DNS),具体看你的网络环境。
网关地址、IP地址必须在同一个网段内,这个看似简单的规则,实际出错率很高。比如你配了192.168.1.100/24,网关却写了192.168.2.1,那数据包永远出不去,因为本机发现网关不在自己的直连网段里,根本无法直接访问。
3.2 用nmcli完成全部配置:命令行一步到位
很多初学Linux的朋友一听配置文件就觉得头疼,其实用 nmcli 命令可以完成所有网络配置,而且比编辑文件更不容易出错。它是NetworkManager的命令行工具,几乎主流的发行版都支持。
查看当前网络连接:
bash复制nmcli connection show
给一个连接配置静态IP:
bash复制# 修改连接 ens33 的IP配置
nmcli connection modify ens33 ipv4.addresses 192.168.1.100/24
nmcli connection modify ens33 ipv4.gateway 192.168.1.1
nmcli connection modify ens33 ipv4.dns "114.114.114.114 8.8.8.8"
nmcli connection modify ens33 ipv4.method manual
# 重新激活连接
nmcli connection up ens33
改用DHCP:
bash复制nmcli connection modify ens33 ipv4.method auto
nmcli connection up ens33
用nmcli的好处是,它会自动同步配置文件、NetworkManager状态和系统运行时状态,不会出现“配置文件改了但没生效”的尴尬局面。而且命令可以重复执行、可以写进脚本,适合批量操作多台机器。如果临时改IP又怕记不住,可以用交互式命令 nmcli connection edit ens33,它会一步步引导你修改参数。
3.3 多网卡场景:内网外网分离怎么配
服务器上经常有多块网卡,内网走一块、外网走另一块。这时候配置的核心是路由策略。默认路由(default route)只能有一条,否则数据包不知道往哪走,就会出现外网偶尔通、偶尔断的怪现象。
场景举例:网卡ens33接外网(网关192.168.1.1),网卡ens37接内网(内网网段192.168.10.0/24,无网关)。
配置思路:
- ens33正常配置IP、网关、DNS,拥有默认路由。
- ens37只配IP和掩码,不配网关。这样访问内网网段时,系统发现目标在直连网段内,直接走ens37;访问其他网段时走默认路由ens33。
配置命令:
bash复制# ens33 正常配置
nmcli connection modify ens33 ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns "114.114.114.114" ipv4.method manual
# ens37 只配IP,不配网关
nmcli connection modify ens37 ipv4.addresses 192.168.10.100/24 ipv4.method manual
nmcli connection up ens33
nmcli connection up ens37
配置完用 ip route 查看路由表,重点确认默认路由走的是外网卡。如果默认路由被内网卡抢走了,外网就不通了,这时候要手动删掉错误路由,再确保默认路由正确:
bash复制ip route del default via 192.168.10.1
ip route add default via 192.168.1.1
注意,ip route add/del 只是临时生效,重启就没了。如果要把静态路由持久化,CentOS里可以写到 /etc/sysconfig/network-scripts/route-ens33 文件,Ubuntu的netplan则是在routes段里配置,这个细节很容易被忽略。
3.4 配置完的验证步骤:一条条过
配置完网络别急着用,先按顺序验证一遍。我的验证顺序如下:
bash复制# 1. 查看网卡和IP是否正常
ip addr show ens33
# 2. 检查能否ping通网关(验证链路和二层)
ping -c 4 192.168.1.1
# 3. 检查能否ping通外网IP(验证路由和公网连通性)
ping -c 4 114.114.114.114
# 4. 检查DNS解析是否正常(验证域名解析)
dig +short www.baidu.com
# 5. 检查到目标服务器的延迟和路径(验证中间链路)
traceroute -n -w 2 www.baidu.com
哪一步不通,问题就出在对应的环节。第一步不通肯定是网卡配置或物理链路问题;第二步不通是IP、网关或二层隔离问题;第三步不通是路由或公网侧问题;第四步不通是DNS配置问题。这个顺序我校验过无数遍,基本可以覆盖90%以上的日常故障场景。
4. Linux网络排查常用命令与技巧
4.1 连通性测试:ping、telnet、nc、mtr
ping 是基础中的基础,用来测试目标主机是否可达、延迟是多少。常用参数:
bash复制# 指定次数
ping -c 4 192.168.1.1
# 指定间隔和包大小
ping -i 0.2 -s 1000 192.168.1.1
但ping有几个局限性:第一,很多公网服务器禁ping,不代表服务不可用;第二,ping只测ICMP,测不了TCP端口连通性。所以更要学会用 telnet 或 nc 测试端口:
bash复制# 测试目标IP的80端口是否开放
telnet 192.168.1.100 80
# 用nc更灵活
nc -zv -w 5 192.168.1.100 80
traceroute 用的不多但排查链路故障很有用,它显示数据包经过的每一跳路由器。如果某一段出现 * * *,说明那一跳的中间设备没有回应,可能是设备防火墙设置,也可能是真的丢包。mtr 是ping和traceroute的组合版,实时显示每一跳的丢包率和延迟,排查线路质量会首选它:
bash复制mtr -n -c 100 192.168.1.100
4.2 端口监听与连接状态:netstat、ss、lsof
排查“服务为什么连不上”最常用的就是看端口。老系统用netstat,新系统我更推荐 ss,输出更快更清晰。
bash复制# 查看所有监听端口
ss -tlnp
# 查看所有TCP连接
ss -tunap
# 查看指定端口的监听情况
ss -tlnp | grep 3306
关键字段:LISTEN 表示正在监听,State 里的ESTABLISHED表示已建立连接。-t 是TCP,-u 是UDP,-l 是监听,-n 不解析域名,-p 显示进程信息。
还有一种常见情况:端口被占用了。用 ss -tlnp 查到PID之后,用 ps -fp <PID> 看是什么进程。如果是你自己跑的进程,确认能不能换端口;如果是系统服务,注意别乱杀。lsof -i:3306 也能查端口占用,不过lsof需要单独安装,ss是内置的,优先推荐ss。
4.3 抓包入门:tcpdump的基本用法
高端一点的排查手段是抓包。tcpdump 是Linux下最常用的命令行抓包工具,虽然不及Wireshark可视化方便,但在服务器上排查问题很实用。
bash复制# 抓取特定网卡、特定端口的数据包
tcpdump -i ens33 -nn port 80
# 抓取特定主机之间的通信
tcpdump -i ens33 -nn host 192.168.1.100
# 抓包保存到文件,方便用Wireshark分析
tcpdump -i ens33 -nn -w /tmp/capture.pcap port 3306
抓包看什么?重点看TCP三次握手的流程:有没有SYN包发出去、有没有SYN-ACK回来、有没有ACK确认。如果只看到SYN没有回复,说明目标机器的防火墙把包丢了;如果请求包都没发出去,说明本地路由或防火墙有问题。这些信息对定位“连不上”问题的层次非常有帮助。-w 保存的文件可以用Wireshark打开,我在服务器上抓一小段再下载到本地分析,效率往往比直接在终端里盯滚动输出高得多。
4.4 常见网络问题速查表
我在运维过程中积累了下面这些经验,整理成一个速查表,遇到问题对号入座。
| 现象 | 可能原因 | 排查命令/方法 |
|---|---|---|
| 局域网可以通、外网不通 | 默认路由缺失或错误 | ip route 查看默认路由 |
| 域名解析不了,但IP能通 | DNS配置错误 | dig +short www.baidu.com |
| IP、网关正常但ping不通网关 | 网卡链路或物理连接问题 | ip link 查看UP状态 |
| 服务启动成功但外部访问不了 | 监听地址是127.0.0.1 | ss -tlnp 看监听地址 |
| 服务能ping通但端口不通 | 防火墙拦截 | systemctl status firewalld、iptables -L -n |
| 能访问但时通时断 | 线路质量或网卡速率协商 | mtr 查看每一跳丢包率 |
| 改了配置不生效 | NetworkManager覆盖配置 | 用nmcli修改并重启连接 |
这个表里最容易被忽视的是“监听地址”问题。很多人启动服务后发现只能本机访问、外部连不上,第一反应是查防火墙,结果查了半天发现是服务配置里的bind地址写成了127.0.0.1。内核的socket绑定了回环地址,外部机器当然访问不到,这时候应该把bind地址改为0.0.0.0,表示监听所有网卡接口。
5. 最后分享两个实操教训
关于配置文件改完不生效这件事,我踩过太多次了。在CentOS上手动改了ifcfg文件,执行 systemctl restart network,发现配置还是没变。后来才明白,NetworkManager会把配置文件内容缓存起来,光改文件不重新加载配置等于白干。所以我现在一律用nmcli操作,一切以NetworkManager的运行时状态为准,不跟它对着干,这条建议送给所有在CentOS上折腾网络配置的朋友。
另一个坑是虚拟机复制镜像导致的网卡识别问题。在VMware或VirtualBox里,如果你复制了一个虚拟机镜像,新虚拟机的网卡MAC地址变了,但系统里还留着旧的udev规则,结果就是网卡名字变成ens34或者干脆起不来。这时候要清理 /etc/udev/rules.d/70-persistent-net.rules 这类文件,或者直接在ifcfg文件里把HWADDR删掉,让系统重新识别网卡。这个问题在批量部署虚拟机时特别常见,提前知道就能省很多事。
网络配置这件事,真的不能靠死记硬背,关键是理解分层的思路和IP、掩码、网关之间的关系。把这些基础打牢,遇到任何网络问题都能按层一步步排查,不会被各种报错信息带偏。后面有机会,我再把Linux网络编程里socket编程、TCP状态转换这些更深入的内容单独写一篇,跟这篇的网络配置内容正好衔接上。
