Linux 网络相关

1. 基本网络配置工具

1.1. 查看网卡连接信息

# 查看当前系统所连接的所有以太网卡
lspci |grep -i ethernet

# 确认网线已经连接好,以 ens33 为例
mii-tool ens33  # 该命令需要安装有net-tools才能用
ens33: negotiated 1000baseT-FD flow-control, link ok # link ok 表示网卡能够被识别,并且接了有效的网线
 
mii-tool ens33
SIOCGMIIPHY on 'ens33' failed: Invalid argument   # 网卡虽然能够被识别(网卡已经被驱动了,但不能用:网卡配置错误,网线没接等)
Bash

1.2. ifconfig 命令

ifconfig 设置的参数都是临时的,重启系统或服务失效。

# 查看所有网卡信息(包括未激活的网卡)
ifconfig -a 
# 查看单个网卡信息
ifconfig ens33 
# 临时设定IP和掩码(重启服务或者系统都失效)
ifconfig ens33 192.168.1.122 netmask 255.255.255.0 
ifconfig ens33 192.168.1.122/24 
# 绑定多个IP地址(别名)
ifconfig ens33:0 192.168.1.101 netmask 255.255.255.0  # 添加别名IP
ifconfig ens33:0 down             # 删除别名
# 启用/禁用网络接口
## 不加载网卡配置文件
ifconfig ens33 up      # 重新启用接口(不重新获取 IP)
ifconfig ens33 down    # # 禁用接口(IP 地址仍保留,但无法通信)
# 加载网卡配置文件
ifdown ens33  # 完全停用接口(释放 IP,关闭 DHCP)
ifup ens33  # 重新激活接口(重新获取 IP)
# 设置网卡最大传输单元
ifconfig ens33 mtu 1500
# 设置MAC地址(需root权限)
ifconfig ens33 hw ether 00:1a:2b:3c:4d:5e
# 添加、删除ipv6地址
ifconfig ens33 add 3ffe:3240:800:1005::2/64
ifconfig ens33 del 3ffe:3240:800:1005::2/64
 
# 高级用法(了解)
# 网卡的繁杂模式(Promiscuous mode)和多播(Multicast)是网络通信中两种非常重要的概念。
## 网卡的繁杂模式:在默认情况下,网卡只会接收发给自己MAC地址的数据帧,其它的数据帧则会被过滤丢弃。但是当我们把网卡设置为繁杂模式时,网卡将接收通过该网卡的所有数据帧,无论这些数据帧的目标MAC地址是什么。这个特性在一些特定的情况下很有用,例如网络监听(sniffing)和网络调试。
# 多播:多播是一种网络传输技术,它允许一个网络节点将数据发送到多个接收节点,但又不像广播那样向所有网络节点发送。多播通过使用特定的IP地址范围(224.0.0.0到239.255.255.255)和MAC地址范围,来标示一组特定的接收节点。当发送节点发送数据时,只有加入了相应多播组的节点会接收和处理这份数据,其它未加入的节点则会忽略这份数据。多播技术可有效减少网络流量,提升网络的利用效率,因此在一些需要数据共享的场景,例如视频直播和在线游戏,多播技术得到了广泛的应用。
ifconfig ens33 promisc  # 开启繁杂模式
ifconfig ens33 -promisc  # 关闭繁杂模式

ifconfig ens33 multicast  # 开启多播
ifconfig ens33 -multicast  # 关闭多播
# 这条命令将网络设备ens33配置为接收多播流。这意味着,如果多播流被发送到与ens33关联的多播IP地址,只要设备在这个多播组中,那么ens33就能接收到这个多播流。
 
ifconfig eth0 allmulti  # 开启
ifconfig eth0 -allmulti  # 关闭
# 条命令启用了网络设备eth0上的全多播模式。全多播模式是指,网络设备接收所有来自网络的多播流,而不仅仅是它已经订阅的流。这对于一些需要接收所有多播流的特殊应用,例如路由器或者一些网络调试工具,是非常有用的。
Bash

