Linux 网络

基本概念

本部分包括 Linux 网络基本概念。

NetworkManager

NetworkManager 是监控和管理网络设置的守护进程。除了该守护进程外,还有一个提供网络状态信息的 GNOME 通知区域小程序。命令行和图形工具与 NetworkManager 通信,并将配置文件保存在 /etc/sysconfig/network-scripts 目录中。对于 NetworkManager:

  • 一个 device(设备) 是一个网络接口。

  • 一个 connection(连接) 是一组用来配置 设备 的设置的集合。

  • 对于任何一个设备,在同一时间只能有一个连接处于活动状态。可能存在多个连接,以供不同设备使用或者以便为同一设备更改配置。

  • 每个连接具有一个用于标识自身的名称ID

  • 连接的持久配置存储在 /etc/sysconfig/network-scripts/ifcfg-name 中,其中 name 是连接的名称。如果需要,可以手动编辑此文件。

  • nmcli 是一个实用小工具,可用于通过 shell 提示符来创建和编辑连接文件。

ifcfg 文件的一般配置属性

Note
/etc/sysconfig/network-scripts/ifcfg-<name> 文件可以用来配置网络设备和连接。

通常情况,编辑 /etc/sysconfig/network-scripts/ifcfg-<name> 文件,添加下表中一些常见配置:

Table 1. DHCP 与手动编辑 ifcfg 文件对照表
静态 动态 通用
BOOTPROTO=none
IPADDR0=172.25.X.10
PREFIX0=24
GATEWAY0=172.25.X.254
DEFROUTE=yes
DNS1=172.25.254.254
BOOTPROTO=dhcp
DEVICE=eth0
NAME=eth0
ONBOOT=yes
UUID=f3e8dd32-3...
USERCTL=yes

一般配置文件修改完成后需要重新加载网络连接,具体通过:

# nmcli con reload
# nmcli con down "eth0"
# nmcli con up "eth0"

nmcli con mod nm-settings 与 ifcfg-* 指令的比较

Table 2. nm-settings 与编辑 ifcfg 文件对照表
nmcli con mod ifcfg-* 文件 作用描述
ipv4.method manual
BOOTPROTO=none

IPv4 以静态方式配置。

ipv4.method auto
BOOTPROTO=dhcp

IPv4 以动态的方式分配地址,将从 DHCPv4 服务器中查找配置设置。如果还设置了静态地址,则在我们从 DHCPv4 中获取信息之前,将不会激活这些静态地址。

ipv4.addresses "192.0.2.1/24 192.0.2.254"
IPADDR0=192.0.2.1
PREFIX0=24
GATEWAY0=192.0.2.254

设置 IPv4 地址、网络前缀和默认网关。如果一个连接设置了多个地址,则 ifcfg-* 指令将以 1、2、3 等等结尾,而不是以 0 结尾。

ipv4.dns 8.8.8.8
DNS0=8.8.8.8

修改 /etc/resolv.conf 以使用此 nameserver

ipv4.dns-search example.com
DOMAIN=example.com

修改 /etc/resolv.conf 以在 search 指令中使用此域。

ipv4.ignore-auto-dns true
PEERDNS=no

忽略来自 DHCP 服务器的 DNS 服务器信息

ipv6.method manual
IPV6_AUTOCONF=no

IPv6 地址以静态方式配置

ipv6.method auto
IPV6_AUTOCONF=yes

将使用路由器播发中的 SLAAC 来配置网络设置。

ipv6.method dhcp
IPV6_AUTOCONF=no
DHCPV6C=yes

将使用 DHCPv6(而不使用 SLAAC)来配置网络设置

ipv6.addresses "2001:db8::a/64 2001:db8::1"
IPV6ADDR=2001:db8::a/64
IPV6_DEFAULTGW=2001:db8::1

设置静态 IPv4 地址、网络前缀和默认网关。如果为连接设置了多个地址,IPV6_SECONDARIES 将采用空格分隔的地址/前缀定义的双引号列表。

ipv6.dns . . .
DNS0= . . .

修改 /etc/resolv.conf 以使用此 nameserver。与 IPv4 完全相同

ipv6.dns-search example.com
DOMAIN=example.com

修改 /etc/resolv.conf 以在 search 指令中使用此域。与 IPv4 完全相同。

ipv6.ignore-auto-dns true
IPV6_PEERDNS=no

忽略来自 DHCP 服务器的 DNS 服务器信息。

connection.autoconnect yes
ONBOOT=yes

在启动时自动激活此连接。

connection.id eth0
NAME=eth0

此连接的名称。

connection.interface-name eth0
DEVICE=eth0

连接与具有此名称的网络接口绑定。

802-3-ethernet.mac-address . . .
HWADDR= . . .

连接与具有此 MAC 地址的网络接口绑定。

域名解析配置文件

