0%

Linux 网络

Linux 网络


前言

网络的监测是所有Linux子系统里面最复杂的,有太多的因素在里面,比如:延迟、阻塞、冲突、丢包等,更糟的是与Linux主机相连的路由器、交换机、无线信号都会影响到整体网络并且很难判断是因为Linux网络子系统的问题还是别的设备的问题,增加了监测和判断的复杂度。

网络问题是什么,是不通,还是慢?

  1. 如果是网络不通,要定位具体的问题,一般是不断尝试排除不可能故障的地方,最终定位问题根源。一般需要查看

    是否接入到链路

    是否启用了相应的网卡

    本地网络是否连接

    DNS故障

    能否路由到目标主机

    远程端口是否开放

  1. 如果是网络速度慢,一般有以下几个方式定位问题源:

    DNS是否是问题的源头

    查看路由过程中哪些节点是瓶颈

    查看带宽的使用情况

实操

是否接入到链路

使用 ethtool 查看 em1 的物理连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@hahaha ~]# ethtool em1
Settings for em1:
Supported ports: [ FIBRE ]
Supported link modes: 1000baseT/Full
10000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 1000baseT/Full
10000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: Unknown!
Duplex: Unknown! (255)
Port: FIBRE
PHYAD: 0
Transceiver: external
Auto-negotiation: on
Supports Wake-on: umbg
Wake-on: g
Current message level: 0x00000007 (7)
drv probe link
Link detected: no

Speed 显示当前网卡的速度。但是不知道为啥,我司机器是Unknown。。

是否启用了相应的网卡

ip addr show 显示网卡及配置的地址信息

1
2
3
4
5
6
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 06:50:32:00:02:18 brd ff:ff:ff:ff:ff:ff
inet 100.73.12.12/24 brd 100.73.12.255 scope global eth0

首先这个系统有两个接口:lo和eth0,lo是环回接口,而我们重点关注的则是eth0这个普通网络接口

state UP: 网络接口已启用。具体详细的请阅读Linux ip命令详解

是否正确设置路由

route -n查看路由状态

1
2
3
4
5
[root@massive-dataset-new-002 ~]# route  -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
100.73.12.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 100.73.12.254 0.0.0.0 UG 0 0 0 eth0

通过route命令查看内核路由,检验具体的网卡是否连接到目标网路的路由,之后就可以尝试ping 网关,排查与网关之间的连接。

如果无法ping通网关,可能是网关限制了ICMP数据包,或者交换机设置的问题。

关于网关介绍

网络连接到另一个网络的“关口”

如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。

比如有网络A和网络B,网络A的IP地址范围为 “192.168.1.1192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1192.168.2.254”,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上, TCP/IP协议也会根据子网掩码(255.255.255.0)判定两个网络中的主机处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。

DNS工作状况

通常很多网络问题是DNS故障或配置不当造成的

使用nslookup命令查看DNS解析

1
2
3
4
5
6
7
8
9
[root@massive-dataset-new-002 ~]# nslookup baidu.com
Server: 100.73.18.5
Address: 100.73.18.5#53

Non-authoritative answer:
Name: baidu.com
Address: 39.156.69.79
Name: baidu.com
Address: 220.181.38.148

这里的DNS服务器 100.73.18.5 位于当前局域网内,nslookup的结果显示DNS工作正常。

如果这里nslookup命令无法解析目标域名,则很有可能是DNS配置不当

查看 dns 配置文件当然最简单的方法就是查看dns配置文件,/etc/resolv.conf文件里面的 nameserver 地址

是否可以正常路由到远程主机