ifconfig 命令查询结果解析:

ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
         # 从flags可知该接口已启用,支持广播、组播,MTU:1500(最大传输单元):1500字节
         # 其他了解知识:
         ## UP:表示“接口已启用”。
         ## BROADCAST :表示“主机支持广播”。
         ## RUNNING:表示“接口在工作中”。
         ## MULTICAST:表示“主机支持多播”。

        inet 192.168.12.42  netmask 255.255.255.0  broadcast 192.168.12.255
        # IPv4地址           子网掩码                   广播地址
 
        inet6 fe80::499e:c2c1:f5ed:3900  prefixlen 64  scopeid 0x20<link>
        # IPv6地址                        掩码长度       作用域,link表示仅该接口有效
 
        ether 00:0c:29:86:f8:59  txqueuelen 1000  (Ethernet)
        # 网卡接口的MAC地址         传输队列长度       接口类型为Ethernet
 
        RX packets 5708  bytes 1061424 (1.0 MiB)
        # 表示开机后此接口累积接收的报文个数,总字节数
 
        RX errors 0  dropped 833  overruns 0  frame 0
        # 表示开机后此接口累积接收报文错误数,丢弃数,溢出数(由于速度过快而丢失的数据包数),冲突的帧数
 
        TX packets 102  bytes 16768 (16.3 KiB)
        # 表示开机后此接口累积发送的报文个数,总字节数
 
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        # 表示开机后此接口累积发送报文错误数,丢弃数,溢出数(由于速度过快而丢失的数据包数),
        # carrier 载荷数(发生carrier错误而丢失的数据包数)
        # collisions 冲突数
Bash

1.3. ip 命令

ip 设置的参数也都是临时的,重启系统或服务失效。

ip 命令帮助文档

ip -h
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
       ip [ -force ] -batch filename
where  OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
                   tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
                   netns | l2tp | fou | macsec | tcp_metrics | token | netconf | ila |
                   vrf }
       OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
                    -h[uman-readable] | -iec |
                    -f[amily] { inet | inet6 | ipx | dnet | mpls | bridge | link } |
                    -4 | -6 | -I | -D | -B | -0 |
                    -l[oops] { maximum-addr-flush-attempts } | -br[ief] |
                    -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
                    -rc[vbuf] [size] | -n[etns] name | -a[ll] | -c[olor]}
                    
                    
# 获取相关OBJECT详细文档
ip link help


# 使用 man 命令查看相应 OBJECT
man ip-address
# 相应 OBJECT 列表
rpm -ql iproute | grep "man8/ip-"
/usr/share/man/man8/ip-address.8.gz
/usr/share/man/man8/ip-addrlabel.8.gz
/usr/share/man/man8/ip-l2tp.8.gz
/usr/share/man/man8/ip-link.8.gz
/usr/share/man/man8/ip-maddress.8.gz
/usr/share/man/man8/ip-monitor.8.gz
/usr/share/man/man8/ip-mroute.8.gz
/usr/share/man/man8/ip-neighbour.8.gz
/usr/share/man/man8/ip-netconf.8.gz
/usr/share/man/man8/ip-netns.8.gz
/usr/share/man/man8/ip-ntable.8.gz
/usr/share/man/man8/ip-route.8.gz
/usr/share/man/man8/ip-rule.8.gz
/usr/share/man/man8/ip-tcp_metrics.8.gz
/usr/share/man/man8/ip-token.8.gz
/usr/share/man/man8/ip-tunnel.8.gz
/usr/share/man/man8/ip-xfrm.8.gz
Bash

ip address 详解

ip address show #  查看ip地址信息
# 也可以缩写
ip a show
ip a s
ip a
# 在ip命令下,任何 object 都可以写其全名,也可以写其缩写名,例如 address 这个 object,可以简写为 addr,也可以简写为一个字母a。首字母相同的则以 object 顺序匹配。

