首页 / 资讯中心 / 文章详情

Linux网络基础:从网卡配置到路由与DNS故障排查

Linux网络基础:从网卡配置到路由与DNS故障排查 ★ FEATURED ARTICLE
刚装好一台Linux服务器发现死活连不上外网ping网关能通ping域名却报“未知的名称或服务”——这种场景几乎每个Linux新手都撞见过。问题多半不在“网络没插好”而是你对Linux网络基础的理解还停留在“能ping通就行”的层面。这篇文章就是为这个阶段准备的不堆砌协议栈理论只讲你日常真正会用到、排查问题时真正能救命的那套Linux网络基本功域名解析、路由、网卡配置、端口连通性这些事一次说清楚。我工作这些年见过太多人卡在“ifconfig没了”“eth0不见了”“DNS又挂了”这类基础问题上。倒不是他们不努力而是网上资料太碎今天讲命令明天讲配置文件串不起来。所以这篇《Linux网络基础一》我换个思路直接按“一台机器从启动到能上网、能被人访问”的顺序来讲把知识串成一条线希望你读完能建立起自己的排查脑图。这篇文章面向刚接触Linux的运维新人、做开发但需要经常和服务器打交道的程序员以及所有想把手里的Linux机器玩明白的人。我会用一套连贯的实操流程配合理清楚的概念解释让你不光知道命令怎么敲还能明白为什么要这么敲。1. 先搞懂Linux机器是怎么“上网”的从网卡到路由的完整路径很多人上来就背命令但我建议你先在脑子里建立一张图——你的数据包从本机出发到底经过了哪些环节才到达目标服务器。1.1 网卡Linux网络世界的“大门”机器要上网第一步是得有物理网卡或虚拟网卡。你可以在终端里执行$ ip link show 1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 2: eth0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:fflo是回环接口IP永远是127.0.0.1代表“本机自己”。eth0才是真正对外的物理网卡。注意看state UP表示网卡处于激活状态。如果看到state DOWN说明网卡被逻辑关闭了你后面所有配置都是白搭。许多初学者一上来就查IP、查路由结果第一步就错了。拿到一台新机器我永远是先跑一遍ip link确认网卡是UP的再往下排查。1.2 IP地址你在网络上的“门牌号”网卡只是硬件大门你还需要给这扇门贴上门牌号也就是IP地址。查看当前IP最常用的命令是$ ip addr show eth0 2: eth0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0注意看这个192.168.1.100/24它同时包含了IP地址和子网掩码信息/24表示网络部分是前24位等价于传统写法255.255.255.0。这意味着你的机器属于192.168.1.0/24这个网段广播地址是192.168.1.255。我见过不少朋友还在用ifconfig eth0来查IP。不是说不行只是ifconfig在好多新系统里已经不预装了而且它显示的很多信息比如RX packets那些流量统计实际排查时用不太上。ip addr信息更精简也符合新的网络管理习惯。如果你手头机器没有ip命令多半是没装iproute2包装上就行。1.3 网关和路由表决定“数据往哪儿走”的交警光有地址还不够。你想访问外网数据包总得有个“出口”。这个出口就是默认网关。查看路由表用$ ip route show default via 192.168.1.1 dev eth0 proto static 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100这里有两行关键信息第一行default via 192.168.1.1指明所有不匹配其他规则的流量全部交给192.168.1.1这个网关处理第二行告诉系统访问192.168.1.0/24网段内的地址直接走eth0不需要经过网关。为什么要单独区分这两类流量因为网段内的机器比如你的NAS、同网段另一台服务器跟你是“邻居”直接敲门就行用不着通过小区门卫。而网段外的机器比如互联网上的服务器你根本不认识只能是把包裹交给门卫网关由他帮你转发。上面这套逻辑几乎适用于所有私有网段。了解这点后很多玄学问题就变得不再玄学了——比如两台机器能ping通IP能ping通但不能访问对方服务我会建议先去查防火墙而不是查路由因为IP能通已经证明路由没问题了。1.4 域名解析从网址到IP的“翻译官”现在你的机器有了地址、有了网关、有了路由规则但还缺一个关键环节——域名解析。你访问www.example.com时系统必须先把这个域名翻译成IP地址才能发起连接。负责翻译的“翻译官”是DNS服务。Linux下查看和测试DNS解析最直接的命令是dig$ dig www.example.com short 93.184.216.34如果返回IP地址说明DNS解析正常。如果报connection timed out; no servers could be reached多半是系统配置的DNS服务器不可达。这时你要检查系统解析配置文件不同系统位置不同常见的是/etc/resolv.conf看看里面nameserver那一行写的到底是谁。我见过最经典的坑是公司内网某台服务器突然解析不了域名折腾了半天最后发现是/etc/resolv.conf里被人改成了一个已经失效的内部DNS地址。后面会专门讲DNS配置这里先有个概念。2. 网络配置实操用什么命令、改什么文件一次搞明白概念清楚了接下来就是实操。这部分我会把命令和文件拆开讲清楚——哪些配置重启就丢、哪些配置永久生效这是Linux网络入门最容易混淆的点。2.1 “临时”配置 vs “永久”配置两套系统并行Linux网络配置有个很反直觉的特点你用ip addr add加上的地址重启网络服务后可能就没了但你改配置文件又不会立刻生效。这两套系统各管一头。比如你现在临时测试想给网卡加上一个额外IP$ sudo ip addr add 192.168.1.200/24 dev eth0这个命令立刻生效但重启后消失。同理ip route add、ip link set eth0 up都是临时生效。这适合做实验、临时调试不适合做正式配置。而真正的正式配置要写在网卡配置文件里。不同发行版文件位置不同CentOS/RHEL 传统上是/etc/sysconfig/network-scripts/ifcfg-eth0Ubuntu 18.04 之后则是/etc/netplan/目录下的.yaml文件。以最常用的静态IP配置为例。在CentOS系的ifcfg-eth0里最简配置长这样DEVICEeth0 BOOTPROTOnone ONBOOTyes IPADDR192.168.1.100 NETMASK255.255.255.0 GATEWAY192.168.1.1 DNS18.8.8.8 DNS2114.114.114.114在Ubuntu的netplan里对应写法是这样network: version: 2 ethernets: eth0: dhcp4: no addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 114.114.114.114]改动配置文件后CentOS系执行systemctl restart network部分新版本用nmcli con reloadUbuntu执行sudo netplan apply。这一步常有人漏掉只改了文件不重启服务然后跑来问“为什么配置没生效”。2.2 DHCP与静态IP该怎么选到底用DHCP自动分配还是手工设静态IP原则简单判定一下即可笔记本、桌面机这种移动设备用DHCP省心走到哪个网络都能自动适应。服务器、NAS、打印机这类固定服务的机器建议一定要配静态IP或者至少在路由器里做DHCP保留。否则哪天DHCP租约一换你辛苦配置的基于IP的规则全完蛋甚至SSH直接连不上。配置DHCP自动化其实很简单把上文配置文件里的BOOTPROTOnone改成BOOTPROTOdhcpCentOS或把netplan里那段改成dhcp4: yes其他什么都不用填系统启动时自动获取地址、网关和DNS。我个人的操作习惯是所有生产服务器一律静态IPDNS也要写死不能依赖自动分配的DNS。这样即使上游DHCP抽风机器至少还收发自如不至于整个服务跟着一起断网。2.3 配置主机名的逻辑别小看这一步Linux主机名看似和网络关系不大实际很不小。你配的域名解析、各种服务间的互相访问很大程度上依赖主机名的正确性。临时设置主机名直接用hostnamectl set-hostname即可比如$ sudo hostnamectl set-hostname web-server这个命令在Systemd系发行版上会同步更新配置文件重启也不会丢。顺手提一句设置完后最好确认一下/etc/hosts里有没有一条对应条目比如192.168.1.100 web-server为什么重要因为很多程序比如某些数据库、消息队列启动时会做反向解析如果你的主机名解析不到自己它可能会拒绝启动。这是我踩过的坑——某次服务一直起不来日志里全报hostname相关错误最后发现是/etc/hosts里没有本机条目补上立刻痊愈。3. 连通性排查思路从ping到telnet分层定位故障有了上面的基础现在可以聊聊排查了。网络问题排查一定要分层先链路层、再网络层、最后传输层应用层。一层一层来才能快速定位到底哪儿断了。3.1 先用ping确认“通不通”最简单的连通性测试就是ping。但我发现很多人用它时有个误区一上来就ping域名域名拉通了就觉得网络是好的域名拉不通就认为DNS出问题了。正确的顺序应该是# 第一步ping网关确认本机到网关链路是否正常 $ ping -c 4 192.168.1.1 # 第二步ping公网IP确认网关之后的路由是否可用 $ ping -c 4 8.8.8.8 # 第三步ping域名确认DNS解析是否工作 $ ping -c 4 www.example.com三步层层递进哪一步断了问题就出在哪一段第一步不通本机到网关的链路有问题查网线、Wi-Fi、网卡配置是否正常。第二步不通、第一步通你的网关或运营商侧路由有问题但好消息是你的本机配置基本没毛病。第三步不通、第二步通DNS解析异常优先查resolv.conf里的nameserver配得对不对。有个细节必须提并不是所有机器都允许ping。有些公网服务器、云主机的安全组会屏蔽ICMP导致你ping不通但服务其实是正常的。所以ping不通不等同于一定有问题后续还要配合端口探测确认。3.2 用telnet/nc验证端口连不连得上网络层通了不代表你要访问的具体服务可用。比如某个网站能ping通但你浏览器却打不开可能是80/443端口的服务挂了或防火墙拦截了。这时候用端口测试是最好的验证方式。在不方便用telnet的现代系统里可以用nc# 测试目标主机80端口是否开放 $ nc -zv 192.168.1.100 80 Connection to 192.168.1.100 80 port [tcp/http] succeeded!如果显示Connection refused或超时说明要么目标没监听该端口、要么访问被防火墙拦截了。-z代表只扫描不发送数据-v显示详细信息。也可以测试UDP端口不过UDP测试不容易做到准确通常需要配合对方服务日志看。这个方法非常实用因为它能把“网络通不通”和“服务通不通”这两件事分开排查效率一下提升很多。3.3 抓包工具tcpdump终极排查神器如果ping和端口测试都正常但服务依然诡异那就得看更底层的数据了。tcpdump是Linux下最经典的抓包工具它能把你机器上进出网卡的每一个包都记录下来供你分析。比如你想看看本机的DNS查询到底发出去没有可以执行$ sudo tcpdump -i eth0 port 53 -nn-i eth0指定网卡port 53只抓DNS流量-nn不做域名反解直接显示IP。如果执行后看到本机IP向8.8.8.8的53端口发包说明DNS请求确实发出了但没人回应那就是外部DNS的问题。如果压根没发包就该查本机配置了。我当年排查过一个挺隐蔽的问题某机器偶尔断网tcpdump一抓才发现它每隔几分钟就向外网发起大流量连接把带宽吃满了。没有tcpdump这种问题基本靠猜。所以这个工具值得所有Linux网络玩家花时间掌握。4. 防火墙与网卡启动影响连通性的“隐形杀手”即使IP、路由、DNS全对你依然可能连不上某台机器。这类问题十有八九出在防火墙或网卡启动逻辑上。4.1 防火墙端口不通的第一嫌疑人Linux最常用的防火墙是iptables以及它的前端firewalldCentOS 7或ufwUbuntu。我把它们比作门禁系统——默认情况下陌生人外部流量进不来只有你点头添加规则才放行。CentOS上最简单的操作方式# 查看当前firewalld状态 $ sudo systemctl status firewalld # 对外开放80端口 $ sudo firewall-cmd --add-port80/tcp --permanent $ sudo firewall-cmd --reloadUbuntu上用ufw# 允许OpenSSH访问 $ sudo ufw allow OpenSSH # 允许特定端口 $ sudo ufw allow 8080/tcp新手最常犯的错是写完了服务配置兴冲冲地启动然后从外面连不上折腾一晚上最后发现是防火墙默认策略拦住了。所以我的经验是排查端口不通的时候关闭防火墙或放行对应的端口应该作为最先尝试的步骤之一而不是最后的手段。生产环境当然不建议直接关防火墙但临时关闭验证一下却很有价值。验证完关闭了再根据需要细化规则。例如临时关闭firewalld$ sudo systemctl stop firewalld如果关闭后服务立刻能连通那恭喜你问题就定位在防火墙规则上。4.2 NetworkManager与network服务的纠缠很多人都被“改完网卡配置重启后没生效”折腾过。这往往是你安装了NetworkManager这样的网络管理服务还装了传统的network服务两者同时存在且在抢着管理网卡。在CentOS系上NetworkManager往往默认开机启动而传统的network服务则不一定。如果你改了传统网卡配置文件再重启network服务结果发现它根本没接管网卡——因为NetworkManager优先级更高上面的改动自然不生效。一个做法是明确分工要么彻底停用NetworkManager如果你喜欢传统方式要么所有配置都通过NetworkManager来管。多数现代发行版默认用NetworkManager所以我建议你适应它——CentOS上用nmcli命令管理网络# 查看当前网络连接状态 $ nmcli connection show # 启用某个连接 $ sudo nmcli connection up ens33用nmcli改IP比改文件和重启服务要更优雅命令如下$ sudo nmcli connection modify ens33 ipv4.addresses 192.168.1.100/24 $ sudo nmcli connection modify ens33 ipv4.gateway 192.168.1.1 $ sudo nmcli connection modify ens33 ipv4.dns 8.8.8.8 114.114.114.114 $ sudo nmcli connection modify ens33 ipv4.method manual $ sudo nmcli connection up ens33这几条命令的效果等同于改配置文件但好处是它同时更新了运行时的网络状态不会出现“文件改了但系统不认”的割裂感。4.3 网卡命名规则为什么你找不到eth0还有个大坑是新版系统网卡命名不再是eth0而是叫eno1、ens33、enp0s3这类。这是因为新版系统根据硬件位置来命名网卡方便多网卡时稳定识别。可它也让很多教程一下子就过期了——照着老教程找eth0找半天找不到就开始怀疑人生。遇到这种情况不要慌。先用ip link show或nmcli connection show找出系统实际认到的网卡名再去替换教程里的eth0。另外网卡名里如果是enp0s3这类其实是可预测命名的正常产物en代表以太网p0表示PCI总线0s3表示插槽3。不至于非得改成eth0除非你有业务逻辑强制要求旧名称。5. 从本机到远程SSH连接和常见失败原因所有基础配置就位后绝大多数人下一步就是SSH远程登录。SSH虽看似简单但它是网络配置的一个集中体现——很多人网络上的小毛病都能从SSH失败现象里看出来。5.1 一次完整的SSH连接流程你执行ssh userhost时本机依次做了这些事情解析host域名或直接使用IP。尝试连接目标主机的22端口。双方协商加密参数。验证用户密码或密钥。每一步都可能出问题。最简单有用的调试命令是加-v参数$ ssh -v user192.168.1.100如果卡在expecting SSH2_MSG_KEX_ECHO阶段往往是传输层问题如果卡在密码验证阶段那就是认证问题。有个更直接的经验——如果你能ping通IP、22端口也开着但SSH就是连不上马上看目标服务器的/var/log/secure或/var/log/auth.log日志。这能告诉你大量信息是密码错是被防火墙拦还是服务根本没监听。5.2 远程管理服务器的一个安全小习惯再提醒一个看起来很基础但总有人忽略的安全习惯SSH不要用默认的22端口且在公网上裸奔。改到高位端口比如2222然后禁止root直接登录必要的开启密钥认证禁用密码认证。这些操作都可在/etc/ssh/sshd_config里配置# 修改端口 Port 2222 # 禁止root密码登录 PermitRootLogin prohibit-password # 开启密钥认证 PubkeyAuthentication yes PasswordAuthentication no改完执行sudo systemctl restart sshd。注意务必先确认你的密钥能正常登录再重启否则可能把自己锁在门外。我见过不止一个人兴致勃勃关了密码登录结果密钥没配好最后只能去控制台做紧急救援。5.3 本机服务“没起来“的一个排查案例最后说个我印象深刻的排查经历它串联了本文所有知识点。当时某开发者说他机器上的某个Web服务从外面怎么都访问不了。我的排查路径是先ping那台机器通再nc -zv测80端口失败提示Connection refused。看到这个提示我基本判断是服务本身的问题已经排除了链路、防火墙防火墙拦截通常是超时而非refused这一区别很关键但常被忽略。上服务器查服务状态结果发现服务进程根本没起来。再看日志显示启动时依赖的数据库连接超时。追查数据库为什么超时最后发现数据库绑定的地址是127.0.0.1只监听在本机回环上外部服务当然连不上它。把绑定地址改为对外网卡IP或0.0.0.0重启数据库再启动Web服务一切正常。这个案例想说明的是网络排查不能只停留在“能ping通”的层面端口测试、服务状态、监听地址全都得看。你掌握的命令越多越能把问题范围缩得更小而不是对着“上不了网”四个字发呆。最后再分享一个我一直以来的习惯拿到任何一台带网络问题的Linux机器我都会先看一眼ip addr、ip route和cat /etc/resolv.conf这三大件能覆盖九成以上“网络配错”场景。然后再按“链路层→网络层→传输层→服务层”的顺序去逐层排查基本十分钟内就能把问题锁定到一个很小的范围内。本篇文章先把“从网卡到路径、从配置到排查”的这条主线理清了后续如果大家感兴趣我可以接着写网络基础二把iptables规则细化、双网卡绑定、路由策略这类进阶内容展开讲。系统的学习节奏往往就是先把主干立起来再一点点补枝叶。这套网络基本功不只是应付考试和工作中的小case更是你之后理解容器网络、云上VPC、K8s网络模型的地基。地基打得稳上层就算盖得有点歪也不至于塌。
阅读完成 · 觉得有帮助?
咨询建站