当前位置: 首页 > 文档资料 > 笨办法学 Linux >

练习 24:接口配置,`ifconfig`,`netstat`,`iproute2`,`ss`,`route`

优质
小牛编辑
132浏览
2023-12-01

这个练习对于你来说是一个很大的信息量,如果你不熟悉网络,这就是一个伤害。如果你感到非常失落,请立即跳到“这样做”的部分,并完成它。为了正确理解这部分,你至少应该非常熟悉网络的以下基本概念:

  • 通信协议 - 通信协议,就是数字消息格式和规则的系统,用于在计算系统或在电子通讯中交换那些消息。
  • 以太网 - 用于局域网(LAN)的计算机网络技术族。
  • MAC 地址 - 分配给物理网段上通信的网络接口的唯一标识符。例如:08:00:27:d4:45:68
  • TCP/IP - 互联网协议套件是一组通信协议,用于互联网和类似网络,通常是广域网最流行的协议栈。它通常被称为 TCP/IP,由于其最重要的协议:传输控制协议(TCP)和互联网协议(IP)
  • IP - 互联网协议(IP)是主要通信协议,用于跨互联网络中继转发数据报(也称为网络封包)。
  • IP 地址 - 互联网协议地址。示例:10.0.2.15
  • 端口 - 应用特定或流程特定的软件结构,在计算机的主机操作系统中用作通信端点。示例:22
  • 网络套接字 - 跨计算机网络的,进程间通信流的端点。今天,大多数计算机之间的通信基于互联网协议;因此大多数网络套接字都是互联网套接字。
  • 本地套接字地址 - 本地 IP 地址和端口号,例如:10.0.2.15:22
  • 远程套接字地址 - 远程 IP 地址和端口号,仅适用于已建立的 TCP 套接字。示例:10.0.2.2:52173
  • 套接字对 - 沟通本地和远程套接字,只有 TCP 协议。示例:(10.0.2.15:22, 10.0.2.2:52173)
  • 子网掩码 - 逻辑可见的 IP 网络细分。示例:/24或另一个记号255.255.255.0
  • 路由 - 在网络中选择路径,来发送网络流量的过程。
  • 默认网关 - 在计算机网络中,网关是一个 TCP/IP 网络上的节点(路由器),作为另一个网络的接入点。默认网关是计算机网络上的节点,当 IP 地址与路由表中的任何其他路由不匹配时,网络软件使用它。示例:10.0.2.2
  • 广播地址 - 逻辑地址,其中连接到多重访问的网络的设备能接收数据报。发给广播地址的消息,通常会由所有附加到网络的主机接收,而不是特定主机。示例:10.0.2.255
  • ICMP - 互联网消息控制协议,示例用法:ping 10.0.2.2
  • TCP - 传输控制协议。在数据交换之前建立连接,因此设计上可靠。示例:SSH, HTTP。
  • UDP - 用户数据报协议。传输数据而不建立连接,因此设计上不可靠。示例:DNS。

如果你对某些概念不熟悉,不用担心。

  • 阅读相应的维基百科文章,直到你至少充分理解(但是深入钻研当然更好)。
  • 观看 http://www.visualland.net.cn/ 的视频:
    • 展开站点左侧的 IP 地址树节点,并通过它来以你的方式实现。
    • 展开 TCP 树节点并执行相同操作。
  • 阅读 Linux 网络概念介绍。这本指南很好,因为它甚至承认 互联网是为情欲而生的。

让我们继续。这是 Linux 网络相关的命令列表:

  • ifconfig - 配置和查看网络接口的状态。
  • netstat - 打印网络连接,路由表,接口统计信息,伪装连接和组播成员资格。
  • ip - 显示/操做路由,设备,策略和隧道。
  • ss - 调查套接字的另一个实用程序。

现在让我们来看看每个命令可以告诉我们什么信息。我们将从ifconfig开始。

user1@vm1:~$ sudo ifconfig
 
