拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Linux双网卡配置与故障排查:从物理层到防火墙的完整指南

1. 问题场景当双网口板子“瘸腿”时最近在调试一块带双网口的工控板时遇到了一个挺典型的网络问题板子上的两个以太网口eth0和eth1配置好IP后发现其中一个网口比如eth1完全“失联”了。从板子本身ping这个网口的IP或者从同网段的其他设备ping过来都显示“目标主机不可达”或者干脆超时。但另一个网口eth0却工作得稳稳当当网络通信一切正常。这种“一个能用一个不能用”的“瘸腿”现象在嵌入式开发、网络设备调试和工控集成中其实并不少见。它不像整个网络都瘫痪了那样目标明确问题往往隐藏在配置细节、硬件状态或系统路由的角落里。从你提供的热词来看eth0(lan)10.251.251.251/24 , eth1(dmz)10.252.252.252/24这个信息非常关键。它暗示了一个常见的应用场景双网卡隔离。eth0可能连接内部局域网LAN而eth1则连接一个隔离的DMZ区域或另一个独立的网络。这种配置下问题可能不仅仅是网口本身更涉及到路由表、防火墙策略甚至是内核的网络栈配置。此外热词中反复出现的ping命令及其各种报错如“没有可用的缓冲区空间”、“传输失败”也为我们提供了排查的思路和线索。这篇文章我就结合自己踩过的坑和解决过的案例带你一步步拆解这个“板子双网口一个网口无法使用”的问题从最基础的物理层一直排查到复杂的网络层和系统层。2. 第一步建立清晰的排查逻辑与测试环境遇到问题切忌乱试。首先我们需要建立一个清晰的排查逻辑树。对于网络不通经典的OSI七层模型就是最好的指导。我们的排查应该自底向上从物理层开始逐步向应用层推进。这样可以避免在高层浪费大量时间后才发现是网线没插好这种低级错误。2.1 明确你的测试拓扑根据eth0和eth1的IP地址10.251.251.251/24 和 10.252.252.252/24我们可以推断出基本的网络拓扑。这很可能是两个完全不同的子网。因此你的测试环境至少需要测试设备AIP地址配置在10.251.251.0/24网段用于测试eth0。测试设备BIP地址配置在10.252.252.0/24网段用于测试eth1。确保物理连接用于测试eth0的网线另一端必须连接在10.251.251.0/24网段的交换机或路由器端口上用于测试eth1的网线同理。绝对不要把两根网线都插到同一个傻瓜交换机上如果两个网段在二层是互通的可能会引起ARP混乱和路由问题。2.2 准备必要的排查工具在板子的Linux系统上你需要熟悉以下命令它们是你的“听诊器”和“万用表”ip link或ifconfig查看网卡接口的物理状态UP/DOWN、MAC地址、MTU等。ip addr或ifconfig查看网卡接口的IP地址配置是否正确。ip route或route -n查看系统路由表这是双网卡问题的重灾区。ping最基本的连通性测试工具。但要注意ping使用的是ICMP协议如果防火墙丢弃了ICMP报文即使TCP/UDP通ping也会失败。这时需要辅助其他测试。arp -n查看ARP缓存表确认是否学习到了网关或对端设备的MAC地址。ethtool查询和设置网卡驱动和硬件参数的强大工具特别是查看链路状态Link detected。iptables -L -n -v或nft list ruleset查看防火墙规则确认是否有规则阻止了特定网口的流量。dmesg | grep eth或journalctl -k | grep eth查看内核日志排查网卡驱动加载、初始化过程中的错误。注意很多嵌入式板子基于BusyBox命令可能是精简版。例如ifconfig和route可能可用而ip命令功能不全。ethtool也可能需要单独安装。在开始前最好确认一下板子上的工具链。3. 从物理层到数据链路层确认网口“活着”排查的第一步是确认有问题的网口假设是eth1在物理上和驱动层面是正常的。3.1 检查接口物理与链路状态首先登录板子的终端执行ip link show eth1或者ifconfig eth1观察输出。关键信息有两个状态标志ip link输出中BROADCAST,MULTICAST,UP,LOWER_UP这样的字样是理想的。UP表示接口已被软件启用。LOWER_UP或ifconfig中的RUNNING表示物理链路已接通即网线对端有设备且协商成功。如果只有UP而没有LOWER_UP那问题大概率在物理层网线坏了、对端设备没开机、对端端口被禁用、或者交换机/路由器端口VLAN配置错误。MAC地址确认eth1有一个非零且不是00:00:00:00:00:00的MAC地址。如果MAC地址异常可能是驱动加载失败。3.2 使用ethtool进行深度诊断如果ip link显示链路未接通使用ethtool进一步诊断ethtool eth1重点关注Link detected: yes这行直接告诉你驱动是否检测到了物理链路信号。如果是no那么问题100%在物理连接或对端设备。Speed和Duplex显示协商后的速率和双工模式。如果是10Mb/s或Half而你的网络是千兆全双工可能是网线质量至少超五类或电磁干扰问题。3.3 检查驱动与内核信息运行dmesg | grep -i eth1或者dmesg | grep -i ‘network’查看系统启动时内核是否成功识别并初始化了eth1对应的网卡芯片。你可能会看到类似eth1: link up的成功信息也可能会看到eth1: failed to initialize或eth1: timeout之类的错误这指向了驱动兼容性或硬件问题。实操心得我曾遇到一块板子eth1始终显示LOWER_UP为no但换线、换交换机口都没用。最后用ethtool -p eth1命令让对应网口的LED灯闪烁发现板子上的网口指示灯根本没反应而eth0的灯会闪。这直接定位到是板子硬件上eth1的网口变压器或PHY芯片虚焊属于硬件故障。这个命令在排查物理连接模糊时非常有用。4. 网络层核心IP配置与路由表的“交通规则”当确认物理链路和驱动没问题后我们就要进入网络层这里是双网卡问题的“高发区”。核心就两点IP地址配置和路由表。4.1 确认IP地址与子网掩码执行ip addr show eth1确认eth1上配置的IP地址是否是10.252.252.252/24或你预期的地址。特别注意子网掩码/24是否正确。一个常见的低级错误是配成了/32单主机或错误的掩码导致设备认为自己不在正确的广播域内。4.2 解剖路由表——问题的关键所在执行ip route show或者route -n仔细分析输出。对于双网卡、双网段的系统路由表是决定数据包从哪个口进、哪个口出的“交警”。一个配置不当的路由表会直接导致某个网口的流量“有去无回”或“根本出不去”。典型问题场景分析假设你的路由表如下简化default via 10.251.251.1 dev eth0 10.251.251.0/24 dev eth0 proto kernel scope link src 10.251.251.251 10.252.252.0/24 dev eth1 proto kernel scope link src 10.252.252.252这看起来是标准的双网卡配置去往10.251.251.0/24的走eth0去往10.252.252.0/24的走eth1默认网关指向eth0的网关10.251.251.1。问题1默认网关的“霸权”当你从板子(10.252.252.252)去ping同网段10.252.252.100的设备时数据包会根据第二条规则从eth1正确发出。对方设备10.252.252.100收到后要回复给10.252.252.252。关键来了对于10.252.252.100来说目标IP10.252.252.252和自己在同一网段它会直接发送ARP请求询问10.252.252.252的MAC地址。但如果10.252.252.100的默认网关指向了另一个网络比如10.251.251.1并且它认为去往所有非直连网段的流量都要走网关它可能不会发送ARP而是试图将回复包扔给它的默认网关。而它的网关很可能不知道10.252.252.0/24这个网络导致包被丢弃。这就是热词中“windows内网电脑a可以ping到b,bping不到a”的一种可能原因——不对称路由。你需要确保测试设备B10.252.252.100上没有错误的路由策略或者其防火墙允许同网段ARP和直接通信。问题2缺失的特定路由更常见的情况是你的路由表里根本没有10.252.252.0/24这条规则。可能是因为IP地址是手动配置的但路由规则没有自动添加或者被后续的脚本、网络管理器如NetworkManager, systemd-networkd覆盖了。你需要手动添加ip route add 10.252.252.0/24 dev eth1或者更规范的做法是在配置IP地址时就确保路由添加。对于systemd-networkd在.network文件中使用Route字段对于Networking脚本在/etc/sysconfig/network-scripts/ifcfg-eth1中确保GATEWAY不设置除非这是默认路由出口并检查DEFROUTEno。问题3弱主机模型与RPF检查在某些安全要求较高的Linux系统上可能启用了反向路径过滤Reverse Path Filtering。这是一种安全机制内核会检查收到的数据包的源地址是否可以通过收到该包的接口的路由表返回去。如果检查失败包会被丢弃。对于双网卡这很容易造成问题。 检查RPF设置sysctl -a | grep \\.rp_filter你会看到类似net.ipv4.conf.eth0.rp_filter、net.ipv4.conf.eth1.rp_filter、net.ipv4.conf.all.rp_filter的选项。值为1表示启用严格模式2表示宽松模式。在复杂的多网卡环境中为了连通性有时需要临时关闭它sysctl -w net.ipv4.conf.eth1.rp_filter0 sysctl -w net.ipv4.conf.all.rp_filter0注意这只是临时生效且降低安全性。永久修改需要编辑/etc/sysctl.conf文件。更好的做法是确保你的路由表足够精确让RPF检查能通过。5. 防火墙与安全策略看不见的墙如果物理连接、IP、路由都正确但ping依然不通或者像热词中提到的“ping 报错: sendmsg: 没有可用的缓冲区空间”那么防火墙iptables/nftables很可能是“罪魁祸首”。5.1 检查iptables规则运行iptables -L -n -v仔细查看INPUT、FORWARD、OUTPUT链特别是INPUT链。是否有规则丢弃DROP或拒绝REJECT来自eth1接口或目标为eth1IP的ICMP协议ping所用例如一条规则是-i eth1 -j DROP那么所有从eth1进入的包都会被丢弃。5.2 “没有可用的缓冲区空间”深度解析这个错误信息sendmsg: No buffer space available非常具体。它通常不是指物理内存不足而是指内核网络协议栈的缓冲区满了。可能的原因有网络拥塞或丢包重传风暴某个应用在eth1上疯狂发送UDP包而对方不回应导致发送缓冲区积压。ARP问题如果eth1无法解析同网段网关或目标主机的MAC地址发出的ARP请求得不到回应也会导致socket缓冲区无法释放。防火墙规则配置错误一条错误的DROP规则可能导致内核在等待某个永远不会到来的响应从而占满缓冲区队列。排查步骤清空计数器并观察iptables -Z清空所有计数器然后尝试ping再看iptables -L -n -v看哪个链、哪个规则的包计数在飞涨。检查网络队列状态使用ss -nutlp查看socket状态或者netstat -s查看协议统计信息关注send buffer errors、packet receive errors等。临时放行所有流量为了定位是否是防火墙问题可以临时设置默认策略为ACCEPT并清空所有规则生产环境慎用iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -F iptables -t nat -F iptables -t mangle -F然后立刻测试ping。如果通了问题就在防火墙规则上你需要逐步恢复规则来定位是哪一条导致的。检查连接追踪conntrack表如果系统处理大量连接连接追踪表可能满。查看当前数量cat /proc/sys/net/netfilter/nf_conntrack_count对比最大值cat /proc/sys/net/netfilter/nf_conntrack_max。如果接近最大值需要调大或优化应用。6. 进阶排查与特殊场景当基础排查都无效时我们需要考虑一些更隐蔽或特殊的场景。6.1 网络命名空间Network Namespace的干扰如果你的板子运行了Docker、Kubernetes Pod或其他容器技术它们可能会创建虚拟的网络设备或使用网络命名空间隔离。ip link看到的eth1可能已经不是物理网卡而是veth pair的一端。你需要确认当前shell是否在宿主机的全局命名空间里。一个简单的方法是看ip link列表里是否有docker0、cni0等桥接设备或者使用ip netns list查看是否有其他命名空间。6.2 网卡绑定Bonding或桥接Bridging配置在某些应用中两个物理网口可能被配置成网卡绑定bond模式如主备、负载均衡或者被加入到一个网桥br0中。如果是这样eth0和eth1本身就不会配置IP地址IP地址会配置在bond接口或桥接口上。你需要检查是否有bond0、br0这样的接口存在并使用cat /proc/net/bonding/bond0查看绑定状态。6.3 交换机/路由器端的配置不要只盯着板子看。问题可能出在对端的网络设备上。交换机端口安全交换机上可能开启了端口安全功能比如MAC地址绑定、802.1X认证。eth1的MAC地址如果未在交换机上注册端口会被禁用。VLAN配置eth1连接的交换机端口可能属于某个VLAN比如VLAN 252而板子eth1配置的是access模式且未打VLAN Tag或者错误地配置了trunk模式。确保板子端和交换机端的VLAN配置匹配。对于Access端口板子不需要配置VLAN对于Trunk端口板子上可能需要创建VLAN子接口如eth1.252并在这个子接口上配置IP。路由器ACL如果eth1连接的是路由器接口路由器上可能配置了访问控制列表ACL禁止了ICMP或特定IP的流量。6.4 使用更底层的工具进行测试当pingICMP被防火墙禁止时我们可以测试TCP/UDP的连通性这更能反映真实应用的网络状况。测试TCP端口在板子上用ncnetcat或telnet尝试连接测试设备B的某个开放端口如SSH的22端口。nc -zv 10.252.252.100 22监听测试在测试设备B上使用nc -l -p 12345监听一个端口然后在板子上尝试连接。这可以绕过ICMP的限制。使用arpingarping命令直接发送ARP请求用于测试二层连通性完全绕过了IP层和防火墙只要防火墙不拦ARP。arping -I eth1 10.252.252.1如果能收到ARP回复证明物理层、数据链路层完全正常问题一定在IP层及以上路由、防火墙。7. 系统性诊断流程与案例复盘让我们将以上所有步骤串联成一个完整的、可复现的诊断流程并结合一个真实案例进行复盘。7.1 标准化诊断流程图文字描述现象确认明确是哪个网口如eth1不通记录本地IP、对端测试IP。物理层检查ip link show eth1查看LOWER_UP标志。ethtool eth1查看Link detected。行动更换网线、更换交换机端口、检查对端设备电源与端口状态。驱动与内核检查dmesg | grep -i eth1查看有无错误日志。网络层检查ip addr show eth1确认IP/掩码。ip route show仔细分析路由表重点检查目标网段路由是否存在、默认网关是否冲突。arp -n查看是否能学到同网段网关或对端设备的MAC。行动手动添加缺失的路由、调整RPF设置。防火墙检查iptables -L -n -v查看过滤规则。sysctl -a | grep rp_filter检查反向路径过滤。行动临时清空防火墙规则测试定位问题规则。外部设备检查登录交换机/路由器检查端口状态、VLAN、ACL、安全策略。进阶测试使用arping测试二层使用nc/telnet测试TCP/UDP四层连通性。7.2 案例复盘被“默认网关”误导的DMZ网口场景一块工控板eth0: 192.168.1.100/24连接内网网关192.168.1.1eth1: 172.16.1.100/24连接DMZ区摄像头网络无网关因为DMZ区是封闭网络。配置完成后从板子ping摄像头172.16.1.200不通。排查过程ip link显示eth1状态UP, LOWER_UP物理层正常。ip addr显示IP配置正确。ip route显示如下default via 192.168.1.1 dev eth0 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 172.16.1.0/24 dev eth1 proto kernel scope link src 172.16.1.100路由表看起来完美。在板子上执行ping 172.16.1.200用tcpdump -i eth1 -n抓包发现只有ARP请求发出没有ARP回复。检查摄像头172.16.1.200发现其错误地配置了默认网关为192.168.1.1可能是复制了内网机器的配置。当摄像头收到板子172.16.1.100的ping请求ICMP Echo Request后它需要回复Echo Reply。它查看目标IP172.16.1.100发现自己直连网段是172.16.1.0/24照理应该发ARP问172.16.1.100的MAC。但由于其错误的路由表或某些旧的网络配置脚本它认为所有非本机流量都应走默认网关192.168.1.1于是它试图将回复包发给192.168.1.1。而这个网关根本不在172.16.1.0/24网段网关接口也收不到这个包导致ARP过程失败ping自然不通。解决方案修正摄像头172.16.1.200的网络配置删除其默认网关或者确保其路由表正确对于172.16.1.0/24网段使用直连路由。在摄像头无法修改的情况下一个变通方案是在板子上为eth1也添加一个同网段的虚拟网关IP如172.16.1.1并将摄像头网关指向它但这改变了网络架构。这个案例告诉我们双网卡问题的排查绝不能只盯着问题设备本身必须将网络视为一个整体特别是对端设备的配置至关重要。ping不通常常不是“没发出”而是“回不来”。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门