
1. 动手前的底层概念IP地址、子网掩码和网段判断很多人学Linux网络配置上来就背命令ip addr add、route add记了一堆结果真到配置的时候照样翻车。根子不在命令在于对IP地址本身的理解是欠的。所以这篇我先花点篇幅把地基夯实后面讲命令你会觉得顺理成章。1.1 IPv4地址的结构网络位和主机位到底在分什么一个IPv4地址是32位二进制数日常写成点分十进制比如192.168.1.100。这32位被分成两段网络位和主机位。网络位标识你所在的网段主机位标识你在该网段内的门牌号。可以类比快递地址网络位是某某市某某街道主机位是几号楼几室。快递员先看街道再看门牌两层定位。那么问题来了32位里哪几位算网络位这就是子网掩码的职责。子网掩码也是32位写成255.255.255.0或者CIDR形式的/24表示前24位是网络位后8位是主机位。掩码说白了就是一把尺子量出IP地址里哪段属于网络、哪段属于主机。1.2 快速心算网段的实用技巧实际工作中面对/24、/25、/26这类前缀要能快速算出这个网段的范围、广播地址和可用IP数否则排查冲突时效率极低。规律很简单前缀每加1可用主机数就减半。前缀子网掩码网段内IP总数可用主机数/24255.255.255.0256254/25255.255.255.128128126/26255.255.255.1926462/27255.255.255.2243230/28255.255.255.2401614可用主机数要减2是因为网段里第一个地址是网络地址本身最后一个是广播地址这俩不能分配给主机用。例如192.168.1.0/24网络地址是192.168.1.0广播地址是192.168.1.255真正能用的只有192.168.1.1到192.168.1.254。拿到一个IP和掩码快速判断两台机器是否同网段方法就是把IP和掩码做按位与运算得到网络地址两个网络地址相同就在同一网段。实战中用不着真的去算二进制记住规律即可/24就是前三段一样在同网段/16就是前两段一样。但遇到/25这种中间值最好还是老老实实按位算一遍。2. ip addr 深度解读从输出内容读懂网卡状态配置IP之前先得会看当前网络状态。ip addr是这一代Linux网络命令的核心取代了老旧的ifconfig。但很多新手看到它的输出一脸懵不知道每行代表什么。2.1 逐行拆解ip addr的返回信息执行ip addr典型的输出长这样2: eth0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic eth0 valid_lft 86398sec preferred_lft 86398sec inet6 fe80::5054:ff:fe12:3456/64 scope link第一行的eth0是网卡名称尖括号里的UP表示网卡处于激活状态LOWER_LUP表示物理链路已连通网线插好了。如果看到DOWN或者没有LOWER_UP说明网卡没起来或者网线有问题此时不用往下看了。第二行的link/ether后面是MAC地址这是网卡在二层数据链路层的身份标识。第三行的inet是IPv4地址/24是前缀长度scope global表示这是全局有效地址后面的dynamic表示这个IP是DHCP动态获取的。有个细节值得注意valid_lft和preferred_lft表示DHCP租约剩余时间。如果租约快到期而续租失败IP会先进入deprecated状态最终被移除。排查IP突然消失问题时这两个字段是重点线索。2.2 lo接口和物理网卡的区别ip addr输出里第一个通常是lo1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 inet 127.0.0.1/8 scope host lolo是回环接口IP永远是127.0.0.1它只在本机内部通信不对外收发数据包。scope host表示这个地址只在主机内部可见。有初学者在服务器上ping不通外网拿ping 127.0.0.1做测试结果通就以为网络是好的——这是典型的误判。回环接口通只说明协议栈还没坏和物理网络是否通没有半毛钱关系。2.3 查看简洁模式ip -br addr日常巡检时完整输出信息太多我喜欢用ip -br addrbrief模式一行一个网卡紧凑清晰lo UNKNOWN 127.0.0.1/8 eth0 UP 192.168.1.100/24一眼就能看出哪块网卡是UP、配了什么地址。批量查看多台服务器时这个命令比完整模式高效得多也更容易写进脚本做状态采集。3. 手工配置IP的两种方式临时生效与永久写入配置IP最常踩的坑就是重启之后配置丢了。原因很简单命令配置只改内核内存里的状态没有写进配置文件。要分清临时配置和持久化配置根据场景选择合适方式。3.1 临时配置ip addr add命令的使用边界测试环境里临时加个IP用命令直接操作ip addr add 192.168.2.50/24 dev eth0 ip link set eth0 up第二条命令其实通常不用手动执行——网卡一般已经是UP状态但若网卡处于DOWN加完地址后需要激活。这个配置立即生效服务器重启后丢失。它的适用场景是临时测试、调试网络、或者手动模拟DHCP下发的地址。删除临时地址用ip addr del 192.168.2.50/24 dev eth0需要注意如果网卡本身是通过DHCP获取的地址你手动ip addr add加一个同网段的静态地址可能和DHCP租约产生竞争表现就是地址忽隐忽现。临时加地址前最好先确认网卡的现有IP来源。3.2 持久化配置主流发行版的配置文件与操作手法持久化配置因发行版而异目前主流的分三套体系务必先分清你手上的是哪套发行版/体系配置文件位置推荐管理工具RHEL/CentOS系/etc/sysconfig/network-scripts/ifcfg-*nmcliDebian/Ubuntu系/etc/network/interfaces 或 /etc/netplan/*.yamlnetplansystemd-networkd/etc/systemd/network/*.networknetworkctlCentOS系的ifcfg文件核心配置项长这样DEVICEeth0 BOOTPROTOstatic ONBOOTyes IPADDR192.168.1.100 NETMASK255.255.255.0 GATEWAY192.168.1.1 DNS18.8.8.8改完以后执行systemctl restart network重启网络服务。但现在CentOS系更推荐用nmcli操作避免手工改文件踩格式错误nmcli connection modify eth0 ipv4.addresses 192.168.1.100/24 nmcli connection modify eth0 ipv4.gateway 192.168.1.1 nmcli connection modify eth0 ipv4.method manual nmcli connection up eth0Ubuntu新版本用netplan配置在/etc/netplan/*.yaml核心配置项network: version: 2 ethernets: eth0: dhcp4: false addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 8.8.8.8注意netplan的yaml对缩进极其敏感addresses列表项必须和前面的键保持层级一致否则netplan apply直接报错。3.3 为什么配完网关却上不了外网网关与网卡对应关系这是一个极其常见的场景内网能通外网不通。很多人第一反应是DNS问题结果ping 8.8.8.8也不通这才想到查路由。实际上配置网关时最容易忽略的一点是网关IP必须和网卡IP在同一网段。比如网卡配了192.168.1.100/24网关却写了192.168.2.1数据包出门就找不到路直接饥饿。用一条命令验证默认网关是否生效ip route show正常输出应有类似default via 192.168.1.1 dev eth0 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100如果只有第二条没有第一条说明默认网关没配上。数据包只会在本网段内转悠出不了门。4. 路由表详解数据包出门前的那次抉择配置IP只是第一步真正决定数据包走哪条路的是路由表。不夸张地说Linux网络排障里七成问题都能通过读懂ip route解决。4.1 路由表条目的含义和优先级逻辑ip route输出中常见的几类路由default默认路由所有未匹配到更具体路由的数据包都走这里相当于数据的最后退路。网段直连路由proto kernel开头的条目是内核根据网卡IP自动生成的表示目标在该网段内的包直接通过对应网卡发送不经过网关。静态路由手动添加的复杂路径控制规则。Linux路由查询是最长前缀匹配原则目标IP同时匹配多条路由时前缀最长的优先。比如发往192.168.1.5的数据包同时有default和192.168.1.0/24两条路由会走直连路由而非默认路由因为/24比/0更具体。4.2 多网卡服务器的路由策略多网卡服务器经常出怪问题明明两块网卡都配好了IPping网关都通但跨网段访问时数据包走的网卡不对导致服务不可用。这就是路由表的策略选择问题。直连路由是内核按网卡自动生成的同时存在192.168.1.0/24 dev eth0和192.168.2.0/24 dev eth1本网段通信没问题。但去往192.168.3.0/24的数据包只能走default路由。如果默认路由只写了via 192.168.1.1 dev eth0那么所有跨网段流量都从eth0出去eth1的流量也强行走eth0网关不一定认得回来。解决办法是给eth1加一条独立的路由ip route add 192.168.3.0/24 via 192.168.2.1 dev eth1但命令方式重启失效需要写进配置文件。RHEL系可以在ifcfg-eth1里加ROUTE相关参数或者用nmcli添加静态路由严重场景还需要调策略路由策略。这里给一个经验之谈双网卡跨网段通信强烈建议直接用策略路由单独维护一张路由表把网卡和路由表绑定别指望一张主路由表能撑起所有网卡的流量。否则总会遇到通则全通、乱则全乱的局面。4.3 IPv6的基础认知link-local地址和默认路由虽然现在内网还是IPv4占绝大多数但IPv6的配置也常见了至少要知道基础概念。IPv6地址是128位写法是八组十六进制数比如fe80::5054:ff:fe12:3456/64。fe80::/10开头的是link-local地址相当于IPv4时代的169.254.x.x——自动生成的链路本地地址只在同一物理链路上有效。很多人看到网卡上多了一个fe80开头的地址以为是异常其实是正常现象。IPv6默认路由长这样default via fe80::1 dev eth0注意IPv6的网关一般是link-local地址不是全局单播地址。检查IPv6连通性用ping6部分发行版ping已经支持IPv6和ip -6 route show。5. 连通性验证与常见排障链路配置完之后不能只看配置项对不对还得实测。但测通也有门道很多人的测试方法本身就有问题导致误判。5.1 ping通不代表网络通ping不通不代表网络不通第一个经典误区对方禁ping。很多生产服务器出于安全考虑会过滤ICMP包ping不通不代表服务不可用。此时应该改用TCP端口测试比如telnet IP 80或者nc -zv IP 3306。能建立TCP连接才算真正通。第二个误区过度依赖ping大包。ping -s 65500测MTU或者链路质量有一定道理但ICMP和TCP/UDP在网络路径上的待遇可能不同某些网络设备会优先丢弃ICMP。验证链路质量更可靠的做法是用实际业务流量测试比如curl下载测速、ssh建立会话。5.2 跨网段不通的完整排查思路假设A机器192.168.1.100访问B机器192.168.3.100不通我会按这个顺序排查先确认本机到网关通不通ping 192.168.1.1不通就看网卡状态、物理链路、IP配置。再看A机器有没有到192.168.3.0/24的路由ip route get 192.168.3.100。这个命令很直观直接告诉你内核打算把包发给谁、从哪个网卡出去。网关通且路由正确但跨网段依然不通那问题可能在中间三层设备——交换机VLAN配置、防火墙策略、路由器的ACL。在B机器上反向验证ip route get 192.168.1.100有时问题出在回程路由缺失。排查过程中traceroute能看到数据包走到哪一跳断了但要注意有些设备不回应TTL超时导致traceroute输出* * *不一定是断点。5.3 ARP表与MAC地址二层通信被忽视的环节同网段通信靠ARPAddress Resolution Protocol把IP解析成MAC地址。ip neigh show能看到ARP缓存表192.168.1.1 dev eth0 lladdr 00:11:22:33:44:55 REACHABLE 192.168.1.200 dev eth0 FAILED状态是REACHABLE说明邻居可达FAILED说明解析失败。如果同网段ping不通先看ARP表里能不能解析到对端MAC。解析不到可能是对端没开机、VLAN隔离、或者对端开启了ARP防护。手动清空ARP缓存用ip neigh flush all。有些场景下ARP缓存陈旧会导致通信异常清一下就好了。5.4 一个真实场景的复现DHCP获取IP后无法上网最后分享一个我实际处理过的案例正好串起这篇的所有知识点。某台服务器用DHCP拿到了IPeth0: 192.168.1.150/24ip addr看着没问题但外网不通。用ip route一看发现没有default路由。DHCP虽然下发了IP但网关没下发成功常见原因是DHCP服务器配置缺了option router或者客户端的DHCP请求被防火墙拦截了部分选项。临时解决方法是手动补上默认网关ip route add default via 192.168.1.1 dev eth0但关键是把DHCP服务端的网关下发配置修好否则每次续租都可能在报错。如果是静态配置则要检查GATEWAY参数是否被注释掉、netplan里routes段是否缺失。这类问题靠背命令解决不了核心还是对路由表的工作机制有数。在实际操作中我的体会是Linux网络配置这摊事命令只占三成七成是概念和排障思路。把IP分类、路由决策、ARP解析这几条主线摸透了遇到问题先理清是二层问题、三层路由问题还是配置问题再对症下手效率比乱试命令高得多。最后建议大家每配完一台机器都执行一遍ip addr、ip route、ip neigh show三条命令看一眼结果形成习惯基本就告别大部分网络故障了。