Linux网络故障分层诊断:从Connection refused到慢响应的实战方法论
2026/9/15 13:52:16 网站建设 项目流程

1. 这不是“工具列表”,而是一套网络问题定位的肌肉记忆

你有没有遇到过这样的场景:线上服务突然响应变慢,但CPU、内存都正常;容器里ping得通,curl却超时;同事说“网络肯定没问题”,结果一查发现是TCP重传率飙升到15%;或者更糟——凌晨三点被报警电话叫醒,只有一行日志:“connection refused”,连目标IP都没写全。这时候翻文档、查手册、问群友,效率低得让人抓狂。我干运维和SRE这十多年,踩过的坑比走过的路还多,最深的体会是:Linux网络Debug不是靠背命令,而是靠建立一套可复现、可推演、有层次的诊断肌肉记忆。今天说的“Linux 网络 Debug 工具”,绝不是简单罗列tcpdump、netstat、ss这些名字——它们只是扳手、游标卡尺、万用表,真正值钱的是你脑子里那张“网络故障树”:从物理层抖动,到链路层MTU不匹配,再到IP层路由黑洞、ICMP不可达,再到传输层SYN半开、TIME_WAIT堆积、端口耗尽,最后到应用层TLS握手失败、HTTP头被截断……每个层级都有对应的工具组合、观察指标和验证逻辑。比如,看到“Connection refused”,第一反应不该是netstat -tuln | grep 8080,而是先确认目标进程是否监听在0.0.0.0:8080而非127.0.0.1:8080,再检查iptables/nftables是否DROP了该端口,接着验证SELinux上下文是否阻止了绑定——这三步缺一不可,跳过任何一步都可能让你在错误方向上折腾两小时。本文要拆解的,就是这套经过上百次真实故障锤炼出来的分层诊断法:它不教你“怎么用tcpdump”,而是告诉你“为什么此刻必须用tcpdump而不是ss”,“抓包时filter怎么写才能一秒定位重传源头”,“当ss -i显示retransmits=0但业务仍卡顿,下一步该看哪个内核参数”。所有内容基于Linux 5.10+主线内核、主流发行版(CentOS Stream 9 / Ubuntu 22.04 / Rocky 9)实测,拒绝纸上谈兵。适合刚脱离ping/traceroute阶段的中级运维、正在啃《Linux性能优化》的开发,以及那些总被问“你们网络到底哪里出问题了”的技术负责人。

2. 工具选型逻辑:为什么是这7个,而不是“全部”

市面上号称“Linux网络调试工具”的清单动辄二三十个,但真正能进我生产环境故障排查流程的,稳定在7个核心工具+3个辅助命令。这不是主观偏好,而是由Linux网络栈的分层结构和故障发生概率决定的。我把它画成一张“故障定位金字塔”,底层越宽,工具越基础、越高频;顶层越窄,工具越专业、越少用但关键时救命。

2.1 基础层:L1-L3的“听诊器”(必装,无依赖)

这一层工具解决的是“连得上吗?通得过吗?路径对吗?”——所有网络问题的起点。它们不依赖用户态服务,直接读取内核网络子系统状态,启动快、干扰小、结果可信。

  • ip(替代ifconfig/aroute):不是“高级版ifconfig”,而是内核netlink接口的官方前端。ip link show dev eth0能看到精确的TX/RX errors、dropped、overruns计数,这些数字直接对应物理网卡驱动或交换机端口问题;ip route get 8.8.8.8能模拟内核路由决策过程,比route -n多显示scope、protocol、table等关键字段,避免因策略路由配置错误导致的“明明有路由却不通”陷阱。我见过太多人用ifconfig看IP就以为网卡OK,结果ip -s link show eth0里dropped=12000,根本原因是网卡驱动版本太老不支持巨型帧。

  • ss(替代netstat)netstat早已被标记为deprecated,ssiproute2套件的一部分,直接读取内核socket结构体,速度比netstat快5-10倍,且输出字段更精准。重点在于ss -tuln(监听端口)和ss -tun state established(已建立连接)的组合使用——前者查服务是否真在监听,后者查连接是否真建立了。很多“端口被占用”问题,其实是ss -tuln | grep :8080看到监听,但ss -tun state established | grep :8080发现零连接,说明客户端根本没发SYN,问题在客户端或中间设备。ss -i(显示TCP详细信息)更是神器:retransmit字段直击重传问题,rto(Retransmission Timeout)值异常高(>1000ms)往往指向网络延迟或丢包;cwnd(Congestion Window)持续为1,基本锁定是慢启动或拥塞控制算法被误配。

  • ping/traceroute(ICMP诊断基石):别小看这两个“入门级”命令。ping -c 4 -s 1472 -M do 8.8.8.8(带DF标志、1472字节payload)是检验MTU路径的黄金标准——如果失败而ping -c 4 8.8.8.8成功,99%是中间某段链路MTU小于1500且未正确处理分片。traceroute -T -p 443 google.com(TCP traceroute)比ICMP traceroute更能暴露防火墙策略:很多企业防火墙放行ICMP但拦截TCP SYN,用ICMP traceroute看到“* * *”,换TCP traceroute立刻显示真实跳数和延迟。我处理过一个案例:客户说“外网访问我们API超时”,ping通、traceroute到第5跳就断,换成traceroute -T -p 8080 api.example.com,发现第3跳开始SYN包被DROP,最终定位是云厂商安全组规则漏配。

