直接说结论Linux网络基础这块是后端、运维、嵌入式甚至很多测试岗的硬通货。标题叫《网络基础》但它不是让你背OSI七层模型而是让你能在终端里把网络玩明白网卡怎么配、路由怎么走、连接怎么看、通了没有、不通卡在哪。这篇文章我按实际排查问题的顺序来讲不是按教科书目录来排读完你能直接上手在命令行里干活。1. 先厘清Linux网络的核心概念别急着敲命令很多新手上来就敲ifconfig、ping结果报错或者结果看不懂问题就出在一开始没把几个最基本的概念理清楚。这里我按理解顺序把最核心的几块讲透。1.1 网卡、IP、掩码、网关四者的关系网卡是物理或虚拟的网络接口Linux里命名有讲究。老系统常见的eth0、eth1对应物理网卡新系统里你大概率会看到ens33、enp0s3这种带总线位置的命名en代表以太网s0、p3这些是总线和端口号。云服务器里则常看到eth0、ens5这类。回环口通常叫loIP固定是127.0.0.1专门用来测试本机网络栈。IP地址是网卡在网络中的位置标识相当于门牌号。子网掩码如255.255.255.0是告诉你这个网络有多大把IP和掩码按位相与就能算出网络地址。举例192.168.1.100/24/24就是掩码前24位为1换算成十进制就是255.255.255.0网络地址就是192.168.1.0这个网段里有效主机IP范围是192.168.1.1到192.168.1.254。网关就是出口网关设备的IP通常是你局域网里路由器或云环境的虚拟网关的地址比如192.168.1.1。你需要去访问其他网段比如公网时数据包会先扔给网关由它再往外转发。理解这三者的关系后面配置静态IP和排查上不了网时思路会清晰得多。1.2 DNS解析你觉得是网络问题其实是名字问题很多时候上不了网不是网络不同而是域名解析不出IP。Linux的域名解析配置在/etc/resolv.conf内容是类似这样nameserver 223.5.5.5 nameserver 8.8.8.8nameserver就是DNS服务器的IP。这个文件传统上由网络管理工具自动生成你手动改了之后一旦重启网络服务或DHCP续租很可能会被覆盖。这是新手排障时的一个典型坑手工改了resolv.conf发现重启后白改。想确认是不是DNS的问题最简单的判断方式ping 114.114.114.114通了但ping baidu.com不通那八成就是DNS配置有问题。如果nslookup命令可用直接nslookup baidu.com看返回什么比乱猜快得多。1.3 路由表数据包怎么走全看这张表路由表决定了一个数据包从你的网卡出去以后往哪里走。用ip route查看典型的默认路由长这样default via 192.168.1.1 dev eth0意思是匹配不到其他更精确的路由时所有流量都扔给192.168.1.1。路由匹配遵循最长前缀匹配原则如果有一条路由是10.0.0.0/8有一条是10.0.1.0/24那么去10.0.1.5的数据包会走第二条因为前缀更长、更精确。我遇到过不少同事多网卡服务器上配置了静态路由写的掩码和实际网络对不上结果包全从错误的网卡出去业务怎么调都不通。记住一条配置路由前先把地址和掩码用ipcalc或手工算清楚不要凭感觉填。2. 配置网络的实际操作现代命令和传统命令都要会Linux网络配置的命令有两个体系旧的net-toolsifconfig、route、netstat和新的iproute2ip、ss。现在主流发行版基本都默认带的是iproute2但很多老教程和脚本还在用旧命令你得两套都看得懂。2.1 查看网卡和IP状态学会读ifconfig输出用ip addr show简写ip a或ifconfig查看当前网卡的状态。一个重点你要能分清网卡是up还是down。输出中会有state UP或者state DOWN的描述或者UP、LOWER_UP这样的标志位。如果网卡是DOWN状态有IP也不通需要先把它启用。来看一次典型输出里你会看到的关键内容每块网卡会有link/ether字段MAC地址还有inet字段IPv4地址和前缀。需要注意的是如果你看到的IP以/24、/16这样的前缀形式呈现那就是CIDR表示法把/16换算成掩码就是255.255.0.0换算方法前面已经说过。2.2 配置静态IP三种常见方式第一种临时改IP重启失效。直接用命令行操作适合快速测试但重启后配置丢失。# 给eth0配置IP为192.168.1.100掩码24位 sudo ip addr add 192.168.1.100/24 dev eth0 # 启用网卡 sudo ip link set eth0 up # 删除IP sudo ip addr del 192.168.1.100/24 dev eth0 # 添加默认网关 sudo ip route add default via 192.168.1.1临时改IP用的场景往往是你在服务器上操作原IP断了、网卡配置错了没法远程操作只能去控制台或者现场做临时配置。这种时候你会谢天谢地知道ip命令怎么用。第二种系统级持久化配置。不同发行版方式不同这是最容易踩坑的地方。CentOS/RHEL系的网卡配置文件在/etc/sysconfig/network-scripts/下命名类似ifcfg-eth0。内容是键值对关键项有BOOTPROTOnone # 或static表示静态配置 ONBOOTyes # 开机自启 IPADDR192.168.1.100 PREFIX24 GATEWAY192.168.1.1 DNS1223.5.5.5Debian/Ubuntu系新版用的是/etc/netplan/下的YAML文件例如00-installer-config.yamlnetwork: version: 2 ethernets: eth0: dhcp4: no addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 223.5.5.5改完netplan之后要执行sudo netplan apply生效。这里有个经验在生产环境改网络配置一定要先备份原文件并且想好回滚方案。我见过有人改错了网关远程连接直接断开最后只能去机房或者云控制台通过VNC救回来非常狼狈。2.3 启用和禁用网卡小心远程连接# 禁用网卡命令前的sudo是必须的 sudo ip link set eth0 down # 启用网卡 sudo ip link set eth0 up这里提个醒如果你是通过SSH远程操作的禁用正在通信的网卡连接会立刻断开。要在远程操作时做网卡重启建议写成一条命令让网卡down了之后马上自动up例如sudo ip link set eth0 down sudo ip link set eth0 up不过在极端情况下这条命令也可能让你瞬间断连然后恢复但风险还在。生产环境建议先加一条备用路由或者直接在控制台上操作。3. 网络连通性排查一条命令一条命令来找问题这部分是实战重点。排查思路要按顺序来不要瞎猜。我列出了高频排查命令的顺序和用法跟着走能解决大部分连通性问题。3.1 ping、traceroute、mtr网络通不通的三种问法ping是最基础的连通性测试。默认是持续ping测试时建议用-c指定次数避免长时间刷屏ping -c 4 114.114.114.114 ping -c 4 baidu.com第一个命令测试到公共DNS的连通性和延迟第二个命令测试DNS解析和公网域名连通性。如果第一个通、第二个不通基本定位到DNS问题。traceroute用于查看数据包到达目标经历的路由路径判断在哪一跳断的。用法是traceroute baidu.com输出会列出每一跳的IP和延迟。有些路由节点因为防火墙策略不回应ICMP会出现*这是正常的不必太紧张重点看最后能不能到达目标。用得更多人推荐的是mtr它结合了ping和traceroute的功能会持续输出每一跳的丢包率mtr -rwc 10 baidu.com如果某一跳丢包高但最终目标丢包低说明那一跳只是不响应探测实际转发正常。如果目标节点本身丢包高那才是真正的问题所在。3.2 端口连通性排查TCP三次握手的关键手段服务启动了但就是连不上很可能是端口不通。常见的端口连通性测试工具是telnet和nc现代系统里更推荐用ncnetcatnc -zv 192.168.1.100 22返回Connection succeeded表示端口开放返回超时或拒绝则端口不通。还有一个技巧是用timeout配合bash的内置能力没装nc的时候也能测timeout 3 bash -c echo /dev/tcp/192.168.1.100/22 echo port open如果端口不通下一步要判断是防火墙拦了还是服务没起来或者是云平台安全组没放行。这个排查顺序我在后面章节会展开。3.3 ss和netstat查看本机端口和服务连接状态ss是现在的推荐工具netstat是老工具但还没被淘汰新机器上可能没有。查看本机在监听哪些端口用ss -tlnp-t显示TCP-l显示监听状态-n不做域名反解显示数字地址-p显示进程信息需要root权限。排查服务明明起了但端口不监听时这一步能直接看到真相。查TCP连接状态可以用ss -tunap常见的TCP状态有LISTEN监听、ESTABLISHED已建立、SYN_SENT发出SYN等待回应、TIME_WAIT主动关闭连接后的等待状态、CLOSE_WAIT被动关闭连接后等待应用关闭。TIME_WAIT和CLOSE_WAIT过多通常意味着代码里有连接没正确关闭这是后端开发经常要处理的问题。3.4 tcpdump抓包最后的杀手锏当所有常规排查都没法定位时抓包是最后的杀手锏。看一下实际流量走了没有、到了没有、回了没有sudo tcpdump -i eth0 host 192.168.1.100 and port 80常用参数-i指定网卡-n不解析域名-c指定抓包数量-w保存到文件sudo tcpdump -i eth0 -nn -w /tmp/eth0.pcap抓完包之后用Wireshark打开分析更直观。注意TCP握手的SYN发出后如果一直重传说明数据包发出去了但对方没回应可能是防火墙丢包如果直接RST通常是端口没监听。这个区分经验非常实战能帮助你快速定位是网络问题还是服务问题。4. 网络服务与远程管理防火墙、DNS解析和SSH网络通了以后实际使用中遇到最多的问题集中在防火墙配置、域名解析和SSH远程管理这三块。4.1 iptables与firewalld防火墙的两种管理思路Linux防火墙最底层是netfilter用户态操作工具常用的有两类iptables和firewalld。很多云服务器用的是云平台安全组那是云平台层面的防火墙和服务器内部防火墙是两回事排查时要注意区分。iptables操作规则链看当前规则sudo iptables -L -n -v测试时如果怀疑是防火墙拦截先临时放行端口和IP# 放行某IP访问本机22端口 sudo iptables -I INPUT -s 192.168.1.50 -p tcp --dport 22 -j ACCEPT # 查看规则编号 sudo iptables -L INPUT --line-numbers # 删除编号为1的规则 sudo iptables -D INPUT 1firewalld是CentOS 7及以后版本的默认工具管理方式不同但它底层调用的是iptables的规则。放行端口用sudo firewall-cmd --zonepublic --add-port8080/tcp --permanent sudo firewall-cmd --reload有个容易混淆的点firewalld的--zone概念里不同zone针对不同来源网段的流量有不同规则public是默认zone一般流量都归它管。配置了永久规则后必须--reload才能生效这是很多人忘记的一步。4.2 SSH远程连接排查一个经典的不能登录案例SSH连接不上是最常见的远程问题。排查顺序应该是先ping确认主机在线再nc -zv IP 22确认端口通然后查看本机的sshd服务状态systemctl status sshd如果服务没在运行启动并设置开机自启sudo systemctl start sshd sudo systemctl enable sshd如果服务在运行但端口不通检查防火墙是否放行了22端口。云服务器的话重点检查安全组有没有放行22端口这个出问题的概率非常高。我曾经排查过一个本机能连、外网不能连的问题最后发现就是云平台安全组只放行了内网IP。登录时提示Connection refused一般是端口没监听或被拒绝提示Connection timed out则通常是防火墙丢包或路由不可达。这两个现象要区分开。4.3 hosts文件和DNS优先级一个影响日常开发的细节/etc/hosts文件的优先级默认高于DNS解析。开发时经常会把测试环境的域名指向本机或特定IP127.0.0.1 dev.example.com如果你改了/etc/hosts却发现不生效可能是因为系统开了NSCDName Service Cache Daemon缓存需要重启或刷新缓存sudo systemctl restart nscd另一个相关问题是容器里改了/etc/hosts后重启容器可能会被重置这是容器编排工具的常见行为要注意别反复手工修改而是通过合适的挂载方式做持久化配置。4.4 云环境和容器网络理解透才能避免瞎猜云服务器和容器里的网络排查与传统物理机有明显差别。云端有安全组、VPC、虚拟网关多层很多问题发生在这些虚拟网络层而不是服务器本身。容器网络则更多涉及端口映射-p 8080:80和容器network模式排查时先搞清楚流量是哪种转发模式是NAT转发、桥接还是host网络。这些场景里传统命令ifconfig、route不一定能看到完整的网络拓扑一定要结合云控制台的信息不要只在服务器内部死磕。我曾经在云服务器上排查一个从外网访问不通的问题服务器内抓包一切正常最后发现是安全组规则顺序问题高优先级规则没有放行对应端口导致的。这类问题不看控制台在系统内部是怎么也查不出来的。5. 常见问题速查一张表解决大部分排障场景我整理了实际工作中遇到频率最高的几个问题按现象—排查思路—常见原因给出一张速查表方便你直接对照。现象排查顺序常见原因内网能通外网不通1.ip route查默认路由2.ping 网关测试网关连通3. 检查网关设备和防火墙策略默认路由丢失或错误、出口防火墙拦截域名解析不了1.cat /etc/resolv.conf查DNS配置2.nslookup 域名看解析结果3. 尝试更换DNS为公共DNSDNS配置错误、DNS服务器不可达能ping通IP但没法访问服务端口1.nc -zv IP 端口测端口2.ss -tlnp查监听3. 检查防火墙和安全组服务未启动、防火墙拦截、安全组未放行网络连接断断续续1.mtr查看丢包节点2. 检查网卡速率/双工模式3. 更换网线或检查虚拟化平台负载物理链路问题、网卡故障、云主机宿主机热迁移影响SSH登录特别慢1. 查/etc/ssh/sshd_config的DNS反向解析配置2. 关掉UseDNS选项3. 尝试GSSAPIAuthentication设为noSSH反向解析超时、GSSAPI认证耗时本机能上网容器里不能1.docker network inspect查网络模式2. 检查容器内DNS配置3. 检查宿主机iptables的FORWARD链容器网络模式不对、iptables规则覆盖、DNS配置错误这里有两个容易被忽略的冷门坑分享一下坑一网卡协商速率问题导致间歇性丢包。有次某台服务器网络偶尔慢排查了很久才发现是物理网卡和交换机协商成了半双工模式。用ethtool eth0就能查看和修改sudo ethtool eth0 sudo ethtool -s eth0 speed 1000 duplex full autoneg on正常情况下negotiated speed应该是和交换机一致的比如1000Mb/s Full Duplex。如果显示10Mb/s Half Duplex或者频繁在两种速率间跳变极大可能是物理链路问题直接报障换线。坑二Netfilter连接跟踪表满导致新连接失败。高并发场景下nf_conntrack表满了会直接丢新连接表现为连接数一上去就大量超时。查看方式cat /proc/sys/net/netfilter/nf_conntrack_max cat /proc/sys/net/netfilter/nf_conntrack_count如果count接近max说明连接跟踪表满了需要调大参数或优化连接复用机制同时排查是否有连接泄漏。这个坑在外网API服务上特别容易出现请求量稍大就有大量超时检查日志和内核日志dmesg往往能看到nf_conntrack: table full的错误记录。6. 如何系统化提升Linux网络基本功如果看完这篇文章你还想继续深入我的建议是不要光看一定要多给自己挖坑。给你三个方向也是我自己验证过的提升路径。方向一把命令背后的数据链走通。比如ping通了你知道数据包是怎么从应用层到链路层的吗不如自己用tcpdump -i lo抓一次本机回环的ping包看看ICMP request和reply各自长什么样。再比如ss -tnp看到的Recv-Q和Send-Q字段你真的知道它们的含义吗遇到Recv-Q堆积异常时又该怎么分析这些细节往往是面试和实际排障的加分点。方向二刻意练习从抓包到定位的完整链路。自己搭一个nginx服务然后故意设置防火墙规则丢包、改错网关、写错DNS再在本地抓包观察每个环节的现象差异。这种练习做上三轮排障手感和自信心都会完全不同。我在教团队新人的时候就是让他们自己制造故障再排查效果比看十篇文档都好。方向三理解现代网络栈的演进方向。比如TCP BBR拥塞控制算法、DPDK、eBPF这些它们都是在解决传统Linux网络栈的性能瓶颈。你可以先从TCP BBR入手看看如何在内核里开启BBR以及它为什么能提升高延迟链路的传输速度。这类知识点不直接帮你应付眼前的故障但会让你对Linux网络这件事的理解上一个层次。7. 实操中的几件小事省心经验和最后提醒最后分享几个我自己的习惯算是踩过坑之后总结出来的第一件改网络配置必须留退路。远程操作服务器时先开一个screen或tmux会话在里面执行网络操作。一旦连接断了还能通过这个会话恢复。如果手边有其他机器也可以先用备用IP加路由打隧道。一句老话保住连接才能保住工作。第二件习惯用现代命令但也要看得懂旧命令。很多老系统上ifconfig已经没有了但一些自动化脚本还用它导致脚本报错。如果你要兼容不同的发行版和系统版本写脚本时可以先探测命令是否存在再做分支处理if command -v ip /dev/null 21; then ip addr show eth0 else ifconfig eth0 fi第三件多看系统日志和内核日志。网络不通时dmesg -T里往往能看到网卡down、路由异常、nf_conntrack: table full之类的线索。排查任何可疑的网络问题我都会顺手看一眼/var/log/messages或journalctl -xe经常能直接找到keyword定位原因省掉大量盲猜的时间。
阅读完成 · 觉得有帮助?