# 添加|删除ip地址语法结构
ip address { add | del } IFADDR dev STRING
IFADDR := PREFIX [ broadcast ADDR ] [ anycast ADDR ] [ label STRING ]
# add:添加 IP 地址到指定网卡。
# del:从网卡删除 IP 地址。
# IFADDR:IP 地址及其附加参数。
## PREFIX(必选):指定 IP 地址和子网掩码(CIDR 格式)。
## broadcast ADDR(可选):手动指定广播地址(默认根据 PREFIX 自动计算)。
## anycast ADDR(可选):配置任播地址(通常用于 IPv6,需内核支持)。
## label STRING(可选):为 IP 地址添加别名标签(用于区分多个 IP)。
# dev STRING:指定操作的网络接口名称(如 eth0、ens33)。

# 完整命令示例
sudo ip address add 192.168.1.100/24 broadcast 192.168.1.255 dev ens33 label ens33:web
sudo ip address del 192.168.1.100/24 dev eth0
# 此方式添加的ip地址只有添加了标签(如:label ens33:web)才会在ifconfg命令中显示,ifconfg能捕捉到的是别名。


# 批量删除ip地址
ip address flush
ip a flush dev ens33  # 删除ens33网卡上的所有ip地址
Bash

ip route 详解

该命令维护和查看内核中的路由表。

# 操作路由表
ip route { add | del | change | append | replace } dest[/cidr_mask] [ via ADDRESS ] [ dev STRING ]
# dest[/cidr_mask]:目标网络地址(如 192.168.1.0/24)。可以是主机地址、网段地址,一般在地址后都会带上cidr 格式的掩码长度,不带时默认为32位长度。如果dest为“0/0"或者写为” default",则表示默认路由。
## 默认路由:是网络设备(如计算机、路由器)中一条特殊的路由规则,用于指示当数据包的目标地址不匹配任何其他具体路由条目时,应通过哪条路径转发。它是网络通信的“兜底”规则,确保未知目的地的流量仍有路可走。
# via ADDRESS:下一跳网关 IP。
# dev STRING:出口网络设备(如 eth0)。

# 添加/修改/替换普通路由:
ip route add/change/replace 172.16.10.0/24 via 192.168.10.20
# 添加/修改/替换默认路由:
ip route add/change/replace default via 192.168.10.20
ip route add/change/replace 0/0 via 192.168.100.20
# 删除路由
ip route del 172.16.10.0/24
ip route del default   # 删除默认路由


# 列出路由表
ip route show [to [ root | match | exact ] ADDR_pattern ] [ via ADDR ]
# to ADDR_pattern:按目标网络地址匹配。
## root:匹配目标网络的最长前缀。
## match:匹配包含该模式的所有路由。
## exact:精确匹配目标网络(默认行为)。
# via ADDR:按下一跳地址过滤。

# 示例:
ip route show to 192.168.1.0/24  # 显示目标为 192.168.1.0/24 的路由(默认 exact 模式)。
ip route show to root 10.0.0.0/8  # 显示目标网络的最长前缀匹配(如 10.0.0.0/8 或更具体子网)。
ip route show to match 192.168.0.0  # 显示所有包含 192.168.0.0 的路由(如 192.168.0.0/16、192.168.1.0/24)。
ip route show to exact 172.16.1.0/24  # 仅显示完全匹配 172.16.1.0/24 的路由。


# 批量删除路由条目
ip route flush eth1  # 删除出口为 eth1 的路由条目
ip r flush via 192.168.100.70  # 删除下一跳为 192.168.100.70 的路由条目
ip route flush 192.168.0.0/16  # 删除目标为 192.168.0.0/16 的路由条目


# 导出导入路由表
ip route save > /tmp/route.txt
ip route restore < /tmp/route.txt
Bash

ip link 详解

该命令用于管理和查看网络接口,可以添加虚拟网络接口,将网络接口分组进行管理。

# 修改网络接口属性
ip link set DEVICE  { up | down | arp { on | off } | name NEWNAME | address LLADDR }  
 
# 选项说明:
# DEVICE:目标网络接口名(如 eth0、ens33)。
# up/down:启用或禁用接口。
# arp on/arp off:启用或禁用 ARP 协议。
# name NEWNAME:重命名接口,建议不要在该接口处于运行状态或已分配IP地址时重命名。
# address LLADDR:修改 MAC 地址。
# 示例:
## 禁用eth1网卡
ip link set eth1 down
## 修改MAC地址
ip link set eth1 address 00:0c:29:f3:33:77