2.2 核心层:L4的“显微镜”(需谨慎启用,影响性能)

这一层工具深入协议细节,能看到数据包内容和连接状态变迁,但开启即产生性能开销,必须明确目标后才启用。

  • tcpdump(无可替代的抓包之王):不是“抓所有包”,而是“抓关键包”。tcpdump -i eth0 -nn -s 0 'host 10.1.2.3 and port 8080'是基础,但生产环境必须加过滤:tcpdump -i eth0 -nn -s 0 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 or tcp[tcpflags] & tcp-rst != 0'(只抓SYN/FIN/RST包),瞬间把流量从GB/s降到KB/s。更关键的是理解-s 0(全包捕获)和-s 64(只抓前64字节)的取舍:查TCP选项(如SACK、Window Scale)必须-s 0;查连接建立/断开流程,-s 64足够且更快。我曾用tcpdump -i any -w /tmp/debug.pcap 'port 53 and udp'抓DNS查询,结果文件2GB,分析时OOM——后来改用tcpdump -i any -C 10 -W 5 -w /tmp/dns_%d.pcap 'port 53 and udp'(自动轮转10MB文件,最多存5个),问题迎刃而解。

  • lsof -i(进程-网络映射透视镜)netstat -tulpn也能看,但lsof -i :8080更直观,且能穿透容器:lsof -i :8080 -nP(-n禁用DNS解析,-P禁用端口名转换)直接显示PID和COMMAND,配合ps -p PID -o comm=秒级确认进程名。更重要的是lsof -i @10.1.2.3(查所有连指定IP的socket),在排查恶意扫描或异常外联时极快。注意:lsof需要read权限,非root用户可能看不到其他用户进程,此时sudo lsof -i :8080是唯一选择。

2.3 深度层:内核与协议栈的“CT扫描仪”(专家级,需理解原理)

这一层工具直面内核网络参数和协议栈内部状态,不是“运行就出结果”,而是需要结合理论解读输出。

  • ethtool(网卡驱动与物理层诊断)ethtool eth0显示speed、duplex、link detected,但关键在ethtool -S eth0(统计计数器)。rx_missed_errors高?可能是ring buffer太小或中断合并不当;tx_aborted_errors多?大概率是交换机端口协商失败或网线质量差。ethtool -r eth0(重启网卡)有时比ifdown/ifup更彻底,尤其在驱动bug导致状态僵死时。

  • nstat(内核网络协议栈统计)nstat -z -a | grep -i "TcpExt.*Retrans"(查看TCP重传相关计数器),比ss -i的瞬时值更有趋势价值。TcpExtTCPSynRetrans持续增长,说明SYN包反复丢失,问题在客户端到服务器的第一跳;TcpExtTCPTimeouts高,则是连接建立后超时,问题在服务器侧或中间网络。nstat输出是累计值,需watch -n 1 'nstat -z -a | grep TcpExtTCPSynRetrans'观察增量变化。

  • perf(内核函数级性能剖析):当怀疑是内核网络栈瓶颈(如softirq处理不过来)时,perf record -e 'syscalls:sys_enter_accept' -g -p $(pgrep nginx)(跟踪accept系统调用)或perf record -e 'net:*' -g -a sleep 10(捕获所有网络事件)能定位到具体函数耗时。这需要一定内核知识,但一次精准perf分析,胜过十次盲目调参。