/etc/hosts 文件中定义着 IP 地址和域名的映射关系

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.66.192.101 master.example.com

当通过 /etc/hosts 不能够完成域名解析时 /etc/resolv.conf 用来完成域名解析。这个文件中定义了一系列域名服务器和search:

# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
Note
/etc/resolv.conf 文件会在网络接口重起时自动重写,设置 PEERDNS=no 属性可以阻止被自动更新。nmcli con mod eth0 ipv4.ignore-auto-dns yes 可以用来设定这个属性

基本命令

Table 3. 网络配置列表
命令 描述

hostnamectl set-hostname

在此系统上持久设置主机名。

ip addr show

显示/管理当前网络接口地址配置。

ip link

显示/管理网络设备

ip route

显示/管理路由信息

nmcli dev status

显示所有网络接口的 NetworkManager 状态。

nmcli con show

列出所有连接。

nmcli con show name

列出 name 连接的当前设置。

nmcli con add con-name name

添加一个名为 name 的新连接。

nmcli con mod name

修改 name 连接。

nmcli con reload

告知 NetworkManager 重新读取配置文件(在手动编辑配置文件之后使用)。

nmcli con up name

激活 name 连接。

nmcli dev dis dev

在网络接口 dev 上停用并断开当前连接。

nmcli con del name

删除 name 连接及其配置文件。

ip addr

显示所有设备和地址信息
# ip addr
# ip addr show eth0
显示设备网络接收和统计数据
# ip -s link
# ip -s link show eth0
Note
ip 用来显示/管理路由、设备、地址、等。

ip route

显示路由信息
# ip route

ping

ping 用来检测网络的连通性
# ping -c2 10.66.193.254
PING 10.66.193.254 (10.66.193.254) 56(84) bytes of data.
64 bytes from 10.66.193.254: icmp_seq=1 ttl=255 time=2.05 ms
64 bytes from 10.66.193.254: icmp_seq=2 ttl=255 time=6.90 ms

--- 10.66.193.254 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 2.059/4.482/6.906/2.424 ms

tracepath

tracepath 用来跟踪远程地址
# tracepath 10.66.193.254
 1?: [LOCALHOST]                                         pmtu 1500
 1:  10.66.193.253                                         2.605ms reached
 1:  10.66.193.253                                         2.263ms reached
     Resume: pmtu 1500 hops 1 back 1

traceroute

traceroute 用来跟踪远程地址
$ traceroute redhat.com
traceroute to redhat.com (10.4.204.55), 30 hops max, 60 byte packets
 1  10.66.193.253 (10.66.193.253)  1.009 ms  1.133 ms  1.524 ms
 2  10.66.254.13 (10.66.254.13)  0.464 ms  0.455 ms  0.438 ms
 3  10.4.57.254 (10.4.57.254)  239.447 ms  239.446 ms  239.425 ms
 4  10.4.56.12 (10.4.56.12)  250.716 ms  250.678 ms  261.759 ms
 5  unused (10.4.60.2)  253.584 ms  253.562 ms unused (10.4.60.6)  253.529 ms
 6  unused (10.4.253.2)  274.428 ms network (10.4.253.0)  247.439 ms unused (10.4.253.6)  274.089 ms
 7  10.4.255.154 (10.4.255.154)  241.891 ms 10.4.255.156 (10.4.255.156)  241.231 ms  240.579 ms
 8  10.4.192.5 (10.4.192.5)  239.829 ms  239.946 ms  240.473 ms
 9  redirect-redhat-com.vserver.prod.ext.phx2.redhat.com (10.4.204.55)  239.598 ms  240.883 ms  239.943 ms
Note
tracepath/traceroute 默认发送 UDP 包给远程地址。traceroute 可以指定发送包的类型,ICMP (-I),TCP(-T)。

ss

Note
ss 主要用来显示一些端口服务相关的信息。
显示所有 TCP UDP 连接信息
# ss -tu
Netid State      Recv-Q Send-Q                                                        Local Address:Port                                                                         Peer Address:Port
udp   ESTAB      0      0                                                             10.66.193.160:49795                                                                        51.15.41.135:ntp
udp   ESTAB      0      0                                                             10.66.193.160:34809                                                                        59.46.44.253:ntp
udp   ESTAB      0      0                                          2620:52:0:42c0:5054:ff:fee0:d006:47532                                                      2600:3c01::f03c:91ff:fe93:b0d1:ntp
tcp   ESTAB      0      0                                                             10.66.193.160:ssh                                                                         10.66.192.147:36872
Note
NOTE: /etc/services 中保存着所有端口和服务对应的信息。
显示所有监听的 TCP Socket 及其对应的服务
# ss -ltp
Table 4. ss 常见 options
Option 描述

-n

显示数字(端口号)而不是服务名

-t

显示 TCP 连接

-u

显示 UDP 连接