# 用于显示网络接口(网卡)的信息
ip [ -s | -h ] link show [dev DEV]  
# 选项说明:
# show:显示接口信息(默认行为,可省略)。
# [ -s | -h ]:可选参数(-s 或 -h,不能同时使用)。
## -s:显示详细统计信息(如接收/发送的字节数、包数、错误数等)。
## -h:以人类可读的方式显式,即单位转换。注:"-h"在CentOS 7上才支持。
# [dev DEV]:可选参数,指定要查询的网卡名称(如 eth0、wlan0)。

# 添加/删除虚拟网卡
# 添加虚拟网卡(如虚拟以太网设备),veth(Virtual Ethernet) 是一种成对出现的虚拟网络设备,类似于双向管道:
## 发送到 veth0 的数据会从 veth1 接收,反之亦然。
## 常用于容器网络(如 Docker、Kubernetes)、网络命名空间(Network Namespace) 或 虚拟机互联。
ip link add veth0 type veth peer name veth1
# 删除网卡
ip link delete veth0
Bash

1.4. route 路由详解

交换(Switching)与路由(Routing)概念解析:

  • 交换:交换是指 在同一个网络(广播域)内,基于 MAC 地址(二层)进行数据帧转发 的技术。主要设备是交换机
  • 路由:路由是指 在不同网络(IP 子网)之间,基于 IP 地址(三层)选择最佳路径转发数据包 的技术。

1.4.1. Linux 处理数据包的流程

当主机网卡接收到数据流入后需要对它做路由决策,根据其目标决定是流入本机的用户空间还是在内核空间就直接转发给其他主机。

  • 如果是流入本机用户空间的数据:则数据会从内核空间进入用户空间(被应用程序接收并处理);此时如果本机用户空间的应用程序不需要产生新的数据包对外发送,那便不再涉及到从某个网卡流出数据;但是如果本机用户空间的应用程序需要产生新的数据包对外发送,那便需要从某个网卡流出数据,但在流出之前,也需要做路由决策:根据目标决定从哪个网卡流出。
  • 如果不是流入本机用户空间的数据,仅仅只是要经由本机把数据包转发给其他主机,则必然涉及到从某个网卡流出,此时数据包必须从流入网卡完整地转发给流出网卡,这要求Linux主机能够完成这样的转发。但Linux主机默认未开启ip_forward功能,这使得数据包无法转发而被丢弃。

1.4.2. Linux 开启路由转发功能

Linux主机和路由器不同,路由器本身就是为了转发数据包,所以路由器内部默认就能在不同网卡间转发数据包,而Linux主机默认则不能转发。若要开启linux主机的转发功能,有很多方式,如下所示:

# 临时开启
# 方式1:
echo 1 > /proc/sys/net/ipv4/ip_forward
# 方式2:
sysctl -w net.ipv4.ip_forward=1

# 要永久生效则需要写入配置文件
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf

# 几种查询是否开启路由转发功能的方法
sysctl net.ipv4.ip_forward
cat /proc/sys/net/ipv4/ip_forward
sysctl -a | grep ip_forward
Bash

1.4.3. 路由条目的三种类型

  • 主机路由:针对 单个特定 IP 地址 的路由规则,目标地址为 完整 IP
    • 示例:192.168.1.100/32 via 10.0.0.1 dev eth0
    • 含义:所有发送到 192.168.1.100 的数据包,通过 eth0 经网关 10.0.0.1 转发。
  • 网络路由:针对 一个子网(网段) 的路由规则,目标地址为 网络地址 + 子网掩码,用于同一局域网内或跨子网的通信。
    • 示例:192.168.2.0/24 dev ens33 proto kernel scope link src 192.168.2.50
    • 含义:发送到 192.168.2.0/24 网段的数据包,直接通过 ens33 接口发出,源 IP 为 192.168.2.50
  • 默认路由:当目标地址 不匹配任何主机或网络路由 时使用的兜底规则,目标地址为 0.0.0.0/0(IPv4)或 ::/0(IPv6),优先级最低,但覆盖范围最广。
    • 示例:default via 192.168.1.1 dev eth0
    • 含义:所有未明确路由的数据包,通过 eth0 经网关 192.168.1.1 转发。

