在Linux系统中,网络设置、问题查找和故障修复是系统管理的重要技能,对于开发人员来说,了解Linux故障排除命令对于日常任务十分有帮助。
本文将介绍在Linux系统中已经可用的重要的网络和故障排除命令。
以下是已经存在于Linux机器上的故障排除令列表:
命令??????????????????描述
|?hostname?????|?检查和设置服务器的主机名
|?host?????????|?检索给定主机的DNS详细信息
|?ping?????????|?使用ICMP检查远程服务器的可达性,并显示往返时间
|?curl?????????|?用于数据传输的通用工具,用于故障排除网络问题
|?wget?????????|?下载文件,解决代理连接和连通性问题
|?ip???????????|?替代ifconfig,配置和检索有关网络接口的信息
|?arp??????????|?管理和查看ARP缓存
|?ss/netstat???|?检查端口和Unix套接字上的连接和PID
|?traceroute???|?使用ICMP查找到目标服务器的跃点,并显示跃点之间的时间
|?mtr??????????|?结合ping和traceroute,提供额外的信息,如中间主机
|?dig??????????|?检索与域名相关的DNS记录
|?nslookup?????|?类似于dig,用于DNS查询
|?nc???????????|?用于调试TCP/UDP套接字的实用工具
|?telnet???????|?在端口上测试远程连接
|?route????????|?检索路由表信息
|?tcpdump??????|?捕获用于分析网络问题的网络数据包
|?lsof?????????|?列出打开的文件和关联的进程信息
本文中提到的每个命令或实用程序都带有各种选项和标志。要了解这些选项和标志,可以参考每个命令的手册页。手册页提供了有关命令功能及其使用方法的详细信息。只需在终端中键入man
,然后输入命令即可访问指南,并查看适合大家需求的可用选项和标志。
hostname
命令可帮助检查机器的当前主机名,并支持给其指定新的主机名。
要查看当前名称,请键入:
hostname
如果想更改名称,可以使用以下方式使用hostname
命令:
sudo?hostname?example.com
注意:使用此命令进行的更改是临时的。在重新启动机器后,会恢复为保存在文件中的原始名称(例如/etc/hostname)。
但是,如果想永久更改主机名,可以使用/etc/hosts
文件或服务器上存在的hostname文件:
对于Ubuntu,请编辑/etc/hostname file
。
对于RHEL、CentOS和Fedora,请在?/etc/sysconfig/network file
中进行更改。
ping
网络工具用于检查远程服务器是否可达。其主要目的是验证连接性并排除网络问题。
它提供以下信息:
发送和接收的字节数
发送、接收和丢失的数据包
往返时间的大致时间(以毫秒为单位)
ping命令的语法:ping IPADDRESS or DOMAINANME
例如:
ping?medium.com
要ping一个IP地址:
ping?1.1.1.1
如果想在不使用Ctrl+C的情况下限制ping输出,可以使用带有数字的-c
标志,如下所示:
ping?-c?1?medium.com
curl
工具主要用于与服务器之间传输数据。然而,它也非常适用于网络故障排除。
对于故障排除,curl支持多种协议,如DICT、FILE、FTP、FTPS、GOPHER、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、MQTT、POP3、POP3S、RTMP、RTMPS、RTSP、SCP、SFTP、SMB、SMBS、SMTP、SMTPS、TELNET和TFTP。
例如,可以使用curl通过telnet检查22端口的连接性:
curl?-v?telnet://192.168.33.10:22
检查FTP连接:
curl?ftp://ftptest.net
还可以使用curl来排查Web服务器的连接性:
curl?http://medium.com?-I
在这些示例中,curl用于验证不同端口和协议上的连接性,使其成为网络诊断的通用工具。
wget
命令主要用于获取网页,但也可以帮助排查网络问题。
例如,可以使用wget来排查通过代理服务器的连接:
wget?-e?use_proxy=yes?http_proxy=?http://externalsite.com
要检查网站是否可用,可以获取其文件:
wget?www.google.com
在这些示例中,wget扩展了其功能,不仅可以获取网页,还可以用于诊断网络问题,如代理服务器连接和网站可用性。
ip
命令用于显示和管理路由和网络接口。它是ifconfig
的更新版本。虽然ifconfig
在所有系统中都可以工作,但建议使用ip
命令以获得更好的功能。
以下是使用ip
命令的几个示例:
显示网络设备和配置:
ip?addr
可以将此命令与管道和grep结合使用,以获取特定信息,例如eth0接口的IP地址。这对于需要动态获取IP地址的自动化工具特别有帮助。
例如,要获取eth0网络接口的IP地址:
ip?a?|?grep?eth0?|?grep?"inet"?|?awk?-F"?"?'{print?$2}'
获取特定接口的详细信息:
ip?a?show?eth0
列出路由表:
ip?route
ip?route?list
这些示例说明了如何使用ip
命令显示有关网络设备、配置和路由表的详细信息。
ARP(地址解析协议)显示了系统与本地网络的IP地址和MAC地址之间的缓存表。
arp
示例输出:
vagrant@somelab:~$?arp
Address??????????????????HWtype??HWaddress???????????Flags?Mask????????????Iface
10.0.2.3?????????????????ether???52:54:00:12:35:03???C?????????????????????eth0
192.168.33.1?????????????ether???0a:00:27:00:00:00???C?????????????????????eth1
10.0.2.2?????????????????ether???52:54:00:12:35:02???C?????????????????????eth0
ss
命令可以作为netstat
的替代品使用,但在所有系统上仍然可以使用netstat
命令。
使用ss
命令,可以获取比netstat
命令更多的信息。ss命令速度快,因为它从内核用户空间获取所有信息。
下面来看一下ss
命令的几个用法。
"ss"命令将列出计算机上的所有TCP、UDP和Unix套接字连接。
ubuntu@medium:~$?ss
Netid??State??????Recv-Q?Send-Q???Local?Address:Port???????Peer?Address:Port
u_str??ESTAB??????0??????0????????????????????*?7594??????????????????*?0
u_str??ESTAB??????0??????0??????@/com/ubuntu/upstart?7605??????????????????*?0??
u_str??ESTAB??????0??????0????????????????????*?29701?????????????????*?0
u_str??ESTAB??????0??????0??????/var/run/dbus/system_bus_socket?29702?????????????????*?0
tcp????ESTAB??????0??????400??????172.31.18.184:ssh?????????1.22.167.31:61808
ss
命令的输出会很大,可以使用"ss | less"命令使输出可滚动。
如果要过滤掉TCP、UDP或UNIX套接字的详细信息,请使用"ss"命令的"-t"、"-u"和"-x"标志。它将显示所有连接到特定端口的已建立连接。如果要使用"a"和特定标志同时列出已连接和监听端口,请参考下面的示例。
ss?-ta
ss?-ua
ss?-xa
要列出所有监听端口,请使用"ss"命令的"-l"标志。要列出特定的TCP、UDP或UNIX套接字,请使用"-t"、"-u"和"-x"标志与"-l"一起,如下所示。
ubuntu@medium:~$?ss?-lt
State??????Recv-Q?Send-Q??????Local?Address:Port??????????Peer?Address:Port
LISTEN?????0??????128?????????????????????*:ssh??????????????????????*:*
LISTEN?????0??????50?????????????????????:::http-alt?????????????????:::*
LISTEN?????0??????50?????????????????????:::55857???????????????????:::*
LISTEN?????0??????128????????????????????:::ssh?????????????????????:::*
LISTEN?????0??????50?????????????????????:::53285???????????????????:::*
ubuntu@medium:~$
要列出所有已建立的端口,请使用状态已建立标志,如下所示。
ss?-t?-r?state?established
要列出所有处于监听状态的套接字,
ss?-t?-r?state?listening
mtr
工具是用于排查网络瓶颈的网络诊断工具。它结合了ping
和traceroute
的功能。
例如,以下命令实时显示traceroute
输出。
mtr?google.com
mtr报告
可以使用"--report"标志生成报告。运行mtr报告时,它会向目标发送10个数据包并生成报告。
mtr?-n?--report?google.com
如果有与DNS查找相关的任务,可以使用“dig”命令查询DNS名称服务器。
下面的命令返回twitter.com的所有DNS记录和TTL信息
dig?twitter.com?ANY
使用+shor
t参数可以获得无冗余的输出。
dig?google.com?ANY?+short
例如,如果想获取特定域名的A记录,可以使用dig命令。使用+short
参数可以提供无冗余的信息。
dig?www.google.com?A?+short
类似地,可以使用以下命令分别获取其他记录信息。
dig?google.com?CNAME?+short
dig?google.com?MX?+short
dig?google.com?TXT?+short
dig?google.com?NS?+short
可以使用以下命令使用dig进行反向DNS查找。将8.8.8.8
替换为所需的IP地址。
dig?-x?8.8.8.8
nc
(netcat)命令被称为网络命令中的瑞士军刀。
使用nc
,可以检查特定端口上运行的服务的连接性。
例如,要检查ssh
端口是否打开,可以使用以下命令。
nc?-v?-n?192.168.33.10?22
netcat
还可以用于TCP/UDP数据传输和端口扫描。
在云环境中不推荐进行端口扫描。您需要请求云服务提供商在您的环境中执行端口扫描操作。
telnet命令用于故障排除端口上的TCP连接。
要使用telnet检查端口连接性,请使用以下命令。
telnet?10.4.5.5?22
lsof
是个在日常Linux故障排除中使用的命令。对于任何与Linux系统工作的人来说,这个命令同样重要。
要列出所有打开的文件,请执行lsof
命令。
开发人员和DevOps工程师经常遇到的一个常见错误是“绑定失败错误:地址已在使用中”。可以使用以下命令找到与端口关联的进程ID,然后可以终止该进程以释放端口。
lsof?-i?:8080
本文介绍了修复和设置网络所需的重要Linux命令。每个命令都有很多功能,读者可以根据需要深入挖掘。