-l

仅显示 LISTEN 状态的 Socket

-a

显示所有(listening 和 established) Socket

-p

显示使用 Socket 的进程信息

nmcli con

显示所有连接
# nmcli connection show
NAME    UUID                                  TYPE            DEVICE
eth0    0e612544-0d1e-4487-83d8-d4f054e929d8  802-3-ethernet  eth0
virbr0  405c39c0-8b20-475e-a241-137f74982308  bridge          virbr0
显示所有活跃连接
# nmcli connection show --active
NAME    UUID                                  TYPE            DEVICE
eth0    0e612544-0d1e-4487-83d8-d4f054e929d8  802-3-ethernet  eth0
virbr0  405c39c0-8b20-475e-a241-137f74982308  bridge          virbr0
显示某一个连接的详细信息
# nmcli connection show eth0
....
Note
nmcli 同来管理网络配置和设备。另外 etc/sysconfig/network-scripts 中保存着网络和设备相关的配置文件。

nmcli dev

显示设备状态
# nmcli device status
DEVICE      TYPE      STATE      CONNECTION
virbr0      bridge    connected  virbr0
eth0        ethernet  connected  eth0
lo          loopback  unmanaged  --
virbr0-nic  tun       unmanaged  --
显示某一个设备的详细信息
# nmcli device show eth0
GENERAL.DEVICE:                         eth0
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         52:54:00:E0:D0:06
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     eth0
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/0
WIRED-PROPERTIES.CARRIER:               on
IP4.ADDRESS[1]:                         10.66.193.160/23
IP4.GATEWAY:                            10.66.193.254
IP4.ROUTE[1]:                           dst = 10.72.17.5/32, nh = 10.66.193.254, mt = 100
IP4.DNS[1]:                             10.72.17.5
IP4.DNS[2]:                             10.68.5.26
IP4.DOMAIN[1]:                          pek.redhat.com
IP6.ADDRESS[1]:                         2620:52:0:42c0:5054:ff:fee0:d006/64
IP6.ADDRESS[2]:                         fe80::5054:ff:fee0:d006/64
IP6.GATEWAY:                            fe80::e6d3:f1ff:fe9a:2cc3
IP6.ROUTE[1]:                           dst = 2620:52:0:42c0::/64, nh = ::, mt = 100

nmcli con add

添加一个动态连接
# nmcli connection add con-name "conn-dynamic" type ethernet ifname eth0
Connection 'conn-dynamic' (eaf49242-0708-43f7-aa98-10e62c29dfb4) successfully added.
添加一个静态连接
# nmcli connection add con-name "conn-static" ifname eth0 autoconnect no type ethernet ip4 10.66.192.100/24 gw4 10.66.193.254
Connection 'conn-static' (874025b6-7a32-4ab7-873e-255aad44f2b6) successfully added.
启动静态连接
# nmcli connection up "conn-static"
启动动态连接
# nmcli connection up "conn-dynamic"

nmcli con modify

关闭自动连接
# nmcli connection modify "conn-static" connection.autoconnect no
修改 ipv4.dns
# nmcli connection modify "conn-static" ipv4.dns 10.68.5.26
添加备份 DNS
# nmcli connection modify "conn-static" +ipv4.dns 8.8.8.
修改 ip 地址
# nmcli connection modify "conn-static" ipv4.addresses 10.66.192.100/24
添加备份 ip 地址
# nmcli connection modify "conn-static" +ipv4.addresses 10.10.10.10/16

hostname

显示 /etc/hostname 中配置的 hostname
$ hostname
ksoong.redhat.com

hostnamectl

配置 hostname
$ hostnamectl set-hostname master.example.com
$ hostnamectl status
   Static hostname: master.example.com
         Icon name: computer-vm
           Chassis: vm
        Machine ID: d8bed309f4294655bb32a6fae3d9b8e9
           Boot ID: f6013904460948db93109440302364f8
    Virtualization: kvm
  Operating System: Red Hat Enterprise Linux Server 7.3 (Maipo)
       CPE OS Name: cpe:/o:redhat:enterprise_linux:7.3:GA:server
            Kernel: Linux 3.10.0-514.el7.x86_64
      Architecture: x86-64
# cat /etc/hostname
master.example.com
Note
老版本的 Linux, hostname 保存在 /etc/sysconfig/network

getent hosts

getent hosts HOSTNAME 用来测试域名解析
$ getent hosts master.example.com
192.168.122.101 master.example.com master

host

host HOSTNAME 用来测试 DNS 服务器的连接性
# host master.example.com

nc

The Netcat tool can be run through the command nc, and has two mandatory arguments, a host and a port.

$ nc -z -v redhat.com 80
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.4.204.55:80.
Ncat: 0 bytes sent, 0 bytes received in 0.25 seconds.

results matching ""

    No results matching ""