1.4.4. route 命令

# 查看路由表
route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.1     0.0.0.0         UG    0      0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 ens33

 
# 各字段含义
# 1、Destination:目标网络或目标主机
# 2、Gateway:要达到目标所需要经过的网关。如果没有通过网关,这部分将显示为0.0.0.0。
# 3、Genmask:和目标IP配对使用的网络掩码
# 4、Flags::表示特定的路由信息,有三个字符
## U 表示该路由处于up状态、该路由可用
## G 表示通过网关,路由项指向了一个网关
## H 表示路由项指向一个主机,而非整个网络
 
# 5、Metric:Metric用于距离衡量,一般用于路由选择,值越小优先级越高。
# 6、Ref:使用/引用这个路由项的活动连接数量 (通常对普通用户没有意义)。
# 7、Use:这个路由项被使用的次数。
# 8、Iface:该路由所绑定的网络接口名,例如eth0,lo。
 
# 对于CentOS 6以上的系统,请忽略Metric和Ref两列,它们已经不被内核使用,只是有些路由软件可能会用上。


# 管理路由表
route [add/del] [-host/-net/default] [address[/mask]] [netmask] [gw] [dev]
 
# 选项说明:
# add/del:增加或删除路由条目
# -net:增加或删除的是一条网络路由
# -host:增加或删除的是一条主机路由
# default:增加或删除的是一条默认路由
# netmask:明确使用netmask关键字指定掩码,要可以不使用该选项直接在地址上使用cidr格式的掩码,即IP/MASK。
# gw:指定下一跳的地址。要求下一跳地址必须是能到达的,且一般是和本网段直连的接口。
# dev:强制将路由条目关联到指定的接口上。一般内核会自动判断路由条目应该关联到哪个网络接口。
Bash

1.5. network 与 NetworkManager

network 和 NetworkManager 是两种不同的网络管理工具,每种工具都有自己的特点和适用场景。在上面几个小节中使用的命令都是临时更改网络配置,如需要永久修改则需要将网络配置写入配置文件使用网络管理工具来配置网络。

  • network:它是基于传统的Linux网络管理方法,即手动配置网络接口和服务。在使用network服务时,管理员需要编辑/etc/sysconfig/network-scripts/目录下的ifcfg文件来配置网络接口。network服务在系统启动时读取这些配置文件,并应用这些设置。network服务的优势在于其稳定性和可预测性,特别适合服务器环境。
  • NetworkManager:它是一个更现代的网络管理工具,可以自动管理其他网络接口和服务,主要用于桌面环境。NetworkManager可以管理各种类型的网络连接,例如有线网络、无线网络和VPN等,并在网络环境改变时动态更新网络配置。通常情况下,这两种服务不会同时运行,因为它们可能会产生冲突。
  • 但是在 CentOS 9 中,NetworkManager 已经成为默认的网络管理工具,而network服务已被移除。也就是说,你需要使用NetworkManager来管理你的网络接口和连接。这相比早期的CentOS版本,使得网络配置更加灵活和自动化,特别是对于经常需要切换网络环境的桌面用户来说。

network 网卡配置示例:

# 打开网卡配置文件,完成静态ip配置,修改完毕后重启网络服务即可:systemctl restart network
vim /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE=Ethernet                 # 接口类型(以太网)
DEVICE=ens33                  # 网卡名字
BOOTPROTO=static              # static 静态iP,dhcp 动态获取ip
ONBOOT=yes                    # 网络服务启动的时候,yes 代表激活状态,no 代表禁用

IPADDR=192.168.2.50           # IP 地址
NETMASK=255.255.255.0         # 子网掩码
GATEWAY=192.168.2.1           # 默认网关
HWADDR=14:da:e9:eb:a9:61      # 用于指定该配置必须绑定到哪个物理网卡,该地址需与物理网卡MAC地址相同,否则网卡会启动失败,不配置则系统会直接使用物理网卡的MAC地址
MACADDR=14:da:e9:eb:a9:61     # 修改网卡MAC地址,自定义。