eth0      Link encap:Ethernet  HWaddr 08:00:27:d4:45:68               # (1), (2), (3)
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0   # (4), (5), (6), (7)
          inet6 addr: fe80::a00:27ff:fed4:4568/64 Scope:Link          # (8), (9), (10)
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          # (11), (12), (13), (14), (15), (16)
          RX packets:35033 errors:0 dropped:0 overruns:0 frame:0      # (17), (18), (19), (20), (21), (22)
          TX packets:28590 errors:0 dropped:0 overruns:0 carrier:0    # (23), (24), (25), (26), (27), (28)
          collisions:0 txqueuelen:1000                                # (29), (30)
          RX bytes:6360747 (6.0 MiB)  TX bytes:21721365 (20.7 MiB)   # (31), (32)
 
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:560 (560.0 B)  TX bytes:560 (560.0 B)

我们可以看到vm1中有两个网络接口,eth0lolo是一个回送 接口,用于连接同一台机器上的客户端-服务器程序。

让我们看看我们在eth0上有哪些信息,它是一个 VirtualBox 的伪网络接口:

字段描述字段描述
(1) Link物理选项(17) RX接收(缩写)
(2) encap封装类型(18) packets封包总数
(3) HwaddrMAC 地址(19) errors错误的数据包总数
(4) inet地址族(IPv4)(20) dropped丢弃的封包(低系统内存?)
(5) addrIPv4 地址(21) overruns比处理速度快的封包
(6) Bcast广播地址(22) frame接收的无效的帧
(7) Mask网络掩码(23) TX传输(缩写)
(8) inet6地址族(IPv6)(24) packets封包总数
(9) addrIPv6 地址(25) errors错误的数据包总数
(10) Scope地址范围(主机,链路,全局)(26) dropped丢弃的封包(低系统内存?)
(11) UP接口功能正常(27) overruns比处理速度快的封包(我不确定)
(12) BROADCAST它可以一次性向所有主机发送流量(28) carrier链路载波丢失
(13) RUNNING它准备好接受数据(我不确定)(29) collisions发生了包装碰撞
(14) MULTICAST它可以发送和接收组播封包(30) txqueuelen传出数据包的转发队列长度
(15) MTU其最大传输单位(31) RX bytes收到的字节总数
(16) Metric路由开销(在 Linux 中未使用)(32) TX bytes发送的字节总数

这确实很多。但是同样,现在的重要字段是:

  • (5) addr - IPv4地址。
  • (6) Bcast - 广播地址。
  • (7) Mask - 网络掩码。
  • (11) UP - 接口正常工作。
  • (13) RUNNING - 准备好接受数据。
  • (19) errors 和 (25) errors - 如果在这里有不为零的东西,我们就有问题了。

现在让我们看看netstat能给我们看的东西。

