内容纲要

本文为《Linux & Debian》专栏系列


本篇文章主要介绍 iproute2 为主的网络配置工具命令,但鉴于可能会使用一些老旧的发行版,所以会将已经停止维护的 net-tools 相关命令以「💡 提示」的形式注明。

获取帮助

ip help

查看网络信息

显示网络接口信息

💡 提示:类似于 net-tools 的 ifconfig -a

ip addr

返回:

...
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP group default qlen 1000
    link/ether aa:aa:00:12:07:7f brd ff:ff:ff:ff:ff:ff
    inet 98.142.140.209/21 brd 98.142.143.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a8aa:ff:fe12:77f/64 scope link 
       valid_lft forever preferred_lft forever
...

这部分一般注意:

首先是「eth0」表示第一块网卡(「eth1」为第二块以此类推增加),根据情况的不同它还可能是:

  • eno1(板载网卡)
  • ens33(PCI-E 网卡)
  • enp0s3(无法获取物理信息的 PCI-E 网卡)

除了网卡信息还会有其他如 lo 代表 Loopback 网络回环信息。

以及 inet 表示 IPv4 相关信息;inet6 表示 IPv6 相关信息。

显示路由表

💡 提示:类似于 net-tools 的 route -nnetstat -r

ip route

返回:

default via 98.142.136.1 dev eth0 
98.142.136.0/21 dev eth0 proto kernel scope link src 98.142.140.209 

显示 ARP 表

💡 提示:类似于 net-tools 的 arp -na

ip neigh

返回:

173.82.157.121 dev eth0 lladdr 00:17:df:b3:a8:00 STALE
98.142.136.35 dev eth0 lladdr 24:6e:96:42:3b:1c STALE
98.142.136.1 dev eth0 lladdr 10:0e:7e:a5:5a:a1 PERMANENT

显示网络统计数据

ip -s link

修改网络配置

添加及删除 IP 地址

💡 提示:类似于 net-tools 的 ifconfig

搭配上述 ip addr 查看命令使用可知修改结果

# 添加网卡 eth0 上的 IP 地址
ip addr add 192.168.1.100/24 dev eth0

# 删除网卡 eth0 上的 IP 地址
ip addr add 192.168.1.100/24 dev eth0

添加网关地址

💡 提示:类似于 net-tools 的 route add

搭配 ip route 查看命令可知修改结果

# 添加默认网关地址为 192.168.1.254
ip route add default via 192.168.1.254

# 添加网卡为 eth0 的默认网关地址为 192.168.1.254
ip route add default via  192.168.0.254  dev eth0

# 添加网卡为 eth0 上的 192.168.3.0/24 网段的网关为 192.168.1.254
ip route add 192.168.3.0/24  via 192.168.1.254 dev eth0

删除网关地址

💡 提示:类似于 net-tools 的 route del

搭配 ip route 查看命令可知修改结果

删除网卡 eth0 上的网关地址

# 删除默认路由
ip route del default

# 删除 192.168.3.0/24 网段的网关
ip route del 192.168.3.0/24

# 删除网卡为 eth0 上的 192.168.3.0/24 网段的网关
ip route delete 192.168.1.0/24 dev eth0

配置网卡设置

💡 提示:类似于 net-tools 的 ifconfig

搭配 ip link 查看命令可知修改结果

# 开启 eth0 网卡
ip link set eth0 up

# 关闭  eth0 网卡
ip link set eth0 down

# 开启网卡的混合模式
ip link set eth0 promisc on

# 关闭网卡的混合模式
ip link set eth0 promisc offi

# 设置网卡队列长度
ip link set eth0 txqueuelen 1200

# 设置网卡最大传输单元
ip link set eth0 mtu 1400

简单的网络故障排除

ping

ping 用来测试主机之间网络的连通性。执行 ping 指令会使用 ICMP 传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。

ping 1.1.1.1

tracepath

tracepath 用来追踪并显示报文到达目的主机所经过的路由信息。

tracepath 1.1.1.1

mtr

mtr 是一种简单的跨平台命令行网络诊断工具,它将常用的 tracerouteping 程序的功能组合到一个工具中。 与 traceroute 类似, mtr 输出关于数据包从运行 mtr 的主机到用户指定的目标主机的路由信息。

mtr 1.1.1.1

nslookup

nslookup

# nslookup 有两种工作模式,可以直接输入命令进入交互模式
nslookup

# 也可以直接带上参数查询,也就是非交互模式
nslookup google.com

# 查询 SOA 记录
nslookup -type=soa google.com

# 查询所有可用的 DNS 记录
nslookup -query=any google.com

telnet