DNS1=8.8.8.8                  # 主 DNS 服务器,Google 公共 DNS
DNS2=4.2.2.2                  # 备用 DNS 服务器,Level3 公共 DNS

IPV6INIT=yes                  # 是否在该网卡上启动IPV6的功能
NM_CONTROLLED=no              # 如果NetworkManager服务启用,该网卡配置文件也不受NetworkManager服务管理

USERCTL=no                    # 是否允许普通用户启动或者停止该网卡
PEERDNS=yes                   # 是否允许网卡在启动时向DHCP服务器查询DNS信息,
                              # 设置为yes时,此文件设置的DNS将覆盖/etc/resolv.conf,
                              # 若开启了DHCP,则默认为yes,所以dhcp的dns也会覆盖/etc/resolv.conf
                              
                              

# /etc/resolv.conf DNS 服务器地址文件,对应网卡配置文件中的配置
[root@localhost ~]# cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 4.2.2.2
search localdomain

# /etc/hosts 本地解析文件,优先于DNS
# DNS 检索顺序
# 应用程序缓存->本地系统缓存->本地计算机/etc/hosts文件->DNS 服务器(ISPDNS缓存>递归or迭代搜索)
Bash

network 路由配置示例:

根据网卡接口创建路由配置文件/etc/syconfig/network-scripts/route-ethX,要从 那个接口出去X就是几。

# 路由配置文件的配置格式,先是要到达的目标,然后是via关键字,最后是下一跳地址。要求下一跳必须能到达,且一般都和 ethX同网段。

# 在配置文件添加主机路由、默认路由、网段路由示例如下,其中dev是可以省略的,配置在哪个eth文件中就会从哪个接口转发。
# 默认路由
default     via 192.168.100.1
0.0.0.0/0   via 192.168.100.1
# 网络路由
192.168.10.0/24   via 192.168.100.1
#主机路由
192.168.100.52/32 via 192.168.100.33 dev eth1


# 注意:
# route-ethX 的对应网卡配置文件 ifcfg-ethX 必须存在,否则路由无效。
# 如果在文件中配置永久默认路由,则必须保证所有使用了DHCP服务的网卡配置文件 ifcfg-ethX 中的DEFROUTE指令设置为“no",表示DHCP不设置默认路由。
# 如果在 route-ethX文 件中配置永久路由,且该网卡使用了DHCP服务分配地址,则必须保证该网卡的 ifcfg-ethX 文件中的PEERROUTES指令设置为"no",表示DHCP设置的路由允许被覆盖。
Bash

NetworkManager 配置示例:

NetworkManager 可以通过 nmcli 客户端命令直接修改配置并永久保存。配置文件路径:/etc/NetworkManager/system-connections/。官方文档

网卡配置命令:

# 常用命令示例

# 修改 IP 地址和子网掩码
nmcli con mod ens33 ipv4.addresses "192.168.1.100/24"
# 设置默认网关
nmcli con mod ens33 ipv4.gateway "192.168.1.1"
# 设置 DNS 服务器
nmcli con mod ens33 ipv4.dns "8.8.8.8,8.8.4.4" 
# 将 IPv4 配置方式改为 手动(静态 IP)
nmcli con mod ens33 ipv4.method manual
# 关闭、开启网卡
nmcli con down ens33
nmcli con up ens33
Bash

路由配置命令:

# +号代表增加路由条目,-号代表删除,如果不带任何符号代表覆盖
# 添加默认路由:“0.0.0.0/0”代表所有IP地址,“192.168.1.1”代表路由的网关。
nmcli connection modify eth0 +ipv4.routes "0.0.0.0/0 192.168.1.1" 
nmcli connection up eth0  # 重启生效
 
# 添加网络路由:“192.0.2.0/24”是目标网络,“192.168.1.1”是网关。
nmcli connection modify eth0 +ipv4.routes "192.0.2.0/24 192.168.1.1"
nmcli connection up eth0
 