2.4 为什么不用Wireshark?为什么不用iftop?

  • Wireshark:GUI工具,在服务器端无图形界面,远程X11转发延迟高、易卡死;其解析引擎虽强,但tcpdump抓包后本地用Wireshark分析更高效。生产环境坚持“服务器只抓包,分析在本地”。

  • iftop:实时流量TOP,但它是基于libpcap的用户态程序,精度受采样率影响,且无法区分同一端口上的不同连接(如多个HTTP请求混在一起)。ss -i配合watchretransmits,比iftop看“流量大”更能直指问题本质。

提示:所有工具默认安装在iproute2procps-ngutil-linux等基础包中。tcpdump需单独yum install tcpdumpapt install tcpdumpperf属于linux-tools包,Ubuntu下apt install linux-tools-common linux-tools-generic,RHEL系dnf install kernel-tools

3. 分层诊断实战:从“连不上”到“慢得像蜗牛”的完整推演

真正的Debug能力,体现在面对一个模糊现象时,能快速构建假设、设计验证、排除分支。下面以三个高频真实场景为例,展示如何用前述7个工具组合拳出击。每一步都标注工具、命令、预期输出、判断逻辑和下一步动作,拒绝“试错式排查”。

3.1 场景一:服务完全不可达(“Connection refused”)

现象:客户端curl http://api.example.com:8080/health返回curl: (7) Failed to connect to api.example.com port 8080: Connection refused