user1@vm1:~$ sudo netstat -ap
Active Internet connections (servers and established)
#(1)  (2)    (3)    (4)                     (5)                     (6)         (7)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:sunrpc                *:*                     LISTEN      580/portmap
tcp        0      0 *:ssh                   *:*                     LISTEN      900/sshd
tcp        0      0 localhost:smtp          *:*                     LISTEN      1111/exim4
tcp        0      0 *:36286                 *:*                     LISTEN      610/rpc.statd
tcp        0      0 10.0.2.15:ssh           10.0.2.2:52191          ESTABLISHED 12023/sshd: user1 [
tcp        0      0 10.0.2.15:ssh           10.0.2.2:48663          ESTABLISHED 11792/sshd: user1 [
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      900/sshd
tcp6       0      0 ip6-localhost:smtp      [::]:*                  LISTEN      1111/exim4
udp        0      0 *:bootpc                *:*                                 843/dhclient
udp        0      0 *:sunrpc                *:*                                 580/portmap
udp        0      0 *:52104                 *:*                                 610/rpc.statd
udp        0      0 *:786                   *:*                                 610/rpc.statd
#(8)  (9)    (10)        (11)       (12)          (13)     (14)                (15)
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Path
unix  2      [ ACC ]     STREAM     LISTENING     3452     786/acpid           /var/run/acpid.socket
unix  6      [ ]         DGRAM                    3407     751/rsyslogd        /dev/log
unix  2      [ ]         DGRAM                    1940     214/udevd           @/org/kernel/udev/udevd
unix  2      [ ]         DGRAM                    88528    30939/sudo
unix  3      [ ]         STREAM     CONNECTED     68565    12023/sshd: user1 [
unix  3      [ ]         STREAM     CONNECTED     68564    12026/1
unix  2      [ ]         DGRAM                    68563    12023/sshd: user1 [
unix  3      [ ]         STREAM     CONNECTED     66682    11792/sshd: user1 [
unix  3      [ ]         STREAM     CONNECTED     66681    11794/0
unix  2      [ ]         DGRAM                    66680    11792/sshd: user1 [
unix  2      [ ]         DGRAM                    3465     843/dhclient
unix  2      [ ]         DGRAM                    3448     786/acpid
unix  3      [ ]         DGRAM                    1945     214/udevd
unix  3      [ ]         DGRAM                    1944     214/udevd

我使用两个参数来修改netstat输出。-a参数告诉netstat来显示所有的连接,包括建立的,例如你当前正在打字的ssh会话,以及监听的,例如等待新的连接的sshd守护进程。-p告诉netstat来显示哪个程序拥有每个连接。

活动互联网连接(服务器和已建立)
字段描述
(1) Proto套接字使用的协议(tcp,udp,raw)
(2) Recv-Q连接到此套接字的用户程序的未复制的字节数
(3) Send-Q远程主机未确认的字节数
(4) Local Address套接字的本端的地址和端口号。
(5) Foreign Address套接字远端的地址和端口号。
(6) StateESTABLISHED, SYN_SENT, SYN_RECV, FIN_WAIT1, FIN_WAIT2, TIME_WAIT, CLOSE, CLOSE_WAIT, LAST_ACK, LISTEN, CLOSING, UNKNOWN
(7) PID拥有套接字的进程的进程 ID(PID)和进程名称的斜杠对。
活动 UNIX 域套接字(服务器和已建立)
字段描述
(8) Proto套接字使用的协议(通常为 unix)。
(9) RefCnt引用计数(即附加到此套接字的进程)。
(10) Flags显示的标志是SO_ACCEPTON(显示为ACC),SO_WAITDATAW)或SO_NOSPACEN)。
(11) TypeSOCK_DGRAM, SOCK_STREAM, SOCK_RAW, SOCK_RDM, SOCK_SEQPACKET, SOCK_PACKET, UNKNOWN.
(12) StateFREE, LISTENING, CONNECTING, CONNECTED, DISCONNECTING, (empty), UNKNOWN.
(13) I-Node套接字文件的索引节点。
(14) PID打开套接字的进程的进程 ID(PID)和进程名称。
(15) Path这是连接到套接字的对应进程的路径名。

并非所有字段都是重要的。通常你只需要查看活动的互联网连接(服务器和已建立) 部分,并使用以下字段:

(1)Proto - 套接字使用的协议(tcp,udp,raw)。 (4)Local Address - 套接字本端的地址和端口号。 (5)Foreign Address - 套接字远端的地址和端口号,仅用于套接字对。 (6)State - 现在你只应该知道两个状态:LISTENESTABLISHED。前者意味着你可以连接到这个套接字,第后者的意思是这个套接字已经连接了,在这种情况下,netstat显示你的套接字对。

ip是一个类似于ifconfig的,具有扩展功能的程序。它来自iproute2套件,用于在某一天替换ifconfig。示例输出:

user1@vm1:~$ sudo ip addr show
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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
#        (1)        (2)      (3) (4)       (5)      (6)              (8)      (9)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:d4:45:68 brd ff:ff:ff:ff:ff:ff      # (9),  (10), (11)
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0      # (12), (13), (14)
    inet6 fe80::a00:27ff:fed4:4568/64 scope link            # (15), (16)
       valid_lft forever preferred_lft forever              # (17), (18), (19)

同样,我们来看看我们在eth0上有什么信息:

字段描述
(1) BROADCAST它可以一次性向所有主机发送流量
(2) MULTICAST它可以发送和接收组播数据包
(3) UP它是生效的,逻辑状态
(4) LOWER_UP驱动器信号 L1 已开启(自 Linux 2.6.17 起)
(5) MTU最大传输单位
(6) qdisc排队规则,基本上是流量调度策略
(8) State物理状态(载体感觉?)
(9) qlen传出数据包的转发队列长度
(10) link物理选项
(11) ether封装类型,MAC 地址
(12) brd数据链路层(物理)广播地址
(13) inetIPv4 地址族地址
(14) brdIPv4 广播
(15) scopeIPv4地址范围(主机,链路,全局)
(16) inet6IPv6 地址族地址
(17) scopeIPv6地址范围(主机,链路,全局)
(18) valid_lftIPv6 源地址选择策略
(19) preffered_lftIPv6 源地址选择策略

你已经知道哪些参数很重要(与ifconfig相同)。

ss基本上是具有扩展功能的当代netstat。这是它的示例输出,其解释为留作练习:

user1@vm1:~$ sudo ss -ap | cut -c1-200
State      Recv-Q Send-Q    Local Address:Port      Peer Address:Port
LISTEN     0      128                   *:sunrpc               *:*        users:(("portmap",580,5))
LISTEN     0      128                  :::ssh                 :::*        users:(("sshd",900,4))
LISTEN     0      128                   *:ssh                  *:*        users:(("sshd",900,3))
LISTEN     0      20                  ::1:smtp                :::*        users:(("exim4",1111,4))
LISTEN     0      20            127.0.0.1:smtp                 *:*        users:(("exim4",1111,3))
LISTEN     0      128                   *:36286                *:*        users:(("rpc.statd",610,7))
ESTAB      0      0             10.0.2.15:ssh           10.0.2.2:52191    users:(("sshd",12023,3),("sshd",12026,3))
ESTAB      0      0             10.0.2.15:ssh           10.0.2.2:48663    users:(("sshd",11792,3),("sshd",11794,3))

这用于处理接口,连接和接口地址。但是网络路由呢?你也可以使用几个命令获取它们的信息:

user1@vm1:~$ sudo route -n
Kernel IP routing table
# (1)           (2)             (3)             (4)   (5)    (6)    (7) (8)
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
user1@vm1:~$ sudo netstat -nr
Kernel IP routing table #                                           (9)
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.2.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
0.0.0.0         10.0.2.2        0.0.0.0         UG        0 0          0 eth0
user1@vm1:~$ sudo ip route show
# (10)      (11)      (12)          (13)        (14)
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
#(15)                (16)
default via 10.0.2.2 dev eth0

让我们再一次看看字段:

字段描述
(1) Destination目标网络或目标主机。
(2) Gateway网关地址或*,如果没有设置的话。
(3) Genmask目标网络的掩码;255.255.255.255为主机目标,0.0.0.0为默认路由。
(4) FlagsUp, Host, Gateway, Reinstate, Dynamically installed, Modified, Addrconf, Cache entry, ! reject.
(5) Metric目标的“距离”(通常以跳数计算)。最近的内核不使用它,但路由守护进程可能需要它。
(6) Ref这个路由的引用次数(在 Linux 内核中未使用)。
(7) Use路由查询次数。
(8) Iface用于这个路由的,发送封包的接口
(9) irtt初始 RTT(往返时间)。内核使用它来猜测最佳的 TCP 协议参数,而无需等待(可能很慢)的答案。
(10) Net/Mask目标网络或目标主机。
(11) dev用于这个路由的,发送封包的接口
(12) protoman ip /RTPROTO: redirect, kernel, boot, static, ra
(13) scopeman ip /SCOPE_WALUE: global, site, link, host
(14) src发送到路由前缀覆盖的目标时,优先选择的源地址。
(15) default默认网关地址
(15) dev用于这个路由的,发送封包的接口

目前的重要字段:

  • (1)Destination - 目标网络或目标主机。
  • (2)Gateway - 网关地址或*,如果没有设置的话。默认值意味着,如果没有明确指定的目标地址的网关,则将通过该网关发送数据包。
  • (3)Genmask - 目标网络的网络掩码;255.255.255.255为主机目标,0.0.0.0为默认路由。
  • (8)Iface - 用于这个路由的,发送封包的接口。

netstatroute的哪个字段对应于`ip route show ·的哪个字段 ,再次留作一个练习。这真是太多了!深吸一口气,让我们转到实践。

现在你将学习如何创建伪接口,为其分配地址并更改其状态。

这样做

 1: sudo aptitude install uml-utilities
 2: sudo tunctl -t tap0 -u user1
 3: ls -al /sys/devices/virtual/net/tap0
 4: sudo ifconfig tap0 10.1.1.1 netmask 255.255.255.0
 5: sudo ifconfig
 6: sudo route
 7: ping 10.1.1.1 -c 2
 8: sudo ifconfig tap0 down
 9: ping 10.1.1.1 -c 2
10: sudo ifconfig tap0 up
11: sudo ip a a 10.2.2.2/24 brd + dev tap0
12: sudo ifconfig
13: sudo route
14: ip a s
15: ip r s
16: ping 10.2.2.2 -c 2
17: sudo ip link set dev tap0 down
18: ip a s
19: ip r s
20: ping 10.2.2.2 -c 2
21: sudo tunctl -d tap0
22: ip a s
23: ls -al /sys/devices/virtual/net/tap0

你会看到什么

user1@vm1:~$ sudo aptitude install uml-utilities
The following NEW packages will be installed:
  libfuse2{a} uml-utilities
0 packages upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/205 kB of archives. After unpacking 737 kB will be used.
Do you want to continue? [Y/n/?]
Selecting previously deselected package libfuse2.
(Reading database ... 39616 files and directories currently installed.)
Unpacking libfuse2 (from .../libfuse2_2.8.4-1.1_amd64.deb) ...
Selecting previously deselected package uml-utilities.
Unpacking uml-utilities (from .../uml-utilities_20070815-1.1_amd64.deb) ...
Processing triggers for man-db ...
Setting up libfuse2 (2.8.4-1.1) ...
Setting up uml-utilities (20070815-1.1) ...
Starting User-mode networking switch: uml_switch.
user1@vm1:~$ sudo tunctl -t tap0 -u user1
Set 'tap0' persistent and owned by uid 1000
user1@vm1:~$ ls -al /sys/devices/virtual/net/tap0
total 0
drwxr-xr-x 4 root root    0 Jul 11 05:33 .
drwxr-xr-x 4 root root    0 Jul 11 05:33 ..
-r--r--r-- 1 root root 4096 Jul 11 05:33 address
-r--r--r-- 1 root root 4096 Jul 11 05:33 addr_len
-r--r--r-- 1 root root 4096 Jul 11 05:33 broadcast
-r--r--r-- 1 root root 4096 Jul 11 05:33 carrier
-r--r--r-- 1 root root 4096 Jul 11 05:33 dev_id
-r--r--r-- 1 root root 4096 Jul 11 05:33 dormant
-r--r--r-- 1 root root 4096 Jul 11 05:33 duplex
-r--r--r-- 1 root root 4096 Jul 11 05:33 features
-rw-r--r-- 1 root root 4096 Jul 11 05:33 flags
-r--r--r-- 1 root root 4096 Jul 11 05:33 group
-rw-r--r-- 1 root root 4096 Jul 11 05:33 ifalias
-r--r--r-- 1 root root 4096 Jul 11 05:33 ifindex
-r--r--r-- 1 root root 4096 Jul 11 05:33 iflink
-r--r--r-- 1 root root 4096 Jul 11 05:33 link_mode
-rw-r--r-- 1 root root 4096 Jul 11 05:33 mtu
-r--r--r-- 1 root root 4096 Jul 11 05:33 operstate
-r--r--r-- 1 root root 4096 Jul 11 05:33 owner
drwxr-xr-x 2 root root    0 Jul 11 05:33 power
-r--r--r-- 1 root root 4096 Jul 11 05:33 speed
drwxr-xr-x 2 root root    0 Jul 11 05:33 statistics
lrwxrwxrwx 1 root root    0 Jul 11 05:33 subsystem -> ../../../../class/net
-r--r--r-- 1 root root 4096 Jul 11 05:33 tun_flags
-rw-r--r-- 1 root root 4096 Jul 11 05:33 tx_queue_len
-r--r--r-- 1 root root 4096 Jul 11 05:33 type
-rw-r--r-- 1 root root 4096 Jul 11 05:33 uevent
user1@vm1:~$ sudo ifconfig tap0 10.1.1.1 netmask 255.255.255.0
user1@vm1:~$ sudo ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:d4:45:68
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fed4:4568/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:64040 errors:0 dropped:0 overruns:0 frame:0
          TX packets:44578 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:19663646 (18.7 MiB)  TX bytes:25043918 (23.8 MiB)
 
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:76 errors:0 dropped:0 overruns:0 frame:0
          TX packets:76 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:6272 (6.1 KiB)  TX bytes:6272 (6.1 KiB)
 
tap0      Link encap:Ethernet  HWaddr ee:d8:2e:f6:bc:f1
          inet addr:10.1.1.1  Bcast:10.1.1.255  Mask:255.255.255.0
          inet6 addr: fe80::ecd8:2eff:fef6:bcf1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:1 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 
user1@vm1:~$ sudo route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
10.1.1.0        *               255.255.255.0   U     0      0        0 tap0
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
user1@vm1:~$ ping 10.1.1.1 -c 2
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_req=1 ttl=64 time=0.070 ms
64 bytes from 10.1.1.1: icmp_req=2 ttl=64 time=0.027 ms
 
--- 10.1.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.027/0.048/0.070/0.022 ms
user1@vm1:~$ sudo ifconfig tap0 down
user1@vm1:~$ ping 10.1.1.1 -c 2
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_req=1 ttl=64 time=0.030 ms
64 bytes from 10.1.1.1: icmp_req=2 ttl=64 time=0.024 ms
 
--- 10.1.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.024/0.027/0.030/0.003 ms
user1@vm1:~$ sudo ifconfig tap0 up
user1@vm1:~$ sudo ip a a 10.2.2.2/24 brd + dev tap0
user1@vm1:~$ sudo ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:d4:45:68
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fed4:4568/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:64088 errors:0 dropped:0 overruns:0 frame:0
          TX packets:44609 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:19667480 (18.7 MiB)  TX bytes:25049771 (23.8 MiB)
 
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:84 errors:0 dropped:0 overruns:0 frame:0
          TX packets:84 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:6944 (6.7 KiB)  TX bytes:6944 (6.7 KiB)
 
tap0      Link encap:Ethernet  HWaddr ee:d8:2e:f6:bc:f1
          inet addr:10.1.1.1  Bcast:10.1.1.255  Mask:255.255.255.0
          inet6 addr: fe80::ecd8:2eff:fef6:bcf1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:9 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
user1@vm1:~$ sudo route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.2.2.0        *               255.255.255.0   U     0      0        0 tap0
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
10.1.1.0        *               255.255.255.0   U     0      0        0 tap0
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
user1@vm1:~$ ip a s
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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:d4:45:68 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
    inet6 fe80::a00:27ff:fed4:4568/64 scope link
       valid_lft forever preferred_lft forever
12: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
    link/ether ee:d8:2e:f6:bc:f1 brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.1/24 brd 10.1.1.255 scope global tap0
    inet 10.2.2.2/24 brd 10.2.2.255 scope global tap0
    inet6 fe80::ecd8:2eff:fef6:bcf1/64 scope link
       valid_lft forever preferred_lft forever
user1@vm1:~$ ip r s
10.2.2.0/24 dev tap0  proto kernel  scope link  src 10.2.2.2
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
10.1.1.0/24 dev tap0  proto kernel  scope link  src 10.1.1.1
default via 10.0.2.2 dev eth0
user1@vm1:~$ ping 10.2.2.2 -c 2
PING 10.2.2.2 (10.2.2.2) 56(84) bytes of data.
64 bytes from 10.2.2.2: icmp_req=1 ttl=64 time=0.081 ms
64 bytes from 10.2.2.2: icmp_req=2 ttl=64 time=0.025 ms
 
--- 10.2.2.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.025/0.053/0.081/0.028 ms
user1@vm1:~$ sudo ip link set dev tap0 down
user1@vm1:~$ ip a s
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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:d4:45:68 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
    inet6 fe80::a00:27ff:fed4:4568/64 scope link
       valid_lft forever preferred_lft forever
12: tap0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 500
    link/ether ee:d8:2e:f6:bc:f1 brd ff:ff:ff:ff:ff:ff
    inet 10.1.1.1/24 brd 10.1.1.255 scope global tap0
    inet 10.2.2.2/24 brd 10.2.2.255 scope global tap0
user1@vm1:~$ ip r s
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
default via 10.0.2.2 dev eth0
user1@vm1:~$ ping 10.2.2.2 -c 2
PING 10.2.2.2 (10.2.2.2) 56(84) bytes of data.
64 bytes from 10.2.2.2: icmp_req=1 ttl=64 time=0.037 ms
64 bytes from 10.2.2.2: icmp_req=2 ttl=64 time=0.024 ms
 
--- 10.2.2.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.024/0.030/0.037/0.008 ms
user1@vm1:~$ sudo tunctl -d tap0
Set 'tap0' nonpersistent
user1@vm1:~$ ip a s
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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:d4:45:68 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
    inet6 fe80::a00:27ff:fed4:4568/64 scope link
       valid_lft forever preferred_lft forever
user1@vm1:~$ ls -al /sys/devices/virtual/net/tap0
ls: cannot access /sys/devices/virtual/net/tap0: No such file or directory
user1@vm1:~$

解释

  1. 安装使用伪(虚拟)接口的软件包。
  2. 创建伪接口tap0
  3. 打印为此接口创建的,虚拟目录的内容,其中包含其设置和统计信息。
  4. 将 IP 地址10.1.1.1/24添加到tap0
  5. 打印当前接口状态。
  6. 打印当前路由表条目。请注意,Linux 自动为tap0添加新路由。
  7. 通过向其发送 ICMP 回显请求数据包来测试tap0
  8. tap0设为DOWN状态(停用)。
  9. 通过再次发送 ICMP 回显请求数据包来测试tap0。会有额外的附加题来解释为什么这个仍然可以工作,尽管已经停用了。
  10. tap0设为UP状态(启用)。
  11. tap0添加额外的IP地址10.2.2.2/24ip aaip addr add的缩写版本。这个+的含义,你会在附加题中自己发现它。
  12. 打印当前接口状态。注意ifconfig无法列出使用ip工具添加的新 IP 地址。为什么?留作附加题。
  13. 打印当前路由表。请注意,Linux 自动为tap0添加了一条路由。
  14. 使用ip工具打印当前接口状态。你可以在这里看到新添加的地址。
  15. 使用ip工具打印我们的路由表。
  16. 通过向其发送 ICMP 回显请求报文,来测试net tap0的 IP 地址。
  17. tap0设为DOWN状态。
  18. 打印当前接口状态。
  19. 打印当前路由表条目。请注意,tap0路由将自动删除。
  20. 通过向其发送 ICMP 回显请求报文,来测试net tap0的 IP 地址。这个有用,为什么?
  21. 删除伪接口tap0
  22. 打印当前接口状态。tap0不存在
  23. 告诉我们,tap0虚拟目录现在也没有了。

附加题

  • 熟悉man ifconfigman ipman netstatman ss
  • tap0处于关闭状态时,为什么ping有用?
  • brd +的意思是什么?
  • 为什么ifconfig无法列出使用ip添加的新地址?