# 添加主机路由:“192.0.2.2/32”是目标主机的网络地址, “192.168.1.1”是网关。
nmcli connection modify eth0 +ipv4.routes "192.0.2.2/32 192.168.1.1"
nmcli connection up eth0
 
# 删除路由条目,只需要将上述命令中的+ipv4.routes更改为-ipv4.routes即可:
nmcli connection modify eth0 -ipv4.routes "0.0.0.0/0 192.168.1.1"
nmcli connection modify eth0 -ipv4.routes "192.0.2.0/24 192.168.1.1"
nmcli connection modify eth0 -ipv4.routes "192.0.2.2/32 192.168.1.1"
nmcli connection up eth0
Bash

2. 解决网络问题的排查流程

2.1. 检查本机网卡

ip a        # 查看网卡运行状态
# 如果网卡处于done或者网卡无显示信息,重启网卡和网络服务,如果启动失败检查网卡配置信息。
Bash

2.2. 检查网络连通性

# 1、判断网卡是否能识别,是否接了有效的网线
mii-tool   eth0  # 判断物理网卡是否接了网线
# 有可能明明连接了有效的网线,但是还是看不到link ok,可以先确定网卡配置文件是正确的,并且ONBOOT=yes ,然后重启network服务(systemctl restart network )
 
# 2、**ping 127.0.0.1**
# 通,代表系统能够支持tcp/ip通信。
# 不通,原因:相关驱动损坏或者没有。防火墙iptables拦截了。
 
# 3、**ping 网卡的ip**
# 假设eth0配置10.1.1.22
ping 10.1.1.22
# 通,说明网卡是能够正常工作
# 不通,可能是网卡驱动工作不正常,或iptables防火墙问题。或者是网卡未激活,可以尝试重启网络服务
 
# 4、**ping 网关**
# 不通,网关有问题,或者IP冲突
# 解决方法:ping 同一个网段中其他IP,或者用其他计算机也ping网关,如果能通,那就是自己机器的原因了
 
# 5、**ping 外网(IP或域名)**
# 通,只能说明通信没问题,网关是ok的。
# 不通,很可能就是网关无法联网
 
# ping 域名
# 如果连域名对应的IP都无法返回,说明域名解析失败,原因:DNS设定有问题。
 
# 7、**ping的错误类型**
 
**network unreachable (网络不可达): 一般没有设定正确的网关**
**unknow host xxxx : 设定DNS无效**
Bash

3. 网络问题排查工具

ping 命令

Ping(Packet Internet Groper)是网络诊断中最基础且强大的工具,用于测试主机之间的连通性、延迟和丢包情况。

# 语法
ping [选项] 目标主机(IP/域名)

# 常用选项
-c <数>  # 指定发送的包数量(如 -c 4)。
-i <数>  # 设置发包间隔。
-s <节>  # 设置数据包大小(如 -s 1000)。

# 示例:
ping -c 4 baidu.com

PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=49 time=91.4 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=2 ttl=49 time=91.9 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=3 ttl=49 time=89.4 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=4 ttl=49 time=91.9 ms

--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 89.497/91.210/91.966/1.078 ms
# 关键字段
# icmp_seq:包序列号(检测丢包)。
# ttl(Time to Live):数据包存活跳数(每经路由器减1,初始值通常为64/128/255)。
# time:往返延迟(RTT)。
Bash

traceroute 命令

Traceroute(跟踪路由)是一种网络诊断工具,用于显示数据包从源主机到目标主机的完整传输路径。它通过分析数据包经过的每一跳(路由器或网关)来帮助识别网络延迟或故障点。

# 安装
yum install traceroute -y

# 语法
traceroute [选项] 目标主机(IP/域名)

# 常用选项
-n  # 禁用DNS反向解析,直接显示IP(加快输出)。
-I  # 使用ICMP协议(默认UDP,Linux专用)。
-T  # 使用TCP SYN探测。
-m <数>  # 设置最大跳数(默认30)。
-q <数>  # 每跳发送的探测包数量(默认3)。
-w <数>  # 设置等待回复的超时时间。