诊断流程

  1. 确认目标地址解析与可达性(ping+ip route
    ping -c 3 api.example.com→ 若失败,查DNS:dig +short api.example.com;若成功,继续。
    ip route get $(dig +short api.example.com | head -1)→ 输出应为xx.xx.xx.xx via yy.yy.yy.yy dev eth0 src zz.zz.zz.zz。若出现Network is unreachable,说明路由缺失;若dev lo,说明目标IP是本机回环,需检查服务绑定地址。

  2. 验证服务端监听状态(ss
    ss -tuln | grep ':8080'→ 必须看到LISTEN状态。若无输出,服务未启动或监听在127.0.0.1:8080(仅限本地)。此时ss -tuln | grep 8080应显示127.0.0.1:8080,证明绑定错误。修复:改服务配置bind_addr=0.0.0.0::

  3. 检查防火墙拦截(iptables/nftables+ss -i
    sudo iptables -L -n -v | grep 8080sudo nft list ruleset | grep 8080→ 查是否有DROP规则。若无,执行ss -tun state listening | grep ':8080'确认监听,再从客户端telnet api.example.com 8080。若telnet也报Connection refused,且防火墙无DROP,问题在服务本身(如Java应用启动失败但进程还在)。

  4. 终极验证:本地curl(绕过网络)
    在服务端执行curl -v http://localhost:8080/health。若成功,证明服务OK,问题在中间网络或客户端;若失败,服务应用层故障,查应用日志。

实操心得:Connection refused永远优先查ss -tuln,90%的case是服务没监听或监听地址不对。我曾帮一个团队排查,他们坚信“服务肯定起来了”,结果ss -tuln | grep 8080空,systemctl status myapp显示active but idle——因为启动脚本里ExecStart写错了路径,服务根本没跑起来,systemctl却认为它“启动成功”了。

3.2 场景二:连接建立但响应极慢(“Slow response”)

现象curl -w "@curl-format.txt" -o /dev/null -s http://api.example.com:8080/显示time_total>5s,time_connect<0.1s,time_starttransfer>4.9s。

诊断流程

  1. 定位慢点在传输层还是应用层(tcpdump+ss -i
    在服务端抓包:sudo tcpdump -i eth0 -nn -s 0 'host <client_ip> and port 8080' -w /tmp/slow.pcap。同时watch -n 1 'ss -tun state established | grep :8080 | wc -l'看连接数是否暴涨。
    分析pcap:用Wireshark打开,过滤tcp.stream eq 0,看HTTP请求发出后,服务器何时发回第一个TCP ACK(确认收到)?若ACK延迟高(>100ms),是网络问题;若ACK快但HTTP响应包迟迟不来,是应用处理慢。

  2. 检查TCP重传与拥塞(ss -i+nstat
    ss -tun state established | grep :8080 | head -1 | ss -i→ 关注retransmits(重传次数)、rto(重传超时)、cwnd(拥塞窗口)。若retransmits > 0rto很大,用nstat -z | grep TcpExtTCPSynRetrans看SYN重传是否高。高SYN重传=客户端到服务器路径问题;高数据包重传=服务器到客户端路径问题。

  3. 验证应用层处理(perf+ 日志)
    若抓包显示服务器收到请求后很久才发响应,且ss -i无重传,问题在应用。用perf record -e 'syscalls:sys_enter_read' -g -p $(pgrep -f "java.*api")跟踪read系统调用,看是否卡在IO。同时查应用日志,搜索ERRORWARN及慢SQL。

实操心得:time_connect短但time_starttransfer长,95%是应用处理慢或数据库慢。但必须先用tcpdump排除网络层干扰——我处理过一个案例,curl显示慢,tcpdump发现服务器发的HTTP响应包被中间防火墙分片丢弃,导致客户端收不到完整响应,不断重传,ss -iretransmits飙升,这才是根因。

3.3 场景三:间歇性超时(“Intermittent timeout”)

现象curl成功率95%,5%请求返回curl: (28) Operation timed out after 3000 milliseconds with 0 bytes received

诊断流程

  1. 量化丢包率(ping+mtr
    ping -c 100 -q api.example.com→ 看packet loss百分比。若>1%,用mtr -r -c 100 api.example.com(报告模式)看哪一跳丢包。mtrtraceroute更准,因为它持续发包统计。

  2. 抓取失败请求的完整会话(tcpdump高级过滤)
    sudo tcpdump -i eth0 -nn -s 0 'host <client_ip> and port 8080 and (tcp[tcpflags] & tcp-rst) != 0 or (tcp[tcpflags] & tcp-fin) != 0' -w /tmp/timeout.pcap(抓RST/FIN包)。分析时,找curl超时时间点附近的RST包,看是谁发的:客户端发RST=主动断开;服务器发RST=拒绝连接或连接异常关闭。

  3. 检查TIME_WAIT堆积与端口耗尽(ss+netstat
    ss -s→ 看TCP: time wait数量。若>65000,且ss -tan state time-wait | wc -l接近此数,说明TIME_WAIT连接过多。查net.ipv4.ip_local_port_range(默认32768-65535,共32768个端口),若并发连接数高,需调大或启用net.ipv4.tcp_tw_reuse=1(谨慎!需确保客户端IP唯一)。

  4. 内核参数健康检查(sysctl
    sysctl net.ipv4.tcp_fin_timeout(默认60s,可调小加速回收)、net.ipv4.tcp_max_syn_backlog(SYN队列大小,高并发需增大)、net.core.somaxconn(listen backlog,必须>=应用设置的backlog)。用sysctl -w临时修改后测试。

实操心得:间歇性超时,80%是网络不稳定(丢包/抖动)或服务器资源瓶颈(TIME_WAIT、文件描述符耗尽)。mtr是第一利器,它能暴露traceroute看不到的中间设备丢包。我曾用mtr发现某云厂商的负载均衡器在高峰时段丢包率5%,而ping只测到1%,因为mtr发包频率更高,更能反映真实状况。

4. 避坑指南:那些年我们踩过的“看似合理”陷阱

工具用得熟,不代表Debug不出错。很多“标准操作”在特定场景下会成为陷阱。以下是我在生产环境血泪总结的避坑清单,每一条都附真实案例。

4.1tcpdump的三大隐形杀手

  • 陷阱1:抓包位置错误导致“看不见”
    在多网卡服务器上,tcpdump -i any看似万能,实则危险。any是虚拟接口,抓到的包可能已被iptables规则处理过(如DNAT后的包),或根本抓不到某些流量(如VLAN子接口)。正确做法:明确指定物理接口-i eth0,或用tcpdump -i eth0 -nn 'host 10.1.2.3'。案例:排查一个K8s集群Pod间通信问题,tcpdump -i any抓不到包,换成tcpdump -i cni0(CNI网桥)立刻看到大量ARP请求失败——根因是CNI插件配置错误。

  • 陷阱2:-s参数设错导致关键信息丢失
    tcpdump -s 64只抓前64字节,对TCP头部足够,但若想看TLS SNI(Server Name Indication)或HTTP Host头,必须-s 0。SNI在TLS ClientHello的扩展字段,通常在包偏移100+字节处。案例:客户说“HTTPS访问域名A正常,域名B失败”,tcpdump -s 64只看到TCP握手,-s 0抓包后Wireshark解密TLS,发现B的ClientHello里SNI为空,证明客户端配置错误。

  • 陷阱3:未考虑时区与时间戳精度
    tcpdump默认用系统时钟,若服务器时钟漂移,抓包时间戳与应用日志时间对不上。解决方案:tcpdump -tttt(打印绝对时间戳,含微秒),或用chrony同步NTP。更关键的是,tcpdump时间戳精度依赖内核CONFIG_HIGH_RES_TIMERS,旧内核可能只有毫秒级,无法精确定位微秒级抖动。

4.2ssnetstat的“假阳性”陷阱

  • 陷阱1:ss -tuln显示监听,但服务实际不可用
    ss -tuln只检查socket是否创建并bind/listen,不检查服务进程是否健康。案例:一个Python Flask应用,ss -tuln | grep 5000显示*:5000,但curl localhost:5000超时。ps aux | grep flask发现进程存在,strace -p $(pgrep flask)显示它卡在recvfrom系统调用——应用代码有死锁,socket虽监听但不accept新连接。

  • 陷阱2:ESTABLISHED状态不等于“连接可用”
    ss -tun state established列出所有TCP连接,但其中很多是“僵尸连接”:客户端已断开,服务器未收到FIN,仍维持ESTABLISHED状态(TCP FIN_WAIT_2或CLOSE_WAIT)。ss -tun state established | wc -l数值高,未必是并发高,可能是连接泄漏。查ss -tun state close-wait | wc -l,若>100,说明应用未正确关闭socket。

4.3 内核参数调优的“自毁式优化”

  • 陷阱1:盲目调大net.core.somaxconn引发SYN Flood风险
    somaxconn是listen socket的backlog上限,调大可缓解高并发下的连接拒绝。但若同时net.ipv4.tcp_syncookies=0(禁用SYN Cookie),且net.ipv4.tcp_max_syn_backlog未同步调大,攻击者可轻易填满SYN队列,导致合法连接被拒。安全做法:tcp_syncookies=1(默认开启),somaxconntcp_max_syn_backlog设为相同值(如65535)。

  • 陷阱2:net.ipv4.tcp_tw_reuse=1在NAT环境下导致连接冲突
    tw_reuse允许TIME_WAIT socket被重用,加速端口回收。但在客户端使用NAT(如家用路由器)时,多个内网设备共享同一公网IP,tw_reuse可能导致新连接复用旧TIME_WAIT socket的四元组(src_ip:src_port:dst_ip:dst_port),服务器误认为是旧连接重传,发送RST。生产环境慎用,优先调大ip_local_port_range

注意:所有内核参数修改用sysctl -w是临时的,重启失效。永久生效需写入/etc/sysctl.conf/etc/sysctl.d/99-custom.conf,并执行sysctl -p。修改前务必sysctl -a | grep <param>备份原值。

5. 故障树速查表:5分钟定位90%网络问题

把前面所有逻辑浓缩成一张可打印、可速查的故障树。遇到问题,按顺序打钩,走到叶子节点即得答案。表格覆盖L1-L4所有常见故障,标注对应工具、命令和关键指标。

现象检查层级工具/命令关键指标/输出判断标准下一步
完全无法连接(Connection refused)L3-L4ss -tuln | grep :PORTLISTEN服务未启动或监听地址错误检查服务配置、启动日志
sudo iptables -L -n -v | grep PORTDROP规则且pkts>0防火墙拦截修改iptables规则或停用防火墙测试
ip route get TARGET_IPNetwork is unreachable路由缺失添加静态路由或检查网关配置
连接超时(Operation timed out)L1-L2ping -c 4 TARGET_IP100% packet loss物理链路或ARP失败ip neigh show查ARP表,ethtool eth0查网卡状态
mtr -r -c 50 TARGET_IP某跳Loss%>5%中间网络丢包联系ISP或云厂商,提供mtr报告
tcpdump -i eth0 -c 10 'icmp'无ICMP响应目标主机禁ping或防火墙拦截改用telnet TARGET_IP PORT测试TCP
连接建立但响应慢L4ss -tun state established | grep :PORT | ss -iretransmits > 0rto > 1000TCP重传严重nstat -z | grep TcpExtTCPSynRetrans查重传源头
curl -w "\n time_namelookup: %{time_namelookup}\n time_connect: %{time_connect}\n time_starttransfer: %{time_starttransfer}\n time_total: %{time_total}\n" -o /dev/null -s URLtime_connect正常,time_starttransfer应用处理慢查应用日志、数据库慢查询、perf跟踪
ss -sTCP: time wait接近net.ipv4.ip_local_port_range上限TIME_WAIT端口耗尽调大ip_local_port_range或启用tcp_tw_reuse(谨慎)
间歇性失败L1-L4ping -c 100 TARGET_IPpacket loss1%-5%网络抖动mtr定位丢包跳,tcpdump抓失败会话
ss -tun state time-wait | wc -l数值>60000TIME_WAIT堆积netstat -s | grep -i "tcp.*retrans"查重传率
nstat -z | grep -i "TcpExt.*Retrans"TcpExtTCPSynRetrans持续增长SYN包丢失检查客户端到服务器第一跳(通常是网关)

这张表是我放在工位贴纸上的“救命纸”,每次接到告警,先抄起这张表,5分钟内完成初筛。它不求覆盖100%的case,但保证90%的常见问题能快速分流到正确方向,避免在错误路径上浪费时间。

6. 终极建议:把Debug变成肌肉记忆的3个习惯

工具和流程再好,不变成日常习惯也是白搭。我坚持了十年的三个习惯,让网络Debug从“救火”变成“预见性维护”。

6.1 习惯一:每次部署,必做“基线抓包”

新服务上线、配置变更、内核升级后,第一件事不是压测,而是tcpdump -i eth0 -c 1000 -w /tmp/baseline-$(date +%s).pcap 'port 8080'。抓1000个包存档。这样,当未来出现异常时,对比基线pcap,一眼就能看出差异:是TCP选项变了(如少了SACK)?是TLS版本降级了?还是HTTP响应头多了一个X-Powered-By?基线不是摆设,是故障时的“时间胶囊”。

6.2 习惯二:监控nstat计数器,而非只看ss瞬时值

在Prometheus里配置node_network_netstat_*指标(通过node_exporter),重点关注TcpExtTCPSynRetransTcpExtTCPTimeoutsIpExtInNoRoutes。这些是累计值,趋势比瞬时值更有意义。设置告警:rate(node_network_netstat_TcpExtTCPSynRetrans[5m]) > 1(每分钟SYN重传>1次),这比“连接数突增”告警更能提前发现网络恶化。

6.3 习惯三:给每个服务写“Debug Runbook”

在Confluence或Git仓库里,为每个核心服务维护一份Markdown Runbook,包含:

  • 服务监听的精确地址(0.0.0.0:8080还是127.0.0.1:8080
  • 关键端口的ss -tuln预期输出
  • 健康检查的curl命令和预期HTTP状态码
  • 常见故障的tcpdump过滤表达式(如'port 8080 and tcp[tcpflags] & (tcp-syn|tcp-rst) != 0'
  • 对应的nstat关键计数器名称

Runbook不是文档,是SOP。新同事入职,第一周任务就是读懂Runbook并执行一次模拟故障演练。当curl失败时,他不需要问“接下来怎么办”,直接打开Runbook,按步骤执行。

最后分享一个小技巧:在.bashrc里加一个函数debug-net() { echo "=== $1 DEBUG ==="; ss -tuln \| grep ":$1"; echo "--- ss -i ---"; ss -tun state established \| grep ":$1" \| head -1 \| ss -i; echo "--- nstat ---"; nstat -z \| grep -i "tcp.*retrans\|$1"; }。用法:debug-net 8080,一键输出三层关键信息。这种小自动化,每天省下的5分钟,一年就是30小时。

我见过太多人把Debug当成“玄学”,靠运气和经验撞。其实Linux网络栈是确定性的,每一层都有迹可循。你缺的不是工具,而是把工具嵌入思维的那套肌肉记忆。现在,就从ss -tuln开始,把它敲进终端,看看你的服务,是不是真的在那里。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询