互谅网是通过大量路由器中继连接起来的,网络的访问就是在这些节点间一跳一跳最终到达目的地,想要查看网络连接,最直接最常用的命令是ping,ping得通,说明路由工作正常,但是如果ping不通,traceroute命令可以查看从当前主机到目标主机的全部“跳”的过程。traceroute和ping命令都是使用ICMP协议包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@massive-dataset-new-002 ~]#  traceroute www.baidu.com
traceroute to www.baidu.com (103.235.46.39), 30 hops max, 60 byte packets
1 100.73.12.254 (100.73.12.254) 2.124 ms 2.670 ms 2.388 ms
2 100.73.255.252 (100.73.255.252) 0.107 ms 0.092 ms 0.089 ms
3 114.113.234.233 (114.113.234.233) 7.929 ms 8.298 ms 8.290 ms
4 172.16.0.4 (172.16.0.4) 13.154 ms 14.051 ms 13.626 ms
5 192.168.77.9 (192.168.77.9) 9.923 ms 9.330 ms 9.901 ms
6 61.49.40.97 (61.49.40.97) 2.216 ms 2.319 ms 1.595 ms
7 * * *
8 219.232.11.73 (219.232.11.73) 2.156 ms 219.232.11.153 (219.232.11.153) 3.377 ms 219.232.11.233 (219.232.11.233) 2.410 ms
9 202.96.12.21 (202.96.12.21) 3.088 ms 123.126.0.101 (123.126.0.101) 3.232 ms 125.33.186.85 (125.33.186.85) 3.251 ms
10 219.158.5.146 (219.158.5.146) 9.310 ms 219.158.4.170 (219.158.4.170) 10.142 ms 219.158.5.158 (219.158.5.158) 8.519 ms
11 219.158.3.138 (219.158.3.138) 10.748 ms 11.408 ms 219.158.16.66 (219.158.16.66) 8.184 ms
12 219.158.96.26 (219.158.96.26) 152.988 ms 219.158.98.18 (219.158.98.18) 154.549 ms 154.532 ms
13 219.158.40.190 (219.158.40.190) 170.641 ms 219.158.33.58 (219.158.33.58) 190.226 ms 219.158.40.190 (219.158.40.190) 170.384 ms
14 if-ae-8-2.tcore1.sv1-santa-clara.as6453.net (66.110.59.9) 190.528 ms 192.138 ms 189.755 ms
15 if-ae-0-2.tcore2.sv1-santa-clara.as6453.net (63.243.251.2) 170.883 ms 168.308 ms 168.036 ms
16 209.58.86.30 (209.58.86.30) 168.931 ms * 192.311 ms
17 * * *
18 103.235.45.0 (103.235.45.0) 308.516 ms 329.374 ms 331.152 ms
19 * * *
20 * * *
21 * * *^C

traceroute可以查看网络中继在哪里中断或者网络延时情况,“*”是因为网络不通或者某个网关限制了ICMP协议包。

远程主机是否开放端口

telnet 命令是检查端口开放情况的利器

telnet IP PORT,可以查看指定远程主机是否开放目标端口

但是telnet 命令的功能非常有限,当防火墙存在时,就不能很好地显示结果,所以telnet无法连接包含两种可能:1是端口确实没有开放,2是防火墙过滤了连接。

本机查看监听端口

如果要在本地查看某个端口是否开放,可以使用如下命令

netstat -lnp | grep PORT 查看本地指定端口的监听情况

1
2
3
4
5
6
7
8
[root@massive-dataset-new-002 ~]# netstat -anlp | grep 13307
tcp 0 0 0.0.0.0:13307 0.0.0.0:* LISTEN 18368/mysqld
tcp 0 0 100.73.12.12:13307 100.73.53.250:46370 ESTABLISHED 18368/mysqld
tcp 0 0 100.73.12.12:13307 100.73.53.250:51380 ESTABLISHED 18368/mysqld
tcp 0 0 100.73.12.12:13307 100.73.53.250:33466 ESTABLISHED 18368/mysqld
tcp 0 0 100.73.12.12:13307 100.73.53.250:48615 ESTABLISHED 18368/mysqld
tcp 0 0 100.73.12.12:13307 100.73.53.250:44921 ESTABLISHED 18368/mysqld
tcp 0 0 100.73.12.12:13307 100.73.53.250:35016 ESTABLISHED 18368/mysqld

其中第一列是套接字通信协议,第2列和第3列显示的是接收和发送队列,第4列是主机监听的本地地址,反映了该套接字监听的网络;第6列显示当前套接字的状态,最后一列显示打开端口的进程。

查看当前活动端口监听的网络,如果netstat找不到指定的端口,说明没有进程在监听指定端口。

网络较慢的排查

iftop命令类似于top命令,查看哪些网络连接占用的带宽较多

1
2
3
# CentOS上安装所需依赖包
yum install flex byacc libpcap ncurses ncurses-devel libpcap-devel
yum install iftop

该命令按照带宽占用高低排序,可以确定那些占用带宽的网络连接

最上方的一行刻度是整个网络的带宽比例,下面第1列是源IP,第2列是目标IP,箭头表示了二者之间是否在传输数据,以及传输的方向。最后三列分别是2s、10s、40s时两个主机之间的数据传输速率。

最下方的TX、RX分别代表发送、接收数据的统计,TOTAL则是数据传输总量。

使用 -n 选项直接显示连接的IP,否则看到的则是解析成域名后的结果。
-i 选项可以指定要查看的网卡,默认情况下,iftop会显示自己找到的第一个网卡
在进入iftop的非交互界面后,按 p 键可以打开或关闭显示端口,按 s 键可以显示或隐藏源主机,而按 d 键则可以显示或隐藏目标主机。

虽然iftop报告每个连接所使用的带宽,但它无法报告参与某个套按字连接的进程名称/编号(ID)。

tcpdump

当一切排查手段都无济于事时仍然不能找到网络速度慢、丢包严重等原因时,往往祭出杀手锏——抓包。抓包的最佳手段是在通信的双方同时抓取,这样可以同时检验发出的数据包和收到的数据包,tcpdump是常用的抓包工具。

具体自行查阅Linux tcpdump命令详解


参考链接