# 示例:
$ traceroute -n 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  192.168.1.1     2.345 ms  1.987 ms  1.876 ms  # 第一跳:家庭路由器
 2  10.100.50.1     12.456 ms  11.234 ms  10.987 ms  # 第二跳:ISP网关
 3  203.0.113.45    25.678 ms  24.567 ms  23.456 ms  # 第三跳:运营商核心路由器
 4  72.14.194.14    30.123 ms  29.876 ms  28.765 ms  # Google边缘节点
 5  8.8.8.8        31.234 ms  30.987 ms  30.123 ms  # 目标:Google DNS

# * * *:节点未响应(可能防火墙丢弃ICMP/UDP包)。
Bash

netstat 命令

netstat(Network Statistics)是一个用于显示网络连接、路由表、接口统计等信息的命令行工具。

# 基本语法
netstat [选项]

# 常用选项
-a  # 显示所有连接和监听端口(包括TCP/UDP)。
-t  # 仅显示TCP连接。
-u  # 仅显示UDP连接。
-n  # 禁用域名解析,直接显示IP和端口(加快输出)。
-p  # 显示进程ID和程序名。
-l  # 仅显示监听(LISTEN)状态的端口。
-r  # 显示路由表(类似route print)。
-s  # 显示网络统计信息(如收发数据包总数)。
-c  # 持续输出(实时刷新,类似top)。

# 常见用法示例
# 查看所有活动连接
netstat -a        # 显示所有连接(TCP/UDP)
netstat -at       # 仅TCP连接
netstat -au       # 仅UDP连接
# 查看监听端口
netstat -tuln    # 显示所有TCP/UDP监听端口(-n禁用DNS解析)
# 查看进程占用端口
sudo netstat -tulnp  # Linux/macOS
netstat -ano         # Windows(-a所有连接,-n禁用解析,-o进程ID)
Bash

tcpdump 命令

# 命令格式
tcpdump [选项] [过滤表达式]

# 常用选项
-i <口>  # 指定监听的网络接口(如 eth0、any)。
-n  # 禁用域名解析(直接显示IP,加快输出)。
-nn  # 禁用域名和端口解析(IP和端口均显示数字)。
-c <量>  # 捕获指定数量的包后退出(如 -c 10)。
-w <件>  # 将抓包数据保存到文件(如 -w capture.pcap)。
-r <件>  # 读取保存的抓包文件(如 -r capture.pcap)。
-v  # 显示详细信息(-vv 或 -vvv 更详细)。
-X  # 以十六进制和ASCII格式显示数据包内容。
-A  # 以ASCII格式显示数据包内容(适合HTTP/文本协议)。
-s <度>  # 设置抓包长度(如 -s 0 捕获完整数据包)。

# 常见抓包示例
# 捕获所有经过 eth0 的流量
sudo tcpdump -i eth0
# 捕获特定主机的流量
sudo tcpdump -i eth0 host 192.168.1.100
# 捕获源/目标IP的流量
sudo tcpdump -i eth0 src 192.168.1.100    # 仅源IP
sudo tcpdump -i eth0 dst 8.8.8.8          # 仅目标IP
# 捕获特定端口的流量
sudo tcpdump -i eth0 port 80              # HTTP
sudo tcpdump -i eth0 port 22              # SSH
sudo tcpdump -i eth0 portrange 20-30      # 端口范围
# 捕获协议流量(TCP/UDP/ICMP)
sudo tcpdump -i eth0 tcp                  # 仅TCP
sudo tcpdump -i eth0 udp                  # 仅UDP
sudo tcpdump -i eth0 icmp                 # 仅ICMP(Ping)
# 保存抓包数据
sudo tcpdump -i eth0 -w capture.pcap      # 保存到文件
sudo tcpdump -r capture.pcap              # 读取文件
# 组合过滤条件
sudo tcpdump -i eth0 'src 192.168.1.100 and dst port 80'
sudo tcpdump -i eth0 'tcp and (port 80 or port 443)'

# 过滤表达式语法
# 逻辑运算符
and 
or 
not
# 常见过滤字段
host  # IP地址
port  # 端口号
src   # 源IP
dst   # 目标IP
net   # 网络段
proto # 协议类型
Bash
上一篇
下一篇