telnet 用于登录远程主机,对远程主机进行管理。但因为采用明文传送报文,安全性不好,所以现在一般用来测试端口是否连通。

telnet www.qq.com 443 # 试试其他不可能连通的端口

ss

ss 用来显示处于活动状态的套接字信息。ss 命令可以用来获取 socket 统计信息,它可以显示和 netsta t类似的内容。但 ss 的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比 netstat 更快速更高效。

# 显示 TCP sockets
ss -t -a

# 显示 UDP sockets
ss -u -a

# 显示 socket 使用摘要
ss -s

# 显示进程 socket 使用摘要
ss -pl

网络服务管理

上述 ip 等命令的操作是存储与内存中,临时生效但在系统重启后就失效了,也就是用于测试以确定最终需要的设置,而要想重启之后还需要保持配置需要写入配置文件。

Ubuntu

以 Ubuntu 为例:

ip addr

返回:

ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:63:f2:3f brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.118/24 brd 192.168.2.255 scope global dynamic ens33
       valid_lft 85600sec preferred_lft 85600sec
    inet6 fe80::20c:29ff:fe63:f23f/64 scope link 
       valid_lft forever preferred_lft forever

得知我的网卡名为 ens33

接着使用

ls /etc/netplan/

返回:

50-cloud-init.yaml

查看网络配置,得知目前的网络配置文件名为 50-cloud-init.yaml (在你的计算机上可能是别的名称)

sudo vim /etc/netplan/*.yaml

为避免文件名不同(且一般只有一个配置文件)所以使用通配符打开。

当然为了以防万一改错了不知道怎么改回来可以先复制出一个备份文件

sudo cp /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.bak

现在来看看配置文件的内容:

# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        ens33:
            dhcp4: true
    version: 2

默认的信息比较简单,网卡 ens33 使用 dhcp 服务,如果不想使用 dhcp 而是手动配置可以如下修改:

network:
    ethernets:
        ens33:
            addresses: [192.168.1.121/24]
            gateway4: 192.168.1.1
            nameservers:
              addresses: [1.1.1.1, 8.8.8.8]
    version: 2

说明:

addresses:也就是 IP 地址,此处为一个数组,如果你有多个地址需要配置可以就写成:[192.168.1.121/24,192.168.1.122/24],如果你有 IPv6 地址可以写成 [192.168.1.121/24, 2002:7111:236b:1::1/64],而子网掩码不像之前使用类似 255.255.255.0 而是以 /24 形式配置。

gateway4:也就是网关,此处的 4 表示 IPv4,举一反三如果要配置 IPv6 的网关就再加上一个 gateway6 的配置项。

nameservers: 也就是 DNS 服务器地址,同样以数组的方式进行多个配置。

除了上述还有一些其他配置可以查看 Netplan官网的 示例配置

需要注意的是文件格式为 YAML,如果你从未了解过该格式很可能在缩进等问题上出岔子,所以在编辑完成后可以先使用测试命令

sudo netplan try

如果配置的格式上没有问题会提示配置成功,按「回车键」即可应用。(如果你很自信认为绝对没问题配置一次过也可以使用 sudo netplan apply 直接应用配置)

⚠️ 注意:如果你只想修改 DNS 而其他继续使用 DHCP 获取呢?

# 禁用 systemd-resolved 服务
systemctl stop systemd-resolved
systemctl disable systemd-resolved

# 编辑配置文件
sudo vim /etc/systemd/resolved.conf

主要如下修改

[Resolve]
DNS=1.0.0.1 8.8.4.4
#FallbackDNS=
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=yes

去掉首行 DNS= 之前都井号也就是不再注视,后面写上 DNS 服务器地址,多个地址以空格隔开。在修改完成后重启网络服务进行应用:

systemctl restart networking

Debian

同上,先备份配置文件

sudo cp /etc/network/interfaces  /etc/network/interfaces.bak

接着编辑配置文件

sudo vim /etc/network/interfaces

返回:

auto lo
iface lo inet loopback
auto ens33
iface ens33 inet dhcp

如上修改为手动设置

auto lo
iface lo inet loopback
auto ens33
iface ens33 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1

主要将 dhcp 修改为 static 以及加上 IP 地址、子网掩码及网关设置。

接着修改 DNS 服务器地址

sudo vim /etc/resolv.conf

返回:

nameserver 1.0.0.1
nameserver 8.8.8.8
nameserver 1.1.1.1
nameserver 8.8.4.4

这部分很简单就不赘述了,在修改完成后重启网络服务进行应用:

systemctl restart networking

设置 hostname

例如想将 hostname 设置为 DivineEngine

sudo hostnamectl set-hostname DivineEngine

设置 hosts

sudo vim /etc/hosts

返回:

127.0.0.1 localhost